Repository navigation
Conversation
| // G1/Serial/Parallel relocate objects at safepoints. A sampled Java thread | ||
| // cannot reach a safepoint while its signal handler is reading these oops. | ||
| // Concurrently relocating collectors require load barriers not provided here. |
There was a problem hiding this comment.
Can the profiling signal land on a thread with frozen stack and already in safepoint?
Or is this structurally impossible?
CI Test ResultsRun: #39465168904 | Commit:
Status Overview
Legend: ✅ passed | ❌ failed | ⚪ skipped | 🚫 cancelled
|
| Test | Cells | Message |
|---|---|---|
FrozenVirtualThreadStackTest.cstack_vmx |
glibc-21-debug-aarch64 |
org.opentest4j.AssertionFailedError: Application callers were recovered in the wrong order ==> expected: <0> but was: <8 |
VirtualThreadWallClockTest.cstack_vmx |
glibc-21-graal-debug-amd64 |
org.opentest4j.AssertionFailedError: No sample showed carrier-thread frames (ForkJoinWorkerThread) — continuation unwind |
These fail the build. Passing on a second run makes a test flaky, not passing. Fix it, or quarantine it against a ticket so the debt is tracked rather than forgotten.
Consider quarantining these — click for ready-made entries
A quarantined test still runs and still reports; its failures just stop
turning CI red. To quarantine one:
- Open a PROF ticket for the test, linking the failing job.
- Append the line below to
ddprof-test/quarantine.txt, replacing
PROF-XXXXXwith the ticket number. - Check the
cellsandreasoncolumns — the proposal only knows what
failed in this run, and a narrowercellsglob keeps the same test
gating everywhere it has not misbehaved.
CI fails once review_by passes, so an entry expires instead of piling up.
# test | ticket | added | review_by | cells | reason
# WIDENED: observed `com.datadoghq.profiler.wallclock.FrozenVirtualThreadStackTest.cstack=vmx`, which covers() cannot match exactly; this entry mutes the whole class
com.datadoghq.profiler.wallclock.FrozenVirtualThreadStackTest.* | PROF-XXXXX | 2026-10-20 | 2027-01-18 | glibc-21-debug-aarch64 | org.opentest4j.AssertionFailedError: Application callers were recovered in the wrong order ==> expected: <0> but was: <88> (seen in: glibc-21-debug-aarch64)
# WIDENED: observed `com.datadoghq.profiler.wallclock.VirtualThreadWallClockTest.cstack=vmx`, which covers() cannot match exactly; this entry mutes the whole class
com.datadoghq.profiler.wallclock.VirtualThreadWallClockTest.* | PROF-XXXXX | 2026-10-20 | 2027-01-18 | glibc-21-graal-debug-amd64 | org.opentest4j.AssertionFailedError: No sample showed carrier-thread frames (ForkJoinWorkerThread) — continuation unwind may be broken ==> expected: <true> but was: <false> (seen in: glibc-21-graal-debug-amd64)
❌ Failing tests
| Test | Cells | Message |
|---|---|---|
VirtualThreadWallClockTest.cstack_vmx |
glibc-21-debug-aarch64, glibc-25-debug-aarch64, glibc-21-debug-amd64 |
org.opentest4j.AssertionFailedError: No sample showed carrier-thread frames (ForkJoinWorkerThread) — continuation unwind |
Retried 4 of 32 cells.
Failed Jobs
- glibc-aarch64/debug / 25 — view logs
- glibc-amd64/debug / 21 — view logs
- glibc-aarch64/debug / 21 — view logs
- glibc-amd64/debug / 21-graal — view logs
Summary: Total: 32 | Passed: 28 | Failed: 4
Updated: 2026-10-20 17:48:35 UTC
What does this PR do?:
Recover older Java callers from HotSpot heap stack chunks when a mounted virtual thread reaches a continuation return barrier. Append interpreted and compiled frames, including inlined callers and parent chunks, to the existing trace buffer before stopping at the continuation root (
cstack=vm) or walking the carrier (cstack=vmx).Extend regression coverage for both walking modes, CPU and wall sampling, parent chunks, depth limits, native calls, unsupported recovery, and platform-thread/fully thawed controls.
Motivation:
HotSpot can thaw only part of a virtual thread's stack after remounting it. The remaining Java callers stay in heap chunks and are absent from a walk of the carrier's native stack. #877 correctly marks that omission as truncated; this change restores those callers where recovery is supported.
Additional Notes:
paul.fournillon/fix-frozen-virtual-thread-truncation). Retarget tomainafter that dependency merges.break_cont_carrier_spwithout encountering a return barrier; this PR does not claim to fix it.How to test the change?:
spotlessApplyandgit diff --checkpass; the latesttestDebuginvocation was up-to-date and adds no new test executions to the results above.For Datadog employees: