diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-08-13 23:32:30 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-08-14 11:15:20 +0100 |
commit | 5e267f14bb0155889615f567a920af4a37eb3c6b (patch) | |
tree | a302df4a9e0cae276199c75b587479b3f24a2e8e /lib | |
parent | 218e4b6418992588312b8ef5949b84ef43263d1a (diff) | |
download | bitbake-contrib-5e267f14bb0155889615f567a920af4a37eb3c6b.tar.gz |
process: Improve client disconnects
There have been cases where the server could loop indefinitely and incorrectly
handle client disconnects. In the EOFError case, ensure a full disconnect
happens in the alternative disconnect path to avoid this.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/bb/server/process.py | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py index ee8b14ea7..a7a6fbff6 100644 --- a/lib/bb/server/process.py +++ b/lib/bb/server/process.py @@ -134,6 +134,26 @@ class ProcessServer(multiprocessing.Process): if self.xmlrpc: fds.append(self.xmlrpc) print("Entering server connection loop") + + def disconnect_client(self, fds): + if not self.haveui: + return + print("Disconnecting Client") + fds.remove(self.controllersock) + fds.remove(self.command_channel) + bb.event.unregister_UIHhandler(self.event_handle, True) + self.command_channel_reply.writer.close() + self.event_writer.writer.close() + del self.event_writer + self.controllersock.close() + self.controllersock = False + self.haveui = False + self.lastui = time.time() + self.cooker.clientComplete() + if self.timeout is None: + print("No timeout, exiting.") + self.quit = True + while not self.quit: if self.sock in ready: self.controllersock, address = self.sock.accept() @@ -165,21 +185,8 @@ class ProcessServer(multiprocessing.Process): self.haveui = True except (EOFError, OSError): - print("Disconnecting Client") - fds.remove(self.controllersock) - fds.remove(self.command_channel) - bb.event.unregister_UIHhandler(self.event_handle, True) - self.command_channel_reply.writer.close() - self.event_writer.writer.close() - del self.event_writer - self.controllersock.close() - self.controllersock = False - self.haveui = False - self.lastui = time.time() - self.cooker.clientComplete() - if self.timeout is None: - print("No timeout, exiting.") - self.quit = True + disconnect_client(self, fds) + if not self.timeout == -1.0 and not self.haveui and self.lastui and self.timeout and \ (self.lastui + self.timeout) < time.time(): print("Server timeout, exiting.") @@ -191,6 +198,7 @@ class ProcessServer(multiprocessing.Process): except EOFError: # Client connection shutting down ready = [] + disconnect_client(self, fds) continue if command[0] == "terminateServer": self.quit = True |