[gnome-continuous-yocto/gnomeostree-3.28-rocko: 7415/8267] staging: Avoid sysroot removal races



commit 3de078642925e720c2fca5b89cd3abb8b29d2439
Author: Richard Purdie <richard purdie linuxfoundation org>
Date:   Sat Aug 26 23:30:39 2017 +0100

    staging: Avoid sysroot removal races
    
    Currently a task could remove a dependency needed by another task leading
    to build failures, often due to missing dependencies (e.g. dynamic libraries
    not being found). This was often seen for all-arch recipes in package_write_rpm.
    
    When removing a dependency, first check that no other task active for the
    recipe has that same dependency.
    
    (From OE-Core rev: ff3617cc2cd5618f48a25aa4e3b2014430fcbe23)
    
    Signed-off-by: Richard Purdie <richard purdie linuxfoundation org>

 meta/classes/staging.bbclass |   25 ++++++++++++++++++++-----
 1 files changed, 20 insertions(+), 5 deletions(-)
---
diff --git a/meta/classes/staging.bbclass b/meta/classes/staging.bbclass
index 9d3d2ad..8b833d3 100644
--- a/meta/classes/staging.bbclass
+++ b/meta/classes/staging.bbclass
@@ -247,6 +247,7 @@ python extend_recipe_sysroot() {
     import subprocess
     import errno
     import collections
+    import glob
 
     taskdepdata = d.getVar("BB_TASKDEPDATA", False)
     mytaskname = d.getVar("BB_RUNTASK")
@@ -531,6 +532,7 @@ python extend_recipe_sysroot() {
     # to be insignificant
     taskindex = depdir + "/" + "index." + mytaskname
     if os.path.exists(taskindex):
+        potential = []
         with open(taskindex, "r") as f:
             for l in f:
                 l = l.strip()
@@ -539,11 +541,24 @@ python extend_recipe_sysroot() {
                     if not os.path.exists(l):
                         # Was likely already uninstalled
                         continue
-                    bb.note("Task %s no longer depends on %s, removing from sysroot" % (mytaskname, l))
-                    lnk = os.readlink(l)
-                    sstate_clean_manifest(depdir + "/" + lnk, d, workdir)
-                    os.unlink(l)
-                    os.unlink(l + ".complete")
+                    potential.append(l)
+        # We need to ensure not other task needs this dependency. We hold the sysroot
+        # lock so we ca search the indexes to check
+        if potential:
+            for i in glob.glob(depdir + "/index.*"):
+                if i.endswith("." + mytaskname):
+                    continue
+                with open(i, "r") as f:
+                    for l in f:
+                        l = l.strip()
+                        if l in potential:
+                            potential.remove(l)
+        for l in potential:
+            bb.note("Task %s no longer depends on %s, removing from sysroot" % (mytaskname, l))
+            lnk = os.readlink(l)
+            sstate_clean_manifest(depdir + "/" + lnk, d, workdir)
+            os.unlink(l)
+            os.unlink(l + ".complete")
     with open(taskindex, "w") as f:
         for l in sorted(installed):
             f.write(l + "\n")


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]