summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-08-13 23:32:30 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-08-14 11:15:20 +0100
commit5e267f14bb0155889615f567a920af4a37eb3c6b (patch)
treea302df4a9e0cae276199c75b587479b3f24a2e8e
parent218e4b6418992588312b8ef5949b84ef43263d1a (diff)
downloadbitbake-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>
-rw-r--r--lib/bb/server/process.py38
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