[yum-git] 2 commits - yum/__init__.py yum/packageSack.py yum/sqlitesack.py

James Antill james at linux.duke.edu
Tue Mar 18 17:04:31 UTC 2008


 yum/__init__.py    |    1 
 yum/packageSack.py |    5 +++
 yum/sqlitesack.py  |   81 +++++++++++++++++++++++++++++++++++++++++++++++------
 3 files changed, 78 insertions(+), 9 deletions(-)

New commits:
commit c2efd9e13055e873983b7cdfe58e4914f3e01f70
Author: James Antill <james at and.org>
Date:   Tue Mar 18 12:56:07 2008 -0400

    Move pkgoblist into droCachedData

diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 74d0962..26c1f68 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -290,6 +290,8 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
             del self._memoize_requires
         if hasattr(self, '_memoize_provides'):
             del self._memoize_provides
+        if hasattr(self, 'pkgobjlist'):
+            del self.pkgobjlist
         self._search_cache = {
             'provides' : { },
             'requires' : { },
@@ -311,8 +313,6 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
         self.excludes = {}
         self._excludes = set()
         self._all_excludes = {}
-        if hasattr(self, 'pkgobjlist'):
-            del self.pkgobjlist
 
         yumRepo.YumPackageSack.close(self)
 
commit fb3be34e1b6ee6672118a5780f059fb5b1a83d62
Author: James Antill <james at and.org>
Date:   Tue Mar 18 12:53:04 2008 -0400

     Pre-load the requires data when we first need it, in depsolving.
     Tweak what we _share_data()
     Add dropCachedData() call, in sqlitesack and MetaSack.
      Call it after resolveDeps().

diff --git a/yum/__init__.py b/yum/__init__.py
index c38afe9..1ddb4c0 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -629,6 +629,7 @@ class YumBase(depsolve.Depsolve):
         
         if self.tsInfo.changed:
             (rescode, restring) = self.resolveDeps()
+	self.tsInfo.pkgSack.dropCachedData()
 
         # if depsolve failed and skipbroken is enabled
         # The remove the broken packages from the transactions and
diff --git a/yum/packageSack.py b/yum/packageSack.py
index 24d1436..319692b 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -260,6 +260,11 @@ class MetaSack(PackageSackBase):
             ret += len(sack)
         return ret
 
+    def dropCachedData(self):
+        for sack in self.sacks.values():
+            if hasattr(sack, 'dropCachedData'):
+                sack.dropCachedData()
+
     def addSack(self, repoid, sack):
         """Adds a repository's packageSack to this MetaSack."""
         self.sacks[repoid] = sack
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 4c65a8c..74d0962 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -83,13 +83,13 @@ class YumAvailablePackageSqlite(YumAvailablePackage, PackageObject, RpmBase):
             except (IndexError, KeyError):
                 return None
 
-        for item in ['name', 'arch', 'epoch', 'version', 'release']:
+        for item in ['name', 'arch', 'epoch', 'version', 'release', 'pkgKey']:
             try:
                 setattr(self, item, _share_data(db_obj[item]))
             except (IndexError, KeyError):
                 pass
 
-        for item in ['pkgId', 'pkgKey']:
+        for item in ['pkgId']:
             try:
                 setattr(self, item, db_obj[item])
             except (IndexError, KeyError):
@@ -285,8 +285,22 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
             pkg_num += self._sql_MD_pkg_num('primary', repo)
         return pkg_num - exclude_num
 
+    def dropCachedData(self):
+        if hasattr(self, '_memoize_requires'):
+            del self._memoize_requires
+        if hasattr(self, '_memoize_provides'):
+            del self._memoize_provides
+        self._search_cache = {
+            'provides' : { },
+            'requires' : { },
+            }
+        global _store
+        _store = {}
+
     @catchSqliteException
     def close(self):
+        self.dropCachedData()
+
         for dataobj in self.primarydb.values() + \
                        self.filelistsdb.values() + \
                        self.otherdb.values():
@@ -297,10 +311,6 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
         self.excludes = {}
         self._excludes = set()
         self._all_excludes = {}
-        self._search_cache = {
-            'provides' : { },
-            'requires' : { },
-            }
         if hasattr(self, 'pkgobjlist'):
             del self.pkgobjlist
 
@@ -418,6 +428,9 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
             # grab repo object from primarydb and force filelists population in this sack using repo
             # sack.populate(repo, mdtype, callback, cacheonly)
             for (repo,cache) in self.primarydb.items():
+                if repo in self._all_excludes:
+                    continue
+
                 self.populate(repo, mdtype='filelists')
 
         # Check to make sure the DB data matches, this should always pass but
@@ -429,6 +442,9 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
                 raise Errors.RepoError
 
         for (rep,cache) in self.filelistsdb.items():
+            if rep in self._all_excludes:
+                continue
+
             cur = cache.cursor()
 
             if glob:
@@ -589,6 +605,28 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
         
         return pkgs
         
+    @catchSqliteException
+    def _search_get_memoize(self, prcotype):
+        if not hasattr(self, '_memoize_' + prcotype):
+            memoize = {}
+
+            for (rep,cache) in self.primarydb.items():
+                if rep in self._all_excludes:
+                    continue
+
+                cur = cache.cursor()
+                executeSQL(cur, "select * from %s" % prcotype)
+                for x in cur:
+                    val = (_share_data(x['name']), _share_data(x['flags']),
+                           (_share_data(x['epoch']), _share_data(x['version']),
+                            _share_data(x['release'])))
+                    val = _share_data(val)
+                    key = (rep, val[0])
+                    pkgkey = _share_data(x['pkgKey'])
+                    val = (pkgkey, val)
+                    memoize.setdefault(key, []).append(val)
+            setattr(self, '_memoize_' + prcotype, memoize)
+        return getattr(self, '_memoize_' + prcotype)
 
     @catchSqliteException
     def _search(self, prcotype, name, flags, version):
@@ -600,12 +638,34 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
         elif type(version) in (tuple, list): # would this ever be a list?
             req = (name, flags, version)
 
+        prcotype = _share_data(prcotype)
+        req      = _share_data(req)
         if self._search_cache[prcotype].has_key(req):
             return self._search_cache[prcotype][req]
 
         result = { }
 
-        for (rep,cache) in self.primarydb.items():
+        # Requires is the biggest hit, pre-loading provides actually hurts
+        if prcotype != 'requires':
+            primarydb_items = self.primarydb.items()
+        else:
+            primarydb_items = []
+            memoize = self._search_get_memoize(prcotype)
+            for (rep,cache) in self.primarydb.items():
+                if rep in self._all_excludes:
+                    continue
+
+                tmp = {}
+                for x in memoize.get((rep, name), []):
+                    pkgkey, val = x
+                    if rpmUtils.miscutils.rangeCompare(req, val):
+                        tmp.setdefault(pkgkey, []).append(val)
+                for pkgKey, hits in tmp.iteritems():
+                    if self._pkgKeyExcluded(rep, pkgKey):
+                        continue
+                    result[self._packageByKey(rep, pkgKey)] = hits
+
+        for (rep,cache) in primarydb_items:
             cur = cache.cursor()
             executeSQL(cur, "select * from %s where name=?" % prcotype,
                        (name,))
@@ -642,6 +702,9 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
 
         # If it is a filename, search the primary.xml file info
         for (rep,cache) in self.primarydb.items():
+            if rep in self._all_excludes:
+                continue
+
             cur = cache.cursor()
             executeSQL(cur, "select DISTINCT pkgKey from files where name = ?", (name,))
             for ob in cur:



More information about the Yum-cvs-commits mailing list