diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2012-09-26 14:32:13 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2012-09-26 14:41:04 +0100 |
commit | 603daf343ad3f18c8adb799e3625ae2a18d94f56 (patch) | |
tree | c71bbdad277ef6bfa526b2441fae9df2de84f908 | |
parent | f50c5d36b2da9b36d56d95a7d89404509a1a3e9b (diff) | |
download | openembedded-core-603daf343ad3f18c8adb799e3625ae2a18d94f56.tar.gz openembedded-core-603daf343ad3f18c8adb799e3625ae2a18d94f56.tar.bz2 openembedded-core-603daf343ad3f18c8adb799e3625ae2a18d94f56.zip |
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.
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/classes/sstate.bbclass | 31 |
1 files changed, 3 insertions, 28 deletions
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): |