Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics - #126666

Merged
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress
Apr 9, 2026
Merged

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics#126666
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

OleTxTests.Recovery intermittently hangs (20+ min) waiting on MSDTC, killing CI work items. Previous approach skipped the test under stress modes, but the hang also occurs on regular CoreCLR runs.

Changes

vartestCompleted=newManualResetEventSlim(false);varwatchdog=newThread(()=>{if(!testCompleted.Wait(TimeSpan.FromMinutes(5)))Environment.FailFast("OleTxTests.Recovery did not complete within 5 minutes. See https://github.com/dotnet/runtime/issues/126304");});watchdog.IsBackground=true;watchdog.Start();try{Test(()=>{/* ... */});}finally{testCompleted.Set();}

The watchdog thread is a background thread and the completion signal is in a finally block, so it does not interfere with normal test execution.

The Recovery test consistently times out (20+ min) under stress modes
(fullpgo, jitstress2_jitstressregs) — confirmed from Helix logs across
multiple hits. PR #125813 added a 120s child-process timeout but the
main thread still hangs waiting for MSDTC under slow runtimes.
This is a libraries-level test exercising MSDTC/OLE transaction recovery;
running it under JIT stress provides no additional signal. Skip it on
all non-regular CoreCLR test modes.
Fixes#126304
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 8, 2026 22:06
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to prevent System.Transactions.Local CI work item timeouts by skipping the long-running OleTxTests.Recovery test when running under non-regular CoreCLR test modes (e.g., JIT stress configurations).

Changes:

  • Add a SkipOnCoreClr attribute to OleTxTests.Recovery intended to exclude non-regular CoreCLR test modes.
Show a summary per file
FileDescription
src/libraries/System.Transactions.Local/tests/OleTxTests.csAdds CoreCLR-mode-based skip metadata to avoid stress-mode timeouts in Recovery()

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Note

This review was generated by Copilot.

🤖 Copilot Code Review — PR #126666

Holistic Assessment

Motivation: The Recovery test consistently times out (20+ min) under JIT stress modes (fullpgo, jitstress2_jitstressregs) due to MSDTC operations being extremely slow under stress runtimes. This is a libraries-level test exercising MSDTC distributed transaction recovery — running it under JIT stress provides no additional signal. The motivation is clear and justified.

Approach: Adding [SkipOnCoreClr("...", ~RuntimeTestModes.RegularRun)] is the established pattern for disabling tests under all non-regular CoreCLR stress modes. This matches the exact pattern used in System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.Etw.cs for similar timeout-sensitive tests. The approach is correct and minimal.

Summary: ✅ LGTM. Single-line, well-targeted change that follows established conventions for skipping timeout-sensitive infrastructure tests under stress modes. The attribute semantics are correct, the namespace resolves via the existing using Xunit; import, and no new public API surface is introduced.


Detailed Findings

✅ Correctness — Attribute semantics are correct

~RuntimeTestModes.RegularRun is the bitwise complement of RegularRun (= 1), which matches all other flags (JitStress, JitStressRegs, JitMinOpts, TailcallStress, DisableR2R, GCStress3, etc.) — exactly the modes where this test times out. The test will continue to run in RegularRun mode, preserving normal CI coverage. The SkipOnCoreClrAttribute and RuntimeTestModes enum are both in the Xunit namespace, which is already imported at line 7 of the file.

✅ Convention consistency — Matches established pattern

This pattern is identical to the one used in System.Diagnostics.Tracing tests (TestsManifestGeneration.Etw.cs:26, 67) and is documented in docs/workflow/testing/libraries/filtering-tests.md. The skip reason message is descriptive and explains both the symptom and rationale.

✅ No new public API surface

The change only modifies a test file. No ref/ assembly changes, no new public members.

💡 Cross-cutting observation — Promotion tests have similar timeout-sensitive patterns

The Promotion() and Promotion_twice() tests (lines 110–269) also use RemoteExecutor with multiple WaitOne(Timeout) calls and MSDTC operations. Unlike Recovery(), they don't have a RemoteInvokeOptions { TimeOut = 120_000 } guard on the child process, nor a SkipOnCoreClr attribute. If stress modes cause similar slowdowns there, these could also time out — though the Recovery test's crash-and-reenlist flow is uniquely heavy. Worth monitoring, but not blocking for this PR.

Generated by Code Review for issue #126666 ·

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@jkotas

Copy link
Copy Markdown
Member

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of the test. The thread should wait for 5 minutes and then check whether the test completed. If the test did not complete in 5 minutes, crash the process using Environment.FailFast that's going to generate a crash dump that can be investigated. Mentioned #126304 in the fail fast message.

CopilotAI commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of th...

Done in df4852c. I removed the [SkipOnCoreClr] attribute and instead added a background watchdog thread at the start of Recovery(). The thread waits 5 minutes and, if the test hasn't completed by then, calls Environment.FailFast with a message referencing #126304. The testCompleted event is set in a finally block wrapping the Test(...) call so it's always signaled when the test finishes (pass or fail).

CopilotAI changed the title Disable OleTxTests.Recovery under JIT stress configurationsAdd watchdog instrumentation to OleTxTests.Recovery to capture hang diagnosticsApr 9, 2026
CopilotAI requested a review from jkotasApril 9, 2026 05:56
@jkotas

Copy link
Copy Markdown
Member

Just a guess: This can have the same root cause as #105124 . The problem is that System.Transactions.Local has a global timeout setting that is a problem on itself. Moreover, the global timeout setting has buggy implementation with race conditions (reading the timeout value can reset it too in some situations). We may be seeing bad interactions between different tests reading and writing the global timeout on multiple threads in parallel.

@danmoseley
danmoseley enabled auto-merge (squash) April 9, 2026 06:28
@danmoseley

Copy link
Copy Markdown
ContributorAuthor

Aha! Didn't see that one. Let's see what evidence we gather

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@danmoseley@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics - #126666

Merged
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress
Apr 9, 2026
Merged

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics#126666
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

OleTxTests.Recovery intermittently hangs (20+ min) waiting on MSDTC, killing CI work items. Previous approach skipped the test under stress modes, but the hang also occurs on regular CoreCLR runs.

Changes

vartestCompleted=newManualResetEventSlim(false);varwatchdog=newThread(()=>{if(!testCompleted.Wait(TimeSpan.FromMinutes(5)))Environment.FailFast("OleTxTests.Recovery did not complete within 5 minutes. See https://github.com/dotnet/runtime/issues/126304");});watchdog.IsBackground=true;watchdog.Start();try{Test(()=>{/* ... */});}finally{testCompleted.Set();}

The watchdog thread is a background thread and the completion signal is in a finally block, so it does not interfere with normal test execution.

The Recovery test consistently times out (20+ min) under stress modes
(fullpgo, jitstress2_jitstressregs) — confirmed from Helix logs across
multiple hits. PR #125813 added a 120s child-process timeout but the
main thread still hangs waiting for MSDTC under slow runtimes.
This is a libraries-level test exercising MSDTC/OLE transaction recovery;
running it under JIT stress provides no additional signal. Skip it on
all non-regular CoreCLR test modes.
Fixes#126304
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 8, 2026 22:06
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to prevent System.Transactions.Local CI work item timeouts by skipping the long-running OleTxTests.Recovery test when running under non-regular CoreCLR test modes (e.g., JIT stress configurations).

Changes:

  • Add a SkipOnCoreClr attribute to OleTxTests.Recovery intended to exclude non-regular CoreCLR test modes.
Show a summary per file
FileDescription
src/libraries/System.Transactions.Local/tests/OleTxTests.csAdds CoreCLR-mode-based skip metadata to avoid stress-mode timeouts in Recovery()

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Note

This review was generated by Copilot.

🤖 Copilot Code Review — PR #126666

Holistic Assessment

Motivation: The Recovery test consistently times out (20+ min) under JIT stress modes (fullpgo, jitstress2_jitstressregs) due to MSDTC operations being extremely slow under stress runtimes. This is a libraries-level test exercising MSDTC distributed transaction recovery — running it under JIT stress provides no additional signal. The motivation is clear and justified.

Approach: Adding [SkipOnCoreClr("...", ~RuntimeTestModes.RegularRun)] is the established pattern for disabling tests under all non-regular CoreCLR stress modes. This matches the exact pattern used in System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.Etw.cs for similar timeout-sensitive tests. The approach is correct and minimal.

Summary: ✅ LGTM. Single-line, well-targeted change that follows established conventions for skipping timeout-sensitive infrastructure tests under stress modes. The attribute semantics are correct, the namespace resolves via the existing using Xunit; import, and no new public API surface is introduced.


Detailed Findings

✅ Correctness — Attribute semantics are correct

~RuntimeTestModes.RegularRun is the bitwise complement of RegularRun (= 1), which matches all other flags (JitStress, JitStressRegs, JitMinOpts, TailcallStress, DisableR2R, GCStress3, etc.) — exactly the modes where this test times out. The test will continue to run in RegularRun mode, preserving normal CI coverage. The SkipOnCoreClrAttribute and RuntimeTestModes enum are both in the Xunit namespace, which is already imported at line 7 of the file.

✅ Convention consistency — Matches established pattern

This pattern is identical to the one used in System.Diagnostics.Tracing tests (TestsManifestGeneration.Etw.cs:26, 67) and is documented in docs/workflow/testing/libraries/filtering-tests.md. The skip reason message is descriptive and explains both the symptom and rationale.

✅ No new public API surface

The change only modifies a test file. No ref/ assembly changes, no new public members.

💡 Cross-cutting observation — Promotion tests have similar timeout-sensitive patterns

The Promotion() and Promotion_twice() tests (lines 110–269) also use RemoteExecutor with multiple WaitOne(Timeout) calls and MSDTC operations. Unlike Recovery(), they don't have a RemoteInvokeOptions { TimeOut = 120_000 } guard on the child process, nor a SkipOnCoreClr attribute. If stress modes cause similar slowdowns there, these could also time out — though the Recovery test's crash-and-reenlist flow is uniquely heavy. Worth monitoring, but not blocking for this PR.

Generated by Code Review for issue #126666 ·

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@jkotas

Copy link
Copy Markdown
Member

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of the test. The thread should wait for 5 minutes and then check whether the test completed. If the test did not complete in 5 minutes, crash the process using Environment.FailFast that's going to generate a crash dump that can be investigated. Mentioned #126304 in the fail fast message.

CopilotAI commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of th...

Done in df4852c. I removed the [SkipOnCoreClr] attribute and instead added a background watchdog thread at the start of Recovery(). The thread waits 5 minutes and, if the test hasn't completed by then, calls Environment.FailFast with a message referencing #126304. The testCompleted event is set in a finally block wrapping the Test(...) call so it's always signaled when the test finishes (pass or fail).

CopilotAI changed the title Disable OleTxTests.Recovery under JIT stress configurationsAdd watchdog instrumentation to OleTxTests.Recovery to capture hang diagnosticsApr 9, 2026
CopilotAI requested a review from jkotasApril 9, 2026 05:56
@jkotas

Copy link
Copy Markdown
Member

Just a guess: This can have the same root cause as #105124 . The problem is that System.Transactions.Local has a global timeout setting that is a problem on itself. Moreover, the global timeout setting has buggy implementation with race conditions (reading the timeout value can reset it too in some situations). We may be seeing bad interactions between different tests reading and writing the global timeout on multiple threads in parallel.

@danmoseley
danmoseley enabled auto-merge (squash) April 9, 2026 06:28
@danmoseley

Copy link
Copy Markdown
ContributorAuthor

Aha! Didn't see that one. Let's see what evidence we gather

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@danmoseley@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics - #126666

Merged
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress
Apr 9, 2026
Merged

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics#126666
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

OleTxTests.Recovery intermittently hangs (20+ min) waiting on MSDTC, killing CI work items. Previous approach skipped the test under stress modes, but the hang also occurs on regular CoreCLR runs.

Changes

vartestCompleted=newManualResetEventSlim(false);varwatchdog=newThread(()=>{if(!testCompleted.Wait(TimeSpan.FromMinutes(5)))Environment.FailFast("OleTxTests.Recovery did not complete within 5 minutes. See https://github.com/dotnet/runtime/issues/126304");});watchdog.IsBackground=true;watchdog.Start();try{Test(()=>{/* ... */});}finally{testCompleted.Set();}

The watchdog thread is a background thread and the completion signal is in a finally block, so it does not interfere with normal test execution.

The Recovery test consistently times out (20+ min) under stress modes
(fullpgo, jitstress2_jitstressregs) — confirmed from Helix logs across
multiple hits. PR #125813 added a 120s child-process timeout but the
main thread still hangs waiting for MSDTC under slow runtimes.
This is a libraries-level test exercising MSDTC/OLE transaction recovery;
running it under JIT stress provides no additional signal. Skip it on
all non-regular CoreCLR test modes.
Fixes#126304
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 8, 2026 22:06
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to prevent System.Transactions.Local CI work item timeouts by skipping the long-running OleTxTests.Recovery test when running under non-regular CoreCLR test modes (e.g., JIT stress configurations).

Changes:

  • Add a SkipOnCoreClr attribute to OleTxTests.Recovery intended to exclude non-regular CoreCLR test modes.
Show a summary per file
FileDescription
src/libraries/System.Transactions.Local/tests/OleTxTests.csAdds CoreCLR-mode-based skip metadata to avoid stress-mode timeouts in Recovery()

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Note

This review was generated by Copilot.

🤖 Copilot Code Review — PR #126666

Holistic Assessment

Motivation: The Recovery test consistently times out (20+ min) under JIT stress modes (fullpgo, jitstress2_jitstressregs) due to MSDTC operations being extremely slow under stress runtimes. This is a libraries-level test exercising MSDTC distributed transaction recovery — running it under JIT stress provides no additional signal. The motivation is clear and justified.

Approach: Adding [SkipOnCoreClr("...", ~RuntimeTestModes.RegularRun)] is the established pattern for disabling tests under all non-regular CoreCLR stress modes. This matches the exact pattern used in System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.Etw.cs for similar timeout-sensitive tests. The approach is correct and minimal.

Summary: ✅ LGTM. Single-line, well-targeted change that follows established conventions for skipping timeout-sensitive infrastructure tests under stress modes. The attribute semantics are correct, the namespace resolves via the existing using Xunit; import, and no new public API surface is introduced.


Detailed Findings

✅ Correctness — Attribute semantics are correct

~RuntimeTestModes.RegularRun is the bitwise complement of RegularRun (= 1), which matches all other flags (JitStress, JitStressRegs, JitMinOpts, TailcallStress, DisableR2R, GCStress3, etc.) — exactly the modes where this test times out. The test will continue to run in RegularRun mode, preserving normal CI coverage. The SkipOnCoreClrAttribute and RuntimeTestModes enum are both in the Xunit namespace, which is already imported at line 7 of the file.

✅ Convention consistency — Matches established pattern

This pattern is identical to the one used in System.Diagnostics.Tracing tests (TestsManifestGeneration.Etw.cs:26, 67) and is documented in docs/workflow/testing/libraries/filtering-tests.md. The skip reason message is descriptive and explains both the symptom and rationale.

✅ No new public API surface

The change only modifies a test file. No ref/ assembly changes, no new public members.

💡 Cross-cutting observation — Promotion tests have similar timeout-sensitive patterns

The Promotion() and Promotion_twice() tests (lines 110–269) also use RemoteExecutor with multiple WaitOne(Timeout) calls and MSDTC operations. Unlike Recovery(), they don't have a RemoteInvokeOptions { TimeOut = 120_000 } guard on the child process, nor a SkipOnCoreClr attribute. If stress modes cause similar slowdowns there, these could also time out — though the Recovery test's crash-and-reenlist flow is uniquely heavy. Worth monitoring, but not blocking for this PR.

Generated by Code Review for issue #126666 ·

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@jkotas

Copy link
Copy Markdown
Member

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of the test. The thread should wait for 5 minutes and then check whether the test completed. If the test did not complete in 5 minutes, crash the process using Environment.FailFast that's going to generate a crash dump that can be investigated. Mentioned #126304 in the fail fast message.

CopilotAI commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of th...

Done in df4852c. I removed the [SkipOnCoreClr] attribute and instead added a background watchdog thread at the start of Recovery(). The thread waits 5 minutes and, if the test hasn't completed by then, calls Environment.FailFast with a message referencing #126304. The testCompleted event is set in a finally block wrapping the Test(...) call so it's always signaled when the test finishes (pass or fail).

CopilotAI changed the title Disable OleTxTests.Recovery under JIT stress configurationsAdd watchdog instrumentation to OleTxTests.Recovery to capture hang diagnosticsApr 9, 2026
CopilotAI requested a review from jkotasApril 9, 2026 05:56
@jkotas

Copy link
Copy Markdown
Member

Just a guess: This can have the same root cause as #105124 . The problem is that System.Transactions.Local has a global timeout setting that is a problem on itself. Moreover, the global timeout setting has buggy implementation with race conditions (reading the timeout value can reset it too in some situations). We may be seeing bad interactions between different tests reading and writing the global timeout on multiple threads in parallel.

@danmoseley
danmoseley enabled auto-merge (squash) April 9, 2026 06:28
@danmoseley

Copy link
Copy Markdown
ContributorAuthor

Aha! Didn't see that one. Let's see what evidence we gather

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@danmoseley@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics - #126666

Merged
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress
Apr 9, 2026
Merged

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics#126666
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

OleTxTests.Recovery intermittently hangs (20+ min) waiting on MSDTC, killing CI work items. Previous approach skipped the test under stress modes, but the hang also occurs on regular CoreCLR runs.

Changes

vartestCompleted=newManualResetEventSlim(false);varwatchdog=newThread(()=>{if(!testCompleted.Wait(TimeSpan.FromMinutes(5)))Environment.FailFast("OleTxTests.Recovery did not complete within 5 minutes. See https://github.com/dotnet/runtime/issues/126304");});watchdog.IsBackground=true;watchdog.Start();try{Test(()=>{/* ... */});}finally{testCompleted.Set();}

The watchdog thread is a background thread and the completion signal is in a finally block, so it does not interfere with normal test execution.

The Recovery test consistently times out (20+ min) under stress modes
(fullpgo, jitstress2_jitstressregs) — confirmed from Helix logs across
multiple hits. PR #125813 added a 120s child-process timeout but the
main thread still hangs waiting for MSDTC under slow runtimes.
This is a libraries-level test exercising MSDTC/OLE transaction recovery;
running it under JIT stress provides no additional signal. Skip it on
all non-regular CoreCLR test modes.
Fixes#126304
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 8, 2026 22:06
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to prevent System.Transactions.Local CI work item timeouts by skipping the long-running OleTxTests.Recovery test when running under non-regular CoreCLR test modes (e.g., JIT stress configurations).

Changes:

  • Add a SkipOnCoreClr attribute to OleTxTests.Recovery intended to exclude non-regular CoreCLR test modes.
Show a summary per file
FileDescription
src/libraries/System.Transactions.Local/tests/OleTxTests.csAdds CoreCLR-mode-based skip metadata to avoid stress-mode timeouts in Recovery()

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Note

This review was generated by Copilot.

🤖 Copilot Code Review — PR #126666

Holistic Assessment

Motivation: The Recovery test consistently times out (20+ min) under JIT stress modes (fullpgo, jitstress2_jitstressregs) due to MSDTC operations being extremely slow under stress runtimes. This is a libraries-level test exercising MSDTC distributed transaction recovery — running it under JIT stress provides no additional signal. The motivation is clear and justified.

Approach: Adding [SkipOnCoreClr("...", ~RuntimeTestModes.RegularRun)] is the established pattern for disabling tests under all non-regular CoreCLR stress modes. This matches the exact pattern used in System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.Etw.cs for similar timeout-sensitive tests. The approach is correct and minimal.

Summary: ✅ LGTM. Single-line, well-targeted change that follows established conventions for skipping timeout-sensitive infrastructure tests under stress modes. The attribute semantics are correct, the namespace resolves via the existing using Xunit; import, and no new public API surface is introduced.


Detailed Findings

✅ Correctness — Attribute semantics are correct

~RuntimeTestModes.RegularRun is the bitwise complement of RegularRun (= 1), which matches all other flags (JitStress, JitStressRegs, JitMinOpts, TailcallStress, DisableR2R, GCStress3, etc.) — exactly the modes where this test times out. The test will continue to run in RegularRun mode, preserving normal CI coverage. The SkipOnCoreClrAttribute and RuntimeTestModes enum are both in the Xunit namespace, which is already imported at line 7 of the file.

✅ Convention consistency — Matches established pattern

This pattern is identical to the one used in System.Diagnostics.Tracing tests (TestsManifestGeneration.Etw.cs:26, 67) and is documented in docs/workflow/testing/libraries/filtering-tests.md. The skip reason message is descriptive and explains both the symptom and rationale.

✅ No new public API surface

The change only modifies a test file. No ref/ assembly changes, no new public members.

💡 Cross-cutting observation — Promotion tests have similar timeout-sensitive patterns

The Promotion() and Promotion_twice() tests (lines 110–269) also use RemoteExecutor with multiple WaitOne(Timeout) calls and MSDTC operations. Unlike Recovery(), they don't have a RemoteInvokeOptions { TimeOut = 120_000 } guard on the child process, nor a SkipOnCoreClr attribute. If stress modes cause similar slowdowns there, these could also time out — though the Recovery test's crash-and-reenlist flow is uniquely heavy. Worth monitoring, but not blocking for this PR.

Generated by Code Review for issue #126666 ·

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@jkotas

Copy link
Copy Markdown
Member

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of the test. The thread should wait for 5 minutes and then check whether the test completed. If the test did not complete in 5 minutes, crash the process using Environment.FailFast that's going to generate a crash dump that can be investigated. Mentioned #126304 in the fail fast message.

CopilotAI commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of th...

Done in df4852c. I removed the [SkipOnCoreClr] attribute and instead added a background watchdog thread at the start of Recovery(). The thread waits 5 minutes and, if the test hasn't completed by then, calls Environment.FailFast with a message referencing #126304. The testCompleted event is set in a finally block wrapping the Test(...) call so it's always signaled when the test finishes (pass or fail).

CopilotAI changed the title Disable OleTxTests.Recovery under JIT stress configurationsAdd watchdog instrumentation to OleTxTests.Recovery to capture hang diagnosticsApr 9, 2026
CopilotAI requested a review from jkotasApril 9, 2026 05:56
@jkotas

Copy link
Copy Markdown
Member

Just a guess: This can have the same root cause as #105124 . The problem is that System.Transactions.Local has a global timeout setting that is a problem on itself. Moreover, the global timeout setting has buggy implementation with race conditions (reading the timeout value can reset it too in some situations). We may be seeing bad interactions between different tests reading and writing the global timeout on multiple threads in parallel.

@danmoseley
danmoseley enabled auto-merge (squash) April 9, 2026 06:28
@danmoseley

Copy link
Copy Markdown
ContributorAuthor

Aha! Didn't see that one. Let's see what evidence we gather

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@danmoseley@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics - #126666

Merged
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress
Apr 9, 2026
Merged

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics#126666
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

OleTxTests.Recovery intermittently hangs (20+ min) waiting on MSDTC, killing CI work items. Previous approach skipped the test under stress modes, but the hang also occurs on regular CoreCLR runs.

Changes

vartestCompleted=newManualResetEventSlim(false);varwatchdog=newThread(()=>{if(!testCompleted.Wait(TimeSpan.FromMinutes(5)))Environment.FailFast("OleTxTests.Recovery did not complete within 5 minutes. See https://github.com/dotnet/runtime/issues/126304");});watchdog.IsBackground=true;watchdog.Start();try{Test(()=>{/* ... */});}finally{testCompleted.Set();}

The watchdog thread is a background thread and the completion signal is in a finally block, so it does not interfere with normal test execution.

The Recovery test consistently times out (20+ min) under stress modes
(fullpgo, jitstress2_jitstressregs) — confirmed from Helix logs across
multiple hits. PR #125813 added a 120s child-process timeout but the
main thread still hangs waiting for MSDTC under slow runtimes.
This is a libraries-level test exercising MSDTC/OLE transaction recovery;
running it under JIT stress provides no additional signal. Skip it on
all non-regular CoreCLR test modes.
Fixes#126304
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 8, 2026 22:06
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to prevent System.Transactions.Local CI work item timeouts by skipping the long-running OleTxTests.Recovery test when running under non-regular CoreCLR test modes (e.g., JIT stress configurations).

Changes:

  • Add a SkipOnCoreClr attribute to OleTxTests.Recovery intended to exclude non-regular CoreCLR test modes.
Show a summary per file
FileDescription
src/libraries/System.Transactions.Local/tests/OleTxTests.csAdds CoreCLR-mode-based skip metadata to avoid stress-mode timeouts in Recovery()

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Note

This review was generated by Copilot.

🤖 Copilot Code Review — PR #126666

Holistic Assessment

Motivation: The Recovery test consistently times out (20+ min) under JIT stress modes (fullpgo, jitstress2_jitstressregs) due to MSDTC operations being extremely slow under stress runtimes. This is a libraries-level test exercising MSDTC distributed transaction recovery — running it under JIT stress provides no additional signal. The motivation is clear and justified.

Approach: Adding [SkipOnCoreClr("...", ~RuntimeTestModes.RegularRun)] is the established pattern for disabling tests under all non-regular CoreCLR stress modes. This matches the exact pattern used in System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.Etw.cs for similar timeout-sensitive tests. The approach is correct and minimal.

Summary: ✅ LGTM. Single-line, well-targeted change that follows established conventions for skipping timeout-sensitive infrastructure tests under stress modes. The attribute semantics are correct, the namespace resolves via the existing using Xunit; import, and no new public API surface is introduced.


Detailed Findings

✅ Correctness — Attribute semantics are correct

~RuntimeTestModes.RegularRun is the bitwise complement of RegularRun (= 1), which matches all other flags (JitStress, JitStressRegs, JitMinOpts, TailcallStress, DisableR2R, GCStress3, etc.) — exactly the modes where this test times out. The test will continue to run in RegularRun mode, preserving normal CI coverage. The SkipOnCoreClrAttribute and RuntimeTestModes enum are both in the Xunit namespace, which is already imported at line 7 of the file.

✅ Convention consistency — Matches established pattern

This pattern is identical to the one used in System.Diagnostics.Tracing tests (TestsManifestGeneration.Etw.cs:26, 67) and is documented in docs/workflow/testing/libraries/filtering-tests.md. The skip reason message is descriptive and explains both the symptom and rationale.

✅ No new public API surface

The change only modifies a test file. No ref/ assembly changes, no new public members.

💡 Cross-cutting observation — Promotion tests have similar timeout-sensitive patterns

The Promotion() and Promotion_twice() tests (lines 110–269) also use RemoteExecutor with multiple WaitOne(Timeout) calls and MSDTC operations. Unlike Recovery(), they don't have a RemoteInvokeOptions { TimeOut = 120_000 } guard on the child process, nor a SkipOnCoreClr attribute. If stress modes cause similar slowdowns there, these could also time out — though the Recovery test's crash-and-reenlist flow is uniquely heavy. Worth monitoring, but not blocking for this PR.

Generated by Code Review for issue #126666 ·

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@jkotas

Copy link
Copy Markdown
Member

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of the test. The thread should wait for 5 minutes and then check whether the test completed. If the test did not complete in 5 minutes, crash the process using Environment.FailFast that's going to generate a crash dump that can be investigated. Mentioned #126304 in the fail fast message.

CopilotAI commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of th...

Done in df4852c. I removed the [SkipOnCoreClr] attribute and instead added a background watchdog thread at the start of Recovery(). The thread waits 5 minutes and, if the test hasn't completed by then, calls Environment.FailFast with a message referencing #126304. The testCompleted event is set in a finally block wrapping the Test(...) call so it's always signaled when the test finishes (pass or fail).

CopilotAI changed the title Disable OleTxTests.Recovery under JIT stress configurationsAdd watchdog instrumentation to OleTxTests.Recovery to capture hang diagnosticsApr 9, 2026
CopilotAI requested a review from jkotasApril 9, 2026 05:56
@jkotas

Copy link
Copy Markdown
Member

Just a guess: This can have the same root cause as #105124 . The problem is that System.Transactions.Local has a global timeout setting that is a problem on itself. Moreover, the global timeout setting has buggy implementation with race conditions (reading the timeout value can reset it too in some situations). We may be seeing bad interactions between different tests reading and writing the global timeout on multiple threads in parallel.

@danmoseley
danmoseley enabled auto-merge (squash) April 9, 2026 06:28
@danmoseley

Copy link
Copy Markdown
ContributorAuthor

Aha! Didn't see that one. Let's see what evidence we gather

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@danmoseley@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics - #126666

Merged
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress
Apr 9, 2026
Merged

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics#126666
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

OleTxTests.Recovery intermittently hangs (20+ min) waiting on MSDTC, killing CI work items. Previous approach skipped the test under stress modes, but the hang also occurs on regular CoreCLR runs.

Changes

vartestCompleted=newManualResetEventSlim(false);varwatchdog=newThread(()=>{if(!testCompleted.Wait(TimeSpan.FromMinutes(5)))Environment.FailFast("OleTxTests.Recovery did not complete within 5 minutes. See https://github.com/dotnet/runtime/issues/126304");});watchdog.IsBackground=true;watchdog.Start();try{Test(()=>{/* ... */});}finally{testCompleted.Set();}

The watchdog thread is a background thread and the completion signal is in a finally block, so it does not interfere with normal test execution.

The Recovery test consistently times out (20+ min) under stress modes
(fullpgo, jitstress2_jitstressregs) — confirmed from Helix logs across
multiple hits. PR #125813 added a 120s child-process timeout but the
main thread still hangs waiting for MSDTC under slow runtimes.
This is a libraries-level test exercising MSDTC/OLE transaction recovery;
running it under JIT stress provides no additional signal. Skip it on
all non-regular CoreCLR test modes.
Fixes#126304
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 8, 2026 22:06
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to prevent System.Transactions.Local CI work item timeouts by skipping the long-running OleTxTests.Recovery test when running under non-regular CoreCLR test modes (e.g., JIT stress configurations).

Changes:

  • Add a SkipOnCoreClr attribute to OleTxTests.Recovery intended to exclude non-regular CoreCLR test modes.
Show a summary per file
FileDescription
src/libraries/System.Transactions.Local/tests/OleTxTests.csAdds CoreCLR-mode-based skip metadata to avoid stress-mode timeouts in Recovery()

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Note

This review was generated by Copilot.

🤖 Copilot Code Review — PR #126666

Holistic Assessment

Motivation: The Recovery test consistently times out (20+ min) under JIT stress modes (fullpgo, jitstress2_jitstressregs) due to MSDTC operations being extremely slow under stress runtimes. This is a libraries-level test exercising MSDTC distributed transaction recovery — running it under JIT stress provides no additional signal. The motivation is clear and justified.

Approach: Adding [SkipOnCoreClr("...", ~RuntimeTestModes.RegularRun)] is the established pattern for disabling tests under all non-regular CoreCLR stress modes. This matches the exact pattern used in System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.Etw.cs for similar timeout-sensitive tests. The approach is correct and minimal.

Summary: ✅ LGTM. Single-line, well-targeted change that follows established conventions for skipping timeout-sensitive infrastructure tests under stress modes. The attribute semantics are correct, the namespace resolves via the existing using Xunit; import, and no new public API surface is introduced.


Detailed Findings

✅ Correctness — Attribute semantics are correct

~RuntimeTestModes.RegularRun is the bitwise complement of RegularRun (= 1), which matches all other flags (JitStress, JitStressRegs, JitMinOpts, TailcallStress, DisableR2R, GCStress3, etc.) — exactly the modes where this test times out. The test will continue to run in RegularRun mode, preserving normal CI coverage. The SkipOnCoreClrAttribute and RuntimeTestModes enum are both in the Xunit namespace, which is already imported at line 7 of the file.

✅ Convention consistency — Matches established pattern

This pattern is identical to the one used in System.Diagnostics.Tracing tests (TestsManifestGeneration.Etw.cs:26, 67) and is documented in docs/workflow/testing/libraries/filtering-tests.md. The skip reason message is descriptive and explains both the symptom and rationale.

✅ No new public API surface

The change only modifies a test file. No ref/ assembly changes, no new public members.

💡 Cross-cutting observation — Promotion tests have similar timeout-sensitive patterns

The Promotion() and Promotion_twice() tests (lines 110–269) also use RemoteExecutor with multiple WaitOne(Timeout) calls and MSDTC operations. Unlike Recovery(), they don't have a RemoteInvokeOptions { TimeOut = 120_000 } guard on the child process, nor a SkipOnCoreClr attribute. If stress modes cause similar slowdowns there, these could also time out — though the Recovery test's crash-and-reenlist flow is uniquely heavy. Worth monitoring, but not blocking for this PR.

Generated by Code Review for issue #126666 ·

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@jkotas

Copy link
Copy Markdown
Member

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of the test. The thread should wait for 5 minutes and then check whether the test completed. If the test did not complete in 5 minutes, crash the process using Environment.FailFast that's going to generate a crash dump that can be investigated. Mentioned #126304 in the fail fast message.

CopilotAI commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of th...

Done in df4852c. I removed the [SkipOnCoreClr] attribute and instead added a background watchdog thread at the start of Recovery(). The thread waits 5 minutes and, if the test hasn't completed by then, calls Environment.FailFast with a message referencing #126304. The testCompleted event is set in a finally block wrapping the Test(...) call so it's always signaled when the test finishes (pass or fail).

CopilotAI changed the title Disable OleTxTests.Recovery under JIT stress configurationsAdd watchdog instrumentation to OleTxTests.Recovery to capture hang diagnosticsApr 9, 2026
CopilotAI requested a review from jkotasApril 9, 2026 05:56
@jkotas

Copy link
Copy Markdown
Member

Just a guess: This can have the same root cause as #105124 . The problem is that System.Transactions.Local has a global timeout setting that is a problem on itself. Moreover, the global timeout setting has buggy implementation with race conditions (reading the timeout value can reset it too in some situations). We may be seeing bad interactions between different tests reading and writing the global timeout on multiple threads in parallel.

@danmoseley
danmoseley enabled auto-merge (squash) April 9, 2026 06:28
@danmoseley

Copy link
Copy Markdown
ContributorAuthor

Aha! Didn't see that one. Let's see what evidence we gather

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@danmoseley@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics - #126666

Merged
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress
Apr 9, 2026
Merged

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics#126666
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

OleTxTests.Recovery intermittently hangs (20+ min) waiting on MSDTC, killing CI work items. Previous approach skipped the test under stress modes, but the hang also occurs on regular CoreCLR runs.

Changes

vartestCompleted=newManualResetEventSlim(false);varwatchdog=newThread(()=>{if(!testCompleted.Wait(TimeSpan.FromMinutes(5)))Environment.FailFast("OleTxTests.Recovery did not complete within 5 minutes. See https://github.com/dotnet/runtime/issues/126304");});watchdog.IsBackground=true;watchdog.Start();try{Test(()=>{/* ... */});}finally{testCompleted.Set();}

The watchdog thread is a background thread and the completion signal is in a finally block, so it does not interfere with normal test execution.

The Recovery test consistently times out (20+ min) under stress modes
(fullpgo, jitstress2_jitstressregs) — confirmed from Helix logs across
multiple hits. PR #125813 added a 120s child-process timeout but the
main thread still hangs waiting for MSDTC under slow runtimes.
This is a libraries-level test exercising MSDTC/OLE transaction recovery;
running it under JIT stress provides no additional signal. Skip it on
all non-regular CoreCLR test modes.
Fixes#126304
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 8, 2026 22:06
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to prevent System.Transactions.Local CI work item timeouts by skipping the long-running OleTxTests.Recovery test when running under non-regular CoreCLR test modes (e.g., JIT stress configurations).

Changes:

  • Add a SkipOnCoreClr attribute to OleTxTests.Recovery intended to exclude non-regular CoreCLR test modes.
Show a summary per file
FileDescription
src/libraries/System.Transactions.Local/tests/OleTxTests.csAdds CoreCLR-mode-based skip metadata to avoid stress-mode timeouts in Recovery()

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Note

This review was generated by Copilot.

🤖 Copilot Code Review — PR #126666

Holistic Assessment

Motivation: The Recovery test consistently times out (20+ min) under JIT stress modes (fullpgo, jitstress2_jitstressregs) due to MSDTC operations being extremely slow under stress runtimes. This is a libraries-level test exercising MSDTC distributed transaction recovery — running it under JIT stress provides no additional signal. The motivation is clear and justified.

Approach: Adding [SkipOnCoreClr("...", ~RuntimeTestModes.RegularRun)] is the established pattern for disabling tests under all non-regular CoreCLR stress modes. This matches the exact pattern used in System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.Etw.cs for similar timeout-sensitive tests. The approach is correct and minimal.

Summary: ✅ LGTM. Single-line, well-targeted change that follows established conventions for skipping timeout-sensitive infrastructure tests under stress modes. The attribute semantics are correct, the namespace resolves via the existing using Xunit; import, and no new public API surface is introduced.


Detailed Findings

✅ Correctness — Attribute semantics are correct

~RuntimeTestModes.RegularRun is the bitwise complement of RegularRun (= 1), which matches all other flags (JitStress, JitStressRegs, JitMinOpts, TailcallStress, DisableR2R, GCStress3, etc.) — exactly the modes where this test times out. The test will continue to run in RegularRun mode, preserving normal CI coverage. The SkipOnCoreClrAttribute and RuntimeTestModes enum are both in the Xunit namespace, which is already imported at line 7 of the file.

✅ Convention consistency — Matches established pattern

This pattern is identical to the one used in System.Diagnostics.Tracing tests (TestsManifestGeneration.Etw.cs:26, 67) and is documented in docs/workflow/testing/libraries/filtering-tests.md. The skip reason message is descriptive and explains both the symptom and rationale.

✅ No new public API surface

The change only modifies a test file. No ref/ assembly changes, no new public members.

💡 Cross-cutting observation — Promotion tests have similar timeout-sensitive patterns

The Promotion() and Promotion_twice() tests (lines 110–269) also use RemoteExecutor with multiple WaitOne(Timeout) calls and MSDTC operations. Unlike Recovery(), they don't have a RemoteInvokeOptions { TimeOut = 120_000 } guard on the child process, nor a SkipOnCoreClr attribute. If stress modes cause similar slowdowns there, these could also time out — though the Recovery test's crash-and-reenlist flow is uniquely heavy. Worth monitoring, but not blocking for this PR.

Generated by Code Review for issue #126666 ·

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@jkotas

Copy link
Copy Markdown
Member

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of the test. The thread should wait for 5 minutes and then check whether the test completed. If the test did not complete in 5 minutes, crash the process using Environment.FailFast that's going to generate a crash dump that can be investigated. Mentioned #126304 in the fail fast message.

CopilotAI commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of th...

Done in df4852c. I removed the [SkipOnCoreClr] attribute and instead added a background watchdog thread at the start of Recovery(). The thread waits 5 minutes and, if the test hasn't completed by then, calls Environment.FailFast with a message referencing #126304. The testCompleted event is set in a finally block wrapping the Test(...) call so it's always signaled when the test finishes (pass or fail).

CopilotAI changed the title Disable OleTxTests.Recovery under JIT stress configurationsAdd watchdog instrumentation to OleTxTests.Recovery to capture hang diagnosticsApr 9, 2026
CopilotAI requested a review from jkotasApril 9, 2026 05:56
@jkotas

Copy link
Copy Markdown
Member

Just a guess: This can have the same root cause as #105124 . The problem is that System.Transactions.Local has a global timeout setting that is a problem on itself. Moreover, the global timeout setting has buggy implementation with race conditions (reading the timeout value can reset it too in some situations). We may be seeing bad interactions between different tests reading and writing the global timeout on multiple threads in parallel.

@danmoseley
danmoseley enabled auto-merge (squash) April 9, 2026 06:28
@danmoseley

Copy link
Copy Markdown
ContributorAuthor

Aha! Didn't see that one. Let's see what evidence we gather

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@danmoseley@jkotas
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics - #126666

Merged
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress
Apr 9, 2026
Merged

Add watchdog instrumentation to OleTxTests.Recovery to capture hang diagnostics#126666
danmoseley merged 2 commits into
mainfrom
fix/disable-oletx-recovery-stress

Conversation

@danmoseley

@danmoseleydanmoseley commented Apr 8, 2026

Copy link
Copy Markdown
Contributor

OleTxTests.Recovery intermittently hangs (20+ min) waiting on MSDTC, killing CI work items. Previous approach skipped the test under stress modes, but the hang also occurs on regular CoreCLR runs.

Changes

vartestCompleted=newManualResetEventSlim(false);varwatchdog=newThread(()=>{if(!testCompleted.Wait(TimeSpan.FromMinutes(5)))Environment.FailFast("OleTxTests.Recovery did not complete within 5 minutes. See https://github.com/dotnet/runtime/issues/126304");});watchdog.IsBackground=true;watchdog.Start();try{Test(()=>{/* ... */});}finally{testCompleted.Set();}

The watchdog thread is a background thread and the completion signal is in a finally block, so it does not interfere with normal test execution.

The Recovery test consistently times out (20+ min) under stress modes
(fullpgo, jitstress2_jitstressregs) — confirmed from Helix logs across
multiple hits. PR #125813 added a 120s child-process timeout but the
main thread still hangs waiting for MSDTC under slow runtimes.
This is a libraries-level test exercising MSDTC/OLE transaction recovery;
running it under JIT stress provides no additional signal. Skip it on
all non-regular CoreCLR test modes.
Fixes#126304
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 8, 2026 22:06
@github-actionsgithub-actionsBot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Apr 8, 2026
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @JulieLeeMSFT, @jakobbotsch
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR aims to prevent System.Transactions.Local CI work item timeouts by skipping the long-running OleTxTests.Recovery test when running under non-regular CoreCLR test modes (e.g., JIT stress configurations).

Changes:

  • Add a SkipOnCoreClr attribute to OleTxTests.Recovery intended to exclude non-regular CoreCLR test modes.
Show a summary per file
FileDescription
src/libraries/System.Transactions.Local/tests/OleTxTests.csAdds CoreCLR-mode-based skip metadata to avoid stress-mode timeouts in Recovery()

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 1

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Note

This review was generated by Copilot.

🤖 Copilot Code Review — PR #126666

Holistic Assessment

Motivation: The Recovery test consistently times out (20+ min) under JIT stress modes (fullpgo, jitstress2_jitstressregs) due to MSDTC operations being extremely slow under stress runtimes. This is a libraries-level test exercising MSDTC distributed transaction recovery — running it under JIT stress provides no additional signal. The motivation is clear and justified.

Approach: Adding [SkipOnCoreClr("...", ~RuntimeTestModes.RegularRun)] is the established pattern for disabling tests under all non-regular CoreCLR stress modes. This matches the exact pattern used in System.Diagnostics.Tracing/tests/BasicEventSourceTest/TestsManifestGeneration.Etw.cs for similar timeout-sensitive tests. The approach is correct and minimal.

Summary: ✅ LGTM. Single-line, well-targeted change that follows established conventions for skipping timeout-sensitive infrastructure tests under stress modes. The attribute semantics are correct, the namespace resolves via the existing using Xunit; import, and no new public API surface is introduced.


Detailed Findings

✅ Correctness — Attribute semantics are correct

~RuntimeTestModes.RegularRun is the bitwise complement of RegularRun (= 1), which matches all other flags (JitStress, JitStressRegs, JitMinOpts, TailcallStress, DisableR2R, GCStress3, etc.) — exactly the modes where this test times out. The test will continue to run in RegularRun mode, preserving normal CI coverage. The SkipOnCoreClrAttribute and RuntimeTestModes enum are both in the Xunit namespace, which is already imported at line 7 of the file.

✅ Convention consistency — Matches established pattern

This pattern is identical to the one used in System.Diagnostics.Tracing tests (TestsManifestGeneration.Etw.cs:26, 67) and is documented in docs/workflow/testing/libraries/filtering-tests.md. The skip reason message is descriptive and explains both the symptom and rationale.

✅ No new public API surface

The change only modifies a test file. No ref/ assembly changes, no new public members.

💡 Cross-cutting observation — Promotion tests have similar timeout-sensitive patterns

The Promotion() and Promotion_twice() tests (lines 110–269) also use RemoteExecutor with multiple WaitOne(Timeout) calls and MSDTC operations. Unlike Recovery(), they don't have a RemoteInvokeOptions { TimeOut = 120_000 } guard on the child process, nor a SkipOnCoreClr attribute. If stress modes cause similar slowdowns there, these could also time out — though the Recovery test's crash-and-reenlist flow is uniquely heavy. Worth monitoring, but not blocking for this PR.

Generated by Code Review for issue #126666 ·

Comment threadsrc/libraries/System.Transactions.Local/tests/OleTxTests.cs Outdated
@jkotas

Copy link
Copy Markdown
Member

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of the test. The thread should wait for 5 minutes and then check whether the test completed. If the test did not complete in 5 minutes, crash the process using Environment.FailFast that's going to generate a crash dump that can be investigated. Mentioned #126304 in the fail fast message.

CopilotAI commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@copilot instead of disabling this test, add an instrumentation that will allow us to get insight into why this test hangs. This instrumentation should start a new background thread at the start of th...

Done in df4852c. I removed the [SkipOnCoreClr] attribute and instead added a background watchdog thread at the start of Recovery(). The thread waits 5 minutes and, if the test hasn't completed by then, calls Environment.FailFast with a message referencing #126304. The testCompleted event is set in a finally block wrapping the Test(...) call so it's always signaled when the test finishes (pass or fail).

CopilotAI changed the title Disable OleTxTests.Recovery under JIT stress configurationsAdd watchdog instrumentation to OleTxTests.Recovery to capture hang diagnosticsApr 9, 2026
CopilotAI requested a review from jkotasApril 9, 2026 05:56
@jkotas

Copy link
Copy Markdown
Member

Just a guess: This can have the same root cause as #105124 . The problem is that System.Transactions.Local has a global timeout setting that is a problem on itself. Moreover, the global timeout setting has buggy implementation with race conditions (reading the timeout value can reset it too in some situations). We may be seeing bad interactions between different tests reading and writing the global timeout on multiple threads in parallel.

@danmoseley
danmoseley enabled auto-merge (squash) April 9, 2026 06:28
@danmoseley

Copy link
Copy Markdown
ContributorAuthor

Aha! Didn't see that one. Let's see what evidence we gather

Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area-CodeGen-coreclrCLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@danmoseley@jkotas