Fix vardbapi.flush_cache() so that it only updates the cache when the
authorZac Medico <zmedico@gentoo.org>
Tue, 3 Jun 2008 03:45:58 +0000 (03:45 -0000)
committerZac Medico <zmedico@gentoo.org>
Tue, 3 Jun 2008 03:45:58 +0000 (03:45 -0000)
number of uncached packages reaches a certain threshold (currently 5).
The cache file can be several megabytes in size, so updating it for
every vdb change is wasteful.

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

pym/portage/dbapi/vartree.py

index 5c15393fb667b0f12057fe5283131d82cd92690c..c2503eb42a192336f087098ff926ab3d31176ee4 100644 (file)
@@ -238,6 +238,10 @@ class vardbapi(dbapi):
        _excluded_dirs = re.compile(r'^(\..*|-MERGING-.*|' + \
                "|".join(_excluded_dirs) + r')$')
 
+       # Number of uncached packages to trigger cache update, since
+       # it's wasteful to update it for every vdb change.
+       _aux_cache_threshold = 5
+
        _aux_cache_keys_re = re.compile(r'^NEEDED\..*$')
        _aux_multi_line_re = re.compile(r'^(CONTENTS|NEEDED\..*)$')
 
@@ -556,7 +560,7 @@ class vardbapi(dbapi):
                users have read access and benefit from faster metadata lookups (as
                long as at least part of the cache is still valid)."""
                if self._aux_cache is not None and \
-                       self._aux_cache["modified"] and \
+                       self._aux_cache["modified"] >= self._aux_cache_threshold and \
                        secpass >= 2:
                        valid_nodes = set(self.cpv_all())
                        for cpv in self._aux_cache["packages"].keys():
@@ -571,7 +575,7 @@ class vardbapi(dbapi):
                                        self._aux_cache_filename, gid=portage_gid, mode=0644)
                        except (IOError, OSError), e:
                                pass
-                       self._aux_cache["modified"] = False
+                       self._aux_cache["modified"] = 0
 
        def aux_get(self, mycpv, wants):
                """This automatically caches selected keys that are frequently needed
@@ -616,7 +620,7 @@ class vardbapi(dbapi):
                                not self._aux_cache.get("packages"):
                                self._aux_cache = {"version": self._aux_cache_version}
                                self._aux_cache["packages"] = {}
-                       self._aux_cache["modified"] = False
+                       self._aux_cache["modified"] = 0
                mydir = self.getpath(mycpv)
                mydir_stat = None
                try:
@@ -661,7 +665,7 @@ class vardbapi(dbapi):
                                for aux_key in cache_these:
                                        cache_data[aux_key] = mydata[aux_key]
                                self._aux_cache["packages"][mycpv] = (mydir_mtime, cache_data)
-                               self._aux_cache["modified"] = True
+                               self._aux_cache["modified"] += 1
                return [mydata[x] for x in wants]
 
        def _aux_get(self, mycpv, wants):