[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