All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] process: Improve client disconnects
@ 2017-08-14 10:27 Richard Purdie
  0 siblings, 0 replies; only message in thread
From: Richard Purdie @ 2017-08-14 10:27 UTC (permalink / raw)
  To: bitbake-devel

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>
---
 lib/bb/server/process.py | 38 +++++++++++++++++++++++---------------
 1 file changed, 23 insertions(+), 15 deletions(-)

diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py
index ee8b14e..a7a6fbf 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
-- 
2.7.4



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2017-08-14 10:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-14 10:27 [PATCH] process: Improve client disconnects Richard Purdie

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.