Invalidate the get_users_in_room{_with_profile} caches only when necessary. (#11878)
The get_users_in_room and get_users_in_room_with_profiles are now only invalidated when the membership of a room changes, instead of during any state change in the room.pull/11897/head
parent
41818cda1f
commit
a8da046907
|
@ -0,0 +1 @@
|
||||||
|
Do not needlessly clear the `get_users_in_room` and `get_users_in_room_with_profiles` caches when any room state changes.
|
|
@ -57,7 +57,7 @@ class SQLBaseStore(metaclass=ABCMeta):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _invalidate_state_caches(
|
def _invalidate_state_caches(
|
||||||
self, room_id: str, members_changed: Iterable[str]
|
self, room_id: str, members_changed: Collection[str]
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Invalidates caches that are based on the current state, but does
|
"""Invalidates caches that are based on the current state, but does
|
||||||
not stream invalidations down replication.
|
not stream invalidations down replication.
|
||||||
|
@ -66,11 +66,16 @@ class SQLBaseStore(metaclass=ABCMeta):
|
||||||
room_id: Room where state changed
|
room_id: Room where state changed
|
||||||
members_changed: The user_ids of members that have changed
|
members_changed: The user_ids of members that have changed
|
||||||
"""
|
"""
|
||||||
|
# If there were any membership changes, purge the appropriate caches.
|
||||||
for host in {get_domain_from_id(u) for u in members_changed}:
|
for host in {get_domain_from_id(u) for u in members_changed}:
|
||||||
self._attempt_to_invalidate_cache("is_host_joined", (room_id, host))
|
self._attempt_to_invalidate_cache("is_host_joined", (room_id, host))
|
||||||
|
if members_changed:
|
||||||
|
self._attempt_to_invalidate_cache("get_users_in_room", (room_id,))
|
||||||
|
self._attempt_to_invalidate_cache(
|
||||||
|
"get_users_in_room_with_profiles", (room_id,)
|
||||||
|
)
|
||||||
|
|
||||||
self._attempt_to_invalidate_cache("get_users_in_room", (room_id,))
|
# Purge other caches based on room state.
|
||||||
self._attempt_to_invalidate_cache("get_users_in_room_with_profiles", (room_id,))
|
|
||||||
self._attempt_to_invalidate_cache("get_room_summary", (room_id,))
|
self._attempt_to_invalidate_cache("get_room_summary", (room_id,))
|
||||||
self._attempt_to_invalidate_cache("get_current_state_ids", (room_id,))
|
self._attempt_to_invalidate_cache("get_current_state_ids", (room_id,))
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
import itertools
|
import itertools
|
||||||
import logging
|
import logging
|
||||||
from typing import TYPE_CHECKING, Any, Iterable, List, Optional, Tuple
|
from typing import TYPE_CHECKING, Any, Collection, Iterable, List, Optional, Tuple
|
||||||
|
|
||||||
from synapse.api.constants import EventTypes
|
from synapse.api.constants import EventTypes
|
||||||
from synapse.replication.tcp.streams import BackfillStream, CachesStream
|
from synapse.replication.tcp.streams import BackfillStream, CachesStream
|
||||||
|
@ -25,7 +25,11 @@ from synapse.replication.tcp.streams.events import (
|
||||||
EventsStreamEventRow,
|
EventsStreamEventRow,
|
||||||
)
|
)
|
||||||
from synapse.storage._base import SQLBaseStore
|
from synapse.storage._base import SQLBaseStore
|
||||||
from synapse.storage.database import DatabasePool, LoggingDatabaseConnection
|
from synapse.storage.database import (
|
||||||
|
DatabasePool,
|
||||||
|
LoggingDatabaseConnection,
|
||||||
|
LoggingTransaction,
|
||||||
|
)
|
||||||
from synapse.storage.engines import PostgresEngine
|
from synapse.storage.engines import PostgresEngine
|
||||||
from synapse.util.iterutils import batch_iter
|
from synapse.util.iterutils import batch_iter
|
||||||
|
|
||||||
|
@ -236,7 +240,9 @@ class CacheInvalidationWorkerStore(SQLBaseStore):
|
||||||
txn.call_after(cache_func.invalidate_all)
|
txn.call_after(cache_func.invalidate_all)
|
||||||
self._send_invalidation_to_replication(txn, cache_func.__name__, None)
|
self._send_invalidation_to_replication(txn, cache_func.__name__, None)
|
||||||
|
|
||||||
def _invalidate_state_caches_and_stream(self, txn, room_id, members_changed):
|
def _invalidate_state_caches_and_stream(
|
||||||
|
self, txn: LoggingTransaction, room_id: str, members_changed: Collection[str]
|
||||||
|
) -> None:
|
||||||
"""Special case invalidation of caches based on current state.
|
"""Special case invalidation of caches based on current state.
|
||||||
|
|
||||||
We special case this so that we can batch the cache invalidations into a
|
We special case this so that we can batch the cache invalidations into a
|
||||||
|
@ -244,8 +250,8 @@ class CacheInvalidationWorkerStore(SQLBaseStore):
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
txn
|
txn
|
||||||
room_id (str): Room where state changed
|
room_id: Room where state changed
|
||||||
members_changed (iterable[str]): The user_ids of members that have changed
|
members_changed: The user_ids of members that have changed
|
||||||
"""
|
"""
|
||||||
txn.call_after(self._invalidate_state_caches, room_id, members_changed)
|
txn.call_after(self._invalidate_state_caches, room_id, members_changed)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue