diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-07-28 15:40:02 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2017-07-30 08:43:36 +0100 |
commit | b2c39835bb61687220abbef72e4f69a272cf8afb (patch) | |
tree | 991e25807b5baee65a54386bfcfadcc6c09d69cb | |
parent | dd3a59d3546b900dae92ab3b3eccca5a215ddf61 (diff) | |
download | poky-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.py | 6 | ||||
-rw-r--r-- | bitbake/lib/bb/server/process.py | 20 |
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 |