fix(diag): identify the binary measured by soak reports

This commit is contained in:
Erik 2026-07-24 13:21:08 +02:00
parent 1560c0513f
commit 24f898c54d
2 changed files with 70 additions and 3 deletions

View file

@ -289,6 +289,35 @@ public sealed class ConnectedR6SoakContractTests
Assert.Contains("$env:ACDREAM_DUMP_MOVE_TRUTH = '1'", source, StringComparison.Ordinal);
}
[Fact]
public void BaselineIdentityComesFromTheMeasuredBinaryRatherThanOnlyTheCheckout()
{
string source = File.ReadAllText(Path.Combine(
FindRepoRoot(),
"tools",
"run-connected-r6-soak.ps1"));
AssertAppearsInOrder(
source,
"$sourceCommit = (& git -C $Repository rev-parse HEAD).Trim()",
"[Diagnostics.FileVersionInfo]::GetVersionInfo($exe).ProductVersion",
"$binaryCommitMatch = [regex]::Match(",
"$commit = if ($null -ne $binaryCommit) { $binaryCommit } else { $sourceCommit }",
"$binaryMatchesSource = $null -ne $binaryCommit -and $binaryCommit -eq $sourceCommit");
Assert.Contains(
"status --short --untracked-files=no",
source,
StringComparison.Ordinal);
Assert.Contains("BinaryProductVersion = $binaryProductVersion", source);
Assert.Contains("BinaryCommit = $binaryCommit", source);
Assert.Contains("BinaryMatchesSource = $binaryMatchesSource", source);
Assert.Contains("TrackedSourceStatus = @($sourceStatus)", source);
Assert.Contains(
"measured binary commit $binaryCommit differs from checked-out source commit $sourceCommit",
source,
StringComparison.Ordinal);
}
[Fact]
public void SoakExportsAndSummarizesFrameHistory()
{

View file

@ -625,8 +625,35 @@ if (-not $SkipBuild) {
if (-not (Test-Path -LiteralPath $exe)) { throw "client executable not found: $exe" }
if (-not (Test-Path -LiteralPath $cliDll)) { throw "CLI assembly not found: $cliDll" }
$commit = (& git -C $Repository rev-parse HEAD).Trim()
$sourceStatus = @(& git -C $Repository status --short)
$sourceCommit = (& git -C $Repository rev-parse HEAD).Trim()
# -SkipBuild is intentionally supported, so the checked-out source commit is
# not necessarily the binary being measured. Read the SDK-stamped
# AssemblyInformationalVersion from the executable and make the BINARY commit
# the baseline identity. Otherwise a docs-only commit after a build can
# silently mislabel every performance artifact.
$binaryProductVersion = [Diagnostics.FileVersionInfo]::GetVersionInfo($exe).ProductVersion
$binaryCommitMatch = [regex]::Match(
[string]$binaryProductVersion,
'\+([0-9a-fA-F]{40})(?:\.|$)')
$binaryCommit = if ($binaryCommitMatch.Success) {
$binaryCommitMatch.Groups[1].Value.ToLowerInvariant()
}
else {
$null
}
$commit = if ($null -ne $binaryCommit) { $binaryCommit } else { $sourceCommit }
$binaryMatchesSource = $null -ne $binaryCommit -and $binaryCommit -eq $sourceCommit
# Generated logs and artifacts may be untracked beside a clean source tree.
# The reproducibility contract is about tracked source modifications.
$sourceStatus = @(& git -C $Repository status --short --untracked-files=no)
if ($null -eq $binaryCommit) {
$failures.Add(
"client binary ProductVersion '$binaryProductVersion' does not identify a 40-character source commit")
}
elseif (-not $binaryMatchesSource) {
$warnings.Add(
"measured binary commit $binaryCommit differs from checked-out source commit $sourceCommit")
}
$videoControllers = @(Get-CimInstance Win32_VideoController -ErrorAction SilentlyContinue | ForEach-Object {
[pscustomobject]@{ Name = $_.Name; DriverVersion = $_.DriverVersion; AdapterRam = $_.AdapterRAM }
})
@ -670,6 +697,11 @@ $acdreamEnvVars = Get-ChildItem Env: | Where-Object { $_.Name -like 'ACDREAM_*'
$envDisclosure = [pscustomobject][ordered]@{
Script = 'run-connected-r6-soak.ps1'
GeneratedUtc = [DateTime]::UtcNow.ToString('O')
SourceCommit = $sourceCommit
BinaryProductVersion = $binaryProductVersion
BinaryCommit = $binaryCommit
BinaryMatchesSource = $binaryMatchesSource
TrackedSourceStatus = @($sourceStatus)
Uncapped = [bool]$Uncapped
DenseTown = [bool]$DenseTown
CaptureContention = [bool]$CaptureContention
@ -683,7 +715,9 @@ $envDisclosure | ConvertTo-Json -Depth 4 |
try {
$process = Start-Process -FilePath $exe -WorkingDirectory $Repository `
-RedirectStandardOutput $stdoutLog -RedirectStandardError $stderrLog -PassThru
Write-Marker "launch pid=$($process.Id) commit=$commit session='$env:SESSIONNAME'"
Write-Marker (
"launch pid=$($process.Id) binaryCommit=$commit sourceCommit=$sourceCommit " +
"binaryMatchesSource=$binaryMatchesSource session='$env:SESSIONNAME'")
$null = Wait-ForLogPattern $process $stdoutLog 'live: in world' 1 $LoginTimeoutSeconds
# Attach EventPipe observers only after normal CLR/client startup. Starting
@ -866,6 +900,10 @@ finally {
FinishedUtc = [DateTime]::UtcNow.ToString('O')
ElapsedSeconds = [Math]::Round($stopwatch.Elapsed.TotalSeconds, 3)
Commit = $commit
SourceCommit = $sourceCommit
BinaryProductVersion = $binaryProductVersion
BinaryCommit = $binaryCommit
BinaryMatchesSource = $binaryMatchesSource
SessionName = $env:SESSIONNAME
ExitCode = $exitCode
GracefulExit = $gracefulExit