Mercurial > hg
changeset 33503:27d23fe32887
commandserver: use selectors2
Previously, commandserver was using select.select. That could have issue if
_sock.fileno() >= FD_SETSIZE (usually 1024), which raises:
ValueError: filedescriptor out of range in select()
We got that in production today, although it's the code opening that many
files to blame, it seems better for commandserver to work in this case.
There are multiple way to "solve" it, like preserving a fd with a small
number and swap it with sock using dup2(). But upgrading to a modern
selector supported by the system seems to be the most correct way.
author | Jun Wu <quark@fb.com> |
---|---|
date | Fri, 14 Jul 2017 20:26:21 -0700 |
parents | 5d0c0c8d2929 |
children | 5d3ba4395288 |
files | mercurial/commandserver.py |
diffstat | 1 files changed, 4 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/commandserver.py Fri Jul 14 20:19:46 2017 -0700 +++ b/mercurial/commandserver.py Fri Jul 14 20:26:21 2017 -0700 @@ -22,6 +22,7 @@ encoding, error, pycompat, + selectors2, util, ) @@ -476,6 +477,8 @@ def _mainloop(self): exiting = False h = self._servicehandler + selector = selectors2.DefaultSelector() + selector.register(self._sock, selectors2.EVENT_READ) while True: if not exiting and h.shouldexit(): # clients can no longer connect() to the domain socket, so @@ -486,7 +489,7 @@ self._unlinksocket() exiting = True try: - ready = select.select([self._sock], [], [], h.pollinterval)[0] + ready = selector.select(timeout=h.pollinterval) if not ready: # only exit if we completed all queued requests if exiting: