Kaynağa Gözat

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 <richard.purdie@linuxfoundation.org>
Richard Purdie 10 yıl önce
ebeveyn
işleme
6271fcb589
1 değiştirilmiş dosya ile 7 ekleme ve 2 silme
  1. 7 2
      bitbake/bin/bitbake-worker

+ 7 - 2
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):