#35010: Parallel test runner hangs if one of the tests segfault
---------------------------------------------+------------------------
               Reporter:  Michał Górny       |          Owner:  nobody
                   Type:  Bug                |         Status:  new
              Component:  Testing framework  |        Version:  dev
               Severity:  Normal             |       Keywords:
           Triage Stage:  Unreviewed         |      Has patch:  0
    Needs documentation:  0                  |    Needs tests:  0
Patch needs improvement:  0                  |  Easy pickings:  0
                  UI/UX:  0                  |
---------------------------------------------+------------------------
 When the tests are being run in parallel, and one of the tests cause a
 segfault, the test runner hangs:

 {{{
 $ PYTHONPATH=. python3.11 tests/runtests.py --parallel=2
 queries.tests.{ProxyQueryCleanupTest,Queries1Tests}
 Testing against Django installed in '/tmp/django/django' with up to 2
 processes
 Found 78 test(s).
 Creating test database for alias 'default'...
 Cloning test database for alias 'default'...
 Cloning test database for alias 'default'...
 System check identified no issues (1 silenced).
 .Fatal Python error: Segmentation fault

 Current thread 0x00007fe3c3d42740 (most recent call first):
   File "/usr/lib/python3.11/copy.py", line 265 in _reconstruct
   File "/usr/lib/python3.11/copy.py", line 102 in copy
   File "/tmp/django/django/db/models/expressions.py", line 426 in copy
   File "/tmp/django/django/db/models/expressions.py", line 284 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 277 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   File "/tmp/django/django/db/models/sql/where.py", line 279 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 275 in
 _resolve_node
   File "/tmp/django/django/db/models/sql/where.py", line 283 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/query.py", line 1203 in
 resolve_expression
   File "/tmp/django/django/db/models/sql/where.py", line 268 in
 _resolve_leaf
   ...

 }}}

 At this point, nothing else is happening, the processes don't utilize CPU:

 {{{
 $ ps -ft
  111241 pts/2    Tl     0:02          \_ python3.11 tests/runtests.py
 --parallel=2 queries.tests.ProxyQueryCleanupTest
 queries.tests.Queries1Tests
  111243 pts/2    T      0:00          |   \_ python3.11 tests/runtests.py
 --parallel=2 queries.tests.ProxyQueryCleanupTest
 queries.tests.Queries1Tests
  111248 pts/2    T      0:00          |   \_ python3.11 tests/runtests.py
 --parallel=2 queries.tests.ProxyQueryCleanupTest
 queries.tests.Queries1Tests
 }}}

 If I cancel it, it seems to ignore the killed process:

 {{{
 ^C
 ----------------------------------------------------------------------
 Ran 1 test in 613.663s

 OK
 Destroying test database for alias 'default'...
 Destroying test database for alias 'default'...
 Destroying test database for alias 'default'...
 }}}

 (I'm still trying to figure out why that other test segfaults for me)

-- 
Ticket URL: <https://code.djangoproject.com/ticket/35010>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018c356d7fde-fca59732-e52d-4f5a-bdb2-7f4372e37ee3-000000%40eu-central-1.amazonses.com.

Reply via email to