diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-08-23 15:46:00 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-08-24 13:48:40 +0100 |
commit | 2b453483d4610945c6156cc7f472ffae803cb28a (patch) | |
tree | 668542757ac62186938dd697eb920514b440413c | |
parent | 95b99811bb51fba6a03dfa60a5b85e821550193e (diff) | |
download | poky-2b453483d4610945c6156cc7f472ffae803cb28a.tar.gz |
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>
-rwxr-xr-x | bitbake/lib/bb/main.py | 13 | ||||
-rw-r--r-- | 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 0418d52b84..07972f69e5 100755 --- a/bitbake/lib/bb/main.py +++ b/bitbake/lib/bb/main.py | |||
@@ -438,9 +438,10 @@ def setup_bitbake(configParams, configuration, extrafeatures=None): | |||
438 | return None, None | 438 | return None, None |
439 | # we start a server with a given configuration | 439 | # we start a server with a given configuration |
440 | logger.info("Starting bitbake server...") | 440 | logger.info("Starting bitbake server...") |
441 | server = bb.server.process.BitBakeServer(lock, sockname, configuration, featureset) | 441 | # Clear the event queue since we already displayed messages |
442 | # The server will handle any events already in the queue | ||
443 | bb.event.ui_queue = [] | 442 | bb.event.ui_queue = [] |
443 | server = bb.server.process.BitBakeServer(lock, sockname, configuration, featureset) | ||
444 | |||
444 | else: | 445 | else: |
445 | logger.info("Reconnecting to bitbake server...") | 446 | logger.info("Reconnecting to bitbake server...") |
446 | if not os.path.exists(sockname): | 447 | if not os.path.exists(sockname): |
@@ -448,7 +449,13 @@ def setup_bitbake(configParams, configuration, extrafeatures=None): | |||
448 | time.sleep(5) | 449 | time.sleep(5) |
449 | raise bb.server.process.ProcessTimeout("Bitbake still shutting down as socket exists but no lock?") | 450 | raise bb.server.process.ProcessTimeout("Bitbake still shutting down as socket exists but no lock?") |
450 | if not configParams.server_only: | 451 | if not configParams.server_only: |
451 | server_connection = bb.server.process.connectProcessServer(sockname, featureset) | 452 | try: |
453 | server_connection = bb.server.process.connectProcessServer(sockname, featureset) | ||
454 | except EOFError: | ||
455 | # The server may have been shutting down but not closed the socket yet. If that happened, | ||
456 | # ignore it. | ||
457 | pass | ||
458 | |||
452 | if server_connection or configParams.server_only: | 459 | if server_connection or configParams.server_only: |
453 | break | 460 | break |
454 | except (Exception, bb.server.process.ProcessTimeout) as e: | 461 | 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 3ab793c778..fad8aac4da 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
@@ -215,6 +215,10 @@ class ProcessServer(multiprocessing.Process): | |||
215 | ready = self.idle_commands(.1, fds) | 215 | ready = self.idle_commands(.1, fds) |
216 | 216 | ||
217 | print("Exiting") | 217 | print("Exiting") |
218 | # Remove the socket file so we don't get any more connections to avoid races | ||
219 | os.unlink(self.sockname) | ||
220 | self.sock.close() | ||
221 | |||
218 | try: | 222 | try: |
219 | self.cooker.shutdown(True) | 223 | self.cooker.shutdown(True) |
220 | except: | 224 | except: |
@@ -222,10 +226,6 @@ class ProcessServer(multiprocessing.Process): | |||
222 | 226 | ||
223 | self.cooker.post_serve() | 227 | self.cooker.post_serve() |
224 | 228 | ||
225 | # Remove the socket file so we don't get any more connections to avoid races | ||
226 | os.unlink(self.sockname) | ||
227 | self.sock.close() | ||
228 | |||
229 | # Finally release the lockfile but warn about other processes holding it open | 229 | # Finally release the lockfile but warn about other processes holding it open |
230 | lock = self.bitbake_lock | 230 | lock = self.bitbake_lock |
231 | lockfile = lock.name | 231 | lockfile = lock.name |