summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/server
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2022-12-20 11:43:31 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2022-12-21 14:15:26 +0000
commit98f1b3d6ae6b6ac06f993bc0caa15fa93bce7ddf (patch)
treeb91c2d11afdc21b8f76cb29bb62a7616fe7e2d36 /bitbake/lib/bb/server
parentfafce983635a88fd9bb5a1afdbc06d8b90b393b5 (diff)
downloadpoky-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')
-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 12498a6c47..586d46af88 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
@@ -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()