OpenCyphal / pycyphal

Python implementation of the Cyphal protocol stack.
https://pycyphal.readthedocs.io/
MIT License
119 stars 106 forks source link

Task was destroyed but it is pending! #96

Closed pavel-kirienko closed 3 years ago

pavel-kirienko commented 4 years ago

Certain short-lived coroutines are not terminated properly. Upon canceling, a task needs another scheduling cycle to process asyncio.CancelledError. Search for the offenders in the test log by Task was destroyed but it is pending!. Example:

ERROR    root:base_events.py:1619 Task was destroyed but it is pending!
source_traceback: Object created at (most recent call last):
File "/home/travis/virtualenv/python3.7-dev/bin/pytest", line 8, in <module>
    sys.exit(main())
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/config/__init__.py", line 82, in main
    return config.hook.pytest_cmdline_main(config=config)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/manager.py", line 93, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/manager.py", line 87, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/main.py", line 243, in pytest_cmdline_main
    return wrap_session(config, _main)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/main.py", line 206, in wrap_session
    session.exitstatus = doit(config, session) or 0
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/main.py", line 250, in _main
    config.hook.pytest_runtestloop(session=session)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/manager.py", line 93, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/manager.py", line 87, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/main.py", line 271, in pytest_runtestloop
    item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/manager.py", line 93, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/manager.py", line 87, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/runner.py", line 78, in pytest_runtest_protocol
    runtestprotocol(item, nextitem=nextitem)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/runner.py", line 93, in runtestprotocol
    reports.append(call_and_report(item, "call", log))
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/runner.py", line 173, in call_and_report
    call = call_runtest_hook(item, when, **kwds)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/runner.py", line 198, in call_runtest_hook
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/runner.py", line 226, in from_call
    result = func()
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/runner.py", line 198, in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/manager.py", line 93, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/manager.py", line 87, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/runner.py", line 123, in pytest_runtest_call
    item.runtest()
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/_pytest/python.py", line 1464, in runtest
    self.ihook.pytest_pyfunc_call(pyfuncitem=self)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/hooks.py", line 286, in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/manager.py", line 93, in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/manager.py", line 87, in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pluggy/callers.py", line 187, in _multicall
    res = hook_impl.function(*args)
File "/home/travis/virtualenv/python3.7-dev/lib/python3.7/site-packages/pytest_asyncio/plugin.py", line 158, in pytest_pyfunc_call
    pyfuncitem.obj(**testargs), loop=event_loop))
File "/opt/python/3.7-dev/lib/python3.7/asyncio/base_events.py", line 574, in run_until_complete
    self.run_forever()
File "/opt/python/3.7-dev/lib/python3.7/asyncio/base_events.py", line 541, in run_forever
    self._run_once()
File "/opt/python/3.7-dev/lib/python3.7/asyncio/base_events.py", line 1778, in _run_once
    handle._run()
File "/opt/python/3.7-dev/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
File "/home/travis/build/UAVCAN/pyuavcan/pyuavcan/presentation/_port/_subscriber.py", line 283, in _task_function
    transfer = await self.transport_session.receive_until(self._loop.time() + _RECEIVE_TIMEOUT)
File "/home/travis/build/UAVCAN/pyuavcan/pyuavcan/transport/redundant/_session/_input.py", line 108, in receive_until
    await self._receive_into_backlog(monotonic_deadline)
File "/home/travis/build/UAVCAN/pyuavcan/pyuavcan/transport/redundant/_session/_input.py", line 213, in _receive_into_backlog
    pending = {self._loop.create_task(do_receive(if_idx, inf)) for if_idx, inf in enumerate(inferiors)}
File "/home/travis/build/UAVCAN/pyuavcan/pyuavcan/transport/redundant/_session/_input.py", line 213, in <setcomp>
    pending = {self._loop.create_task(do_receive(if_idx, inf)) for if_idx, inf in enumerate(inferiors)}
task: <Task pending coro=<RedundantInputSession._receive_into_backlog.<locals>.do_receive() running at /home/travis/build/UAVCAN/pyuavcan/pyuavcan/transport/redundant/_session/_input.py:211> wait_for=<Future cancelled created at /opt/python/3.7-dev/lib/python3.7/asyncio/base_events.py:395> created at /home/travis/build/UAVCAN/pyuavcan/pyuavcan/transport/redundant/_session/_input.py:213>