Skip to content

Commit e6b771e

Browse files
committed
Read bounded host mount inventory for benchmark resource evidence
Use the existing hardware metadata cap for the complete kernel mount inventory and retain original bounded mountinfo with native preparation artifacts. Keep control-file limits, shared sample budgets and native resource qualification requirements. Verified: full Debug solution build with -warnaserror (21 projects, zero warnings/errors), scoped format and verify, repository governance, YAML syntax and actionlint. Exact Linux native qualification remains pending the next run.
1 parent 670779e commit e6b771e

4 files changed

Lines changed: 20 additions & 2 deletions

File tree

‎.github/workflows/benchmarks.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ jobs:
125125
benchmarks/KeyLoad.ComparisonHost/bin/Release/net10.0/TestResults/**
126126
benchmarks/KeyLoad.ComparisonHost/bin/Release/net10.0/database-adapters/**/*.log
127127
benchmarks/KeyLoad.ComparisonHost/bin/Release/net10.0/database-adapters/**/resource-observations.json
128+
benchmarks/KeyLoad.ComparisonHost/bin/Release/net10.0/database-adapters/**/host-mountinfo.txt
128129
artifacts/qualification/**
129130
artifacts/code-quality/**
130131
${{ runner.temp }}/keyload-cell-github/**

‎benchmarks/KeyLoad.ComparisonHost/DatabaseAdapters/Resources/NativeDatabaseResourceObservation.cs‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ internal async Task VerifyReadyAsync(CancellationToken token)
3838
{
3939
if (OperatingSystem.IsLinux())
4040
{
41+
await CaptureHostMountsAsync(token);
4142
await collector.WaitForInitialSamplesAsync(token);
4243
}
4344
foreach (var resource in resources)
@@ -65,6 +66,18 @@ internal async Task VerifyReadyAsync(CancellationToken token)
6566
}
6667
}
6768

69+
private async Task CaptureHostMountsAsync(CancellationToken token)
70+
{
71+
const string MountInfoFile = "host-mountinfo.txt";
72+
var settings = app.Services.GetRequiredService<IOptions<ScaleServerResourceOptions>>();
73+
var budget = new ScaleServerResourceSampleBudget(settings,
74+
app.Services.GetRequiredService<IOptions<BenchmarkProvenanceOptions>>(), timeProvider: TimeProvider.System);
75+
var mounts = (await BoundedText.ReadAsync(ScaleServerCgroupHierarchy.MountInfoPath,
76+
settings.Value.MaxHardwareBytes, budget, token)).Value;
77+
await Assert.That(mounts).IsNotNull();
78+
await File.WriteAllTextAsync(Path.Combine(root, MountInfoFile), mounts!, token);
79+
}
80+
6881
internal async Task CompleteAsync()
6982
{
7083
await collector.CompleteAsync(observation);

‎build/KeyLoad.LoadTests.AppHost/Hardware/ScaleServerCgroupHierarchy.cs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ internal static class ScaleServerCgroupHierarchy
88

99
private const string MountInfoSeparator = " - ";
1010

11-
private const string MountInfoPath = "/proc/self/mountinfo";
11+
internal const string MountInfoPath = "/proc/self/mountinfo";
1212
private const string ControllerFile = "cgroup.controllers";
1313
private const string CpuController = "cpu";
1414
private const string MemoryController = "memory";
@@ -19,7 +19,7 @@ internal static class ScaleServerCgroupHierarchy
1919
internal static async Task<bool> IsSupportedRootAsync(string root, ScaleServerResourceSampleBudget budget,
2020
CancellationToken token)
2121
{
22-
var mounts = (await BoundedText.ReadAsync(MountInfoPath, budget.Settings.MaxFileBytes, budget, token)).Value;
22+
var mounts = (await BoundedText.ReadAsync(MountInfoPath, budget.Settings.MaxHardwareBytes, budget, token)).Value;
2323
var controllers = (await BoundedText.ReadAsync(Path.Combine(root, ControllerFile),
2424
budget.Settings.MaxFileBytes, budget, token)).Value;
2525
return mounts is not null && controllers is not null && IsRootMount(mounts, root)

‎docs/Features/BenchmarkComparisons/SessionExecution.md‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,10 @@ the daemon-reported local mount source through a bounded, noninteractive, read-o
185185
`sudo stat --file-system` command on the Linux runner. This does not require a utility
186186
inside each database image. A missing storage observation remains unqualified; it does not
187187
erase separately captured CPU/RSS evidence or authorize public measurements.
188+
The host mount inventory uses the existing bounded hardware-metadata budget rather
189+
than the smaller per-control-file limit. Native Linux artifacts retain the original
190+
`/proc/self/mountinfo` alongside the resource snapshot, so the actual mount table and
191+
its byte size remain reviewable when several database containers are running.
188192

189193
Local execution retains the actual client binary/source/process identity with no
190194
invented GitHub provenance; every database server, KeyLoad included, is identified

0 commit comments

Comments
 (0)