aboutsummaryrefslogtreecommitdiffstats
path: root/bin/bitbake-worker
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2015-09-08 23:37:34 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-09-09 14:26:55 +0100
commitc43d6a8d711db8d3bd9a1976b9f8e3efdb4cb4ae (patch)
treed9752022e85b8edbbd22f35e6b2d3d9fc043724a /bin/bitbake-worker
parent68f53dd77fe0bbfa044bd037a9484e0e1c9088b4 (diff)
downloadbitbake-c43d6a8d711db8d3bd9a1976b9f8e3efdb4cb4ae.tar.gz
bitbake-worker: Handle SIGKILL of parent gracefully
If we SIGKILL cooker (the parent process), ensure the worker notices and shuts down gracefully. To do this: * trigger the sigterm handler if the parent exits * ensure broken pipe writes don't trigger backtraces which interfer with other exit work * notice if our command pipe is broken due to EOF and sigterm if so Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bin/bitbake-worker')
-rwxr-xr-xbin/bitbake-worker9
1 files changed, 7 insertions, 2 deletions
diff --git a/bin/bitbake-worker b/bin/bitbake-worker
index c429dc76d..5f6543b7e 100755
--- a/bin/bitbake-worker
+++ b/bin/bitbake-worker
@@ -80,7 +80,7 @@ def worker_flush():
written = os.write(worker_pipe, worker_queue)
worker_queue = worker_queue[written:]
except (IOError, OSError) as e:
- if e.errno != errno.EAGAIN:
+ if e.errno != errno.EAGAIN and e.errno != errno.EPIPE:
raise
def worker_child_fire(event, d):
@@ -158,6 +158,7 @@ def fork_off_task(cfg, data, workerdata, fn, task, taskname, appends, taskdepdat
signal.signal(signal.SIGTERM, sigterm_handler)
# Let SIGHUP exit as SIGTERM
signal.signal(signal.SIGHUP, sigterm_handler)
+ bb.utils.signal_on_parent_exit("SIGTERM")
# Save out the PID so that the event can include it the
# events
@@ -297,7 +298,11 @@ class BitbakeWorker(object):
(ready, _, _) = select.select([self.input] + [i.input for i in self.build_pipes.values()], [] , [], 1)
if self.input in ready:
try:
- self.queue = self.queue + self.input.read()
+ r = self.input.read()
+ if len(r) == 0:
+ # EOF on pipe, server must have terminated
+ self.sigterm_exception(signal.SIGTERM, None)
+ self.queue = self.queue + r
except (OSError, IOError):
pass
if len(self.queue):