Mercurial > public > mercurial-scm > hg-stable
diff mercurial/wireprotoserver.py @ 51483:13c004b54cbe stable
wireprotoserver: ensure that output stream gets flushed on exception
Previously flush was happening due to Python finalizer being run on
`BufferedWriter`. With upgrade to Python 3.11 this started randomly
failing.
My guess is that the finalizer on the raw `FileIO` object may
be running before the finalizer of `BufferedWriter` has a chance to run.
At any rate, since we're not relying on finalizers in the happy case
we should also not rely on them in case of exception.
author | Arseniy Alekseyev <aalekseyev@janestreet.com> |
---|---|
date | Thu, 04 Apr 2024 14:15:32 +0100 |
parents | 45c7bada5200 |
children | f4733654f144 |
line wrap: on
line diff
--- a/mercurial/wireprotoserver.py Mon Apr 15 16:33:37 2024 +0100 +++ b/mercurial/wireprotoserver.py Thu Apr 04 14:15:32 2024 +0100 @@ -527,24 +527,34 @@ def __init__(self, ui, repo, logfh=None, accesshidden=False): self._ui = ui self._repo = repo - self._fin, self._fout = ui.protectfinout() self._accesshidden = accesshidden - - # Log write I/O to stdout and stderr if configured. - if logfh: - self._fout = util.makeloggingfileobject( - logfh, self._fout, b'o', logdata=True - ) - ui.ferr = util.makeloggingfileobject( - logfh, ui.ferr, b'e', logdata=True - ) + self._logfh = logfh def serve_forever(self): self.serveuntil(threading.Event()) - self._ui.restorefinout(self._fin, self._fout) def serveuntil(self, ev): """Serve until a threading.Event is set.""" - _runsshserver( - self._ui, self._repo, self._fin, self._fout, ev, self._accesshidden - ) + with self._ui.protectedfinout() as (fin, fout): + if self._logfh: + # Log write I/O to stdout and stderr if configured. + fout = util.makeloggingfileobject( + self._logfh, + fout, + b'o', + logdata=True, + ) + self._ui.ferr = util.makeloggingfileobject( + self._logfh, + self._ui.ferr, + b'e', + logdata=True, + ) + _runsshserver( + self._ui, + self._repo, + fin, + fout, + ev, + self._accesshidden, + )