Since python3.5 PEP 475 guarantees that python will retry system calls failing with EINTR, but under python2.7 we have no such guarantee, triggering this issue: > Traceback (most recent call last): > File "/usr/lib/python-exec/python2.7/emerge", line 51, in <module> > retval = emerge_main() > File "/usr/lib/python2.7/site-packages/_emerge/main.py", line 1282, in emerge_main > return run_action(emerge_config) > File "/usr/lib/python2.7/site-packages/_emerge/actions.py", line 3316, in run_action > retval = action_build(emerge_config, spinner=spinner) > File "/usr/lib/python2.7/site-packages/_emerge/actions.py", line 541, in action_build > retval = mergetask.merge() > File "/usr/lib/python2.7/site-packages/_emerge/Scheduler.py", line 1004, in merge > rval = self._merge() > File "/usr/lib/python2.7/site-packages/_emerge/Scheduler.py", line 1409, in _merge > self._main_loop() > File "/usr/lib/python2.7/site-packages/_emerge/Scheduler.py", line 1381, in _main_loop > self._event_loop.iteration() > File "/usr/lib/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 277, in iteration > return self._iteration(*args) > File "/usr/lib/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 342, in _iteration > if self._run_timeouts(): > File "/usr/lib/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 593, in _run_timeouts > if self._run_idle_callbacks(): > File "/usr/lib/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 552, in _run_idle_callbacks > if x._callback(*x._args): > File "/usr/lib/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 96, in __call__ > self._callback(*self._args) > File "/usr/lib/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 493, in _poll_child_processes > x.callback(x.pid, wait_retval[1], x.data) > File "/usr/lib/python2.7/site-packages/_emerge/SubProcess.py", line 119, in _async_waitpid_cb > self.wait() > File "/usr/lib/python2.7/site-packages/_emerge/AsynchronousTask.py", line 57, in wait > self._wait_hook() > File "/usr/lib/python2.7/site-packages/_emerge/AsynchronousTask.py", line 175, in _wait_hook > self._exit_listener_stack.pop()(self) > File "/usr/lib/python2.7/site-packages/_emerge/Binpkg.py", line 341, in _extractor_exit > self.wait() > File "/usr/lib/python2.7/site-packages/_emerge/AsynchronousTask.py", line 57, in wait > self._wait_hook() > File "/usr/lib/python2.7/site-packages/_emerge/AsynchronousTask.py", line 175, in _wait_hook > self._exit_listener_stack.pop()(self) > File "/usr/lib/python2.7/site-packages/_emerge/CompositeTask.py", line 134, in _default_final_exit > return self.wait() > File "/usr/lib/python2.7/site-packages/_emerge/AsynchronousTask.py", line 57, in wait > self._wait_hook() > File "/usr/lib/python2.7/site-packages/_emerge/AsynchronousTask.py", line 175, in _wait_hook > self._exit_listener_stack.pop()(self) > File "/usr/lib/python2.7/site-packages/_emerge/Scheduler.py", line 1353, in _extract_exit > self._build_exit(build) > File "/usr/lib/python2.7/site-packages/_emerge/Scheduler.py", line 1333, in _build_exit > self._task_queues.merge.add(merge) > File "/usr/lib/python2.7/site-packages/_emerge/SequentialTaskQueue.py", line 23, in add > self.schedule() > File "/usr/lib/python2.7/site-packages/_emerge/SequentialTaskQueue.py", line 45, in schedule > task.start() > File "/usr/lib/python2.7/site-packages/_emerge/AsynchronousTask.py", line 30, in start > self._start() > File "/usr/lib/python2.7/site-packages/_emerge/PackageMerge.py", line 41, in _start > self.merge.statusMessage(msg) > File "/usr/lib/python2.7/site-packages/_emerge/Scheduler.py", line 1787, in _status_msg > self._status_display.displayMessage(msg) > File "/usr/lib/python2.7/site-packages/_emerge/JobStatusDisplay.py", line 163, in displayMessage > self._erase() > File "/usr/lib/python2.7/site-packages/_emerge/JobStatusDisplay.py", line 139, in _erase > self._term_codes['clr_eol']) > File "/usr/lib/python2.7/site-packages/_emerge/JobStatusDisplay.py", line 95, in _write > out.flush() > IOError: [Errno 4] Interrupted system call
$ emerge --regen --jobs 12 [snip] Traceback (most recent call last): File "/usr/lib/python-exec/python2.7/emerge", line 51, in <module> retval = emerge_main() File "/usr/lib64/python2.7/site-packages/_emerge/main.py", line 1289, in emerge_main return run_action(emerge_config) File "/usr/lib64/python2.7/site-packages/_emerge/actions.py", line 3203, in run_action emerge_config.opts.get("--load-average")) File "/usr/lib64/python2.7/site-packages/_emerge/actions.py", line 1988, in action_regen signum = run_main_scheduler(regen) File "/usr/lib64/python2.7/site-packages/portage/util/_async/run_main_scheduler.py", line 27, in run_main_scheduler scheduler.wait() File "/usr/lib64/python2.7/site-packages/_emerge/AsynchronousTask.py", line 83, in wait self.scheduler.run_until_complete(self.async_wait()) File "/usr/lib64/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 826, in run_until_complete self.iteration() File "/usr/lib64/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 280, in iteration return self._iteration(*args) File "/usr/lib64/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 345, in _iteration if self._run_timeouts(): File "/usr/lib64/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 596, in _run_timeouts if self._run_idle_callbacks(): File "/usr/lib64/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 555, in _run_idle_callbacks if x._callback(*x._args): File "/usr/lib64/python2.7/site-packages/portage/util/_eventloop/EventLoop.py", line 96, in __call__ self._callback(*self._args) File "/usr/lib64/python2.7/site-packages/_emerge/AsynchronousTask.py", line 84, in wait self._wait_hook() File "/usr/lib64/python2.7/site-packages/_emerge/AsynchronousTask.py", line 195, in _wait_hook self._exit_listener_stack.pop()(self) File "/usr/lib64/python2.7/site-packages/_emerge/MetadataRegen.py", line 150, in _task_exit AsyncScheduler._task_exit(self, metadata_process) File "/usr/lib64/python2.7/site-packages/portage/util/_async/AsyncScheduler.py", line 80, in _task_exit self._schedule() File "/usr/lib64/python2.7/site-packages/_emerge/PollScheduler.py", line 154, in _schedule self._schedule_tasks() File "/usr/lib64/python2.7/site-packages/portage/util/_async/AsyncScheduler.py", line 59, in _schedule_tasks task = self._next_task() File "/usr/lib64/python2.7/site-packages/_emerge/MetadataRegen.py", line 33, in _next_task return next(self._process_iter) File "/usr/lib64/python2.7/site-packages/_emerge/MetadataRegen.py", line 54, in _iter_metadata_processes portage.writemsg_stdout("Processing %s\n" % cp) File "/usr/lib64/python2.7/site-packages/portage/util/__init__.py", line 88, in writemsg_stdout writemsg(mystr, noiselevel=noiselevel, fd=sys.stdout) File "/usr/lib64/python2.7/site-packages/portage/util/__init__.py", line 83, in writemsg fd.write(mystr) IOError: [Errno 4] Interrupted system call
If we implement asyncio.transports.WriteTransport for python2.7, then we can use it for non-blocking writes, handling EAGAIN and EINTR similarly.
For a workaround, use a setting like this in /etc/portage/package.use: sys-apps/portage -python_targets_python2_7
The bug has been referenced in the following commit(s): https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=0a2c520e735f285a11e2486cb7b4fe1c8e4d0dac commit 0a2c520e735f285a11e2486cb7b4fe1c8e4d0dac Author: Michał Górny <mgorny@gentoo.org> AuthorDate: 2020-03-19 09:52:09 +0100 Commit: Michał Górny <mgorny@gentoo.org> CommitDate: 2020-03-19 10:41:00 +0100 sys-apps/portage: Drop py2 Signed-off-by: Michał Górny <mgorny@gentoo.org>