[yum-git] 3 commits - yum/depsolve.py yum/packages.py yum/rpmsack.py
James Antill
james at linux.duke.edu
Sat Mar 29 04:29:54 UTC 2008
yum/depsolve.py | 8 +++----
yum/packages.py | 3 --
yum/rpmsack.py | 61 ++++++++++++++++++++++++++++++++++++--------------------
3 files changed, 44 insertions(+), 28 deletions(-)
New commits:
commit a004a9917c6a8906e602f16152f9b0187c79acba
Author: James Antill <james at and.org>
Date: Fri Mar 28 23:53:06 2008 -0400
Add getProvides() and getRequires() caches in rpmsack.
Saves about 10% runtime, takes about 2% RSS overhead.
That's saves 5 seconds, and takes 5.5MB
diff --git a/yum/packages.py b/yum/packages.py
index 1606e93..8a84ffa 100644
--- a/yum/packages.py
+++ b/yum/packages.py
@@ -302,10 +302,7 @@ class RpmBase(object):
return bool(self.matchingPrcos(prcotype, reqtuple))
def matchingPrcos(self, prcotype, reqtuple):
- # we only ever get here if we have a versioned prco
- # nameonly shouldn't ever raise it
(reqn, reqf, (reqe, reqv, reqr)) = reqtuple
- # however, just in case
# find the named entry in pkgobj, do the comparsion
result = []
for (n, f, (e, v, r)) in self.returnPrco(prcotype):
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 3c82723..58cc53d 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -92,6 +92,8 @@ class RPMDBPackageSack(PackageSackBase):
self._tup2pkg = {}
self._completely_loaded = False
self._simple_pkgtup_list = []
+ self._get_pro_cache = {}
+ self._get_req_cache = {}
self.ts = None
self._cache = {
@@ -120,6 +122,8 @@ class RPMDBPackageSack(PackageSackBase):
self._tup2pkg = {}
self._completely_loaded = False
self._simple_pkgtup_list = []
+ self._get_pro_cache = {}
+ self._get_req_cache = {}
misc._share_data_store = {}
def readOnlyTS(self):
@@ -497,23 +501,41 @@ class RPMDBPackageSack(PackageSackBase):
# Can't support this now
raise NotImplementedError
+ @staticmethod
+ def _genDeptup(name, flags, version):
+ """ Given random stuff, generate a usable dep tuple. """
+
+ if flags == 0:
+ flags = None
+
+ if type(version) is types.StringType:
+ (r_e, r_v, r_r) = miscutils.stringToVersion(version)
+ # would this ever be a ListType?
+ elif type(version) in (types.TupleType, types.ListType):
+ (r_e, r_v, r_r) = version
+ elif type(version) is types.NoneType:
+ r_e = r_v = r_r = None
+
+ deptup = (name, misc.share_data(flags),
+ (misc.share_data(r_e), misc.share_data(r_v),
+ misc.share_data(r_r)))
+ return misc.share_data(deptup)
+
def getProvides(self, name, flags=None, version=(None, None, None)):
"""searches the rpmdb for what provides the arguments
returns a list of pkgtuples of providing packages, possibly empty"""
+ name = misc.share_data(name)
+ deptup = self._genDeptup(name, flags, version)
+ if deptup in self._get_pro_cache:
+ return self._get_pro_cache[deptup]
+ r_v = deptup[2][1]
+
pkgs = self.searchProvides(name)
if name[0] =='/':
morepkgs = self.searchFiles(name)
pkgs.extend(morepkgs)
- if flags == 0:
- flags = None
- if type(version) is types.StringType:
- (r_e, r_v, r_r) = miscutils.stringToVersion(version)
- elif type(version) in (types.TupleType, types.ListType): # would this ever be a ListType?
- (r_e, r_v, r_r) = version
- elif type(version) is types.NoneType:
- r_e = r_v = r_r = None
result = { }
@@ -521,10 +543,10 @@ class RPMDBPackageSack(PackageSackBase):
if name[0] == '/' and r_v is None:
result[po] = [(name, None, (None, None, None))]
continue
- hits = po.matchingPrcos(
- 'provides', (name, flags, (r_e, r_v, r_r)))
+ hits = po.matchingPrcos('provides', deptup)
if hits:
result[po] = hits
+ self._get_pro_cache[deptup] = result
return result
def whatProvides(self, name, flags, version):
@@ -535,16 +557,13 @@ class RPMDBPackageSack(PackageSackBase):
"""searches the rpmdb for what provides the arguments
returns a list of pkgtuples of providing packages, possibly empty"""
- pkgs = self.searchRequires(name)
+ name = misc.share_data(name)
+ deptup = self._genDeptup(name, flags, version)
+ if deptup in self._get_req_cache:
+ return self._get_req_cache[deptup]
+ r_v = deptup[2][1]
- if flags == 0:
- flags = None
- if type(version) is types.StringType:
- (r_e, r_v, r_r) = miscutils.stringToVersion(version)
- elif type(version) in (types.TupleType, types.ListType): # would this ever be a ListType?
- (r_e, r_v, r_r) = version
- elif type(version) is types.NoneType:
- r_e = r_v = r_r = None
+ pkgs = self.searchRequires(name)
result = { }
@@ -553,10 +572,10 @@ class RPMDBPackageSack(PackageSackBase):
# file dep add all matches to the defSack
result[po] = [(name, None, (None, None, None))]
continue
- hits = po.matchingPrcos(
- 'requires', (name, flags, (r_e, r_v, r_r)))
+ hits = po.matchingPrcos('requires', deptup)
if hits:
result[po] = hits
+ self._get_req_cache[deptup] = result
return result
def whatRequires(self, name, flags, version):
commit 415d78f48632403f08fc1cb9c290269987b18c03
Merge: 64f199b... 833e605...
Author: James Antill <james at and.org>
Date: Fri Mar 28 23:52:08 2008 -0400
Merge branch 'master' of ssh://login.linux.duke.edu/home/groups/yum/git/yum
* 'master' of ssh://login.linux.duke.edu/home/groups/yum/git/yum:
partial fix for incorrect update for dependency resolution.
commit 64f199b509295b66778ad0330a1823d4cd1dbf37
Author: James Antill <james at and.org>
Date: Fri Mar 28 17:57:16 2008 -0400
Change name so we don't stomp on provs
diff --git a/yum/depsolve.py b/yum/depsolve.py
index 3daf4c8..d1b2272 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -760,8 +760,8 @@ class Depsolve(object):
def _checkInstall(self, txmbr):
- reqs = txmbr.po.returnPrco('requires')
- provs = set(txmbr.po.returnPrco('provides'))
+ txmbr_reqs = txmbr.po.returnPrco('requires')
+ txmbr_provs = set(txmbr.po.returnPrco('provides'))
# if this is an update, we should check what the old
# requires were to make things faster
@@ -771,10 +771,10 @@ class Depsolve(object):
oldreqs = set(oldreqs)
ret = []
- for req in reqs:
+ for req in txmbr_reqs:
if req[0].startswith('rpmlib('):
continue
- if req in provs:
+ if req in txmbr_provs:
continue
if req in oldreqs and self.rpmdb.getProvides(*req):
continue
More information about the Yum-cvs-commits
mailing list