summaryrefslogtreecommitdiffstats
path: root/bitbake/lib/bb/cooker.py
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:53 +0000
commit7244bf24573252fde6506da8a3f883e6c416d5ad (patch)
tree5bad00fa52a6ccc93e43cff2b4032fa8e3a5bb56 /bitbake/lib/bb/cooker.py
parentb226d4877fc8c0f84d54a51c9188bfb6fc8e8bf2 (diff)
downloadpoky-7244bf24573252fde6506da8a3f883e6c416d5ad.tar.gz
bitbake: 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. (Bitbake rev: 8fc5c50c2e23017833f93bcd514d708a14fa4266) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/cooker.py')
-rw-r--r--bitbake/lib/bb/cooker.py34
1 files changed, 18 insertions, 16 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index c5e9fa2941..b673fe10ee 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -229,24 +229,26 @@ class BBCooker:
229 self.handlePRServ() 229 self.handlePRServ()
230 230
231 def setupConfigWatcher(self): 231 def setupConfigWatcher(self):
232 if self.configwatcher: 232 with bb.utils.lock_timeout(self.inotify_threadlock):
233 self.configwatcher.close() 233 if self.configwatcher:
234 self.confignotifier = None 234 self.configwatcher.close()
235 self.configwatcher = None 235 self.confignotifier = None
236 self.configwatcher = pyinotify.WatchManager() 236 self.configwatcher = None
237 self.configwatcher.bbseen = set() 237 self.configwatcher = pyinotify.WatchManager()
238 self.configwatcher.bbwatchedfiles = set() 238 self.configwatcher.bbseen = set()
239 self.confignotifier = pyinotify.Notifier(self.configwatcher, self.config_notifications) 239 self.configwatcher.bbwatchedfiles = set()
240 self.confignotifier = pyinotify.Notifier(self.configwatcher, self.config_notifications)
240 241
241 def setupParserWatcher(self): 242 def setupParserWatcher(self):
242 if self.watcher: 243 with bb.utils.lock_timeout(self.inotify_threadlock):
243 self.watcher.close() 244 if self.watcher:
244 self.notifier = None 245 self.watcher.close()
245 self.watcher = None 246 self.notifier = None
246 self.watcher = pyinotify.WatchManager() 247 self.watcher = None
247 self.watcher.bbseen = set() 248 self.watcher = pyinotify.WatchManager()
248 self.watcher.bbwatchedfiles = set() 249 self.watcher.bbseen = set()
249 self.notifier = pyinotify.Notifier(self.watcher, self.notifications) 250 self.watcher.bbwatchedfiles = set()
251 self.notifier = pyinotify.Notifier(self.watcher, self.notifications)
250 252
251 def process_inotify_updates(self): 253 def process_inotify_updates(self):
252 with bb.utils.lock_timeout(self.inotify_threadlock): 254 with bb.utils.lock_timeout(self.inotify_threadlock):