[Yum-devel] [PATCH 2/3] Do the pkgmatch_fails negative caching, in _search
James Antill
james at and.org
Mon Apr 12 16:21:33 UTC 2010
---
yum/rpmsack.py | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 179b008..2b932cf 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -986,6 +986,9 @@ class RPMDBPackageSack(PackageSackBase):
def _search(self, name=None, epoch=None, ver=None, rel=None, arch=None):
'''List of matching packages, to zero or more of NEVRA.'''
+ if name is not None and name in self._pkgmatch_fails:
+ return []
+
pkgtup = (name, arch, epoch, ver, rel)
if pkgtup in self._tup2pkg:
return [self._tup2pkg[pkgtup]]
@@ -996,6 +999,8 @@ class RPMDBPackageSack(PackageSackBase):
if self._completely_loaded or name in self._pkgnames_loaded:
if name is not None:
pkgs = self._name2pkg.get(name, [])
+ if not pkgs:
+ self._pkgmatch_fails.add(name)
else:
pkgs = self.returnPkgs()
for po in pkgs:
@@ -1015,6 +1020,7 @@ class RPMDBPackageSack(PackageSackBase):
mi = ts.dbMatch()
self._completely_loaded = True
+ done = False
for hdr in mi:
if hdr['name'] == 'gpg-pubkey':
continue
@@ -1022,6 +1028,7 @@ class RPMDBPackageSack(PackageSackBase):
# We create POs out of all matching names, even if we don't return
# them.
self._pkgnames_loaded.add(po.name)
+ done = True
for tag in ('arch', 'rel', 'ver', 'epoch'):
if loc[tag] is not None and loc[tag] != getattr(po, tag):
@@ -1032,6 +1039,9 @@ class RPMDBPackageSack(PackageSackBase):
if self.auto_close:
self.ts.close()
+ if not done and name is not None:
+ self._pkgmatch_fails.add(name)
+
return ret
def _makePackageObject(self, hdr, index):
--
1.6.6.1
More information about the Yum-devel
mailing list