summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-08-23 15:46:00 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-08-24 11:19:29 +0100
commitf45196cf84669723382730944dddc7eaf50826f2 (patch)
treee9e4716a1f5ba6de67d864ce4ce1c46c3db78c72
parentd5cab2dbf5682d2fd08e58316a3bf39a10f63df2 (diff)
downloadbitbake-contrib-f45196cf84669723382730944dddc7eaf50826f2.tar.gz
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. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rwxr-xr-xlib/bb/main.py13
-rw-r--r--lib/bb/server/process.py8
2 files changed, 14 insertions, 7 deletions
diff --git a/lib/bb/main.py b/lib/bb/main.py
index 0418d52b8..07972f69e 100755
--- a/lib/bb/main.py
+++ b/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/lib/bb/server/process.py b/lib/bb/server/process.py
index 3ab793c77..fad8aac4d 100644
--- a/lib/bb/server/process.py
+++ b/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