All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sstate: Remove master manifest usage
@ 2012-09-26 13:32 Richard Purdie
  0 siblings, 0 replies; only message in thread
From: Richard Purdie @ 2012-09-26 13:32 UTC (permalink / raw)
  To: openembedded-core

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>
---
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):





^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2012-09-26 13:45 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-26 13:32 [PATCH] sstate: Remove master manifest usage Richard Purdie

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.