classification
Title: test_interpreters: when TestInterpreterAttrs.test_id_type() is run alone, it fails with an assertion error
Type: Stage: patch review
Components: Tests Versions: Python 3.10
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: eric.snow, miss-islington, nanjekyejoannah, vstinner
Priority: normal Keywords: patch

Created on 2021-04-27 22:55 by vstinner, last changed 2021-04-28 13:47 by vstinner.

Pull Requests
URL Status Linked Edit
PR 25683 merged vstinner, 2021-04-28 11:13
PR 25685 open miss-islington, 2021-04-28 11:41
PR 25686 merged vstinner, 2021-04-28 11:43
Messages (4)
msg392145 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2021-04-27 22:55
Example on Linux.

$ ./python -m test test_interpreters -m test.test_interpreters.TestInterpreterAttrs.test_id_type
0:00:00 load avg: 1.20 Run tests sequentially
0:00:00 load avg: 1.20 [1/1] test_interpreters
python: Python/pystate.c:561: _PyInterpreterState_IDDecref: Assertion `interp->id_refcount != 0' failed.
Fatal Python error: Aborted

Current thread 0x00007f05eab42740 (most recent call first):
  File "/home/vstinner/python/master/Lib/unittest/case.py", line 549 in _callTestMethod
  File "/home/vstinner/python/master/Lib/unittest/case.py", line 592 in run
  File "/home/vstinner/python/master/Lib/unittest/case.py", line 652 in __call__
  File "/home/vstinner/python/master/Lib/unittest/suite.py", line 122 in run
  File "/home/vstinner/python/master/Lib/unittest/suite.py", line 84 in __call__
  File "/home/vstinner/python/master/Lib/unittest/suite.py", line 122 in run
  File "/home/vstinner/python/master/Lib/unittest/suite.py", line 84 in __call__
  File "/home/vstinner/python/master/Lib/unittest/suite.py", line 122 in run
  File "/home/vstinner/python/master/Lib/unittest/suite.py", line 84 in __call__
  File "/home/vstinner/python/master/Lib/test/support/testresult.py", line 169 in run
  File "/home/vstinner/python/master/Lib/test/support/__init__.py", line 959 in _run_suite
  File "/home/vstinner/python/master/Lib/test/support/__init__.py", line 1082 in run_unittest
  File "/home/vstinner/python/master/Lib/test/libregrtest/runtest.py", line 210 in _test_module
  File "/home/vstinner/python/master/Lib/test/libregrtest/runtest.py", line 246 in _runtest_inner2
  File "/home/vstinner/python/master/Lib/test/libregrtest/runtest.py", line 282 in _runtest_inner
  File "/home/vstinner/python/master/Lib/test/libregrtest/runtest.py", line 154 in _runtest
  File "/home/vstinner/python/master/Lib/test/libregrtest/runtest.py", line 194 in runtest
  File "/home/vstinner/python/master/Lib/test/libregrtest/main.py", line 423 in run_tests_sequential
  File "/home/vstinner/python/master/Lib/test/libregrtest/main.py", line 521 in run_tests
  File "/home/vstinner/python/master/Lib/test/libregrtest/main.py", line 694 in _main
  File "/home/vstinner/python/master/Lib/test/libregrtest/main.py", line 641 in main
  File "/home/vstinner/python/master/Lib/test/libregrtest/main.py", line 719 in main
  File "/home/vstinner/python/master/Lib/test/__main__.py", line 2 in <module>
  File "/home/vstinner/python/master/Lib/runpy.py", line 86 in _run_code
  File "/home/vstinner/python/master/Lib/runpy.py", line 196 in _run_module_as_main

Extension modules: _testcapi, _xxsubinterpreters (total: 2)
Abandon (core dumped)


When the whole test case is run, it's fine:

$ ./python -m test test_interpreters -m TestInterpreterAttrs -v
== CPython 3.10.0a7+ (heads/master:6bd9288b80, Apr 27 2021, 22:16:25) [GCC 11.0.1 20210324 (Red Hat 11.0.1-0)]
== Linux-5.11.15-300.fc34.x86_64-x86_64-with-glibc2.33 little-endian
== cwd: /home/vstinner/python/master/build/test_python_16394æ
== CPU count: 8
== encodings: locale=UTF-8, FS=utf-8
0:00:00 load avg: 1.39 Run tests sequentially
0:00:00 load avg: 1.39 [1/1] test_interpreters
test_custom_id (test.test_interpreters.TestInterpreterAttrs) ... ok
test_custom_isolated_default (test.test_interpreters.TestInterpreterAttrs) ... skipped 'not ready yet (see bpo-32604)'
test_custom_isolated_explicit (test.test_interpreters.TestInterpreterAttrs) ... ok
test_equality (test.test_interpreters.TestInterpreterAttrs) ... ok
test_id_readonly (test.test_interpreters.TestInterpreterAttrs) ... ok
test_id_type (test.test_interpreters.TestInterpreterAttrs) ... ok
test_isolated_readonly (test.test_interpreters.TestInterpreterAttrs) ... ok
test_main_id (test.test_interpreters.TestInterpreterAttrs) ... ok
test_main_isolated (test.test_interpreters.TestInterpreterAttrs) ... skipped 'not ready yet (see bpo-32604)'
test_subinterpreter_isolated_default (test.test_interpreters.TestInterpreterAttrs) ... skipped 'not ready yet (see bpo-32604)'
test_subinterpreter_isolated_explicit (test.test_interpreters.TestInterpreterAttrs) ... ok

----------------------------------------------------------------------

Ran 11 tests in 0.159s

OK (skipped=3)

== Tests result: SUCCESS ==

1 test OK.

Total duration: 285 ms
Tests result: SUCCESS
msg392183 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2021-04-28 11:05
Creating an _interpreters.InterpreterID object calls newinterpid() which calls _PyInterpreterState_IDIncref(interp).

_PyInterpreterState_IDIncref(interp) does nothing if interp->id_mutex is NULL.

Calling _interpreters.get_current() calls interp_get_current() which calls _PyInterpreterState_IDInitref().

_PyInterpreterState_IDInitref() creates the id_mutex and initializes id_refcount to 0.

Later, when the _interpreters.InterpreterID object is deallocated, interpid_dealloc() calls _PyInterpreterState_IDDecref(). Since id_mutex was created in the meanwhile, _PyInterpreterState_IDDecref() now decrements id_refcnt.

... It doesn't work: _PyInterpreterState_IDIncref() should always increase the reference count.
msg392187 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2021-04-28 11:40
New changeset 32c5a174445ec93747240cd8472012276ed27acf by Victor Stinner in branch 'master':
bpo-43962: Fix _PyInterpreterState_IDIncref() (GH-25683)
https://github.com/python/cpython/commit/32c5a174445ec93747240cd8472012276ed27acf
msg392197 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2021-04-28 13:47
New changeset 77db337f1e69213e62ba79a797540cc4ac23492e by Victor Stinner in branch '3.8':
bpo-43962: Fix _PyInterpreterState_IDIncref() (GH-25683) (GH-25686)
https://github.com/python/cpython/commit/77db337f1e69213e62ba79a797540cc4ac23492e
History
Date User Action Args
2021-04-28 13:47:01vstinnersetmessages: + msg392197
2021-04-28 11:43:58vstinnersetpull_requests: + pull_request24376
2021-04-28 11:41:03miss-islingtonsetnosy: + miss-islington
pull_requests: + pull_request24375
2021-04-28 11:40:51vstinnersetmessages: + msg392187
2021-04-28 11:13:48vstinnersetkeywords: + patch
stage: patch review
pull_requests: + pull_request24373
2021-04-28 11:05:17vstinnersetmessages: + msg392183
2021-04-27 22:55:36vstinnersettitle: test_interpreters: when test_id_type() is run alone, it fails with an assertion error -> test_interpreters: when TestInterpreterAttrs.test_id_type() is run alone, it fails with an assertion error
2021-04-27 22:55:01vstinnercreate