mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-05-02 12:46:01 -04:00
Add cache invalidation across workers to module API (#13667)
Signed-off-by: Mathieu Velten <mathieuv@matrix.org>
This commit is contained in:
parent
16e1a9d9a7
commit
6bd8763804
7 changed files with 153 additions and 21 deletions
|
@ -125,7 +125,7 @@ from synapse.types import (
|
|||
)
|
||||
from synapse.util import Clock
|
||||
from synapse.util.async_helpers import maybe_awaitable
|
||||
from synapse.util.caches.descriptors import cached
|
||||
from synapse.util.caches.descriptors import CachedFunction, cached
|
||||
from synapse.util.frozenutils import freeze
|
||||
|
||||
if TYPE_CHECKING:
|
||||
|
@ -836,6 +836,37 @@ class ModuleApi:
|
|||
self._store.db_pool.runInteraction(desc, func, *args, **kwargs) # type: ignore[arg-type]
|
||||
)
|
||||
|
||||
def register_cached_function(self, cached_func: CachedFunction) -> None:
|
||||
"""Register a cached function that should be invalidated across workers.
|
||||
Invalidation local to a worker can be done directly using `cached_func.invalidate`,
|
||||
however invalidation that needs to go to other workers needs to call `invalidate_cache`
|
||||
on the module API instead.
|
||||
|
||||
Args:
|
||||
cached_function: The cached function that will be registered to receive invalidation
|
||||
locally and from other workers.
|
||||
"""
|
||||
self._store.register_external_cached_function(
|
||||
f"{cached_func.__module__}.{cached_func.__name__}", cached_func
|
||||
)
|
||||
|
||||
async def invalidate_cache(
|
||||
self, cached_func: CachedFunction, keys: Tuple[Any, ...]
|
||||
) -> None:
|
||||
"""Invalidate a cache entry of a cached function across workers. The cached function
|
||||
needs to be registered on all workers first with `register_cached_function`.
|
||||
|
||||
Args:
|
||||
cached_function: The cached function that needs an invalidation
|
||||
keys: keys of the entry to invalidate, usually matching the arguments of the
|
||||
cached function.
|
||||
"""
|
||||
cached_func.invalidate(keys)
|
||||
await self._store.send_invalidation_to_replication(
|
||||
f"{cached_func.__module__}.{cached_func.__name__}",
|
||||
keys,
|
||||
)
|
||||
|
||||
async def complete_sso_login_async(
|
||||
self,
|
||||
registered_user_id: str,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue