Skip to content

Commit 3945eaf

Browse files
gh-158097: Make test_staggered_race_with_eager_tasks deterministic (#158469)
* gh-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 --------- Co-authored-by: abhinav-phi <abhinav-phi@users.noreply.github.com> Co-authored-by: Andrew Svetlov <andrew.svetlov@gmail.com>
1 parent 05486ac commit 3945eaf

1 file changed

Lines changed: 3 additions & 1 deletion

File tree

‎Lib/test/test_asyncio/test_eager_task_factory.py‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,9 @@ def test_staggered_race_with_eager_tasks(self):
217217
# See https://github.com/python/cpython/issues/124309
218218

219219
async def fail():
220-
await asyncio.sleep(0)
220+
# Raise without suspending: staggered_race() cancels unfinished
221+
# coroutines once another one wins, so yielding first could turn
222+
# this into a CancelledError when the event loop is busy.
221223
raise ValueError("no good")
222224

223225
async def blocked():

0 commit comments

Comments
 (0)