Repository navigation
Unexpected traceback output in test_concurrent_futures and crash #109370
Copy link
Copy link
Closed
Labels
3.13only security fixesonly security fixestestsTests in the Lib/test dirTests in the Lib/test dirtype-crashA hard crash of the interpreter, possibly with a core dumpA hard crash of the interpreter, possibly with a core dump
Description
Crash report
When I run tests in single-process mode I get unexpected traceback output but tests was marked as passed:
Details
$ ./python -m test -r
== CPython 3.13.0a0 (heads/regretest-no-remove-test-module:eb7766baa4, Sep 13 2023, 10:58:19) [GCC 11.4.0]
== Linux-5.15.0-79-generic-x86_64-with-glibc2.35 little-endian
== Python build: debug
== cwd: /home/serhiy/py/cpython/build/test_python_worker_3200061æ
== CPU count: 8
== encodings: locale=UTF-8, FS=utf-8
Using random seed 68644298
0:00:00 load avg: 0.75 Run 463 tests sequentially
...
0:12:03 load avg: 1.72 [191/463] test.test_concurrent_futures.test_process_pool
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
0:12:21 load avg: 1.52 [192/463] test_codecencodings_tw
...
0:25:47 load avg: 1.21 [361/463] test.test_concurrent_futures.test_deadlock
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 201, in send_bytes
self._send_bytes(m[offset:offset + size])
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 422, in _send_bytes
self._send(buf)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 385, in _send
n = write(self._handle, buf)
^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'NoneType' object cannot be interpreted as an integer
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 201, in send_bytes
self._send_bytes(m[offset:offset + size])
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 422, in _send_bytes
self._send(buf)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 385, in _send
n = write(self._handle, buf)
^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'NoneType' object cannot be interpreted as an integer
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 201, in send_bytes
self._send_bytes(m[offset:offset + size])
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 422, in _send_bytes
self._send(buf)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 385, in _send
n = write(self._handle, buf)
^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: 'NoneType' object cannot be interpreted as an integer
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
0:26:01 load avg: 1.10 [362/463] test_bigaddrspace
...
0:26:20 load avg: 1.08 [368/463] test.test_concurrent_futures.test_init
Traceback (most recent call last):
File "/home/serhiy/py/cpython/Lib/multiprocessing/queues.py", line 250, in _feed
send_bytes(obj)
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 185, in send_bytes
self._check_closed()
File "/home/serhiy/py/cpython/Lib/multiprocessing/connection.py", line 138, in _check_closed
raise OSError("handle is closed")
OSError: handle is closed
0:26:23 load avg: 1.15 [369/463] test_eof
...
Then Python crashed after reporting total success:
Total duration: 38 min 29 sec
Total tests: run=40,827 skipped=1,248
Total test files: run=453/463 skipped=10 resource_denied=10
Result: SUCCESS
Fatal Python error: Segmentation fault
Current thread 0x00007fb61c438740 (most recent call first):
Garbage-collecting
<no Python frame>
Помилка адресування (збережено знімок оперативної пам’яті)
The last line is "Segfault (core dumped)" in Ukrainian, but I have no core dump because ulimit -c was 0.
I ran tests with a modification of #108952 which does not remove test module or any imported during testing modules before or after running a test.
cc @vstinner
Linked PRs
- gh-109370: Support closing Connection and PipeConnection from other thread #109397
- gh-109370: Fix unexpected traceback output in test_concurrent_futures #109780
- [3.11] gh-109370: Fix unexpected traceback output in test_concurrent_futures (GH-109780) #109882
- [3.12] gh-109370: Fix unexpected traceback output in test_concurrent_futures (GH-109780) #111934
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
3.13only security fixesonly security fixestestsTests in the Lib/test dirTests in the Lib/test dirtype-crashA hard crash of the interpreter, possibly with a core dumpA hard crash of the interpreter, possibly with a core dump
Activity
serhiy-storchaka commentedon Sep 13, 2023
Simple
and
produce similar tracebacks, but without a crash.
serhiy-storchaka commentedon Sep 13, 2023
Surprisingly, it is 3.13-only issue.
cc @vstinner
vstinner commentedon Sep 13, 2023
Can you please give precise instructions on how to reproduce the issue? Should I patch Python? The command to reproduce the issue is
./python -m test -r?serhiy-storchaka commentedon Sep 13, 2023
There are two issues which may be related or not related:
Tracebacks are easy reproducible by running two tests. I did not try to reproduce the crash, because running all tests takes almost 40 minutes, and it may be order-depending. I ran full tests several times with other changes to libregrtest and found other crash, but not this one.
I am not sure that my change to libregrtest was related. It was equivalent to the following patch:
Details
I.e. simply remove all removing of test modules before and after running a test. Actually, removing a module from
sys.modulesdid not clear it (yet one mistake in this code), because remaining reference from thetestmodule kept them alive, so I am not sure how it could affect finalization at all.serhiy-storchaka commentedon Sep 14, 2023
I figured out what is wrong with tracebacks. They are triggered by closing the queue's writer connection in
terminate_broken()in #107219. There are two issues:_check_closed()should raise OSError with errno=EPIPE. It makes the queue thread to quit silently instead of printing a traceback and hanging.pythongh-109370: Support closing Connection and PipeConnection from o…
vstinner commentedon Sep 14, 2023
Do you want to propose a fix for this? It may be a good start.
serhiy-storchaka commentedon Sep 14, 2023
#109397
pythongh-109370: Fix unexpected traceback output in test_concurrent_f…
gh-109370: Fix unexpected traceback output in test_concurrent_futures (…
pythongh-109370: Fix unexpected traceback output in test_concurrent_f…
[3.11] gh-109370: Fix unexpected traceback output in test_concurrent_…
3 remaining items
serhiy-storchaka commentedon Nov 10, 2023
The superfluous output was fixed. As for the crash, it was difficult to reproduce.
[3.12] pythongh-114440: Close writer pipe in multiprocessing.Queue, n…
[3.12] gh-114440: Close writer pipe in multiprocessing.Queue, not con…
[3.12] pythongh-114440: Close writer pipe in multiprocessing.Queue, n…
[3.12] pythongh-114440: Close writer pipe in multiprocessing.Queue, n…
[3.12] pythongh-114440: Close writer pipe in multiprocessing.Queue, n…
[3.12] pythongh-114440: Close writer pipe in multiprocessing.Queue, n…
[3.12] pythongh-114440: Close writer pipe in multiprocessing.Queue, n…
[3.12] pythongh-114440: Close writer pipe in multiprocessing.Queue, n…
[3.12] pythongh-114440: Close writer pipe in multiprocessing.Queue, n…
[3.12] pythongh-114440: Close writer pipe in multiprocessing.Queue, n…
[3.12] pythongh-114440: Close writer pipe in multiprocessing.Queue, n…
pythongh-109370: Fix unexpected traceback output in test_concurrent_f…
[3.12] pythongh-114440: Close writer pipe in multiprocessing.Queue, n…