Bug #223417 - Make the vardbapi.cpv_all() use_cache parameter useful
authorZac Medico <zmedico@gentoo.org>
Sat, 24 May 2008 20:35:30 +0000 (20:35 -0000)
committerZac Medico <zmedico@gentoo.org>
Sat, 24 May 2008 20:35:30 +0000 (20:35 -0000)
for forcing direct os.listdir() calls. This is more of an issue now
that these listdir() calls are frequently triggered when merging
packages (due to things like blocker and preserve-libs handling).

svn path=/main/trunk/; revision=10390

pym/_emerge/__init__.py
pym/portage/dbapi/vartree.py

index 0a5306bf6d776b595977b61e9d677fb89f259560..c9ab97722eb6aac6439840228dc0fdf1fc756103 100644 (file)
@@ -998,7 +998,7 @@ class FakeVartree(portage.vartree):
                                vdb_lock = portage.locks.lockdir(vdb_path)
                        real_dbapi = real_vartree.dbapi
                        slot_counters = {}
-                       for cpv in real_dbapi.cpv_all():
+                       for cpv in real_dbapi.cpv_all(use_cache=0):
                                cache_key = ("installed", self.root, cpv, "nomerge")
                                pkg = self._pkg_cache.get(cache_key)
                                if pkg is not None:
index a5d73843ad0bfef46d77d66371cab379125f83e1..69b1512ef5eca4cbd913562bd18024c6c135b0b1 100644 (file)
@@ -136,7 +136,7 @@ class LinkageMap(object):
                libs = {}
                obj_properties = {}
                lines = []
-               for cpv in self._dbapi.cpv_all():
+               for cpv in self._dbapi.cpv_all(use_cache=0):
                        lines += self._dbapi.aux_get(cpv, ["NEEDED.ELF.2"])[0].split('\n')
                # Cache NEEDED.* files avoid doing excessive IO for every rebuild.
                self._dbapi.flush_cache()
@@ -455,8 +455,25 @@ class vardbapi(dbapi):
                return returnme
 
        def cpv_all(self, use_cache=1):
+               """
+               Set use_cache=0 to bypass the portage.cachedir() cache in cases
+               when the accuracy of mtime staleness checks should not be trusted
+               (generally this is only necessary in critical sections that
+               involve merge or unmerge of packages).
+               """
                returnme = []
                basepath = os.path.join(self.root, VDB_PATH) + os.path.sep
+
+               if use_cache:
+                       from portage import listdir
+               else:
+                       def listdir(p, **kwargs):
+                               try:
+                                       return [x for x in os.listdir(p) \
+                                               if os.path.isdir(os.path.join(p, x))]
+                               except EnvironmentError:
+                                       return []
+
                for x in listdir(basepath, EmptyOnError=1, ignorecvs=1, dirsonly=1):
                        if self._excluded_dirs.match(x) is not None:
                                continue