]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
bitbake: process/cooker: Improve readypipe handling
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Mon, 11 Sep 2017 22:17:43 +0000 (23:17 +0100)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Tue, 12 Sep 2017 22:55:29 +0000 (23:55 +0100)
Issues in start are not being correctly detected by the current readypipe
code. Change it to use specific "ready" or "fail" messages to correctly
determine the correct failure mode and avoid bitbake seeming to hang
(it does currently timeout eventually).

[YOCTO #12062]

(Bitbake rev: 60d4791e3dd05729d2a2adf6f3b203c80d466a73)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
bitbake/lib/bb/cooker.py
bitbake/lib/bb/server/process.py

index 7d040dcd88e5857fcece667a5c3bf0903b8cf3ae..8fe36eba1e04ec0e438604225c2ac93d1383c79b 100644 (file)
@@ -165,7 +165,7 @@ class BBCooker:
     Manages one bitbake build run
     """
 
-    def __init__(self, configuration, featureSet=None, readypipe=None):
+    def __init__(self, configuration, featureSet=None):
         self.recipecaches = None
         self.skiplist = {}
         self.featureset = CookerFeatures()
@@ -233,10 +233,6 @@ class BBCooker:
         # Let SIGHUP exit as SIGTERM
         signal.signal(signal.SIGHUP, self.sigterm_exception)
 
-        if readypipe:
-            os.write(readypipe, b"ready")
-            os.close(readypipe)
-
     def process_inotify_updates(self):
         for n in [self.confignotifier, self.notifier]:
             if n.check_events(timeout=0):
index 5c7dfaefa1a4d45a5e9b1e113d2b99f7943243a0..6a12f010578a799fc3fbb3443666a7b70ab69ece 100644 (file)
@@ -388,8 +388,10 @@ class BitBakeServer(object):
         self.bitbake_lock.close()
 
         ready = ConnectionReader(self.readypipe)
-        r = ready.wait(30)
-        if not r:
+        r = ready.poll(30)
+        if r:
+            r = ready.get()
+        if not r or r != "ready":
             ready.close()
             bb.error("Unable to start bitbake server")
             if os.path.exists(logfile):
@@ -404,8 +406,15 @@ class BitBakeServer(object):
         print("Starting bitbake server pid %d" % os.getpid())
         server = ProcessServer(self.bitbake_lock, self.sock, self.sockname)
         self.configuration.setServerRegIdleCallback(server.register_idle_function)
-
-        self.cooker = bb.cooker.BBCooker(self.configuration, self.featureset, self.readypipein)
+        writer = ConnectionWriter(self.readypipein)
+        try:
+            self.cooker = bb.cooker.BBCooker(self.configuration, self.featureset)
+            writer.send("ready")
+        except:
+            writer.send("fail")
+            raise
+        finally:
+            os.close(self.readypipein)
         server.cooker = self.cooker
         server.server_timeout = self.configuration.server_timeout
         server.xmlrpcinterface = self.configuration.xmlrpcinterface