You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
test_asyncio environment changed during test execution due to empty threading._dangling without MainThread before some tests #91676
We're seeing frequent flakiness on CI and buildbots (heavily loaded systems, triggering more race conditions?) with test_asyncio of late. #91260 has some discussion as that seems to have surfaced it more frequently, at least in the stable 3.10 branch.
$ python -m test.bisect_cmd test_asyncio --fail-env-changed
...
0:00:00 load avg: 0.93 [1/2/1] test_asyncio.test_threads failed (env changed)
Warning -- threading._dangling was modified by test_asyncio.test_threads
Before: {<weakref at 0x7f3b2e77fa10; to '_MainThread' at 0x7f3b2f107490>}
After: {<weakref at 0x7f3b2e77ffb0; to '_MainThread' at 0x7f3b2f107490>}
While "interesting" for _MainThread to wind up in threading._dangling... code wise it should always be in there. Yet somehow it is not before execution?!?
after a fork() from the non-main thread or from C, it won't be. danger - something is using fork with threads running, a guaranteed source of problems. Fixing it to always exist in _dangling beforehand would not be a bad thing, but only if we can figure out how it happens to not be in the first place.
changed the title [-]test environment chained due to empty `threading._dangling` without MainThread before some tests[/-][+]test_asyncio environment changed during test execution due to empty `threading._dangling` without MainThread before some tests[/+]on Apr 18, 2022
../b/python -m test.bisect_cmd test_asyncio.test_threads test_asyncio.test_unix_events --fail-env-changed -j 12 -N 1000 2>&1 | less
...
0:00:00 load avg: 0.64 [1/2/1] test_asyncio.test_threads failed (env changed)
Warning -- threading._dangling was modified by test_asyncio.test_threads
Warning -- Before: {<weakref at 0x7f67f8967970; to '_MainThread' at 0x7f67f92eb370>}
Warning -- After: {<weakref at 0x7f67f91a1210; to 'Thread' at 0x7f67f8979480>, <weakref at 0x7f67f8967f60; to '_MainThread' at 0x7f67f92eb370>}
notice the specific weakref instance to the same address _MainThread changed above and here:
python -m test --matchfile /tmp/tmpu15fc2a3 --fail-env-changed test_asyncio.test_threads test_asyncio.test_unix_events -j 2
0:00:00 load avg: 1.42 Run tests in parallel using 2 child processes
0:00:00 load avg: 1.42 [1/2/1] test_asyncio.test_threads failed (env changed)
Warning -- threading._dangling was modified by test_asyncio.test_threads
Before: {<weakref at 0x7f3929113a10; to '_MainThread' at 0x7f3929a93490>}
After: {<weakref at 0x7f3929979800; to '_MainThread' at 0x7f3929a93490>}
0:00:00 load avg: 1.42 [2/2/1] test_asyncio.test_unix_events ran no tests
== Tests result: ENV CHANGED ==
The excess threads running on occasion after a test ends are asyncio concurrent.futures threadpool _worker threads named asyncio_0 or asyncio_1... ('<Thread(asyncio_0, started 140097331353152)>', (<function _worker at 0x7f6af3c3f5f0>, '_worker', 'concurrent.futures.thread', None))
The change that exacerbated this race condition notably no longer does a loop.run_until_complete(loop.shutdown_default_executor()) which is what I believe would've seen the worker threads cleaned up? [edit: confirmed, PR coming]
Activity
[-]test environment chained due to empty `threading._dangling` without MainThread before some tests[/-][+]test_asyncio environment changed during test execution due to empty `threading._dangling` without MainThread before some tests[/+]gpshead commentedon Apr 18, 2022
I've also seen this one:
gpshead commentedon Apr 18, 2022
notice the specific weakref instance to the same address
_MainThreadchanged above and here:gpshead commentedon Apr 19, 2022
The code in
Lib/test/libregrtest/save_env.pyhas race conditions that could lead to this https://github.com/python/cpython/blob/main/Lib/test/libregrtest/save_env.py#L216 are invoked by enter and exit on thesaved_test_environmentcontext manager. seeresource_infofor how.gpshead commentedon Apr 19, 2022
the irony of code that is supposed to help buildbot instability also being one probable cause of buildbot instability...
gpshead commentedon Apr 19, 2022
The excess threads running on occasion after a test ends are asyncio concurrent.futures threadpool _worker threads named asyncio_0 or asyncio_1...
('<Thread(asyncio_0, started 140097331353152)>', (<function _worker at 0x7f6af3c3f5f0>, '_worker', 'concurrent.futures.thread', None))The change that exacerbated this race condition notably no longer does a
loop.run_until_complete(loop.shutdown_default_executor())which is what I believe would've seen the worker threads cleaned up? [edit: confirmed, PR coming][3.10] gh-91676 gh-91260 unittest.IsolatedAsyncioTestCase no longer l…
[3.10] pythongh-91676 pythongh-91260 unittest.IsolatedAsyncioTestCase…
[3.10] gh-91676 gh-91260 unittest.IsolatedAsyncioTestCase no longer l…
vstinner commentedon May 13, 2022
Thanks for the fix ;-)
[3.10] pythongh-91676 pythongh-91260 unittest.IsolatedAsyncioTestCase…