diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2022-12-20 11:43:31 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2022-12-21 14:15:26 +0000 |
commit | 98f1b3d6ae6b6ac06f993bc0caa15fa93bce7ddf (patch) | |
tree | b91c2d11afdc21b8f76cb29bb62a7616fe7e2d36 /bitbake/lib/bb/server/process.py | |
parent | fafce983635a88fd9bb5a1afdbc06d8b90b393b5 (diff) | |
download | poky-98f1b3d6ae6b6ac06f993bc0caa15fa93bce7ddf.tar.gz |
bitbake: server/process: Add bitbake.sock race handling
We've seen cases where the bitbake.sock file appears to disappear but the
server continues to hold bitbake.lock. The most likely explaination is
that some previous build directory was moved out the way, a server there
kept running, eventually exited and removed the sock file from the wrong
directory.
To guard against this, save the inode information for the sock file and check
it before deleting the file. The new code isn't entirely race free but should
guard against what is a rare but annoying potential issue.
(Bitbake rev: b02ebbffdae27e564450446bf84c4e98d094ee4a)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/server/process.py')
-rw-r--r-- | bitbake/lib/bb/server/process.py | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index 12498a6c47..586d46af88 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py | |||
@@ -28,6 +28,7 @@ import datetime | |||
28 | import pickle | 28 | import pickle |
29 | import traceback | 29 | import traceback |
30 | import gc | 30 | import gc |
31 | import stat | ||
31 | import bb.server.xmlrpcserver | 32 | import bb.server.xmlrpcserver |
32 | from bb import daemonize | 33 | from bb import daemonize |
33 | from multiprocessing import queues | 34 | from multiprocessing import queues |
@@ -93,6 +94,9 @@ class ProcessServer(): | |||
93 | self.bitbake_lock_name = lockname | 94 | self.bitbake_lock_name = lockname |
94 | self.sock = sock | 95 | self.sock = sock |
95 | self.sockname = sockname | 96 | self.sockname = sockname |
97 | # It is possible the directory may be renamed. Cache the inode of the socket file | ||
98 | # so we can tell if things changed. | ||
99 | self.sockinode = os.stat(self.sockname)[stat.ST_INO] | ||
96 | 100 | ||
97 | self.server_timeout = server_timeout | 101 | self.server_timeout = server_timeout |
98 | self.timeout = self.server_timeout | 102 | self.timeout = self.server_timeout |
@@ -276,8 +280,14 @@ class ProcessServer(): | |||
276 | 280 | ||
277 | serverlog("Exiting (socket: %s)" % os.path.exists(self.sockname)) | 281 | serverlog("Exiting (socket: %s)" % os.path.exists(self.sockname)) |
278 | # Remove the socket file so we don't get any more connections to avoid races | 282 | # Remove the socket file so we don't get any more connections to avoid races |
283 | # The build directory could have been renamed so if the file isn't the one we created | ||
284 | # we shouldn't delete it. | ||
279 | try: | 285 | try: |
280 | os.unlink(self.sockname) | 286 | sockinode = os.stat(self.sockname)[stat.ST_INO] |
287 | if sockinode == self.sockinode: | ||
288 | os.unlink(self.sockname) | ||
289 | else: | ||
290 | serverlog("bitbake.sock inode mismatch (%s vs %s), not deleting." % (sockinode, self.sockinode)) | ||
281 | except Exception as err: | 291 | except Exception as err: |
282 | serverlog("Removing socket file '%s' failed (%s)" % (self.sockname, err)) | 292 | serverlog("Removing socket file '%s' failed (%s)" % (self.sockname, err)) |
283 | self.sock.close() | 293 | self.sock.close() |