diff --git a/frappe/concurrency_limiter.py b/frappe/concurrency_limiter.py index e0973e7593..ba056faec1 100644 --- a/frappe/concurrency_limiter.py +++ b/frappe/concurrency_limiter.py @@ -23,14 +23,14 @@ from functools import wraps import frappe from frappe.exceptions import ServiceUnavailableError from frappe.utils import cint -from frappe.utils.caching import site_cache +from frappe.utils.caching import redis_cache from frappe.utils.redis_semaphore import RedisSemaphore # Default wait timeout (seconds) before returning 503 to the caller. _DEFAULT_WAIT_TIMEOUT = 10 -@site_cache(ttl=3600) +@redis_cache(shared=True) def _default_limit() -> int: """Derive a sensible default concurrency limit from gunicorn's max concurrency.""" return max(1, gunicorn_max_concurrency() // 2) diff --git a/frappe/utils/caching.py b/frappe/utils/caching.py index f2f1f9aecd..f1e0c781ed 100644 --- a/frappe/utils/caching.py +++ b/frappe/utils/caching.py @@ -180,7 +180,7 @@ def redis_cache(ttl: int | None = 3600, user: str | bool | None = None, shared: func_key = f"{func.__module__}.{func.__qualname__}" def clear_cache(): - frappe.cache.delete_keys(func_key) + frappe.cache.delete_keys(func_key, user=user, shared=shared) func.clear_cache = clear_cache func.ttl = ttl if not callable(ttl) else 3600 diff --git a/frappe/utils/redis_wrapper.py b/frappe/utils/redis_wrapper.py index 016fc3a74a..44a11ebf70 100644 --- a/frappe/utils/redis_wrapper.py +++ b/frappe/utils/redis_wrapper.py @@ -125,19 +125,19 @@ class RedisWrapper(redis.Redis): return ret - def get_keys(self, key): + def get_keys(self, key, user=None, shared=False): """Return keys starting with `key`.""" try: - key = self.make_key(key + "*") + key = self.make_key(key + "*", user=user, shared=shared) return self.keys(key) except redis.exceptions.ConnectionError: regex = re.compile(cstr(key).replace("|", r"\|").replace("*", r"[\w]*")) return [k for k in list(frappe.local.cache) if regex.match(cstr(k))] - def delete_keys(self, key): + def delete_keys(self, key, user=None, shared=False): """Delete keys with wildcard `*`.""" - self.delete_value(self.get_keys(key), make_keys=False) + self.delete_value(self.get_keys(key, user=user, shared=shared), make_keys=False) def delete_key(self, *args, **kwargs): self.delete_value(*args, **kwargs)