summaryrefslogtreecommitdiffstats
path: root/bitbake
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2023-01-14 04:12:02 -1000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-01-16 11:08:39 +0000
commitda318dd088a3573e3abefdf14ea9b8bfecf36e3c (patch)
tree3ba9a6cf0db444bf39b52573541071617e486af5 /bitbake
parentbfa114bfa8040f38c247bb0d38f5aeee3595e819 (diff)
downloadpoky-da318dd088a3573e3abefdf14ea9b8bfecf36e3c.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: 52b6b099a47555811b8d0b311f62af712dd6eb8e) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org> (cherry picked from commit b02ebbffdae27e564450446bf84c4e98d094ee4a) Signed-off-by: Steve Sakoman <steve@sakoman.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r--bitbake/lib/bb/server/process.py12
1 files changed, 11 insertions, 1 deletions
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py
index 2a9fb6623c..3668a32b71 100644
--- a/bitbake/lib/bb/server/process.py
+++ b/bitbake/lib/bb/server/process.py
@@ -28,6 +28,7 @@ import datetime
28import pickle 28import pickle
29import traceback 29import traceback
30import gc 30import gc
31import stat
31import bb.server.xmlrpcserver 32import bb.server.xmlrpcserver
32from bb import daemonize 33from bb import daemonize
33from multiprocessing import queues 34from multiprocessing import queues
@@ -64,6 +65,9 @@ class ProcessServer():
64 self.bitbake_lock_name = lockname 65 self.bitbake_lock_name = lockname
65 self.sock = sock 66 self.sock = sock
66 self.sockname = sockname 67 self.sockname = sockname
68 # It is possible the directory may be renamed. Cache the inode of the socket file
69 # so we can tell if things changed.
70 self.sockinode = os.stat(self.sockname)[stat.ST_INO]
67 71
68 self.server_timeout = server_timeout 72 self.server_timeout = server_timeout
69 self.timeout = self.server_timeout 73 self.timeout = self.server_timeout
@@ -246,8 +250,14 @@ class ProcessServer():
246 250
247 serverlog("Exiting") 251 serverlog("Exiting")
248 # Remove the socket file so we don't get any more connections to avoid races 252 # Remove the socket file so we don't get any more connections to avoid races
253 # The build directory could have been renamed so if the file isn't the one we created
254 # we shouldn't delete it.
249 try: 255 try:
250 os.unlink(self.sockname) 256 sockinode = os.stat(self.sockname)[stat.ST_INO]
257 if sockinode == self.sockinode:
258 os.unlink(self.sockname)
259 else:
260 serverlog("bitbake.sock inode mismatch (%s vs %s), not deleting." % (sockinode, self.sockinode))
251 except Exception as err: 261 except Exception as err:
252 serverlog("Removing socket file '%s' failed (%s)" % (self.sockname, err)) 262 serverlog("Removing socket file '%s' failed (%s)" % (self.sockname, err))
253 self.sock.close() 263 self.sock.close()