From 28949d3f80de33c1c034d877691308c301e50bbd Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Mon, 11 Sep 2017 23:17:43 +0100 Subject: bitbake: process/cooker: Improve readypipe handling 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 --- bitbake/lib/bb/cooker.py | 6 +----- bitbake/lib/bb/server/process.py | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 9 deletions(-) (limited to 'bitbake') diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 7d040dcd88..8fe36eba1e 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py @@ -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): diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py index 5c7dfaefa1..6a12f01057 100644 --- a/bitbake/lib/bb/server/process.py +++ b/bitbake/lib/bb/server/process.py @@ -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 -- cgit v1.2.3-54-g00ecf