From 9eacffe137278b6d72672b41f98dfced9ee80036 Mon Sep 17 00:00:00 2001 From: Richard Purdie Date: Wed, 26 Sep 2012 14:32:13 +0100 Subject: sstate: Remove master manifest usage This was added to allow detection of duplicate files being installed by sstate. There is a much simpler way, just check if the file already exists. This effectively uses the kernel VFS as the cache which is much more efficient. This resolves a significant performance bottleneck (lock contention on a single file) when running builds that are just being generated from sstate cache files. (From OE-Core rev: 603daf343ad3f18c8adb799e3625ae2a18d94f56) Signed-off-by: Richard Purdie --- meta/classes/sstate.bbclass | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) (limited to 'meta/classes') diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass index 0037ce5638..6878e1a936 100644 --- a/meta/classes/sstate.bbclass +++ b/meta/classes/sstate.bbclass @@ -3,7 +3,6 @@ SSTATE_VERSION = "2" SSTATE_MANIFESTS ?= "${TMPDIR}/sstate-control" SSTATE_MANFILEBASE = "${SSTATE_MANIFESTS}/manifest-${SSTATE_MANMACH}-" SSTATE_MANFILEPREFIX = "${SSTATE_MANFILEBASE}${PN}" -SSTATE_MASTERMANIFEST = "${SSTATE_MANIFESTS}/master.list" def generate_sstatefn(spec, hash, d): if not hash: @@ -142,17 +141,11 @@ def sstate_install(ss, d): dstdir = dstdir + "/" shareddirs.append(dstdir) - # Check the file list for conflicts against the master manifest - mastermanifest = d.getVar("SSTATE_MASTERMANIFEST", True) + # Check the file list for conflicts against files which already exist whitelist = (d.getVar("SSTATE_DUPWHITELIST", True) or "").split() - lock = bb.utils.lockfile(mastermanifest + ".lock") - if not os.path.exists(mastermanifest): - open(mastermanifest, "w").close() - fileslist = [line.strip() for line in open(mastermanifest)] - bb.utils.unlockfile(lock) match = [] for f in sharedfiles: - if f in fileslist: + if os.path.exists(f): realmatch = True for w in whitelist: if f.startswith(w): @@ -163,14 +156,10 @@ def sstate_install(ss, d): if match: bb.warn("The recipe is trying to install files into a shared area when those files already exist. Those files are:\n %s" % "\n ".join(match)) - # Write out the manifest and add to the task's manifest file - lock = bb.utils.lockfile(mastermanifest + ".lock") - mf = open(mastermanifest, "a") + # Write out the manifest f = open(manifest, "w") for file in sharedfiles: - mf.write(file + "\n") f.write(file + "\n") - bb.utils.unlockfile(lock) # We want to ensure that directories appear at the end of the manifest # so that when we test to see if they should be deleted any contents @@ -301,20 +290,6 @@ def sstate_clean_manifest(manifest, d): except OSError: pass - # Remove the entries from the master manifest - mastermanifest = d.getVar("SSTATE_MASTERMANIFEST", True) - lock = bb.utils.lockfile(mastermanifest + ".lock") - if not os.path.exists(mastermanifest): - open(mastermanifest, "w").close() - mf = open(mastermanifest + ".new", "w") - for line in open(mastermanifest, "r"): - if not line or line in entries: - continue - mf.write(line) - mf.close() - os.rename(mastermanifest + ".new", mastermanifest) - bb.utils.unlockfile(lock) - oe.path.remove(manifest) def sstate_clean(ss, d): -- cgit v1.2.3-54-g00ecf