summaryrefslogtreecommitdiffstats
path: root/meta/classes/staging.bbclass
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2021-06-30 13:02:25 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2021-07-02 07:24:21 +0100
commit2b3ced714a2388f1dac43915e67fdd6c62892238 (patch)
tree57b0b0f8e8afcd25cdcc488def7e6c0f209efc8d /meta/classes/staging.bbclass
parent68a4cbb7b2dba70fdf931fbd4a316e1dacd2dacc (diff)
downloadpoky-2b3ced714a2388f1dac43915e67fdd6c62892238.tar.gz
sstate/staging: Handle directory creation race issue
The sstate code tries to be careful about racing around directory creation. In particular, the copyhardlinktree code creates the directory tree first allowing for "already exists" errors and ignoring them, then hardlinks the files in. Unfortunately the sstate removal code can race against this since it will try and remove empty directories. If there is some bad timing, a newly created directory can be removed before it was populated, leading to build failures. We could try and add locking but this would damage performance, we've been there before. It is also unclear where to actually place locks just based on the contents of a manifest file which may cover multiple sstate install locations for a given task. Instead, lets disable directory removal in the problematic "shared" core path. This could result in a few more empty directories being left on disk but those should be harmless and better than locking hurting performance or rare build races. [YOCTO #13999] [YOCTO #14379] (From OE-Core rev: 4f94d9296394bc7ce241439f00df86eb5912875f) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/classes/staging.bbclass')
-rw-r--r--meta/classes/staging.bbclass6
1 files changed, 3 insertions, 3 deletions
diff --git a/meta/classes/staging.bbclass b/meta/classes/staging.bbclass
index 806a85773a..32a615c743 100644
--- a/meta/classes/staging.bbclass
+++ b/meta/classes/staging.bbclass
@@ -409,7 +409,7 @@ python extend_recipe_sysroot() {
409 if os.path.islink(f) and not os.path.exists(f): 409 if os.path.islink(f) and not os.path.exists(f):
410 bb.note("%s no longer exists, removing from sysroot" % f) 410 bb.note("%s no longer exists, removing from sysroot" % f)
411 lnk = os.readlink(f.replace(".complete", "")) 411 lnk = os.readlink(f.replace(".complete", ""))
412 sstate_clean_manifest(depdir + "/" + lnk, d, workdir) 412 sstate_clean_manifest(depdir + "/" + lnk, d, canrace=True, prefix=workdir)
413 os.unlink(f) 413 os.unlink(f)
414 os.unlink(f.replace(".complete", "")) 414 os.unlink(f.replace(".complete", ""))
415 415
@@ -454,7 +454,7 @@ python extend_recipe_sysroot() {
454 fl = depdir + "/" + l 454 fl = depdir + "/" + l
455 bb.note("Task %s no longer depends on %s, removing from sysroot" % (mytaskname, l)) 455 bb.note("Task %s no longer depends on %s, removing from sysroot" % (mytaskname, l))
456 lnk = os.readlink(fl) 456 lnk = os.readlink(fl)
457 sstate_clean_manifest(depdir + "/" + lnk, d, workdir) 457 sstate_clean_manifest(depdir + "/" + lnk, d, canrace=True, prefix=workdir)
458 os.unlink(fl) 458 os.unlink(fl)
459 os.unlink(fl + ".complete") 459 os.unlink(fl + ".complete")
460 460
@@ -475,7 +475,7 @@ python extend_recipe_sysroot() {
475 continue 475 continue
476 else: 476 else:
477 bb.note("%s exists in sysroot, but is stale (%s vs. %s), removing." % (c, lnk, c + "." + taskhash)) 477 bb.note("%s exists in sysroot, but is stale (%s vs. %s), removing." % (c, lnk, c + "." + taskhash))
478 sstate_clean_manifest(depdir + "/" + lnk, d, workdir) 478 sstate_clean_manifest(depdir + "/" + lnk, d, canrace=True, prefix=workdir)
479 os.unlink(depdir + "/" + c) 479 os.unlink(depdir + "/" + c)
480 if os.path.lexists(depdir + "/" + c + ".complete"): 480 if os.path.lexists(depdir + "/" + c + ".complete"):
481 os.unlink(depdir + "/" + c + ".complete") 481 os.unlink(depdir + "/" + c + ".complete")