[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