]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
bitbake: process: Reorder server command processing and handle EOFError
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Mon, 31 Jul 2017 07:09:03 +0000 (08:09 +0100)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Mon, 31 Jul 2017 14:13:53 +0000 (15:13 +0100)
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.

(Bitbake rev: 974281ed72d8366baa16ee85f7e93970689b5956)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
bitbake/lib/bb/server/process.py

index e4b9d96234b261e96aa2999ef4e9b31708db9dc7..aefabbed01a69736f5d1de0603816d6a9c945fbc 100644 (file)
@@ -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")