forked from MirrorHub/synapse
Merge pull request #4715 from matrix-org/erikj/fix_state_invalidation
Fix state cache invalidation on workers
This commit is contained in:
commit
9982c71515
3 changed files with 36 additions and 12 deletions
1
changelog.d/4715.misc
Normal file
1
changelog.d/4715.misc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Improve replication performance by reducing cache invalidation traffic.
|
|
@ -59,12 +59,7 @@ class BaseSlavedStore(SQLBaseStore):
|
||||||
members_changed = set(row.keys[1:])
|
members_changed = set(row.keys[1:])
|
||||||
self._invalidate_state_caches(room_id, members_changed)
|
self._invalidate_state_caches(room_id, members_changed)
|
||||||
else:
|
else:
|
||||||
try:
|
self._attempt_to_invalidate_cache(row.cache_func, tuple(row.keys))
|
||||||
getattr(self, row.cache_func).invalidate(tuple(row.keys))
|
|
||||||
except AttributeError:
|
|
||||||
# We probably haven't pulled in the cache in this worker,
|
|
||||||
# which is fine.
|
|
||||||
pass
|
|
||||||
|
|
||||||
def _invalidate_cache_and_stream(self, txn, cache_func, keys):
|
def _invalidate_cache_and_stream(self, txn, cache_func, keys):
|
||||||
txn.call_after(cache_func.invalidate, keys)
|
txn.call_after(cache_func.invalidate, keys)
|
||||||
|
|
|
@ -1342,15 +1342,43 @@ class SQLBaseStore(object):
|
||||||
changed
|
changed
|
||||||
"""
|
"""
|
||||||
for member in members_changed:
|
for member in members_changed:
|
||||||
self.get_rooms_for_user_with_stream_ordering.invalidate((member,))
|
self._attempt_to_invalidate_cache(
|
||||||
|
"get_rooms_for_user_with_stream_ordering", (member,),
|
||||||
|
)
|
||||||
|
|
||||||
for host in set(get_domain_from_id(u) for u in members_changed):
|
for host in set(get_domain_from_id(u) for u in members_changed):
|
||||||
self.is_host_joined.invalidate((room_id, host))
|
self._attempt_to_invalidate_cache(
|
||||||
self.was_host_joined.invalidate((room_id, host))
|
"is_host_joined", (room_id, host,),
|
||||||
|
)
|
||||||
|
self._attempt_to_invalidate_cache(
|
||||||
|
"was_host_joined", (room_id, host,),
|
||||||
|
)
|
||||||
|
|
||||||
self.get_users_in_room.invalidate((room_id,))
|
self._attempt_to_invalidate_cache(
|
||||||
self.get_room_summary.invalidate((room_id,))
|
"get_users_in_room", (room_id,),
|
||||||
self.get_current_state_ids.invalidate((room_id,))
|
)
|
||||||
|
self._attempt_to_invalidate_cache(
|
||||||
|
"get_room_summary", (room_id,),
|
||||||
|
)
|
||||||
|
self._attempt_to_invalidate_cache(
|
||||||
|
"get_current_state_ids", (room_id,),
|
||||||
|
)
|
||||||
|
|
||||||
|
def _attempt_to_invalidate_cache(self, cache_name, key):
|
||||||
|
"""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.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
cache_name (str)
|
||||||
|
key (tuple)
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
getattr(self, cache_name).invalidate(key)
|
||||||
|
except AttributeError:
|
||||||
|
# We probably haven't pulled in the cache in this worker,
|
||||||
|
# which is fine.
|
||||||
|
pass
|
||||||
|
|
||||||
def _send_invalidation_to_replication(self, txn, cache_name, keys):
|
def _send_invalidation_to_replication(self, txn, cache_name, keys):
|
||||||
"""Notifies replication that given cache has been invalidated.
|
"""Notifies replication that given cache has been invalidated.
|
||||||
|
|
Loading…
Reference in a new issue