summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2020-08-26 00:04:04 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2020-08-26 00:07:53 +0100
commit8eb52afdfd4c3e6478d4f8cc56e99def3f1c924c (patch)
treed172a4e59257fee741f870469bd7d3f1e2f2c97b
parente2be6defbb9fcf25f9df04c3b452d0dba48dfd03 (diff)
downloadbitbake-8eb52afdfd4c3e6478d4f8cc56e99def3f1c924c.tar.gz
process: Avoid bb.utils.timeout
I have a suspicion based on process traces that the flock() call is no longer interrupted by SIGALRM and hence the timeout doesn't work. We were relying on EINTR triggering around syscalls but python is likely protecting us from that in modern versions. Re-implement this code with a different mechanism which doesn't have that potential issue. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/bb/server/process.py51
1 files changed, 27 insertions, 24 deletions
diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py
index 6d936ed45..973bc4525 100644
--- a/lib/bb/server/process.py
+++ b/lib/bb/server/process.py
@@ -266,34 +266,37 @@ class ProcessServer():
lock = None
while not lock:
- with bb.utils.timeout(3):
- lock = bb.utils.lockfile(lockfile, shared=False, retry=False, block=True)
- if lock:
- # We hold the lock so we can remove the file (hide stale pid data)
- # via unlockfile.
- bb.utils.unlockfile(lock)
- return
-
- if not lock:
- # Some systems may not have lsof available
- procs = None
+ i = 0
+ lock = None
+ while not lock and i < 30:
+ time.sleep(0.1)
+ _, lock = bb.utils.lockfile(lockfile, shared=False, retry=False, block=False)
+ i += 1
+ if lock:
+ # We hold the lock so we can remove the file (hide stale pid data)
+ # via unlockfile.
+ bb.utils.unlockfile(lock)
+ return
+ if not lock:
+ # Some systems may not have lsof available
+ procs = None
+ try:
+ procs = subprocess.check_output(["lsof", '-w', lockfile], stderr=subprocess.STDOUT)
+ except OSError as e:
+ if e.errno != errno.ENOENT:
+ raise
+ if procs is None:
+ # Fall back to fuser if lsof is unavailable
try:
- procs = subprocess.check_output(["lsof", '-w', lockfile], stderr=subprocess.STDOUT)
+ procs = subprocess.check_output(["fuser", '-v', lockfile], stderr=subprocess.STDOUT)
except OSError as e:
if e.errno != errno.ENOENT:
raise
- if procs is None:
- # Fall back to fuser if lsof is unavailable
- try:
- procs = subprocess.check_output(["fuser", '-v', lockfile], stderr=subprocess.STDOUT)
- except OSError as e:
- if e.errno != errno.ENOENT:
- raise
-
- msg = "Delaying shutdown due to active processes which appear to be holding bitbake.lock"
- if procs:
- msg += ":\n%s" % str(procs)
- print(msg)
+
+ msg = "Delaying shutdown due to active processes which appear to be holding bitbake.lock"
+ if procs:
+ msg += ":\n%s" % str(procs)
+ print(msg)
def idle_commands(self, delay, fds=None):
nextsleep = delay