For example, when /var/tmp/portage runs out of space and bug 451158 is triggered, it stops like this and the user has to use SIGKILL to end the process: > >>> Jobs: 1 of 22 complete, 3 running Load avg: 15.6, 11.8, 10.4Exception in callback PipeLogger._output_handler(18) > handle: <Handle PipeLogger._output_handler(18)> > Traceback (most recent call last): > File "/usr/lib64/python3.6/asyncio/events.py", line 145, in _run > self._callback(*self._args) > File "/usr/lib64/python3.6/site-packages/portage/util/_async/PipeLogger.py", line 124, in _output_handler > log_file.flush() > OSError: [Errno 28] No space left on device > --Return-- > > /usr/lib64/python3.6/site-packages/portage/util/_eventloop/asyncio_event_loop.py(76)_internal_caller_exception_handler()->None > -> pdb.set_trace() > (Pdb) We can enable Ctrl-C in this situation, like this: > diff --git a/lib/portage/util/_eventloop/asyncio_event_loop.py b/lib/portage/util/_eventloop/asyncio_event_loop.py > index ea0e03b23..50839ad26 100644 > --- a/lib/portage/util/_eventloop/asyncio_event_loop.py > +++ b/lib/portage/util/_eventloop/asyncio_event_loop.py > @@ -73,6 +73,7 @@ class AsyncioEventLoop(_AbstractEventLoop): > # aid in diagnosis of the problem. If there's no tty, then > # exit immediately. > if all(s.isatty() for s in (sys.stdout, sys.stderr, sys.stdin)): > + signal.signal(signal.SIGINT, signal.SIG_DFL) > pdb.set_trace() > else: > # Normally emerge will wait for all coroutines to complete
Maybe Scheduler should override the AsyncioEventLoop exception handler when it overrides the SIGINT/SIGTERM handlers.
Maybe Scheduler could also use the asyncio loop.add_signal_handler API instead of using the signal module directly: https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.add_signal_handler
The bug has been referenced in the following commit(s): https://gitweb.gentoo.org/proj/portage.git/commit/?id=ee1f6ff69887dfa02d5c3a3ab3d61163fa504d15 commit ee1f6ff69887dfa02d5c3a3ab3d61163fa504d15 Author: Zac Medico <zmedico@gentoo.org> AuthorDate: 2019-04-16 01:33:29 +0000 Commit: Zac Medico <zmedico@gentoo.org> CommitDate: 2019-04-16 01:40:29 +0000 AsyncioEventLoop: enable SIGINT in exception handler (bug 672540) Before the exception handler invokes the pdb shell, enable SIGINT so that the user can exit with Control-C (otherwise SIGKILL is needed). Bug: https://bugs.gentoo.org/672540 Signed-off-by: Zac Medico <zmedico@gentoo.org> lib/portage/util/_eventloop/asyncio_event_loop.py | 5 +++++ 1 file changed, 5 insertions(+)
(In reply to Zac Medico from comment #2) > Maybe Scheduler could also use the asyncio loop.add_signal_handler API > instead of using the signal module directly: > > https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop. > add_signal_handler This wouldn't be useful in the context of this bug since event loop signal handlers are useless when the loop is suspended (same problem as Scheduler's existing signal handler which relies on the event loop to ultimately trigger exit).