# HG changeset patch # User Yuya Nishihara # Date 2014-10-18 03:24:50 # Node ID 19f5273c9f3e665bcfefdbec65f29321a08a3d23 # Parent 5f8f8225fc7e21da8bc01cdd8e9462deae5163be 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(). diff --git a/mercurial/commandserver.py b/mercurial/commandserver.py --- a/mercurial/commandserver.py +++ b/mercurial/commandserver.py @@ -232,6 +232,8 @@ class server(object): 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) diff --git a/tests/test-commandserver.t b/tests/test-commandserver.t --- a/tests/test-commandserver.t +++ b/tests/test-commandserver.t @@ -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 @@ start without repository: ... # 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 @@ unix domain socket: ... 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):