[gnome-continuous-yocto/gnomeostree-3.28-rocko: 7394/8267] bitbake: process: Clean up connection retry logic



commit 2b453483d4610945c6156cc7f472ffae803cb28a
Author: Richard Purdie <richard purdie linuxfoundation org>
Date:   Wed Aug 23 15:46:00 2017 +0100

    bitbake: process: Clean up connection retry logic
    
    Its possible for a connection to connect to the server as its shutting down
    but before its removed the socket file. This patch:
    
    a) Removes the socket file earlier to avoid connections.
    b) Handles EOFError in initial connections gracefully. These occur if the
       socket is closed during the server shutdown.
    c) Ensure duplicate events aren't shown on the console. This makes debugging
       these issues very very confusing.
    
    With these changes the backtrace that was concerning users is hidden and the
    server works as expected with a reconnect when it catches it in a bad state.
    
    (Bitbake rev: f45196cf84669723382730944dddc7eaf50826f2)
    
    Signed-off-by: Richard Purdie <richard purdie linuxfoundation org>

 bitbake/lib/bb/main.py           |   13 ++++++++++---
 bitbake/lib/bb/server/process.py |    8 ++++----
 2 files changed, 14 insertions(+), 7 deletions(-)
---
diff --git a/bitbake/lib/bb/main.py b/bitbake/lib/bb/main.py
index 0418d52..07972f6 100755
--- a/bitbake/lib/bb/main.py
+++ b/bitbake/lib/bb/main.py
@@ -438,9 +438,10 @@ def setup_bitbake(configParams, configuration, extrafeatures=None):
                         return None, None
                     # we start a server with a given configuration
                     logger.info("Starting bitbake server...")
-                    server = bb.server.process.BitBakeServer(lock, sockname, configuration, featureset)
-                    # The server will handle any events already in the queue
+                    # Clear the event queue since we already displayed messages
                     bb.event.ui_queue = []
+                    server = bb.server.process.BitBakeServer(lock, sockname, configuration, featureset)
+
                 else:
                     logger.info("Reconnecting to bitbake server...")
                     if not os.path.exists(sockname):
@@ -448,7 +449,13 @@ def setup_bitbake(configParams, configuration, extrafeatures=None):
                         time.sleep(5)
                         raise bb.server.process.ProcessTimeout("Bitbake still shutting down as socket exists 
but no lock?")
                 if not configParams.server_only:
-                    server_connection = bb.server.process.connectProcessServer(sockname, featureset)
+                    try:
+                        server_connection = bb.server.process.connectProcessServer(sockname, featureset)
+                    except EOFError:
+                        # The server may have been shutting down but not closed the socket yet. If that 
happened,
+                        # ignore it.
+                        pass
+
                 if server_connection or configParams.server_only:
                     break
             except (Exception, bb.server.process.ProcessTimeout) as e:
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py
index 3ab793c..fad8aac 100644
--- a/bitbake/lib/bb/server/process.py
+++ b/bitbake/lib/bb/server/process.py
@@ -215,6 +215,10 @@ class ProcessServer(multiprocessing.Process):
             ready = self.idle_commands(.1, fds)
 
         print("Exiting")
+        # Remove the socket file so we don't get any more connections to avoid races
+        os.unlink(self.sockname)
+        self.sock.close()
+
         try: 
             self.cooker.shutdown(True)
         except:
@@ -222,10 +226,6 @@ class ProcessServer(multiprocessing.Process):
 
         self.cooker.post_serve()
 
-        # Remove the socket file so we don't get any more connections to avoid races
-        os.unlink(self.sockname)
-        self.sock.close()
-
         # Finally release the lockfile but warn about other processes holding it open
         lock = self.bitbake_lock
         lockfile = lock.name


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