Skip to content

Commit fe5b2f5

Browse files
authored
Fix builds when --keepFiles is specified (#2423)
* Include guid in build artifacts directory when --keepFiles is specified. * Use an auto-incremented id instead of guid. Always use same ProgramName regardless of --keepFiles. Include benchmark assembly name in ProgramName. * Fix InProcessBenchmarkEmitsSameIL tests. * Added comment from PR feedback.
1 parent 6367ad8 commit fe5b2f5

File tree

2 files changed

+17
-4
lines changed

2 files changed

+17
-4
lines changed

src/BenchmarkDotNet/Running/BuildPartition.cs

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.IO;
33
using System.Reflection;
4+
using System.Threading;
45
using BenchmarkDotNet.Characteristics;
56
using BenchmarkDotNet.Configs;
67
using BenchmarkDotNet.Environments;
@@ -18,12 +19,20 @@ namespace BenchmarkDotNet.Running
1819
{
1920
public class BuildPartition
2021
{
22+
// We use an auto-increment global counter instead of Guid to guarantee uniqueness per benchmark run (Guid has a small chance to collide),
23+
// assuming there are fewer than 4 billion build partitions (a safe assumption).
24+
internal static int s_partitionCounter;
25+
2126
public BuildPartition(BenchmarkBuildInfo[] benchmarks, IResolver resolver)
2227
{
2328
Resolver = resolver;
2429
RepresentativeBenchmarkCase = benchmarks[0].BenchmarkCase;
2530
Benchmarks = benchmarks;
26-
ProgramName = benchmarks[0].Config.Options.IsSet(ConfigOptions.KeepBenchmarkFiles) ? RepresentativeBenchmarkCase.Job.FolderInfo : Guid.NewGuid().ToString();
31+
// Combine the benchmark's assembly name, folder info, and build partition id.
32+
string benchmarkAssemblyName = RepresentativeBenchmarkCase.Descriptor.Type.Assembly.GetName().Name;
33+
string folderInfo = RepresentativeBenchmarkCase.Job.FolderInfo;
34+
int id = Interlocked.Increment(ref s_partitionCounter);
35+
ProgramName = $"{benchmarkAssemblyName}-{folderInfo}-{id}";
2736
LogBuildOutput = benchmarks[0].Config.Options.IsSet(ConfigOptions.LogBuildOutput);
2837
GenerateMSBuildBinLog = benchmarks[0].Config.Options.IsSet(ConfigOptions.GenerateMSBuildBinLog);
2938
}

tests/BenchmarkDotNet.IntegrationTests/InProcessEmitTest.cs

+7-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using BenchmarkDotNet.Jobs;
1111
using BenchmarkDotNet.Loggers;
1212
using BenchmarkDotNet.Reports;
13+
using BenchmarkDotNet.Running;
1314
using BenchmarkDotNet.Tests.Loggers;
1415
using BenchmarkDotNet.Tests.XUnit;
1516
using BenchmarkDotNet.Toolchains.InProcess.Emit;
@@ -68,10 +69,13 @@ private void DiffEmit(Summary summary)
6869
if (!Portability.RuntimeInformation.IsFullFramework)
6970
return;
7071

71-
var caseName = summary.BenchmarksCases.First().Job.ToString();
72+
var benchmarkCase = summary.BenchmarksCases.First();
73+
var caseName = $"{benchmarkCase.Descriptor.Type.Assembly.GetName().Name}-{benchmarkCase.Job.FolderInfo}";
74+
// The benchmark config built jobs with 2 toolchains, 1 InProcessEmit and 1 Roslyn,
75+
// so we need to subtract 1 from the partition counter to obtain the emit output.
7276
NaiveRunnableEmitDiff.RunDiff(
73-
$@"{caseName}.exe",
74-
$@"{caseName}Emitted.dll",
77+
$@"{caseName}-{BuildPartition.s_partitionCounter}.exe",
78+
$@"{caseName}-{BuildPartition.s_partitionCounter - 1}Emitted.dll",
7579
ConsoleLogger.Default);
7680
}
7781

0 commit comments

Comments
 (0)