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>
This commit is contained in:
Richard Purdie
2023-02-20 09:30:17 +00:00
parent b226d4877f
commit 7244bf2457

View File

@@ -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):