summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2023-02-20 09:30:17 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-02-20 15:18:48 +0000
commit8fc5c50c2e23017833f93bcd514d708a14fa4266 (patch)
tree191b4249413c8efa4d3453045f1d2a13e9a89c4a
parentc27e48fa81c2327a4a355a028884ab457cde3ae7 (diff)
downloadbitbake-8fc5c50c2e23017833f93bcd514d708a14fa4266.tar.gz
cooker: Ensure lock is held with changing notifier
We've seen a couple of cases which bitbake hangs due to an inotifer exception such as: 3323260 21:48:31.554468 Running command ['getVariable', 'BBINCLUDELOGS'] Exception in thread Thread-1 (idle_thread): Traceback (most recent call last): File "/usr/lib64/python3.10/threading.py", line 1016, in _bootstrap_inner self.run() File "/usr/lib64/python3.10/threading.py", line 953, in run self._target(*self._args, **self._kwargs) File "/home/pokybuild/yocto-worker/oe-selftest-fedora/build/bitbake/lib/bb/server/process.py", line 408, in idle_thread self.cooker.process_inotify_updates() File "/home/pokybuild/yocto-worker/oe-selftest-fedora/build/bitbake/lib/bb/cooker.py", line 256, in process_inotify_updates n.read_events() File "/home/pokybuild/yocto-worker/oe-selftest-fedora/build/bitbake/lib/pyinotify.py", line 1207, in read_events if fcntl.ioctl(self._fd, termios.FIONREAD, buf_, 1) == -1: OSError: [Errno 9] Bad file descriptor 3323260 21:48:32.206995 Command Completed (socket: True) Ensure we don't destory the inotifier when the idle thread is reading is by holding the lock during setup/teardown. Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/bb/cooker.py34
1 files changed, 18 insertions, 16 deletions
diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py
index c5e9fa294..b673fe10e 100644
--- a/lib/bb/cooker.py
+++ b/lib/bb/cooker.py
@@ -229,24 +229,26 @@ class BBCooker:
self.handlePRServ()
def setupConfigWatcher(self):
- if self.configwatcher:
- self.configwatcher.close()
- self.confignotifier = None
- self.configwatcher = None
- self.configwatcher = pyinotify.WatchManager()
- self.configwatcher.bbseen = set()
- self.configwatcher.bbwatchedfiles = set()
- self.confignotifier = pyinotify.Notifier(self.configwatcher, self.config_notifications)
+ with bb.utils.lock_timeout(self.inotify_threadlock):
+ if self.configwatcher:
+ self.configwatcher.close()
+ self.confignotifier = None
+ self.configwatcher = None
+ self.configwatcher = pyinotify.WatchManager()
+ self.configwatcher.bbseen = set()
+ self.configwatcher.bbwatchedfiles = set()
+ self.confignotifier = pyinotify.Notifier(self.configwatcher, self.config_notifications)
def setupParserWatcher(self):
- if self.watcher:
- self.watcher.close()
- self.notifier = None
- self.watcher = None
- self.watcher = pyinotify.WatchManager()
- self.watcher.bbseen = set()
- self.watcher.bbwatchedfiles = set()
- self.notifier = pyinotify.Notifier(self.watcher, self.notifications)
+ with bb.utils.lock_timeout(self.inotify_threadlock):
+ if self.watcher:
+ self.watcher.close()
+ self.notifier = None
+ self.watcher = None
+ self.watcher = pyinotify.WatchManager()
+ self.watcher.bbseen = set()
+ self.watcher.bbwatchedfiles = set()
+ self.notifier = pyinotify.Notifier(self.watcher, self.notifications)
def process_inotify_updates(self):
with bb.utils.lock_timeout(self.inotify_threadlock):