[bitbake-devel] [dizzy 6/7] cooker: read file watches on server idle

Alex DAMIAN alexandru.damian at intel.com
Fri Apr 10 14:57:06 UTC 2015


From: Alexandru DAMIAN <alexandru.damian at intel.com>

The inotify facility monitoring changes to the config files
could be overwhelmed by massive changes to the watched files
while server is running.

This patch adds verification the notification watches to the
server idle functions, in addition to the cooker updateCache
command which executes only infrequently, thus preventing
overflowing the notification buffer.

[YOCTO #7316]

(Bitbake rev: 996e663fd5c254292f44eca46f5fdc95af897f98)

Signed-off-by: Alexandru DAMIAN <alexandru.damian at intel.com>
Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
---
 lib/bb/cooker.py | 30 +++++++++++++++++++++++-------
 1 file changed, 23 insertions(+), 7 deletions(-)

diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py
index 3909dc0..2f2a852 100644
--- a/lib/bb/cooker.py
+++ b/lib/bb/cooker.py
@@ -133,6 +133,19 @@ class BBCooker:
 
 
         self.initConfigurationData()
+
+        self.inotify_modified_files = []
+
+        def _process_inotify_updates(server, notifier_list, abort):
+            for n in notifier_list:
+                if n.check_events(timeout=0):
+                    # read notified events and enqeue them
+                    n.read_events()
+                    n.process_events()
+            return True
+
+        self.configuration.server_register_idlecallback(_process_inotify_updates, [self.confignotifier, self.notifier])
+
         self.baseconfig_valid = True
         self.parsecache_valid = False
 
@@ -171,11 +184,13 @@ class BBCooker:
         signal.signal(signal.SIGHUP, self.sigterm_exception)
 
     def config_notifications(self, event):
-        bb.parse.update_cache(event.path)
+        if not event.path in self.inotify_modified_files:
+            self.inotify_modified_files.append(event.path)
         self.baseconfig_valid = False
 
     def notifications(self, event):
-        bb.parse.update_cache(event.path)
+        if not event.path in self.inotify_modified_files:
+            self.inotify_modified_files.append(event.path)
         self.parsecache_valid = False
 
     def add_filewatch(self, deps, watcher=None):
@@ -1336,11 +1351,12 @@ class BBCooker:
             raise bb.BBHandledException()
 
         if self.state != state.parsing:
-            for n in [self.confignotifier, self.notifier]:
-                if n.check_events(timeout=0):
-                    # read notified events and enqeue them
-                    n.read_events()
-                n.process_events()
+
+            # reload files for which we got notifications
+            for p in self.inotify_modified_files:
+                bb.parse.update_cache(p)
+            self.inotify_modified_files = []
+
             if not self.baseconfig_valid:
                 logger.debug(1, "Reloading base configuration data")
                 self.initConfigurationData()
-- 
1.9.1




More information about the bitbake-devel mailing list