[Yum-devel] [PATCH] Pkgname caching for rpmdb.returnPackages() so update is as fast as install
James Antill
james at and.org
Tue Mar 30 22:53:39 UTC 2010
---
yum/rpmsack.py | 31 ++++++++++++++++++++++++++-----
1 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 4580150..4c17b67 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -142,6 +142,7 @@ class RPMDBPackageSack(PackageSackBase):
self.root = root
self._idx2pkg = {}
self._name2pkg = {}
+ self._pkgnames_loaded = set()
self._tup2pkg = {}
self._completely_loaded = False
self._pkgmatch_fails = set()
@@ -188,6 +189,7 @@ class RPMDBPackageSack(PackageSackBase):
def dropCachedData(self):
self._idx2pkg = {}
self._name2pkg = {}
+ self._pkgnames_loaded = set()
self._tup2pkg = {}
self._completely_loaded = False
self._pkgmatch_fails = set()
@@ -321,7 +323,12 @@ class RPMDBPackageSack(PackageSackBase):
return result
def searchProvides(self, name):
- return self.searchPrco(name, 'provides')
+ if name in self._pkgmatch_fails:
+ return []
+ ret = self.searchPrco(name, 'provides')
+ if not ret:
+ self._pkgmatch_fails.add(name)
+ return ret
def searchRequires(self, name):
return self.searchPrco(name, 'requires')
@@ -364,7 +371,7 @@ class RPMDBPackageSack(PackageSackBase):
return misc.newestInList(allpkgs)
@staticmethod
- def _compile_patterns(self, patterns, ignore_case=False):
+ def _compile_patterns(patterns, ignore_case=False):
if not patterns or len(patterns) > constants.PATTERNS_MAX:
return None
ret = []
@@ -421,15 +428,19 @@ class RPMDBPackageSack(PackageSackBase):
"""Returns a list of packages. Note that the packages are
always filtered to those matching the patterns/case. repoid is
ignored, and is just here for compatibility with non-rpmdb sacks. """
+ ret = []
if patterns and not ignore_case:
tpats = []
for pat in patterns:
if pat in self._pkgmatch_fails:
continue
+ if pat in self._pkgnames_loaded:
+ ret.extend(self._name2pkg[pat])
+ continue
tpats.append(pat)
patterns = tpats
if not patterns:
- return []
+ return ret
if not self._completely_loaded:
rpats = self._compile_patterns(patterns, ignore_case)
@@ -445,7 +456,14 @@ class RPMDBPackageSack(PackageSackBase):
if patterns:
pkgobjlist = parsePackages(pkgobjlist, patterns, not ignore_case)
self._pkgmatch_fails.update(pkgobjlist[2])
- pkgobjlist = pkgobjlist[0] + pkgobjlist[1]
+ if ret:
+ pkgobjlist = pkgobjlist[0] + pkgobjlist[1] + ret
+ else:
+ pkgobjlist = pkgobjlist[0] + pkgobjlist[1]
+ for pkg in pkgobjlist:
+ for pat in patterns:
+ if pkg.name == pat:
+ self._pkgnames_loaded.add(pkg.name)
return pkgobjlist
def _uncached_returnConflictPackages(self):
@@ -975,7 +993,7 @@ class RPMDBPackageSack(PackageSackBase):
loc = locals()
ret = []
- if self._completely_loaded:
+ if self._completely_loaded or name in self._pkgnames_loaded:
if name is not None:
pkgs = self._name2pkg.get(name, [])
else:
@@ -991,6 +1009,9 @@ class RPMDBPackageSack(PackageSackBase):
ts = self.readOnlyTS()
if name is not None:
mi = ts.dbMatch('name', name)
+ # We create POs out of all matching names, even if we don't return
+ # them.
+ self._pkgnames_loaded.add(name)
elif arch is not None:
mi = ts.dbMatch('arch', arch)
else:
--
1.6.6.1
More information about the Yum-devel
mailing list