Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
Bug 654148 - sys-apps/portage: sys.stdout.flush() under python2.7 can trigger IOError: [Errno 4] Interrupted system call
Summary: sys-apps/portage: sys.stdout.flush() under python2.7 can trigger IOError: [Er...
Status: RESOLVED WONTFIX
Alias: None
Product: Portage Development
Classification: Unclassified
Component: Core (show other bugs)
Hardware: All All
: Normal normal (vote)
Assignee: Portage team
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 658182
  Show dependency tree
 
Reported: 2018-04-26 21:01 UTC by Zac Medico
Modified: 2020-04-01 23:33 UTC (History)
0 users

See Also:
Package list:
Runtime testing required: ---


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Zac Medico gentoo-dev 2018-04-26 21:01:10 UTC
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
Comment 1 Patrick Lauer gentoo-dev 2018-05-06 18:43:25 UTC
$ 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
Comment 2 Zac Medico gentoo-dev 2018-05-08 14:59:21 UTC
If we implement asyncio.transports.WriteTransport for python2.7, then we can use it for non-blocking writes, handling EAGAIN and EINTR similarly.
Comment 3 Zac Medico gentoo-dev 2018-06-15 18:34:38 UTC
For a workaround, use a setting like this in /etc/portage/package.use:

sys-apps/portage -python_targets_python2_7
Comment 4 Zac Medico gentoo-dev 2020-04-01 23:33:13 UTC
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>