Skip to content

Race condition in subinterpreters during subinterpreter creation on Windows debug build #100711

Open
@Fidget-Spinner

Description

@Fidget-Spinner

Windows reproducer on main branch: run .\PCbuild\amd64\python_d.exe -m test test__xxsubinterpreters -F and leave it running. If by run 100 nothing crashes, cancel and re-run again until you get a segfault.

Traceback:

Thread 0x000022ec (most recent call first):
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\test__xxsubinterpreters.py", line 788 in setUp
  File "D:\Ken\Documents\GitHub\cpython\Lib\unittest\case.py", line 576 in _callSetUp
  File "D:\Ken\Documents\GitHub\cpython\Lib\unittest\case.py", line 619 in run
  File "D:\Ken\Documents\GitHub\cpython\Lib\unittest\case.py", line 678 in __call__
  File "D:\Ken\Documents\GitHub\cpython\Lib\unittest\suite.py", line 122 in run
  File "D:\Ken\Documents\GitHub\cpython\Lib\unittest\suite.py", line 84 in __call__
  File "D:\Ken\Documents\GitHub\cpython\Lib\unittest\suite.py", line 122 in run
  File "D:\Ken\Documents\GitHub\cpython\Lib\unittest\suite.py", line 84 in __call__
  File "D:\Ken\Documents\GitHub\cpython\Lib\unittest\suite.py", line 122 in run
  File "D:\Ken\Documents\GitHub\cpython\Lib\unittest\suite.py", line 84 in __call__
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\support\testresult.py", line 140 in run
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\support\__init__.py", line 1099 in _run_suite
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\support\__init__.py", line 1225 in run_unittest
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\libregrtest\runtest.py", line 281 in _test_module
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\libregrtest\runtest.py", line 317 in _runtest_inner2
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\libregrtest\runtest.py", line 360 in _runtest_inner
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\libregrtest\runtest.py", line 235 in _runtest
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\libregrtest\runtest.py", line 265 in runtest
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\libregrtest\main.py", line 456 in run_tests_sequential
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\libregrtest\main.py", line 574 in run_tests
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\libregrtest\main.py", line 752 in _main
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\libregrtest\main.py", line 711 in main
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\libregrtest\main.py", line 775 in main
  File "D:\Ken\Documents\GitHub\cpython\Lib\test\__main__.py", line 2 in <module>
  File "D:\Ken\Documents\GitHub\cpython\Lib\runpy.py", line 88 in _run_code
  File "D:\Ken\Documents\GitHub\cpython\Lib\runpy.py", line 198 in _run_module_as_main

Somehow after calling __xxsubinterpreters.create: in drop_gil the &ceval2->gil_drop_request is non-NULL but invalid, so when we try to _Py_atomic_load load from that address it segfaults.

I have my suspicions it's due to swapping of GIL states but this is incredibly hard to debug because the race condition sometimes triggers when I run the test 4 times in a row, and sometimes doesn't trigger after 2 hours of continuous running.

Metadata

Metadata

Assignees

No one assigned

    Labels

    pendingThe issue will be closed if no feedback is providedtopic-subinterpreterstype-bugAn unexpected behavior, bug, or error

    Projects

    Status

    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions