Skip to content

gh-155109: Run tests exhausting the C stack with a limited C stack - #155120

Merged
serhiy-storchaka merged 4 commits into
python:mainfrom
serhiy-storchaka:gh-155109-limited-c-stack
Aug 4, 2026
Merged

gh-155109: Run tests exhausting the C stack with a limited C stack#155120
serhiy-storchaka merged 4 commits into
python:mainfrom
serhiy-storchaka:gh-155109-limited-c-stack

Conversation

@serhiy-storchaka

@serhiy-storchaka serhiy-storchaka commented Aug 3, 2026

Copy link
Copy Markdown
Member

Add the @support.run_with_limited_c_stack(depth) decorator: it runs the test in a thread with an 8 MiB C stack, so that the outcome does not depend on RLIMIT_STACK. If the thread stack size cannot be limited, it falls back to the old behavior — run in the current thread and skip if the C stack is too large.

Use it in tests which recurse to a fixed depth. @support.skip_if_huge_c_stack() estimates the remaining stack in interpreter loop frames (~328 bytes), so it fails to skip tests which recurse with much smaller C frames (~100 bytes) — they fail with a 16 MiB stack. It is kept for tests with unbounded recursion and for test_call.test_super_deep(), which needs a deep stack.

Tested on Linux with 1, 8, 16, 32 and 512 MiB and unlimited stack limits, and on illumos and OpenBSD.

Add the @support.run_with_limited_c_stack() decorator which runs the test
in a thread with a small C stack, so that the outcome does not depend on
RLIMIT_STACK. Use it in tests which recurse to a fixed depth --
@support.skip_if_huge_c_stack() failed to skip them with a 16 MiB stack.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
On platforms where the interpreter cannot query the thread stack size it
assumes Py_C_STACK_SIZE (4 MiB), so a smaller thread stack crashes instead
of raising RecursionError. Verified on illumos and OpenBSD: a 2 MiB stack
dumps core, 8 MiB raises RecursionError.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@serhiy-storchaka

Copy link
Copy Markdown
Member Author

@kulikjak, could you please test if this helps?

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@serhiy-storchaka

Copy link
Copy Markdown
Member Author

The failure of the Windows / Build and test (x64, tail-call) job is gh-155146: test_detach_materialized_dict_no_memory fails if any other allocation happens before the one which detaches the instance dictionary, and adding functions to test.support is enough to shift the sequence. Fixed in #155150.

@kulikjak

kulikjak commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Thanks! I tested your change and the test suite is green again.

@serhiy-storchaka
serhiy-storchaka enabled auto-merge (squash) August 4, 2026 09:15
@serhiy-storchaka serhiy-storchaka added needs backport to 3.14 bugs and security fixes needs backport to 3.15 pre-release feature fixes, bugs and security fixes labels Aug 4, 2026
@serhiy-storchaka
serhiy-storchaka merged commit ce5ae29 into python:main Aug 4, 2026
54 checks passed
@miss-islington-app

Copy link
Copy Markdown

Thanks @serhiy-storchaka for the PR 🌮🎉.. I'm working now to backport this PR to: 3.14, 3.15.
🐍🍒⛏🤖

@miss-islington-app

Copy link
Copy Markdown

Sorry, @serhiy-storchaka, I could not cleanly backport this to 3.14 due to a conflict.
Please backport using cherry_picker on command line.

cherry_picker ce5ae29ef9b8ccb32683c922d135339311c36c9d 3.14

@bedevere-app

bedevere-app Bot commented Aug 4, 2026

Copy link
Copy Markdown

GH-155164 is a backport of this pull request to the 3.15 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.15 pre-release feature fixes, bugs and security fixes label Aug 4, 2026
@bedevere-app

bedevere-app Bot commented Aug 4, 2026

Copy link
Copy Markdown

GH-155165 is a backport of this pull request to the 3.14 branch.

@bedevere-app bedevere-app Bot removed the needs backport to 3.14 bugs and security fixes label Aug 4, 2026
serhiy-storchaka added a commit that referenced this pull request Aug 4, 2026
…tack (GH-155120) (GH-155165)

Add the @support.run_with_limited_c_stack() decorator which runs the test
in a thread with a 8 MiB C stack, so that the outcome does not depend on
RLIMIT_STACK. Use it in tests which recurse to a fixed depth --
@support.skip_if_huge_c_stack() failed to skip them with a 16 MiB stack.

(cherry picked from commit ce5ae29)

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants