# HG changeset patch # User RhodeCode Admin # Date 2023-07-26 14:16:39 # Node ID 7b7ca85641d35cd8061a59bb193bd5e6222ef487 # Parent d88b9a35b699b655cdccacd9bb40038dd178d213 caches: use of global cache prefixes so we can keep compatability when switching from OLD rc to new python3 based diff --git a/vcsserver/base.py b/vcsserver/base.py --- a/vcsserver/base.py +++ b/vcsserver/base.py @@ -22,7 +22,6 @@ import logging import urllib.parse from vcsserver.lib.rc_cache.archive_cache import get_archival_cache_store -from vcsserver.lib.rc_cache import region_meta from vcsserver import exceptions from vcsserver.exceptions import NoContentException @@ -42,7 +41,7 @@ class RepoFactory(object): repo_type = None def __init__(self): - self._cache_region = region_meta.dogpile_cache_regions['repo_object'] + pass def _create_config(self, path, config): config = {} @@ -86,7 +85,6 @@ def raise_from_original(new_type, org_ex del exc_traceback - class ArchiveNode(object): def __init__(self, path, mode, is_link, raw_bytes): self.path = path @@ -98,21 +96,22 @@ class ArchiveNode(object): def store_archive_in_cache(node_walker, archive_key, kind, mtime, archive_at_path, archive_dir_name, commit_id, write_metadata=True, extra_metadata=None, cache_config=None): """ - Function that would store an generate archive and send it to a dedicated backend store + Function that would store generate archive and send it to a dedicated backend store In here we use diskcache :param node_walker: a generator returning nodes to add to archive :param archive_key: key used to store the path :param kind: archive kind :param mtime: time of creation - :param archive_at_path: default '/' the path at archive was started. if this is not '/' it means it's a partial archive + :param archive_at_path: default '/' the path at archive was started. + If this is not '/' it means it's a partial archive :param archive_dir_name: inside dir name when creating an archive :param commit_id: commit sha of revision archive was created at :param write_metadata: :param extra_metadata: :param cache_config: - walker should be a file walker, for example: + walker should be a file walker, for example, def node_walker(): for file_info in files: yield ArchiveNode(fn, mode, is_link, ctx[fn].data) @@ -145,7 +144,7 @@ def store_archive_in_cache(node_walker, archiver.addfile(f_path, f.mode, f.is_link, f.raw_bytes()) except NoContentException: # NOTE(marcink): this is a special case for SVN so we can create "empty" - # directories which arent supported by archiver + # directories which are not supported by archiver archiver.addfile(os.path.join(f_path, b'.dir'), f.mode, f.is_link, b'') if write_metadata: diff --git a/vcsserver/lib/rc_cache/__init__.py b/vcsserver/lib/rc_cache/__init__.py --- a/vcsserver/lib/rc_cache/__init__.py +++ b/vcsserver/lib/rc_cache/__init__.py @@ -52,6 +52,8 @@ register_backend( log = logging.getLogger(__name__) +CACHE_OBJ_CACHE_VER = 'v2' + CLEAR_DELETE = 'delete' CLEAR_INVALIDATE = 'invalidate' @@ -103,7 +105,7 @@ def configure_dogpile_cache(settings): if log.isEnabledFor(logging.DEBUG): region_args = dict(backend=new_region.actual_backend, region_invalidator=new_region.region_invalidator.__class__) - log.debug('dogpile: registering a new region `%s` %s', namespace_name, region_args) + log.debug('dogpile: registering a new region key=`%s` args=%s', namespace_name, region_args) region_meta.dogpile_cache_regions[namespace_name] = new_region diff --git a/vcsserver/lib/rc_cache/backends.py b/vcsserver/lib/rc_cache/backends.py --- a/vcsserver/lib/rc_cache/backends.py +++ b/vcsserver/lib/rc_cache/backends.py @@ -15,7 +15,7 @@ # along with this program; if not, write to the Free Software Foundation, # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -import errno +#import errno import fcntl import functools import logging diff --git a/vcsserver/lib/rc_cache/utils.py b/vcsserver/lib/rc_cache/utils.py --- a/vcsserver/lib/rc_cache/utils.py +++ b/vcsserver/lib/rc_cache/utils.py @@ -27,7 +27,7 @@ from dogpile.cache import CacheRegion from vcsserver.utils import sha1 from vcsserver.str_utils import safe_bytes -from vcsserver.type_utils import str2bool +from vcsserver.type_utils import str2bool # noqa :required by imports from .utils from . import region_meta @@ -177,6 +177,7 @@ def get_or_create_region(region_name, re region_uid_name = f'{region_name}:{region_namespace}' + # Special case for ONLY the FileNamespaceBackend backend. We register one-file-per-region if isinstance(region_obj.actual_backend, FileNamespaceBackend): if not region_namespace: raise ValueError(f'{FileNamespaceBackend} used requires to specify region_namespace param') @@ -192,7 +193,7 @@ def get_or_create_region(region_name, re namespace_cache_dir = cache_dir # we default the namespace_cache_dir to our default cache dir. - # however if this backend is configured with filename= param, we prioritize that + # however, if this backend is configured with filename= param, we prioritize that # so all caches within that particular region, even those namespaced end up in the same path if region_obj.actual_backend.filename: namespace_cache_dir = os.path.dirname(region_obj.actual_backend.filename) diff --git a/vcsserver/vcs_base.py b/vcsserver/vcs_base.py --- a/vcsserver/vcs_base.py +++ b/vcsserver/vcs_base.py @@ -23,7 +23,7 @@ class RemoteBase(object): def _region(self, wire): cache_repo_id = wire.get('cache_repo_id', '') - cache_namespace_uid = f'cache_repo.{cache_repo_id}' + cache_namespace_uid = f'cache_repo.{rc_cache.CACHE_OBJ_CACHE_VER}.{cache_repo_id}' return rc_cache.get_or_create_region('repo_object', cache_namespace_uid) def _cache_on(self, wire): @@ -35,13 +35,12 @@ class RemoteBase(object): return cache_on, context_uid, repo_id def vcsserver_invalidate_cache(self, wire, delete): - from vcsserver.lib import rc_cache - repo_id = wire.get('repo_id', '') cache_repo_id = wire.get('cache_repo_id', '') - cache_namespace_uid = f'cache_repo.{cache_repo_id}' + cache_namespace_uid = f'cache_repo.{rc_cache.CACHE_OBJ_CACHE_VER}.{cache_repo_id}' if delete: rc_cache.clear_cache_namespace( 'repo_object', cache_namespace_uid, method=rc_cache.CLEAR_DELETE) + repo_id = wire.get('repo_id', '') return {'invalidated': {'repo_id': repo_id, 'delete': delete}}