[gnome-continuous-yocto/gnomeostree-3.28-rocko: 6938/8267] bitbake: prserv/serv: Improve process exit handling



commit 57196bc6e4a07f855b3073b6120211ddda179077
Author: Richard Purdie <richard purdie linuxfoundation org>
Date:   Mon Jul 24 13:39:12 2017 +0100

    bitbake: prserv/serv: Improve process exit handling
    
    The server shutdown is currenlty laggy and race prone. This patch:
    
    * adds a waitpid so that no zombie server is left around if its not
      running in daemon mode.
    * adds a quit "sentinal" using a pipe so that we're not sitting in
      a socket poll() until timeout in order just to quit.
    * use a select() call to poll the socket and the pipe for a quit signal.
    
    The net result of this change is that the prserv exits with the cooker server
    and it does so immediately and doesn't wait for the select/poll calls to
    timeout. This makes bitbake a lot more responsive for startup/shutdown and
    doesn't cause UI timeout errors as often when prserv is used.
    
    (Bitbake rev: 0b5a837477d18442caf97dd0fa14a806c54f5842)
    
    Signed-off-by: Richard Purdie <richard purdie linuxfoundation org>

 bitbake/lib/prserv/serv.py |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)
---
diff --git a/bitbake/lib/prserv/serv.py b/bitbake/lib/prserv/serv.py
index 5f061c2..3145689 100644
--- a/bitbake/lib/prserv/serv.py
+++ b/bitbake/lib/prserv/serv.py
@@ -10,6 +10,7 @@ import bb.server.xmlrpcclient
 import prserv
 import prserv.db
 import errno
+import select
 
 logger = logging.getLogger("BitBake.PRserv")
 
@@ -59,6 +60,8 @@ class PRServer(SimpleXMLRPCServer):
         self.register_function(self.importone, "importone")
         self.register_introspection_functions()
 
+        self.quitpipein, self.quitpipeout = os.pipe()
+
         self.requestqueue = queue.Queue()
         self.handlerthread = threading.Thread(target = self.process_request_thread)
         self.handlerthread.daemon = False
@@ -153,11 +156,16 @@ class PRServer(SimpleXMLRPCServer):
 
     def quit(self):
         self.quit=True
+        os.write(self.quitpipeout, b"q")
+        os.close(self.quitpipeout)
         return
 
     def work_forever(self,):
         self.quit = False
-        self.timeout = 0.5
+        # This timeout applies to the poll in TCPServer, we need the select 
+        # below to wake on our quit pipe closing. We only ever call into handle_request
+        # if there is data there.
+        self.timeout = 0.01
 
         bb.utils.set_process_name("PRServ")
 
@@ -170,11 +178,16 @@ class PRServer(SimpleXMLRPCServer):
 
         self.handlerthread.start()
         while not self.quit:
-            self.handle_request()
+            ready = select.select([self.fileno(), self.quitpipein], [], [], 30)
+            if self.quit:
+                break
+            if self.fileno() in ready[0]:
+                self.handle_request()
         self.handlerthread.join()
         self.db.disconnect()
         logger.info("PRServer: stopping...")
         self.server_close()
+        os.close(self.quitpipein)
         return
 
     def start(self):
@@ -182,6 +195,7 @@ class PRServer(SimpleXMLRPCServer):
             pid = self.daemonize()
         else:
             pid = self.fork()
+            self.pid = pid
 
         # Ensure both the parent sees this and the child from the work_forever log entry above
         logger.info("Started PRServer with DBfile: %s, IP: %s, PORT: %s, PID: %s" %
@@ -472,6 +486,7 @@ def auto_shutdown(d=None):
             PRServerConnection(host, port).terminate()
         except:
             logger.critical("Stop PRService %s:%d failed" % (host,port))
+        os.waitpid(singleton.prserv.pid, 0)
         singleton = None
 
 def ping(host, port):


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]