[Yum-devel] [PATCH] Fix our pkgtup+checksum cache to save every pkgtup, so we don't lose pkgs.
seth vidal
skvidal at fedoraproject.org
Fri Oct 15 18:51:28 UTC 2010
On Fri, 2010-10-15 at 09:19 -0400, James Antill wrote:
> ---
> yum/rpmsack.py | 31 ++++++++++++++++++++-----------
> yum/transactioninfo.py | 4 +++-
> 2 files changed, 23 insertions(+), 12 deletions(-)
>
> diff --git a/yum/rpmsack.py b/yum/rpmsack.py
> index 1f44706..2af9a35 100644
> --- a/yum/rpmsack.py
> +++ b/yum/rpmsack.py
> @@ -625,7 +625,7 @@ class RPMDBPackageSack(PackageSackBase):
> misc.unlink_f(self._cachedir + "/version")
> misc.unlink_f(self._cachedir + '/conflicts')
> misc.unlink_f(self._cachedir + '/file-requires')
> - misc.unlink_f(self._cachedir + '/yumdb-package-checksums')
> + misc.unlink_f(self._cachedir + '/pkgtups+checksums')
> # We have a couple of options here, we can:
> #
> # . Ignore it and continue - least invasive, least likely to get any
> @@ -709,8 +709,8 @@ class RPMDBPackageSack(PackageSackBase):
> data = self._trans_cache_store['file-requires']
> self._write_file_requires(rpmdbv, data)
>
> - if 'yumdb-package-checksums' in self._trans_cache_store:
> - data = self._trans_cache_store['yumdb-package-checksums']
> + if 'pkgtups+checksums' in self._trans_cache_store:
> + data = self._trans_cache_store['pkgtups+checksums']
> self._write_package_checksums(rpmdbv, data)
>
> self._trans_cache_store = {}
> @@ -889,18 +889,19 @@ class RPMDBPackageSack(PackageSackBase):
> """ As simpleVersion() et. al. requires it, we "cache" this yumdb data
> as part of our rpmdb cache. We cache it with rpmdb data, even
> though someone _could_ use yumdb to alter it without changing the
> - rpmdb ... don't do that. """
> + rpmdb ... don't do that.
> + NOTE: This is also used as a cache of pkgtups in the rpmdb. """
> if not self.__cache_rpmdb__:
> return
>
> - if not os.path.exists(self._cachedir + '/yumdb-package-checksums'):
> + if not os.path.exists(self._cachedir + '/pkgtups+checksums'):
> return
>
> def _read_str(fo):
> return fo.readline()[:-1]
>
> rpmdbv = self.simpleVersion(main_only=True)[0]
> - fo = open(self._cachedir + '/yumdb-package-checksums')
> + fo = open(self._cachedir + '/pkgtups+checksums')
> frpmdbv = fo.readline()
> if not frpmdbv or rpmdbv != frpmdbv[:-1]:
> return
> @@ -919,7 +920,10 @@ class RPMDBPackageSack(PackageSackBase):
>
> T = _read_str(fo)
> D = _read_str(fo)
> - checksum_data[pkgtup] = (T, D)
> + if T == '-':
> + checksum_data[pkgtup] = None
> + else:
> + checksum_data[pkgtup] = (T, D)
>
> if fo.readline() != '': # Should be EOF
> return
> @@ -931,6 +935,9 @@ class RPMDBPackageSack(PackageSackBase):
> return checksum_data
>
> for pkgtup in checksum_data:
> + if checksum_data[pkgtup] is None:
> + continue
> +
> (n, a, e, v, r) = pkgtup
> pkg = self.searchNevra(n, e, v, r, a)
> if not pkg:
> @@ -948,24 +955,26 @@ class RPMDBPackageSack(PackageSackBase):
> if not self.__cache_rpmdb__:
> return
>
> - self._trans_cache_store['yumdb-package-checksums'] = pkg_checksum_tups
> + self._trans_cache_store['pkgtups+checksums'] = pkg_checksum_tups
>
> def _write_package_checksums(self, rpmdbversion, data):
> if not os.access(self._cachedir, os.W_OK):
> return
>
> pkg_checksum_tups = data
> - fo = open(self._cachedir + '/yumdb-package-checksums.tmp', 'w')
> + fo = open(self._cachedir + '/pkgtups+checksums.tmp', 'w')
> fo.write("%s\n" % rpmdbversion)
> fo.write("%u\n" % len(pkg_checksum_tups))
> for pkgtup, TD in sorted(pkg_checksum_tups):
> for var in pkgtup:
> fo.write("%s\n" % var)
> + if TD is None:
> + TD = ('-', '-')
> for var in TD:
> fo.write("%s\n" % var)
> fo.close()
> - os.rename(self._cachedir + '/yumdb-package-checksums.tmp',
> - self._cachedir + '/yumdb-package-checksums')
> + os.rename(self._cachedir + '/pkgtups+checksums.tmp',
> + self._cachedir + '/pkgtups+checksums')
>
> def _get_cached_simpleVersion_main(self):
> """ Return the cached string of the main rpmdbv. """
> diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py
> index f34a45e..6cf400a 100644
> --- a/yum/transactioninfo.py
> +++ b/yum/transactioninfo.py
> @@ -646,7 +646,9 @@ class TransactionData:
> csum = None
> if 'checksum_type' in ydbi and 'checksum_data' in ydbi:
> csum = (ydbi.checksum_type, ydbi.checksum_data)
> - pkg_checksum_tups.append((pkg.pkgtup, csum))
> + # We need all the pkgtups, so we even save the ones without a
> + # checksum.
> + pkg_checksum_tups.append((pkg.pkgtup, csum))
> main.update(pkg, csum)
>
> self.rpmdb.transactionCachePackageChecksums(pkg_checksum_tups)
discussed a bit on jabber:
1. pkgtups+checksum -> pktups-checksum so we don't have to play escaping
games with bash
2. ACK
-sv
More information about the Yum-devel
mailing list