All of lore.kernel.org
 help / color / mirror / Atom feed
From: Richard Purdie <richard.purdie@linuxfoundation.org>
To: openembedded-core <openembedded-core@lists.openembedded.org>
Subject: [PATCH] sstate: Remove master manifest usage
Date: Wed, 26 Sep 2012 14:32:13 +0100	[thread overview]
Message-ID: <1348666333.8662.105.camel@ted> (raw)

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





                 reply	other threads:[~2012-09-26 13:45 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1348666333.8662.105.camel@ted \
    --to=richard.purdie@linuxfoundation.org \
    --cc=openembedded-core@lists.openembedded.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.