From d0e866d6640d5b834a6a48247642165e610f4a08 Mon Sep 17 00:00:00 2001 From: Robert Yang Date: Thu, 22 Aug 2019 12:24:40 +0800 Subject: bitbake: cooker: Kill alive process before join it Fixed: $ echo helloworld >> meta/recipes-extended/bash/bash_4.4.18.bb $ while true; do kill-bb; rm -fr bitbake-cookerdaemon.log tmp/cache/default-glibc/qemux86-64/x86_64/bb_cache.dat* ; bitbake -p; done It may hang in 10 mins, there are two problems: * There might be deadlocks when call process.join() if the queue is not NULL, so we need cleanup the queue before join() it, but: * The self.result_queue.get(timeout=0.25) may hang if the queue._wlock is hold by SomeOtherProcess, the queue has the following info when it hangs: '_wlock': We can kill alvie process before join it to fix the problems. Signed-off-by: Robert Yang --- bitbake/lib/bb/cooker.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py index 0607fcc708..e42bcbaedf 100644 --- a/bitbake/lib/bb/cooker.py +++ b/bitbake/lib/bb/cooker.py @@ -2082,19 +2082,15 @@ class CookerParser(object): for process in self.processes: self.parser_quit.put(None) - # Cleanup the queue before call process.join(), otherwise there might be - # deadlocks. - while True: - try: - self.result_queue.get(timeout=0.25) - except queue.Empty: - break - for process in self.processes: if force: process.join(.1) process.terminate() else: + # Kill the alive process firstly before join() it to avoid + # deadlocks + if process.is_alive(): + os.kill(process.pid, 9) process.join() sync = threading.Thread(target=self.bb_cache.sync) -- cgit 1.2.3-korg