summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2017-07-28 15:40:02 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-07-28 23:02:32 +0100
commit57000d44beb1aeba37dfc70782b0d6418943acc5 (patch)
treed05f92465ac14adf653b842939955f6cd0d60003
parent77fd3a3a29a569e212374b27aea742ddbaafcdd5 (diff)
downloadbitbake-contrib-57000d44beb1aeba37dfc70782b0d6418943acc5.tar.gz
process/cooker: Allow UI process to know if the cooker was started successfully
Currently if the server fails to start, the user sees no error message and the server will be repeatedly attempted to be started until some longer timeouts expire. There are error messages in the cookerdeamon log but nobody thinks to look there. Add in a pipe which can be used to tell the starting process whether the cooker did actually start or not. If it fails to start, no further attempts can be made and if present, the log file can be shown to the user. [YOCTO #11834] Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--lib/bb/cooker.py6
-rw-r--r--lib/bb/server/process.py20
2 files changed, 23 insertions, 3 deletions
diff --git a/lib/bb/cooker.py b/lib/bb/cooker.py
index d6e691950..1a5e0038b 100644
--- a/lib/bb/cooker.py
+++ b/lib/bb/cooker.py
@@ -165,7 +165,7 @@ class BBCooker:
Manages one bitbake build run
"""
- def __init__(self, configuration, featureSet=None):
+ def __init__(self, configuration, featureSet=None, readypipe=None):
self.recipecaches = None
self.skiplist = {}
self.featureset = CookerFeatures()
@@ -237,6 +237,10 @@ 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 config_notifications(self, event):
if event.maskname == "IN_Q_OVERFLOW":
bb.warn("inotify event queue overflowed, invalidating caches.")
diff --git a/lib/bb/server/process.py b/lib/bb/server/process.py
index fb96804e6..6106c0738 100644
--- a/lib/bb/server/process.py
+++ b/lib/bb/server/process.py
@@ -355,6 +355,7 @@ class BitBakeServer(object):
self.featureset = featureset
self.sockname = sockname
self.bitbake_lock = lock
+ self.readypipe, self.readypipein = os.pipe()
# Create server control socket
if os.path.exists(sockname):
@@ -363,6 +364,8 @@ class BitBakeServer(object):
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# AF_UNIX has path length issues so chdir here to workaround
cwd = os.getcwd()
+ logfile = os.path.join(cwd, "bitbake-cookerdaemon.log")
+
try:
os.chdir(os.path.dirname(sockname))
self.sock.bind(os.path.basename(sockname))
@@ -371,10 +374,23 @@ class BitBakeServer(object):
self.sock.listen(1)
os.set_inheritable(self.sock.fileno(), True)
- bb.daemonize.createDaemon(self._startServer, "bitbake-cookerdaemon.log")
+ bb.daemonize.createDaemon(self._startServer, logfile)
self.sock.close()
self.bitbake_lock.close()
+ ready = ConnectionReader(self.readypipe)
+ r = ready.wait(8)
+ if not r:
+ ready.close()
+ bb.error("Unable to start bitbake server")
+ if os.path.exists(logfile):
+ with open(logfile, "r") as f:
+ logs=f.readlines()
+ bb.error("Last 10 lines of server log %s:\n%s" % (logfile, "".join(logs[-10:])))
+ raise SystemExit(1)
+ ready.close()
+ os.close(self.readypipein)
+
def _startServer(self):
server = ProcessServer(self.bitbake_lock, self.sock, self.sockname)
self.configuration.setServerRegIdleCallback(server.register_idle_function)
@@ -385,7 +401,7 @@ class BitBakeServer(object):
if value:
setattr(self.configuration, "%s_server" % param, value)
- self.cooker = bb.cooker.BBCooker(self.configuration, self.featureset)
+ self.cooker = bb.cooker.BBCooker(self.configuration, self.featureset, self.readypipein)
server.cooker = self.cooker
server.server_timeout = self.configuration.server_timeout
server.xmlrpcinterface = self.configuration.xmlrpcinterface