On Wed, 2012-03-28 at 17:06 +0200, Zdeněk Pavlas wrote:
> Metadata are downloaded in parallel just before postreposetup.
> This implements the reverting behavior.
> ---
>  yum/repos.py |   26 ++++++++++++++++++++++++++
>  1 files changed, 26 insertions(+), 0 deletions(-)
> 
> diff --git a/yum/repos.py b/yum/repos.py
> index 3793bad..9679974 100644
> --- a/yum/repos.py
> +++ b/yum/repos.py
> @@ -22,6 +22,7 @@ import misc
>  
>  import Errors
>  from packageSack import MetaSack
> +import urlgrabber.grabber
>  
>  from weakref import proxy as weakref
>  
> @@ -67,6 +68,30 @@ class RepoStorage:
>          self._cache_enabled_repos = []
>          self.quick_enable_disable = {}
>  
> +    def retrievAllMD(self):
> +        """ Download metadata for all enabled repositories,
> +            based on mdpolicy.
> +        """
> +
> +        if not hasattr(urlgrabber.grabber, 'parallel_wait'):
> +            return
> +        repos = []
> +        for repo in self.listEnabled():
> +            if repo.async and repo._commonLoadRepoXML(repo):
> +                mdtypes = repo._mdpolicy2mdtypes()
> +                downloading = repo._commonRetrieveDataMD_list(mdtypes)
> +                repos.append([repo, downloading, False])
> +                def failfunc(obj, r=repos[-1]):
> +                    r[2] = True
> +                for (ndata, nmdtype) in downloading:
> +                    repo._retrieveMD(nmdtype, async=True, failfunc=failfunc)
> +        urlgrabber.grabber.parallel_wait()
> +        for repo, downloading, error in repos:
> +            if error: # some MD failed?
> +                repo._revertOldRepoXML()
> +            else:
> +                repo._commonRetrieveDataMD_done(downloading)
> +
>      def doSetup(self, thisrepo = None):
>          
>          self.ayum.plugins.run('prereposetup')
> @@ -89,6 +114,7 @@ class RepoStorage:
>                  self.disableRepo(repo.id)
>                  
>          self._setup = True
> +        self.retrievAllMD()

 ACK.

 I'm not sure doSetup() is the best place for this, it kind of feels
wrong in that I thought there were code paths that ran doSetup which
didn't want the metadata downloading ... but a quick test shows that it
isn't triggered on a plain repos.listEnabled(), so I can't think of how
you'd want more than that but not to have the MD downloading.

>          self.ayum.plugins.run('postreposetup')
>          
>      def __str__(self):


_______________________________________________
Yum-devel mailing list
[email protected]
http://lists.baseurl.org/mailman/listinfo/yum-devel

Reply via email to