Repository navigation
[3.15] gh-151518: Avoid STW starvation of attaching threads (GH-152826) - #158186
Conversation
…thonGH-152826) Preserve active attach waiters across successive stop-the-world pauses so a tight collection loop cannot keep them from making progress. Keep the waiter-aware resume operation local to pystate.c because this branch does not have the newer BRC suspend and resume helpers. (cherry picked from commit f156510)
|
This can go into 3.15.0 if not too risky, and PRs need core peer review during the RC, see https://discuss.python.org/t/the-3-15-branch-is-locked-for-rc1/108389. |
|
@colesbury, do you want to double-check this? |
|
This seems to break CI for the free-threaded builds. I see: The 3.15 branch does have the BRC suspend/resume helpers (added by e538c26). The fix suggested by Claude is to basically move the code from |
Oh, I suppose that's the issue that I just reported: #159373. |
Backport of gh-152826, merged as f156510, for gh-151518.
A tight loop of stop-the-world pauses can repeatedly suspend a thread trying to reattach after sleeping, preventing it from returning and stopping the loop. This was found during intentional
numba-cudaGC stress on many-core machines. The fix preserves active attach waiters across successive pauses so they have a chance to run.This branch predates gh-157839, so the waiter-aware resume operation is a private helper in
pystate.c. The attachment changes, regression test, and guard that avoids blocking waits on WASI are carried over from the merged fix.Validation:
test_stop_the_world. Local WASI checks used SDK 34 and Wasmtime 48; the WASI CI job also passed with the branch's configured toolchain.CI note: the required Tests workflow passed. The Intel macOS JIT debug job exceeded its one-hour limit; its log is unavailable, so the cause is not yet known. A targeted retry is running on the unchanged commit. The other 18 JIT jobs passed.
@hugovk Given the 3.15 RC freeze, should this go into 3.15.0 or wait for the first maintenance release?