summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-07-31 08:09:03 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-07-31 08:58:31 +0100
commit974281ed72d8366baa16ee85f7e93970689b5956 (patch)
tree740a9a1794694090985ebc55cc4ad88b79ad4aec
parentbb70ae0c9aac5ec688026d23a64ac0cac1947187 (diff)
downloadbitbake-contrib-974281ed72d8366baa16ee85f7e93970689b5956.tar.gz
bitbake-contrib-974281ed72d8366baa16ee85f7e93970689b5956.tar.bz2
bitbake-contrib-974281ed72d8366baa16ee85f7e93970689b5956.zip
process: Reorder server command processing and handle EOFError
If the connection control socket and the command channel close together, we can race and hit EOFError exceptions before we close the channel. Reorder the code to handle this in the correct order and ignore the EOFError exceptions as they mean the client is disconnecting and shouldn't terminate the server. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/bb/server/process.py31
1 files changed, 18 insertions, 13 deletions
diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py
index e4b9d96234..aefabbed01 100644
--- a/lib/bb/server/process.py
+++ b/lib/bb/server/process.py
@@ -133,19 +133,6 @@ class ProcessServer(multiprocessing.Process):
if self.xmlrpc:
fds.append(self.xmlrpc)
while not self.quit:
- if self.command_channel in ready:
- command = self.command_channel.get()
- if command[0] == "terminateServer":
- self.quit = True
- continue
- try:
- print("Running command %s" % command)
- self.command_channel_reply.send(self.cooker.command.runCommand(command))
- except Exception as e:
- logger.exception('Exception in server main event loop running command %s (%s)' % (command, str(e)))
-
- if self.xmlrpc in ready:
- self.xmlrpc.handle_requests()
if self.sock in ready:
self.controllersock, address = self.sock.accept()
if self.haveui:
@@ -194,6 +181,24 @@ class ProcessServer(multiprocessing.Process):
print("Server timeout, exiting.")
self.quit = True
+ if self.command_channel in ready:
+ try:
+ command = self.command_channel.get()
+ except EOFError:
+ # Client connection shutting down
+ continue
+ if command[0] == "terminateServer":
+ self.quit = True
+ continue
+ try:
+ print("Running command %s" % command)
+ self.command_channel_reply.send(self.cooker.command.runCommand(command))
+ except Exception as e:
+ logger.exception('Exception in server main event loop running command %s (%s)' % (command, str(e)))
+
+ if self.xmlrpc in ready:
+ self.xmlrpc.handle_requests()
+
ready = self.idle_commands(.1, fds)
print("Exiting")