Skip to content

[3.15] gh-158097: Make test_staggered_race_with_eager_tasks deterministic (GH-158469) - #161223

Merged
asvetlov merged 1 commit into
python:3.15from
miss-islington:backport-3945eaf-3.15
Nov 2, 2026
Merged

asvetlov merged 1 commit into
python:3.15from
miss-islington:backport-3945eaf-3.15

Conversation

@miss-islington

Copy link
Copy Markdown
Contributor

staggered_race() awaits the coroutines it is given inline, so the
"await asyncio.sleep(0)" in the test's fail() helper suspended the
run_one_coro() task running it and left a scheduled resumption behind.
If the asyncio.sleep(1) winner (started 0.25s late by the stagger delay)
completes before that resumption runs, the winner's cancel() sets
_must_cancel and the resumption throws CancelledError into fail(), so
excs[2] reports a CancelledError instead of a ValueError.

Pending timers are only moved onto the ready queue at the top of
BaseEventLoop._run_once() and are appended after the handles already
queued, so the t=0.50s stagger timer and the t=1.25s sleep(1) timer run
in due-time order. When both are due in the same _run_once() - which is
what a busy CI machine causes - the stagger timer starts fail(), which
immediately suspends again, and the very next handle is the winner.

Raise straight away instead, so the ValueError is stored in excs[2] in
the same step that starts the coroutine and there is no longer a
scheduled resumption for a cancellation to overtake. The outcome no
longer depends on the event loop getting another iteration.

  • Update Lib/test/test_asyncio/test_eager_task_factory.py

  • Delete Misc/NEWS.d/next/Tests/2026-09-30-00-00-00.gh-issue-158097.pcB3mO.rst


(cherry picked from commit 3945eaf)

Co-authored-by: Abhinav alpha9coder@gmail.com
Co-authored-by: abhinav-phi abhinav-phi@users.noreply.github.com
Co-authored-by: Andrew Svetlov andrew.svetlov@gmail.com

…tic (pythonGH-158469)

* pythongh-158097: Make test_staggered_race_with_eager_tasks deterministic

staggered_race() awaits the coroutines it is given inline, so the
"await asyncio.sleep(0)" in the test's fail() helper suspended the
run_one_coro() task running it and left a scheduled resumption behind.
If the asyncio.sleep(1) winner (started 0.25s late by the stagger delay)
completes before that resumption runs, the winner's cancel() sets
_must_cancel and the resumption throws CancelledError into fail(), so
excs[2] reports a CancelledError instead of a ValueError.

Pending timers are only moved onto the ready queue at the top of
BaseEventLoop._run_once() and are appended after the handles already
queued, so the t=0.50s stagger timer and the t=1.25s sleep(1) timer run
in due-time order.  When both are due in the same _run_once() - which is
what a busy CI machine causes - the stagger timer starts fail(), which
immediately suspends again, and the very next handle is the winner.

Raise straight away instead, so the ValueError is stored in excs[2] in
the same step that starts the coroutine and there is no longer a
scheduled resumption for a cancellation to overtake.  The outcome no
longer depends on the event loop getting another iteration.

* Update Lib/test/test_asyncio/test_eager_task_factory.py

* Delete Misc/NEWS.d/next/Tests/2026-09-30-00-00-00.gh-issue-158097.pcB3mO.rst

---------
(cherry picked from commit 3945eaf2fcd9cbc3f3061275bd29751c8b2e7d3b)

Co-authored-by: Abhinav <alpha9coder@gmail.com>
Co-authored-by: abhinav-phi <abhinav-phi@users.noreply.github.com>
Co-authored-by: Andrew Svetlov <andrew.svetlov@gmail.com>
@bedevere-app bedevere-app Bot added the tests Tests in the Lib/test dir label Nov 2, 2026
@asvetlov
asvetlov enabled auto-merge (squash) November 2, 2026 23:10
@asvetlov
asvetlov merged commit 39aa513 into python:3.15 Nov 2, 2026
57 checks passed
@miss-islington
miss-islington deleted the backport-3945eaf-3.15 branch November 2, 2026 23:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip news tests Tests in the Lib/test dir

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants