mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-06-20 19:44:07 -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
|
@ -15,12 +15,13 @@
|
|||
# limitations under the License.
|
||||
import logging
|
||||
from abc import ABCMeta
|
||||
from typing import TYPE_CHECKING, Any, Collection, Iterable, Optional, Union
|
||||
from typing import TYPE_CHECKING, Any, Collection, Dict, Iterable, Optional, Union
|
||||
|
||||
from synapse.storage.database import make_in_list_sql_clause # noqa: F401; noqa: F401
|
||||
from synapse.storage.database import DatabasePool, LoggingDatabaseConnection
|
||||
from synapse.types import get_domain_from_id
|
||||
from synapse.util import json_decoder
|
||||
from synapse.util.caches.descriptors import CachedFunction
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from synapse.server import HomeServer
|
||||
|
@ -47,6 +48,8 @@ class SQLBaseStore(metaclass=ABCMeta):
|
|||
self.database_engine = database.engine
|
||||
self.db_pool = database
|
||||
|
||||
self.external_cached_functions: Dict[str, CachedFunction] = {}
|
||||
|
||||
def process_replication_rows(
|
||||
self,
|
||||
stream_name: str,
|
||||
|
@ -95,7 +98,7 @@ class SQLBaseStore(metaclass=ABCMeta):
|
|||
|
||||
def _attempt_to_invalidate_cache(
|
||||
self, cache_name: str, key: Optional[Collection[Any]]
|
||||
) -> None:
|
||||
) -> bool:
|
||||
"""Attempts to invalidate the cache of the given name, ignoring if the
|
||||
cache doesn't exist. Mainly used for invalidating caches on workers,
|
||||
where they may not have the cache.
|
||||
|
@ -113,9 +116,12 @@ class SQLBaseStore(metaclass=ABCMeta):
|
|||
try:
|
||||
cache = getattr(self, cache_name)
|
||||
except AttributeError:
|
||||
# We probably haven't pulled in the cache in this worker,
|
||||
# which is fine.
|
||||
return
|
||||
# Check if an externally defined module cache has been registered
|
||||
cache = self.external_cached_functions.get(cache_name)
|
||||
if not cache:
|
||||
# We probably haven't pulled in the cache in this worker,
|
||||
# which is fine.
|
||||
return False
|
||||
|
||||
if key is None:
|
||||
cache.invalidate_all()
|
||||
|
@ -125,6 +131,13 @@ class SQLBaseStore(metaclass=ABCMeta):
|
|||
invalidate_method = getattr(cache, "invalidate_local", cache.invalidate)
|
||||
invalidate_method(tuple(key))
|
||||
|
||||
return True
|
||||
|
||||
def register_external_cached_function(
|
||||
self, cache_name: str, func: CachedFunction
|
||||
) -> None:
|
||||
self.external_cached_functions[cache_name] = func
|
||||
|
||||
|
||||
def db_to_json(db_content: Union[memoryview, bytes, bytearray, str]) -> Any:
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue