[PATCH 2/3] Use decorator for methods that invalidate base repo cache
Samantha N. Bueno
sbueno+anaconda at redhat.com
Mon Oct 21 14:07:36 UTC 2013
Ack on this one.
On Wed, Oct 16, 2013 at 03:26:22PM +0200, Vratislav Podzimek wrote:
>
> Signed-off-by: Vratislav Podzimek <vpodzime at redhat.com>
> ---
> pyanaconda/packaging/yumpayload.py | 66 +++++++++++++++++++++++++++-----------
> 1 file changed, 47 insertions(+), 19 deletions(-)
>
> diff --git a/pyanaconda/packaging/yumpayload.py b/pyanaconda/packaging/yumpayload.py
> index 4225649..7259789 100644
> --- a/pyanaconda/packaging/yumpayload.py
> +++ b/pyanaconda/packaging/yumpayload.py
> @@ -41,6 +41,7 @@ import shutil
> import sys
> import time
> from pyanaconda.iutil import execReadlines
> +from functools import wraps
>
> import logging
> log = logging.getLogger("packaging")
> @@ -86,7 +87,8 @@ from pyanaconda.localization import langcode_matches_locale
> from pykickstart.constants import GROUP_ALL, GROUP_DEFAULT, KS_MISSING_IGNORE
>
> YUM_PLUGINS = ["blacklist", "whiteout", "fastestmirror", "langpacks"]
> -default_repos = [productName.lower(), "rawhide"]
> +DEFAULT_REPOS = [productName.lower(), "rawhide"]
> +BASE_REPO_NAMES = [BASE_REPO_NAME] + DEFAULT_REPOS
>
> import inspect
> import threading
> @@ -112,6 +114,35 @@ class YumLock(object):
> if not isFinal:
> log.info("gave up _yum_lock for %s", threading.currentThread().name)
>
> +def invalidates_br_cache(cond_fn=None):
> + """
> + Function returning decorator for methods that invalidate base repo cache.
> +
> + :param cond_fn: condition function telling if base repo should be
> + invalidated or not (HAS TO TAKE THE SAME ARGUMENTS AS THE
> + DECORATED FUNCTION)
> +
> + """
> +
> + def decorator(method):
> + """
> + Decorator for methods that invalidate base repo cache.
> +
> + :param method: decorated method of the YumPayload class
> +
> + """
> +
> + @wraps(method)
> + def inner_method(yum_payload, *args, **kwargs):
> + if cond_fn is None or cond_fn(yum_payload, *args, **kwargs):
> + yum_payload.invalidate_br_cache()
> +
> + return method(yum_payload, *args, **kwargs)
> +
> + return inner_method
> +
> + return decorator
> +
> _yum_lock = YumLock()
> _yum_cache_dir = "/tmp/yum.cache"
>
> @@ -146,6 +177,11 @@ class YumPayload(PackagePayload):
>
> self.reset()
>
> + def invalidate_br_cache(self):
> + """ Invalidates base repo cache. """
> + with self._br_cache_valid_lock:
> + self._br_cache_valid = False
> +
> def reset(self, root=None):
> """ Reset this instance to its initial (unconfigured) state. """
>
> @@ -406,9 +442,8 @@ reposdir=%s
> return REPO_NOT_SET
>
> def _refreshBaseRepo(self):
> - repo_names = [BASE_REPO_NAME] + default_repos
> with _yum_lock:
> - for repo_name in repo_names:
> + for repo_name in BASE_REPO_NAMES:
> if repo_name in self.repos and \
> self._yum.repos.getRepo(repo_name).enabled:
> with self._br_cache_valid_lock:
> @@ -429,7 +464,8 @@ reposdir=%s
> # go through scheduled callbacks (if any) and remove them
> for callback in self._br_callbacks:
> callback(current_cached)
> - self._br_callbacks.remove(callback)
> +
> + self._br_callbacks = []
>
> @property
> def mirrorEnabled(self):
> @@ -453,6 +489,7 @@ reposdir=%s
> return super(YumPayload, self).isRepoEnabled(repo_id)
>
> # pylint: disable-msg=W0221
> + @invalidates_br_cache()
> def updateBaseRepo(self, fallback=True, root=None, checkmount=True):
> """ Update the base repo based on self.data.method.
>
> @@ -467,9 +504,6 @@ reposdir=%s
> """
> log.info("updating base repo")
>
> - with self._br_cache_valid_lock:
> - self._br_cache_valid = False
> -
> # start with a fresh YumBase instance
> self.reset(root=root)
>
> @@ -559,10 +593,8 @@ reposdir=%s
> # if a method/repo was given, disable all default repos
> self.disableRepo(repo.id)
>
> + @invalidates_br_cache()
> def gatherRepoMetadata(self):
> - with self._br_cache_valid_lock:
> - self._br_cache_valid = False
> -
> # now go through and get metadata for all enabled repos
> log.info("gathering repo metadata")
> for repo_id in self.repos:
> @@ -592,6 +624,7 @@ reposdir=%s
> return dev[len(DRACUT_ISODIR)+1:]
> return None
>
> + @invalidates_br_cache()
> def _configureBaseRepo(self, storage, checkmount=True):
> """ Configure the base repo.
>
> @@ -605,9 +638,6 @@ reposdir=%s
> usable media mounted.
> """
>
> - with self._br_cache_valid_lock:
> - self._br_cache_valid = False
> -
> log.info("configuring base repo")
> url, mirrorlist, sslverify = self._setupInstallDevice(storage, checkmount)
> method = self.data.method
> @@ -733,9 +763,6 @@ reposdir=%s
> """ Retrieve repo metadata if we don't already have it. """
> from yum.Errors import RepoError, RepoMDError
>
> - with self._br_cache_valid_lock:
> - self._br_cache_valid = False
> -
> # And try to grab its metadata. We do this here so it can be done
> # on a per-repo basis, so we can then get some finer grained error
> # handling and recovery.
> @@ -775,13 +802,11 @@ reposdir=%s
>
> return url
>
> + @invalidates_br_cache(lambda s, n, *args, **kwargs: n in BASE_REPO_NAMES)
> def _addYumRepo(self, name, baseurl, mirrorlist=None, proxyurl=None, **kwargs):
> """ Add a yum repo to the YumBase instance. """
> from yum.Errors import RepoError
>
> - with self._br_cache_valid_lock:
> - self._br_cache_valid = False
> -
> needsAdding = True
>
> # First, delete any pre-existing repo with the same name.
> @@ -845,6 +870,7 @@ reposdir=%s
> self._addYumRepo(newrepo.name, newrepo.baseurl, newrepo.mirrorlist, newrepo.proxy) # FIXME: handle MetadataError
> super(YumPayload, self).addRepo(newrepo)
>
> + @invalidates_br_cache(lambda s, r_id: r_id in BASE_REPO_NAMES)
> def _removeYumRepo(self, repo_id):
> if repo_id in self.repos:
> with _yum_lock:
> @@ -877,6 +903,7 @@ reposdir=%s
> except SystemError as e:
> log.error("failed to unmount nfs repo %s: %s", mountpoint, e)
>
> + @invalidates_br_cache(lambda s, r_id: r_id in BASE_REPO_NAMES)
> def enableRepo(self, repo_id):
> """ Enable a repo as specified by id. """
>
> @@ -889,6 +916,7 @@ reposdir=%s
> self._yum.repos.enableRepo(repo_id)
> super(YumPayload, self).enableRepo(repo_id)
>
> + @invalidates_br_cache(lambda s, r_id: r_id in BASE_REPO_NAMES)
> def disableRepo(self, repo_id):
> """ Disable a repo as specified by id. """
>
> --
> 1.7.11.7
>
> _______________________________________________
> anaconda-patches mailing list
> anaconda-patches at lists.fedorahosted.org
> https://lists.fedorahosted.org/mailman/listinfo/anaconda-patches
More information about the anaconda-patches
mailing list