summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/utils.py
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2023-01-04 12:32:35 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-01-05 11:50:17 +0000
commita19687acd12497d727203e63d74b2703387f34a6 (patch)
tree813515cdfb0c807435db26acb6bafc2d351f48f1 /bitbake/lib/bb/utils.py
parent2c6f0b9228b47459dd1b67d578792cd017006128 (diff)
downloadpoky-a19687acd12497d727203e63d74b2703387f34a6.tar.gz
bitbake: lib/bb: Update thread/process locks to use a timeout
The thread/process locks we use translate to futexes in Linux. If a process dies holding the lock, anything else trying to take the lock will hang indefinitely. An example would be the OOM killer taking out a parser process. To avoid bitbake processes just hanging indefinitely, add a timeout to our lock calls using a context manager. If we can't obtain the lock after waiting 5 minutes, hard exit out using os._exit(1). Use _exit() to avoid locking in any other places trying to write error messages to event handler queues (which also need locks). Whilst a bit harsh, this should mean we stop having lots of long running processes in cases where things are never going to work out and also avoids hanging builds on the autobuilder. (Bitbake rev: d2a3f662b0eed900fc012a392bfa0a365df0df9b) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/utils.py')
-rw-r--r--bitbake/lib/bb/utils.py13
1 files changed, 13 insertions, 0 deletions
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py
index 0df522b372..8c79159573 100644
--- a/bitbake/lib/bb/utils.py
+++ b/bitbake/lib/bb/utils.py
@@ -1841,3 +1841,16 @@ def mkstemp(suffix=None, prefix=None, dir=None, text=False):
1841 else: 1841 else:
1842 prefix = tempfile.gettempprefix() + entropy 1842 prefix = tempfile.gettempprefix() + entropy
1843 return tempfile.mkstemp(suffix=suffix, prefix=prefix, dir=dir, text=text) 1843 return tempfile.mkstemp(suffix=suffix, prefix=prefix, dir=dir, text=text)
1844
1845# If we don't have a timeout of some kind and a process/thread exits badly (for example
1846# OOM killed) and held a lock, we'd just hang in the lock futex forever. It is better
1847# we exit at some point than hang. 5 minutes with no progress means we're probably deadlocked.
1848@contextmanager
1849def lock_timeout(lock):
1850 held = lock.acquire(timeout=5*60)
1851 try:
1852 if not held:
1853 os._exit(1)
1854 yield held
1855 finally:
1856 lock.release()