HomePhabricator

chg: suppress OSError in _restoreio() and add some logging (issue6330)

Authored by pulkit.

Description

chg: suppress OSError in _restoreio() and add some logging (issue6330)

According to issue6330, running chg on heavy loaded systems can lead to
following error:

Traceback (most recent call last):
  File "path-to-hg/mercurial/commandserver.py", line 650, in _acceptnewconnection
    self._runworker(conn)
  File "path-to-hg/mercurial/commandserver.py", line 701, in _runworker
    prereposetups=[self._reposetup],
  File "path-to-hg/mercurial/commandserver.py", line 470, in _serverequest
    sv.cleanup()
  File "path-to-hg/mercurial/chgserver.py", line 381, in cleanup
    self._restoreio()
  File "path-to-hg/mercurial/chgserver.py", line 444, in _restoreio
    os.dup2(fd, fp.fileno())
OSError: [Errno 16] Device or resource busy

[man dup2] indicates that, on Linux, EBUSY comes from a race condition
between open() and dup2().

However it's not clear why open() race occurred for newfd=stdin/out/err.

We suppress the OSError in _restoreio() since the forked worker process will
finish anyway and add some logging.

Thanks to Mitchell Plamann for a detailed bug description and Yuya Nishihara for
suggesting the fix.

Details

Committed
pulkitJul 3 2020, 4:15 AM
Parents
rHG36ea1442b7bc: ui: fix Python 2.7 support for ui.timestamp-output
Branches
Unknown
Tags
Unknown