Mercurial > hg
diff hgext/remotefilelog/connectionpool.py @ 46661:0509cee38757
remotefilelog: rework workaround for sshpeer deadlocks
The wrapping of `sshpeer.cleanup` silently broke when `cleanup` was
renamed to `_cleanup`, a couple of years ago.
I don't know what `orig.im_self` is, but regardless, the intention of
the wrapping seems pretty clear: close stderr before
sshpeer._cleanuppipes blocks on it. So do that.
Differential Revision: https://phab.mercurial-scm.org/D9997
author | Valentin Gatien-Baron <valentin.gatienbaron@gmail.com> |
---|---|
date | Mon, 15 Feb 2021 14:15:02 -0500 |
parents | 4aa72cdf616f |
children | db8037e38085 |
line wrap: on
line diff
--- a/hgext/remotefilelog/connectionpool.py Mon Feb 15 14:11:38 2021 -0500 +++ b/hgext/remotefilelog/connectionpool.py Mon Feb 15 14:15:02 2021 -0500 @@ -43,17 +43,19 @@ if conn is None: - def _cleanup(orig): - # close pipee first so peer.cleanup reading it won't deadlock, - # if there are other processes with pipeo open (i.e. us). - peer = orig.im_self - if util.safehasattr(peer, 'pipee'): - peer.pipee.close() - return orig() + peer = hg.peer(self._repo.ui, {}, path) + if util.safehasattr(peer, '_cleanup'): - peer = hg.peer(self._repo.ui, {}, path) - if util.safehasattr(peer, 'cleanup'): - extensions.wrapfunction(peer, b'cleanup', _cleanup) + class mypeer(peer.__class__): + def _cleanup(self): + # close pipee first so peer.cleanup reading it won't + # deadlock, if there are other processes with pipeo + # open (i.e. us). + if util.safehasattr(self, 'pipee'): + self.pipee.close() + return super(mypeer, self)._cleanup() + + peer.__class__ = mypeer conn = connection(pathpool, peer)