Mercurial > hg
changeset 23036:19f5273c9f3e
cmdserver: include pid of server handling requests in hello message
Because unix-mode server forks child process per connection, client does not
know the pid of the server that will handle requests. The pid is necessary
to interrupt hung process:
1. client connects to socket server
2. server accepts the connection, forks, and tells pid
3. client requests "runcommand pull"
.. hung ..
4. client sends SIGINT to the (forked) server
5. server returns from I/O wait
Note that getsockopt(SO_PEERCRED) of Linux cannot be used because the server
fork()s after accept().
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sat, 18 Oct 2014 12:24:50 +0900 |
parents | 5f8f8225fc7e |
children | eeaed3d2b004 |
files | mercurial/commandserver.py tests/test-commandserver.t |
diffstat | 2 files changed, 5 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/commandserver.py Sat Oct 18 21:52:11 2014 +0900 +++ b/mercurial/commandserver.py Sat Oct 18 12:24:50 2014 +0900 @@ -232,6 +232,8 @@ hellomsg = 'capabilities: ' + ' '.join(sorted(self.capabilities)) hellomsg += '\n' hellomsg += 'encoding: ' + encoding.encoding + hellomsg += '\n' + hellomsg += 'pid: %d' % os.getpid() # write the hello msg in -one- chunk self.cout.write(hellomsg)
--- a/tests/test-commandserver.t Sat Oct 18 21:52:11 2014 +0900 +++ b/tests/test-commandserver.t Sat Oct 18 12:24:50 2014 +0900 @@ -16,7 +16,7 @@ ... # run an arbitrary command to make sure the next thing the server ... # sends isn't part of the hello message ... runcommand(server, ['id']) - o, 'capabilities: getencoding runcommand\nencoding: *' (glob) + o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob) *** runcommand id 000000000000 tip @@ -531,7 +531,7 @@ ... # run an arbitrary command to make sure the next thing the server ... # sends isn't part of the hello message ... runcommand(server, ['id']) - o, 'capabilities: getencoding runcommand\nencoding: *' (glob) + o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob) *** runcommand id abort: there is no Mercurial repository here (.hg not found) [255] @@ -562,7 +562,7 @@ ... print '%c, %r' % (ch, data) ... runcommand(conn, ['id']) >>> check(hellomessage, server.connect) - o, 'capabilities: getencoding runcommand\nencoding: *' (glob) + o, 'capabilities: getencoding runcommand\nencoding: *\npid: *' (glob) *** runcommand id eff892de26ec tip bm1/bm2/bm3 >>> def unknowncommand(conn):