mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-07-28 20:58:32 -04:00
Allow streaming cache invalidate all to workers. (#6749)
This commit is contained in:
parent
2093f83ea0
commit
5d7a6ad223
6 changed files with 69 additions and 15 deletions
|
@ -16,6 +16,7 @@
|
|||
|
||||
import itertools
|
||||
import logging
|
||||
from typing import Any, Iterable, Optional
|
||||
|
||||
from twisted.internet import defer
|
||||
|
||||
|
@ -43,6 +44,14 @@ class CacheInvalidationStore(SQLBaseStore):
|
|||
txn.call_after(cache_func.invalidate, keys)
|
||||
self._send_invalidation_to_replication(txn, cache_func.__name__, keys)
|
||||
|
||||
def _invalidate_all_cache_and_stream(self, txn, cache_func):
|
||||
"""Invalidates the entire cache and adds it to the cache stream so slaves
|
||||
will know to invalidate their caches.
|
||||
"""
|
||||
|
||||
txn.call_after(cache_func.invalidate_all)
|
||||
self._send_invalidation_to_replication(txn, cache_func.__name__, None)
|
||||
|
||||
def _invalidate_state_caches_and_stream(self, txn, room_id, members_changed):
|
||||
"""Special case invalidation of caches based on current state.
|
||||
|
||||
|
@ -73,17 +82,24 @@ class CacheInvalidationStore(SQLBaseStore):
|
|||
txn, CURRENT_STATE_CACHE_NAME, [room_id]
|
||||
)
|
||||
|
||||
def _send_invalidation_to_replication(self, txn, cache_name, keys):
|
||||
def _send_invalidation_to_replication(
|
||||
self, txn, cache_name: str, keys: Optional[Iterable[Any]]
|
||||
):
|
||||
"""Notifies replication that given cache has been invalidated.
|
||||
|
||||
Note that this does *not* invalidate the cache locally.
|
||||
|
||||
Args:
|
||||
txn
|
||||
cache_name (str)
|
||||
keys (iterable[str])
|
||||
cache_name
|
||||
keys: Entry to invalidate. If None will invalidate all.
|
||||
"""
|
||||
|
||||
if cache_name == CURRENT_STATE_CACHE_NAME and keys is None:
|
||||
raise Exception(
|
||||
"Can't stream invalidate all with magic current state cache"
|
||||
)
|
||||
|
||||
if isinstance(self.database_engine, PostgresEngine):
|
||||
# get_next() returns a context manager which is designed to wrap
|
||||
# the transaction. However, we want to only get an ID when we want
|
||||
|
@ -95,13 +111,16 @@ class CacheInvalidationStore(SQLBaseStore):
|
|||
txn.call_after(ctx.__exit__, None, None, None)
|
||||
txn.call_after(self.hs.get_notifier().on_new_replication_data)
|
||||
|
||||
if keys is not None:
|
||||
keys = list(keys)
|
||||
|
||||
self.db.simple_insert_txn(
|
||||
txn,
|
||||
table="cache_invalidation_stream",
|
||||
values={
|
||||
"stream_id": stream_id,
|
||||
"cache_func": cache_name,
|
||||
"keys": list(keys),
|
||||
"keys": keys,
|
||||
"invalidation_ts": self.clock.time_msec(),
|
||||
},
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue