Async get event cache prep (#13242)
Some experimental prep work to enable external event caching based on #9379 & #12955. Doesn't actually move the cache at all, just lays the groundwork for async implemented caches.
Signed off by Nick @ Beeper (@Fizzadar)
1 files changed, 38 insertions, 0 deletions
diff --git a/synapse/util/caches/lrucache.py b/synapse/util/caches/lrucache.py
index 8ed5325c5d..31f41fec82 100644
--- a/synapse/util/caches/lrucache.py
+++ b/synapse/util/caches/lrucache.py
@@ -730,3 +730,41 @@ class LruCache(Generic[KT, VT]):
# This happens e.g. in the sync code where we have an expiring cache of
# lru caches.
self.clear()
+
+
+class AsyncLruCache(Generic[KT, VT]):
+ """
+ An asynchronous wrapper around a subset of the LruCache API.
+
+ On its own this doesn't change the behaviour but allows subclasses that
+ utilize external cache systems that require await behaviour to be created.
+ """
+
+ def __init__(self, *args, **kwargs): # type: ignore
+ self._lru_cache: LruCache[KT, VT] = LruCache(*args, **kwargs)
+
+ async def get(
+ self, key: KT, default: Optional[T] = None, update_metrics: bool = True
+ ) -> Optional[VT]:
+ return self._lru_cache.get(key, update_metrics=update_metrics)
+
+ async def set(self, key: KT, value: VT) -> None:
+ self._lru_cache.set(key, value)
+
+ async def invalidate(self, key: KT) -> None:
+ # This method should invalidate any external cache and then invalidate the LruCache.
+ return self._lru_cache.invalidate(key)
+
+ def invalidate_local(self, key: KT) -> None:
+ """Remove an entry from the local cache
+
+ This variant of `invalidate` is useful if we know that the external
+ cache has already been invalidated.
+ """
+ return self._lru_cache.invalidate(key)
+
+ async def contains(self, key: KT) -> bool:
+ return self._lru_cache.contains(key)
+
+ async def clear(self) -> None:
+ self._lru_cache.clear()
|