[Yum-devel] [PATCH] Another returnLeafNodes speedup (roughly 10%).

Tim Lauridsen tim.lauridsen at googlemail.com
Sun Oct 11 06:19:24 UTC 2009


On 10/10/2009 09:41 PM, Ville Skyttä wrote:
> Corresponds to commit 156db879ce62f8f974ea03d83cee575c4411820d for packageSack
> leaf nodes plus adds breaking req/prov lookup as early as possible, and avoids
> a few unnecessary pkgTupleFromHeader calls.
> ---
>   rpmUtils/transaction.py |   18 ++++++++++++++----
>   1 files changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/rpmUtils/transaction.py b/rpmUtils/transaction.py
> index e0c6152..64a272f 100644
> --- a/rpmUtils/transaction.py
> +++ b/rpmUtils/transaction.py
> @@ -120,10 +120,11 @@ class TransactionWrapper:
>           if mi is None: # this is REALLY unlikely but let's just say it for the moment
>               return orphan
>
> +        # prebuild the req dict
>           for h in mi:
> -            tup = miscutils.pkgTupleFromHeader(h)
>               if not h[rpm.RPMTAG_REQUIRENAME]:
>                   continue
> +            tup = miscutils.pkgTupleFromHeader(h)
>               for r in h[rpm.RPMTAG_REQUIRENAME]:
>                   if not req.has_key(r):
>                       req[r] = set()
> @@ -133,17 +134,26 @@ class TransactionWrapper:
>           mi = self.dbMatch()
>           if mi is None:
>               return orphan
> -
> +
> +        def _return_all_provides(hdr):
> +            """ Return all the provides, via yield. """
> +            # These are done one by one, so that we get lazy loading
> +            for prov in hdr[rpm.RPMTAG_PROVIDES]:
> +                yield prov
> +            for prov in hdr[rpm.RPMTAG_FILENAMES]:
> +                yield prov
> +
>           for h in mi:
>               preq = 0
>               tup = miscutils.pkgTupleFromHeader(h)
> -            for p in h[rpm.RPMTAG_PROVIDES] + h[rpm.RPMTAG_FILENAMES]:
> +            for p in _return_all_provides(h):
>                   if req.has_key(p):
>                       # Don't count a package that provides its require
>                       s = req[p]
>                       if len(s)>  1 or tup not in s:
>                           preq = preq + 1
> -
> +                        break
> +
>               if preq == 0:
>                   if headers:
>                       orphan.append((h, mi.instance()))
>    
Looks good to me

Tim


More information about the Yum-devel mailing list