From 6271fcb5896464d0c71172b02de548195191abf8 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Tue, 8 Sep 2015 23:37:34 +0100 Subject: bitbake: 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 (Bitbake rev: c43d6a8d711db8d3bd9a1976b9f8e3efdb4cb4ae) Signed-off-by: Richard Purdie --- bitbake/bin/bitbake-worker | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/bitbake/bin/bitbake-worker b/bitbake/bin/bitbake-worker index c429dc76d7..5f6543b7e9 100755 --- a/bitbake/bin/bitbake-worker +++ b/bitbake/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): -- cgit v1.2.3-54-g00ecf