Skip to content

xdist race condition on node restart #927

Closed
@RonnyPfannschmidt

Description

@RonnyPfannschmidt

it seems we have a order invariant that very rarely happens on node restart

to even see the issue creep up i have to do

while tox --skip-missing-interpreters  -- -k test_each_multiple
do
  sleep .1
done

the result is an action with something we don't have a accounted for yet

py27-pytest27-pexpect runtests: commands[1] | py.test -k test_each_multiple
============================================================================ test session starts ============================================================================
platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.7.2
rootdir: /home/private/Projects/pytest-dev/pytest-xdist, inifile: tox.ini
plugins: xdist, xdist, xdist
collected 98 items 

acceptance_test.py F

================================================================================= FAILURES ==================================================================================
____________________________________________________________________ TestNodeFailure.test_each_multiple _____________________________________________________________________

self = <acceptance_test.TestNodeFailure instance at 0x7f59903c0cb0>, testdir = <TmpTestdir local('/tmp/pytest-774/testdir/test_each_multiple0')>

    def test_each_multiple(self, testdir):
        f = testdir.makepyfile("""
                import os
                def test_a(): os._exit(1)
                def test_b(): pass
            """)
        res = testdir.runpytest(f, '--dist=each', '--tx=2*popen')
        res.stdout.fnmatch_lines([
            "*Replacing crashed slave*",
            "*Slave*crashed while running*",
>           "*2 failed*2 passed*",
        ])
E       Failed: remains unmatched: '*Slave*crashed while running*', see stderr

/home/private/Projects/pytest-dev/pytest-xdist/testing/acceptance_test.py:600: Failed
--------------------------------------------------------------------------- Captured stdout call ----------------------------------------------------------------------------
running ['/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/bin/python2.7', '/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/pytest.py', '--basetemp=/tmp/pytest-774/testdir/test_each_multiple0/runpytest-0', '/tmp/pytest-774/testdir/test_each_multiple0/test_each_multiple.py', '--dist=each', '--tx=2*popen'] curdir= /tmp/pytest-774/testdir/test_each_multiple0
============================= test session starts ==============================
platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.7.2
rootdir: /tmp/pytest-774/testdir/test_each_multiple0, inifile: 
plugins: xdist, xdist, xdist
gw0 I / gw1 I
gw0 [2] / gw1 [2]

scheduling tests via EachScheduling
[gw0] node down: Not properly terminated
fReplacing crashed slave gw0
[gw1] node down: Not properly terminated
fReplacing crashed slave gw1
INTERNALERROR> Traceback (most recent call last):
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/main.py", line 84, in wrap_session
INTERNALERROR>     doit(config, session)
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/main.py", line 122, in _main
INTERNALERROR>     config.hook.pytest_runtestloop(session=session)
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 521, in __call__
INTERNALERROR>     return self._docall(self.methods, kwargs)
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 528, in _docall
INTERNALERROR>     firstresult=self.firstresult).execute()
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 394, in execute
INTERNALERROR>     res = method(*args)
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/xdist/dsession.py", line 521, in pytest_runtestloop
INTERNALERROR>     self.loop_once()
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/xdist/dsession.py", line 539, in loop_once
INTERNALERROR>     call(**kwargs)
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/xdist/dsession.py", line 629, in slave_collectionfinish
INTERNALERROR>     self.sched.init_distribute()
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/xdist/dsession.py", line 130, in init_distribute
INTERNALERROR>     pending[:] = range(len(self.node2collection[node]))
INTERNALERROR> KeyError: <SlaveController gw3>

=========================== 2 failed in 0.71 seconds ===========================
--------------------------------------------------------------------------- Captured stderr call ----------------------------------------------------------------------------
INTERNALERROR> Traceback (most recent call last):
INTERNALERROR> Traceback (most recent call last):
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/main.py", line 84, in wrap_session
INTERNALERROR>     doit(config, session)
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/main.py", line 84, in wrap_session
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/main.py", line 122, in _main
INTERNALERROR>     doit(config, session)
INTERNALERROR>     config.hook.pytest_runtestloop(session=session)
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/main.py", line 122, in _main
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 521, in __call__
INTERNALERROR>     config.hook.pytest_runtestloop(session=session)
INTERNALERROR>     return self._docall(self.methods, kwargs)
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 521, in __call__
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 528, in _docall
INTERNALERROR>     return self._docall(self.methods, kwargs)
INTERNALERROR>     firstresult=self.firstresult).execute()
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 528, in _docall
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 394, in execute
INTERNALERROR>     firstresult=self.firstresult).execute()
INTERNALERROR>     res = method(*args)
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 394, in execute
INTERNALERROR>   File "<remote exec>", line 47, in pytest_runtestloop
INTERNALERROR>     res = method(*args)
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/execnet/gateway_base.py", line 711, in receive
INTERNALERROR>   File "<remote exec>", line 47, in pytest_runtestloop
INTERNALERROR>     raise self._getremoteerror() or EOFError()
INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/execnet/gateway_base.py", line 711, in receive
INTERNALERROR> EOFError
INTERNALERROR>     raise self._getremoteerror() or EOFError()
INTERNALERROR> EOFError
nomatch: '*Replacing crashed slave*'
    and: u'============================= test session starts =============================='
    and: u'platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.7.2'
    and: u'rootdir: /tmp/pytest-774/testdir/test_each_multiple0, inifile: '
    and: u'plugins: xdist, xdist, xdist'
    and: u'gw0 I / gw1 I'
    and: u'gw0 [2] / gw1 [2]'
    and: u''
    and: u'scheduling tests via EachScheduling'
    and: u'[gw0] node down: Not properly terminated'
fnmatch: '*Replacing crashed slave*'
   with: u'fReplacing crashed slave gw0'
nomatch: '*Slave*crashed while running*'
    and: u'[gw1] node down: Not properly terminated'
    and: u'fReplacing crashed slave gw1'
    and: u'INTERNALERROR> Traceback (most recent call last):'
    and: u'INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/main.py", line 84, in wrap_session'
    and: u'INTERNALERROR>     doit(config, session)'
    and: u'INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/main.py", line 122, in _main'
    and: u'INTERNALERROR>     config.hook.pytest_runtestloop(session=session)'
    and: u'INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 521, in __call__'
    and: u'INTERNALERROR>     return self._docall(self.methods, kwargs)'
    and: u'INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 528, in _docall'
    and: u'INTERNALERROR>     firstresult=self.firstresult).execute()'
    and: u'INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/_pytest/core.py", line 394, in execute'
    and: u'INTERNALERROR>     res = method(*args)'
    and: u'INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/xdist/dsession.py", line 521, in pytest_runtestloop'
    and: u'INTERNALERROR>     self.loop_once()'
    and: u'INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/xdist/dsession.py", line 539, in loop_once'
    and: u'INTERNALERROR>     call(**kwargs)'
    and: u'INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/xdist/dsession.py", line 629, in slave_collectionfinish'
    and: u'INTERNALERROR>     self.sched.init_distribute()'
    and: u'INTERNALERROR>   File "/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/lib/python2.7/site-packages/xdist/dsession.py", line 130, in init_distribute'
    and: u'INTERNALERROR>     pending[:] = range(len(self.node2collection[node]))'
    and: u'INTERNALERROR> KeyError: <SlaveController gw3>'
    and: u''
    and: u'=========================== 2 failed in 0.71 seconds ==========================='
========================================================================== short test summary info ==========================================================================
FAIL acceptance_test.py::TestNodeFailure::()::test_each_multiple
=============================================================== 97 tests deselected by '-ktest_each_multiple' ===============================================================
================================================================== 1 failed, 97 deselected in 1.37 seconds ==================================================================
ERROR: InvocationError: '/home/private/Projects/pytest-dev/pytest-xdist/.tox/py27-pytest27-pexpect/bin/py.test -k test_each_multiple'

Metadata

Metadata

Assignees

Labels

plugin: xdistrelated to the xdist external pluginstatus: help wanteddevelopers would like help from experts on this topictype: bugproblem that needs to be addressed

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions