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-30 08:43:36 +0100
commitb2c39835bb61687220abbef72e4f69a272cf8afb (patch)
tree991e25807b5baee65a54386bfcfadcc6c09d69cb
parentdd3a59d3546b900dae92ab3b3eccca5a215ddf61 (diff)
downloadpoky-b2c39835bb61687220abbef72e4f69a272cf8afb.tar.gz
bitbake: 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] (Bitbake rev: 57000d44beb1aeba37dfc70782b0d6418943acc5) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--bitbake/lib/bb/cooker.py6
-rw-r--r--bitbake/lib/bb/server/process.py20
2 files changed, 23 insertions, 3 deletions
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index d6e6919506..1a5e0038b6 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -165,7 +165,7 @@ class BBCooker:
165 Manages one bitbake build run 165 Manages one bitbake build run
166 """ 166 """
167 167
168 def __init__(self, configuration, featureSet=None): 168 def __init__(self, configuration, featureSet=None, readypipe=None):
169 self.recipecaches = None 169 self.recipecaches = None
170 self.skiplist = {} 170 self.skiplist = {}
171 self.featureset = CookerFeatures() 171 self.featureset = CookerFeatures()
@@ -237,6 +237,10 @@ class BBCooker:
237 # Let SIGHUP exit as SIGTERM 237 # Let SIGHUP exit as SIGTERM
238 signal.signal(signal.SIGHUP, self.sigterm_exception) 238 signal.signal(signal.SIGHUP, self.sigterm_exception)
239 239
240 if readypipe:
241 os.write(readypipe, b"ready")
242 os.close(readypipe)
243
240 def config_notifications(self, event): 244 def config_notifications(self, event):
241 if event.maskname == "IN_Q_OVERFLOW": 245 if event.maskname == "IN_Q_OVERFLOW":
242 bb.warn("inotify event queue overflowed, invalidating caches.") 246 bb.warn("inotify event queue overflowed, invalidating caches.")
diff --git a/bitbake/lib/bb/server/process.py b/bitbake/lib/bb/server/process.py
index fb96804e68..6106c07380 100644
--- a/bitbake/lib/bb/server/process.py
+++ b/bitbake/lib/bb/server/process.py
@@ -355,6 +355,7 @@ class BitBakeServer(object):
355 self.featureset = featureset 355 self.featureset = featureset
356 self.sockname = sockname 356 self.sockname = sockname
357 self.bitbake_lock = lock 357 self.bitbake_lock = lock
358 self.readypipe, self.readypipein = os.pipe()
358 359
359 # Create server control socket 360 # Create server control socket
360 if os.path.exists(sockname): 361 if os.path.exists(sockname):
@@ -363,6 +364,8 @@ class BitBakeServer(object):
363 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 364 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
364 # AF_UNIX has path length issues so chdir here to workaround 365 # AF_UNIX has path length issues so chdir here to workaround
365 cwd = os.getcwd() 366 cwd = os.getcwd()
367 logfile = os.path.join(cwd, "bitbake-cookerdaemon.log")
368
366 try: 369 try:
367 os.chdir(os.path.dirname(sockname)) 370 os.chdir(os.path.dirname(sockname))
368 self.sock.bind(os.path.basename(sockname)) 371 self.sock.bind(os.path.basename(sockname))
@@ -371,10 +374,23 @@ class BitBakeServer(object):
371 self.sock.listen(1) 374 self.sock.listen(1)
372 375
373 os.set_inheritable(self.sock.fileno(), True) 376 os.set_inheritable(self.sock.fileno(), True)
374 bb.daemonize.createDaemon(self._startServer, "bitbake-cookerdaemon.log") 377 bb.daemonize.createDaemon(self._startServer, logfile)
375 self.sock.close() 378 self.sock.close()
376 self.bitbake_lock.close() 379 self.bitbake_lock.close()
377 380
381 ready = ConnectionReader(self.readypipe)
382 r = ready.wait(8)
383 if not r:
384 ready.close()
385 bb.error("Unable to start bitbake server")
386 if os.path.exists(logfile):
387 with open(logfile, "r") as f:
388 logs=f.readlines()
389 bb.error("Last 10 lines of server log %s:\n%s" % (logfile, "".join(logs[-10:])))
390 raise SystemExit(1)
391 ready.close()
392 os.close(self.readypipein)
393
378 def _startServer(self): 394 def _startServer(self):
379 server = ProcessServer(self.bitbake_lock, self.sock, self.sockname) 395 server = ProcessServer(self.bitbake_lock, self.sock, self.sockname)
380 self.configuration.setServerRegIdleCallback(server.register_idle_function) 396 self.configuration.setServerRegIdleCallback(server.register_idle_function)
@@ -385,7 +401,7 @@ class BitBakeServer(object):
385 if value: 401 if value:
386 setattr(self.configuration, "%s_server" % param, value) 402 setattr(self.configuration, "%s_server" % param, value)
387 403
388 self.cooker = bb.cooker.BBCooker(self.configuration, self.featureset) 404 self.cooker = bb.cooker.BBCooker(self.configuration, self.featureset, self.readypipein)
389 server.cooker = self.cooker 405 server.cooker = self.cooker
390 server.server_timeout = self.configuration.server_timeout 406 server.server_timeout = self.configuration.server_timeout
391 server.xmlrpcinterface = self.configuration.xmlrpcinterface 407 server.xmlrpcinterface = self.configuration.xmlrpcinterface