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. Signed-off-by: Richard Purdie <richard.pur...@linuxfoundation.org> --- diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass index 0037ce5..6878e1a 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): _______________________________________________ Openembedded-core mailing list Openembedded-core@lists.openembedded.org http://lists.linuxtogo.org/cgi-bin/mailman/listinfo/openembedded-core