diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-07-24 13:39:12 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-07-24 13:59:31 +0100 |
commit | 0b5a837477d18442caf97dd0fa14a806c54f5842 (patch) | |
tree | df15ac690e8f165c6177546faacdb8079ea4cea3 /lib/prserv | |
parent | 6fa07752bbd3ac345cd8617da49a70e0b2dd565f (diff) | |
download | bitbake-contrib-0b5a837477d18442caf97dd0fa14a806c54f5842.tar.gz |
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.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'lib/prserv')
-rw-r--r-- | lib/prserv/serv.py | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/prserv/serv.py b/lib/prserv/serv.py index 5f061c262..3145689ba 100644 --- a/lib/prserv/serv.py +++ b/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): |