]> git.ipfire.org Git - thirdparty/openembedded/openembedded-core-contrib.git/commitdiff
bitbake: cooker: Kill alive process before join it m5
authorRobert Yang <liezhi.yang@windriver.com>
Thu, 22 Aug 2019 04:24:40 +0000 (12:24 +0800)
committerRobert Yang <liezhi.yang@windriver.com>
Thu, 22 Aug 2019 06:53:25 +0000 (14:53 +0800)
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': <Lock(owner=SomeOtherProcess)>

We can kill alvie process before join it to fix the problems.

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
bitbake/lib/bb/cooker.py

index 0607fcc708f2f08d3f18ac79139847d803e61d5e..e42bcbaedf50ee047f5dd6ac044869c6e57d8ea5 100644 (file)
@@ -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)