caches: introduce invalidation as a safer ways to expire keys, deleting them are more problematic.

This commit is contained in:
RhodeCode Admin 2021-07-23 11:09:12 +02:00
parent 81ea8edd0b
commit 3ce837d046
3 changed files with 12 additions and 7 deletions

View file

@ -41,13 +41,14 @@ def trigger_user_permission_flush(event):
automatic flush of permission caches, so the users affected receive new permissions
Right Away
"""
invalidate = True
affected_user_ids = set(event.user_ids)
for user_id in affected_user_ids:
for cache_namespace_uid_tmpl in cache_namespaces:
cache_namespace_uid = cache_namespace_uid_tmpl.format(user_id)
del_keys = rc_cache.clear_cache_namespace('cache_perms', cache_namespace_uid)
log.debug('Deleted %s cache keys for user_id: %s and namespace %s',
del_keys = rc_cache.clear_cache_namespace(
'cache_perms', cache_namespace_uid, invalidate=invalidate)
log.debug('Invalidated %s cache keys for user_id: %s and namespace %s',
del_keys, user_id, cache_namespace_uid)

View file

@ -261,12 +261,15 @@ def get_or_create_region(region_name, region_namespace=None):
return region_obj
def clear_cache_namespace(cache_region, cache_namespace_uid):
def clear_cache_namespace(cache_region, cache_namespace_uid, invalidate=False):
region = get_or_create_region(cache_region, cache_namespace_uid)
cache_keys = region.backend.list_keys(prefix=cache_namespace_uid)
num_delete_keys = len(cache_keys)
if num_delete_keys:
region.delete_multi(cache_keys)
if invalidate:
region.invalidate(hard=False)
else:
if num_delete_keys:
region.delete_multi(cache_keys)
return num_delete_keys

View file

@ -285,7 +285,8 @@ class ScmModel(BaseModel):
repo.update_commit_cache(config=config, cs_cache=None)
if delete:
cache_namespace_uid = 'cache_repo.{}'.format(repo_id)
rc_cache.clear_cache_namespace('cache_repo', cache_namespace_uid)
rc_cache.clear_cache_namespace(
'cache_repo', cache_namespace_uid, invalidate=True)
def toggle_following_repo(self, follow_repo_id, user_id):