[Yum-devel] [PATCH] Don't use .up object on package install, unless we have to.
seth vidal
skvidal at fedoraproject.org
Fri Apr 29 20:34:46 UTC 2011
On Fri, 2011-04-29 at 16:32 -0400, James Antill wrote:
> Huge perf. gain, now takes ~60% of time to get to y/N choice. 45%
> when obsoletes are off.
>
> Somewhat ugly workaround needed to get obsoletes data.
>
> Also fixes bug when obsoletes are off and we install something which
> obsoletes things (they still need to be obsoleted, as rpm will do it).
> ---
> yum/__init__.py | 52 ++++++++++++++++++++++++++++++++++++++++++----------
> 1 files changed, 42 insertions(+), 10 deletions(-)
>
> diff --git a/yum/__init__.py b/yum/__init__.py
> index 1291da9..740273e 100644
> --- a/yum/__init__.py
> +++ b/yum/__init__.py
> @@ -726,7 +726,10 @@ class YumBase(depsolve.Depsolve):
> if self.conf.debuglevel >= 7:
> self._up.debug = 1
>
> - if self.conf.obsoletes:
> + if hasattr(self, '_up_obs_hack'):
> + self._up.rawobsoletes = self._up_obs_hack.rawobsoletes
> + del self._up_obs_hack
> + elif self.conf.obsoletes:
> obs_init = time.time()
> # Note: newest=True here is semi-required for repos. with multiple
> # versions. The problem is that if pkgA-2 _accidentally_ obsoletes
> @@ -3183,7 +3186,23 @@ class YumBase(depsolve.Depsolve):
> def _pkg2obspkg(self, po):
> """ Given a package return the package it's obsoleted by and so
> we should install instead. Or None if there isn't one. """
> - thispkgobsdict = self.up.checkForObsolete([po.pkgtup])
> + if self._up is not None:
> + thispkgobsdict = self.up.checkForObsolete([po.pkgtup])
> + else:
> + # This is pretty hacky, but saves a huge amount of time for small
> + # ops.
> + if not self.conf.obsoletes:
> + return None
> +
> + if not hasattr(self, '_up_obs_hack'):
> + obs_init = time.time()
> + up = rpmUtils.updates.Updates([], [])
> + up.rawobsoletes = self.pkgSack.returnObsoletes(newest=True)
> + self.verbose_logger.debug('Obs Init time: %0.3f' % (time.time()
> + - obs_init))
> + self._up_obs_hack = up
> + thispkgobsdict = self._up_obs_hack.checkForObsolete([po.pkgtup])
> +
> if po.pkgtup in thispkgobsdict:
> obsoleting = thispkgobsdict[po.pkgtup]
> oobsoleting = []
> @@ -3316,10 +3335,19 @@ class YumBase(depsolve.Depsolve):
> installed_pkg = self.getInstalledPackageObject(inst_tup)
> yield installed_pkg
> else:
> - for obs_n in po.obsoletes_names:
> - for pkg in self.rpmdb.searchNevra(name=obs_n):
> - if pkg.obsoletedBy([po]):
> - yield pkg
> + for pkg in self._find_obsoletees_direct(po):
> + yield pkg
> +
> + def _find_obsoletees_direct(self, po):
> + """ Return the pkgs. that are obsoleted by the po we pass in. This works
> + directly on the package data, for two reasons:
> + 1. Consulting .up. has a slow setup for small/fast ops.
> + 2. We need this work even if obsoletes are turned off, because rpm
> + will be doing it for us. """
> + for obs_n in po.obsoletes_names:
> + for pkg in self.rpmdb.searchNevra(name=obs_n):
> + if pkg.obsoletedBy([po]):
> + yield pkg
>
> def _add_prob_flags(self, *flags):
> """ Add all of the passed flags to the tsInfo.probFilterFlags array. """
> @@ -3466,7 +3494,8 @@ class YumBase(depsolve.Depsolve):
> continue
>
> # make sure this shouldn't be passed to update:
> - if po.pkgtup in self.up.updating_dict:
> + if (self.rpmdb.searchNames([po.name]) and
> + po.pkgtup in self.up.updating_dict):
> txmbrs = self.update(po=po)
> tx_return.extend(txmbrs)
> continue
> @@ -3474,7 +3503,9 @@ class YumBase(depsolve.Depsolve):
> # Make sure we're not installing a package which is obsoleted by
> # something else in the repo. Unless there is a obsoletion loop,
> # at which point ignore everything.
> - obsoleting_pkg = self._test_loop(po, self._pkg2obspkg)
> + obsoleting_pkg = None
> + if self.conf.obsoletes:
> + obsoleting_pkg = self._test_loop(po, self._pkg2obspkg)
> if obsoleting_pkg is not None:
> # this is not a definitive check but it'll make sure we don't
> # pull in foo.i586 when foo.x86_64 already obsoletes the pkg and
> @@ -3543,8 +3574,9 @@ class YumBase(depsolve.Depsolve):
> break
>
> # it doesn't obsolete anything. If it does, mark that in the tsInfo, too
> - if po.pkgtup in self.up.getObsoletesList(name=po.name):
> - for obsoletee in self._find_obsoletees(po):
> + obs_pkgs = list(self._find_obsoletees_direct(po))
> + if obs_pkgs:
> + for obsoletee in obs_pkgs:
> txmbr = self.tsInfo.addObsoleting(po, obsoletee)
> self.tsInfo.addObsoleted(obsoletee, po)
> tx_return.append(txmbr)
NACK.
obsoletes are never really off.
rpm will honor them if we even just have the pkg in the ts - whether or
not obsoletes=0 or not.
I don't think we should be making code exceptions for things which
encourage people to set variables which aren't actually DOING what they
think they are doing.
-sv
More information about the Yum-devel
mailing list