Skip to content

NUnit: emit test.final_status on terminal executions#8216

Merged
tonyredondo merged 10 commits intomasterfrom
fix/nunit-final-status-before-close
Feb 20, 2026
Merged

NUnit: emit test.final_status on terminal executions#8216
tonyredondo merged 10 commits intomasterfrom
fix/nunit-final-status-before-close

Conversation

@tonyredondo
Copy link
Member

@tonyredondo tonyredondo commented Feb 18, 2026

Summary of changes

  • Make NUnit emit test.final_status when that execution is the final one for the test.
  • Explicitly set test.final_status=skip for pre-execution skips and disabled tests.
  • Keep retry behavior consistent by setting test.final_status on terminal retry executions.
  • Update CI assertion helpers to avoid local false failures caused by leftover optional metadata keys.

Reason for change

People use test.final_status to answer simple questions like “which tests ultimately failed?”

NUnit still had a few paths where that tag could be missing or inconsistent (especially around skip/disabled and non-retry paths). This PR makes the behavior consistent with the intended rule: set the tag when no more retries will run.

Implementation details

  • tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Testing/NUnit/NUnitIntegration.cs

    • In pre-execution skip path, set final_status=skip before closing the test span.
  • tracer/src/Datadog.Trace/ClrProfiler/AutoInstrumentation/Testing/NUnit/TestOptimizationTestCommand.cs

    • Set final_status=skip for disabled tests.
    • On non-retry executions, check whether EFD/ATR/ATF will schedule retries.
    • If no retry will happen, set final_status from the current execution outcome.
    • Keep existing terminal-retry final_status behavior.
  • tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/CI/TestingFrameworkEvpTest.cs

  • tracer/test/Datadog.Trace.ClrProfiler.IntegrationTests/CI/TestingFrameworkTest.cs

    • Always remove checked metadata keys after assertions to prevent local Assert.Single() noise.

Test coverage

  • Targeted NUnit coverage for changed behavior was re-run:
    • NUnitTests.SubmitTraces
    • NUnitEvpTests.SubmitTraces
    • NUnitEvpTests.EarlyFlakeDetection
    • NUnitEvpTests.QuarantinedTests
    • NUnitEvpTests.DisabledTests
    • NUnitEvpTests.AttemptToFixTests
  • Result: 13/13 passed.

Other details

Set final_status for non-retry NUnit executions in ExecuteTest(), before FinishTest() closes the span, to avoid missing test.final_status in flaky CI snapshot runs.
Ensure NUnit writes test.final_status only on final retry executions, and stop writing it for non-retry and pre-execution skip paths to eliminate close-order race behavior and align with the feature contract. Update NUnit snapshot baselines to match the retry-only tag semantics.
@tonyredondo tonyredondo changed the title [Test Optimization] Set NUnit final_status before closing test spans [Test Optimization] Make NUnit final_status retry-only Feb 18, 2026
…tatus

Update additional NUnit EVP snapshot baselines to remove test.final_status on non-retry executions, matching the retry-only contract and the behavior now emitted by the NUnit integration paths.
Drop investigation-only runtime logging and temporary StyleCop suppressions from NUnit test optimization paths while keeping the retry-only final_status behavior and snapshot baselines unchanged.
Ensure CI environment tag checks always remove inspected keys from the target span, even when the generated reference span does not contain that tag, so leftover tags don't cause downstream assertion noise.
@tonyredondo tonyredondo requested a review from a team as a code owner February 19, 2026 11:15
… tests

Keep final_status retry-only for EFD, ATR, and ATF while setting final_status=skip for quarantined tests that do not retry, so quarantined outcomes remain queryable in CI Visibility.
@tonyredondo tonyredondo changed the title [Test Optimization] Make NUnit final_status retry-only [Test Optimization] Stabilize NUnit final_status semantics Feb 19, 2026
…antics

Set test.final_status on executions that will not be retried anymore (including pre-skip and disabled paths) while keeping final-retry behavior for retry features. Update NUnit snapshot baselines and EVP metadata cleanup assertions so integration verification remains stable.
@tonyredondo tonyredondo changed the title [Test Optimization] Stabilize NUnit final_status semantics NUnit: make test.final_status match the final test outcome Feb 19, 2026
@DataDog DataDog deleted a comment from pr-commenter bot Feb 19, 2026
@DataDog DataDog deleted a comment from dd-trace-dotnet-ci-bot bot Feb 19, 2026
@DataDog DataDog deleted a comment from github-actions bot Feb 19, 2026
@tonyredondo tonyredondo changed the title NUnit: make test.final_status match the final test outcome NUnit: emit test.final_status on terminal executions Feb 19, 2026
@pr-commenter
Copy link

pr-commenter bot commented Feb 19, 2026

Benchmarks

Benchmark execution time: 2026-02-20 13:07:05

Comparing candidate commit 696c0ea in PR branch fix/nunit-final-status-before-close with baseline commit 8941a2d in branch master.

Found 4 performance improvements and 10 performance regressions! Performance is the same for 161 metrics, 17 unstable metrics.

scenario:Benchmarks.Trace.AgentWriterBenchmark.WriteAndFlushEnrichedTraces net6.0

  • 🟥 execution_time [+18.336ms; +18.380ms] or [+17.917%; +17.960%]

scenario:Benchmarks.Trace.Asm.AppSecEncoderBenchmark.EncodeLegacyArgs net6.0

  • 🟩 execution_time [-25.201ms; -24.443ms] or [-12.421%; -12.048%]

scenario:Benchmarks.Trace.Asm.AppSecWafBenchmark.RunWafRealisticBenchmark netcoreapp3.1

  • 🟩 execution_time [-320.786µs; -247.760µs] or [-41.986%; -32.428%]

scenario:Benchmarks.Trace.AspNetCoreBenchmark.SendRequest net6.0

  • 🟥 execution_time [+54.798ms; +60.474ms] or [+58.237%; +64.270%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net472

  • 🟥 throughput [-218.138op/s; -188.816op/s] or [-18.252%; -15.799%]

scenario:Benchmarks.Trace.CIVisibilityProtocolWriterBenchmark.WriteAndFlushEnrichedTraces net6.0

  • 🟥 execution_time [+19.068ms; +23.418ms] or [+9.904%; +12.163%]
  • 🟩 throughput [+217.892op/s; +251.336op/s] or [+15.422%; +17.790%]

scenario:Benchmarks.Trace.CharSliceBenchmark.OptimizedCharSlice net6.0

  • 🟥 execution_time [+169.029µs; +174.304µs] or [+12.316%; +12.701%]
  • 🟥 throughput [-82.218op/s; -79.802op/s] or [-11.283%; -10.952%]

scenario:Benchmarks.Trace.ElasticsearchBenchmark.CallElasticsearchAsync netcoreapp3.1

  • 🟥 execution_time [+10.102ms; +13.202ms] or [+5.062%; +6.615%]

scenario:Benchmarks.Trace.ILoggerBenchmark.EnrichedLog net6.0

  • 🟥 execution_time [+12.772ms; +18.518ms] or [+6.463%; +9.370%]

scenario:Benchmarks.Trace.Log4netBenchmark.EnrichedLog netcoreapp3.1

  • 🟥 execution_time [+33.910ms; +36.272ms] or [+20.434%; +21.858%]

scenario:Benchmarks.Trace.SingleSpanAspNetCoreBenchmark.SingleSpanAspNetCore netcoreapp3.1

  • 🟥 throughput [-16073097.818op/s; -14947174.843op/s] or [-6.664%; -6.197%]

scenario:Benchmarks.Trace.SpanBenchmark.StartFinishTwoScopes net6.0

  • 🟩 execution_time [-15.243ms; -14.326ms] or [-7.104%; -6.677%]

@dd-trace-dotnet-ci-bot
Copy link

Execution-Time Benchmarks Report ⏱️

Execution-time results for samples comparing This PR (8216) and master.

✅ No regressions detected - check the details below

Full Metrics Comparison

FakeDbCommand

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration74.39 ± (74.38 - 74.73) ms72.82 ± (72.87 - 73.15) ms-2.1%
.NET Framework 4.8 - Bailout
duration79.27 ± (79.07 - 79.45) ms77.18 ± (77.02 - 77.42) ms-2.6%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1075.93 ± (1076.04 - 1081.62) ms1060.43 ± (1061.42 - 1068.20) ms-1.4%
.NET Core 3.1 - Baseline
process.internal_duration_ms22.78 ± (22.74 - 22.83) ms22.53 ± (22.49 - 22.57) ms-1.1%
process.time_to_main_ms85.71 ± (85.49 - 85.93) ms84.23 ± (84.06 - 84.41) ms-1.7%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.93 ± (10.92 - 10.93) MB10.91 ± (10.90 - 10.91) MB-0.2%
runtime.dotnet.threads.count12 ± (12 - 12)12 ± (12 - 12)+0.0%
.NET Core 3.1 - Bailout
process.internal_duration_ms22.71 ± (22.67 - 22.76) ms22.40 ± (22.37 - 22.44) ms-1.4%
process.time_to_main_ms87.22 ± (87.00 - 87.43) ms85.97 ± (85.77 - 86.16) ms-1.4%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.95 ± (10.94 - 10.95) MB10.94 ± (10.93 - 10.94) MB-0.1%
runtime.dotnet.threads.count13 ± (13 - 13)13 ± (13 - 13)+0.0%
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms237.93 ± (233.96 - 241.89) ms245.17 ± (241.18 - 249.16) ms+3.0%✅⬆️
process.time_to_main_ms491.11 ± (490.39 - 491.83) ms482.21 ± (481.52 - 482.89) ms-1.8%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed47.63 ± (47.61 - 47.65) MB47.63 ± (47.61 - 47.66) MB+0.0%✅⬆️
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-0.2%
.NET 6 - Baseline
process.internal_duration_ms21.44 ± (21.40 - 21.49) ms21.27 ± (21.24 - 21.31) ms-0.8%
process.time_to_main_ms74.15 ± (73.99 - 74.31) ms73.49 ± (73.31 - 73.67) ms-0.9%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.63 ± (10.62 - 10.63) MB10.64 ± (10.63 - 10.64) MB+0.1%✅⬆️
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 6 - Bailout
process.internal_duration_ms21.42 ± (21.36 - 21.47) ms21.22 ± (21.17 - 21.27) ms-0.9%
process.time_to_main_ms76.10 ± (75.91 - 76.29) ms74.43 ± (74.27 - 74.59) ms-2.2%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed10.67 ± (10.67 - 10.68) MB10.74 ± (10.74 - 10.74) MB+0.6%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms254.10 ± (250.50 - 257.71) ms257.53 ± (254.89 - 260.17) ms+1.3%✅⬆️
process.time_to_main_ms472.83 ± (472.12 - 473.54) ms462.89 ± (462.26 - 463.52) ms-2.1%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed48.37 ± (48.35 - 48.39) MB48.36 ± (48.33 - 48.38) MB-0.0%
runtime.dotnet.threads.count28 ± (28 - 28)28 ± (28 - 28)-0.1%
.NET 8 - Baseline
process.internal_duration_ms19.56 ± (19.52 - 19.61) ms19.32 ± (19.28 - 19.36) ms-1.2%
process.time_to_main_ms73.27 ± (73.11 - 73.43) ms72.06 ± (71.90 - 72.21) ms-1.7%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.69 ± (7.68 - 7.69) MB7.66 ± (7.66 - 7.67) MB-0.3%
runtime.dotnet.threads.count10 ± (10 - 10)10 ± (10 - 10)+0.0%
.NET 8 - Bailout
process.internal_duration_ms19.58 ± (19.53 - 19.63) ms19.32 ± (19.28 - 19.35) ms-1.4%
process.time_to_main_ms74.58 ± (74.42 - 74.74) ms72.93 ± (72.80 - 73.07) ms-2.2%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed7.72 ± (7.71 - 7.72) MB7.72 ± (7.72 - 7.73) MB+0.1%✅⬆️
runtime.dotnet.threads.count11 ± (11 - 11)11 ± (11 - 11)+0.0%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms188.17 ± (187.22 - 189.12) ms186.40 ± (185.44 - 187.36) ms-0.9%
process.time_to_main_ms450.45 ± (449.65 - 451.25) ms444.18 ± (443.32 - 445.05) ms-1.4%
runtime.dotnet.exceptions.count0 ± (0 - 0)0 ± (0 - 0)+0.0%
runtime.dotnet.mem.committed35.97 ± (35.93 - 36.00) MB36.01 ± (35.97 - 36.04) MB+0.1%✅⬆️
runtime.dotnet.threads.count27 ± (27 - 27)27 ± (27 - 27)+0.1%✅⬆️

HttpMessageHandler

Metric Master (Mean ± 95% CI) Current (Mean ± 95% CI) Change Status
.NET Framework 4.8 - Baseline
duration194.22 ± (196.11 - 198.56) ms193.46 ± (193.51 - 194.50) ms-0.4%
.NET Framework 4.8 - Bailout
duration198.35 ± (198.18 - 198.85) ms197.06 ± (196.80 - 197.39) ms-0.6%
.NET Framework 4.8 - CallTarget+Inlining+NGEN
duration1139.21 ± (1140.45 - 1148.21) ms1185.80 ± (1178.83 - 1194.54) ms+4.1%✅⬆️
.NET Core 3.1 - Baseline
process.internal_duration_ms189.42 ± (189.00 - 189.84) ms191.24 ± (190.92 - 191.56) ms+1.0%✅⬆️
process.time_to_main_ms81.82 ± (81.61 - 82.04) ms83.28 ± (83.07 - 83.49) ms+1.8%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.05 ± (16.03 - 16.07) MB16.10 ± (16.08 - 16.13) MB+0.3%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (20 - 20)+0.1%✅⬆️
.NET Core 3.1 - Bailout
process.internal_duration_ms187.83 ± (187.54 - 188.13) ms191.42 ± (191.02 - 191.81) ms+1.9%✅⬆️
process.time_to_main_ms82.75 ± (82.58 - 82.93) ms84.21 ± (84.04 - 84.37) ms+1.8%✅⬆️
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed16.12 ± (16.09 - 16.15) MB16.14 ± (16.11 - 16.17) MB+0.1%✅⬆️
runtime.dotnet.threads.count20 ± (20 - 21)21 ± (20 - 21)+0.4%✅⬆️
.NET Core 3.1 - CallTarget+Inlining+NGEN
process.internal_duration_ms440.07 ± (437.86 - 442.29) ms441.15 ± (438.91 - 443.40) ms+0.2%✅⬆️
process.time_to_main_ms474.62 ± (474.16 - 475.07) ms474.09 ± (473.46 - 474.73) ms-0.1%
runtime.dotnet.exceptions.count3 ± (3 - 3)3 ± (3 - 3)+0.0%
runtime.dotnet.mem.committed57.82 ± (57.70 - 57.94) MB57.89 ± (57.78 - 58.01) MB+0.1%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 30)29 ± (29 - 29)-0.1%
.NET 6 - Baseline
process.internal_duration_ms192.20 ± (191.82 - 192.59) ms191.56 ± (191.21 - 191.92) ms-0.3%
process.time_to_main_ms70.60 ± (70.40 - 70.80) ms70.41 ± (70.25 - 70.58) ms-0.3%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed15.88 ± (15.72 - 16.04) MB16.33 ± (16.24 - 16.42) MB+2.8%✅⬆️
runtime.dotnet.threads.count18 ± (18 - 18)19 ± (18 - 19)+3.6%✅⬆️
.NET 6 - Bailout
process.internal_duration_ms191.61 ± (191.33 - 191.90) ms191.65 ± (191.31 - 191.98) ms+0.0%✅⬆️
process.time_to_main_ms71.59 ± (71.46 - 71.71) ms71.41 ± (71.30 - 71.51) ms-0.3%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed16.37 ± (16.29 - 16.46) MB16.26 ± (16.13 - 16.38) MB-0.7%
runtime.dotnet.threads.count20 ± (20 - 20)20 ± (19 - 20)-1.1%
.NET 6 - CallTarget+Inlining+NGEN
process.internal_duration_ms450.93 ± (449.04 - 452.81) ms451.86 ± (450.43 - 453.29) ms+0.2%✅⬆️
process.time_to_main_ms450.26 ± (449.69 - 450.83) ms450.65 ± (450.05 - 451.26) ms+0.1%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed58.03 ± (57.92 - 58.14) MB58.10 ± (58.01 - 58.19) MB+0.1%✅⬆️
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)-0.0%
.NET 8 - Baseline
process.internal_duration_ms190.83 ± (190.48 - 191.17) ms190.23 ± (189.85 - 190.61) ms-0.3%
process.time_to_main_ms70.34 ± (70.12 - 70.57) ms69.90 ± (69.71 - 70.09) ms-0.6%
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.72 ± (11.70 - 11.74) MB11.79 ± (11.75 - 11.82) MB+0.6%✅⬆️
runtime.dotnet.threads.count18 ± (18 - 18)18 ± (18 - 18)-0.3%
.NET 8 - Bailout
process.internal_duration_ms190.05 ± (189.71 - 190.40) ms189.72 ± (189.47 - 189.98) ms-0.2%
process.time_to_main_ms70.94 ± (70.80 - 71.09) ms70.95 ± (70.79 - 71.12) ms+0.0%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed11.80 ± (11.78 - 11.83) MB11.88 ± (11.84 - 11.91) MB+0.6%✅⬆️
runtime.dotnet.threads.count19 ± (19 - 19)19 ± (19 - 19)-0.6%
.NET 8 - CallTarget+Inlining+NGEN
process.internal_duration_ms363.58 ± (362.11 - 365.04) ms364.89 ± (363.45 - 366.32) ms+0.4%✅⬆️
process.time_to_main_ms433.57 ± (432.96 - 434.18) ms434.35 ± (433.70 - 434.99) ms+0.2%✅⬆️
runtime.dotnet.exceptions.count4 ± (4 - 4)4 ± (4 - 4)+0.0%
runtime.dotnet.mem.committed47.84 ± (47.80 - 47.88) MB47.79 ± (47.76 - 47.82) MB-0.1%
runtime.dotnet.threads.count29 ± (29 - 29)29 ± (29 - 29)-0.2%
Comparison explanation

Execution-time benchmarks measure the whole time it takes to execute a program, and are intended to measure the one-off costs. Cases where the execution time results for the PR are worse than latest master results are highlighted in **red**. The following thresholds were used for comparing the execution times:

  • Welch test with statistical test for significance of 5%
  • Only results indicating a difference greater than 5% and 5 ms are considered.

Note that these results are based on a single point-in-time result for each branch. For full results, see the dashboard.

Graphs show the p99 interval based on the mean and StdDev of the test run, as well as the mean value of the run (shown as a diamond below the graph).

Duration charts
FakeDbCommand (.NET Framework 4.8)
gantt
    title Execution time (ms) FakeDbCommand (.NET Framework 4.8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8216) - mean (73ms)  : 71, 75
    master - mean (75ms)  : 72, 77

    section Bailout
    This PR (8216) - mean (77ms)  : 75, 79
    master - mean (79ms)  : 77, 81

    section CallTarget+Inlining+NGEN
    This PR (8216) - mean (1,065ms)  : 1016, 1114
    master - mean (1,079ms)  : 1039, 1118

Loading
FakeDbCommand (.NET Core 3.1)
gantt
    title Execution time (ms) FakeDbCommand (.NET Core 3.1)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8216) - mean (114ms)  : 111, 116
    master - mean (115ms)  : 111, 120

    section Bailout
    This PR (8216) - mean (115ms)  : 113, 118
    master - mean (117ms)  : 114, 120

    section CallTarget+Inlining+NGEN
    This PR (8216) - mean (760ms)  : 701, 818
    master - mean (763ms)  : 706, 820

Loading
FakeDbCommand (.NET 6)
gantt
    title Execution time (ms) FakeDbCommand (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8216) - mean (101ms)  : 98, 104
    master - mean (102ms)  : 99, 105

    section Bailout
    This PR (8216) - mean (102ms)  : 99, 105
    master - mean (104ms)  : 101, 107

    section CallTarget+Inlining+NGEN
    This PR (8216) - mean (749ms)  : 698, 801
    master - mean (759ms)  : 700, 819

Loading
FakeDbCommand (.NET 8)
gantt
    title Execution time (ms) FakeDbCommand (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8216) - mean (99ms)  : 96, 102
    master - mean (101ms)  : 98, 103

    section Bailout
    This PR (8216) - mean (100ms)  : 98, 102
    master - mean (102ms)  : 99, 105

    section CallTarget+Inlining+NGEN
    This PR (8216) - mean (657ms)  : 644, 670
    master - mean (666ms)  : 654, 679

Loading
HttpMessageHandler (.NET Framework 4.8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET Framework 4.8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8216) - mean (194ms)  : 189, 199
    master - mean (197ms)  : 180, 215

    section Bailout
    This PR (8216) - mean (197ms)  : 194, 200
    master - mean (199ms)  : 195, 202

    section CallTarget+Inlining+NGEN
    This PR (8216) - mean (1,187ms)  : 1072, 1301
    master - mean (1,144ms)  : 1087, 1202

Loading
HttpMessageHandler (.NET Core 3.1)
gantt
    title Execution time (ms) HttpMessageHandler (.NET Core 3.1)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8216) - mean (284ms)  : 279, 289
    master - mean (280ms)  : 272, 287

    section Bailout
    This PR (8216) - mean (284ms)  : 279, 289
    master - mean (279ms)  : 275, 283

    section CallTarget+Inlining+NGEN
    This PR (8216) - mean (945ms)  : 908, 982
    master - mean (944ms)  : 909, 980

Loading
HttpMessageHandler (.NET 6)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 6)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8216) - mean (270ms)  : 265, 275
    master - mean (271ms)  : 266, 276

    section Bailout
    This PR (8216) - mean (271ms)  : 267, 275
    master - mean (271ms)  : 267, 275

    section CallTarget+Inlining+NGEN
    This PR (8216) - mean (933ms)  : 899, 967
    master - mean (931ms)  : 909, 954

Loading
HttpMessageHandler (.NET 8)
gantt
    title Execution time (ms) HttpMessageHandler (.NET 8)
    dateFormat  x
    axisFormat %Q
    todayMarker off
    section Baseline
    This PR (8216) - mean (270ms)  : 265, 275
    master - mean (271ms)  : 266, 276

    section Bailout
    This PR (8216) - mean (270ms)  : 267, 274
    master - mean (270ms)  : 266, 275

    section CallTarget+Inlining+NGEN
    This PR (8216) - mean (831ms)  : 810, 851
    master - mean (828ms)  : 809, 846

Loading

Copy link
Member

@andrewlock andrewlock left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I take your word for it in general 😅

!tools/dumps/start_debian-arm64.sh

# test optimization temp/run folder
.dd/ No newline at end of file
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ooooh, so that's where that was coming from 😅

I'm kinda surprised this isn't a problem for customers tbh 🤔

Clarify that the non-retry branch only sets final_status when no retry will run, while final retry handling is performed in the isFinalExecution path below.
@tonyredondo tonyredondo merged commit 123d9cd into master Feb 20, 2026
140 checks passed
@tonyredondo tonyredondo deleted the fix/nunit-final-status-before-close branch February 20, 2026 15:16
@github-actions github-actions bot added this to the vNext-v3 milestone Feb 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants