Skip to content
Snippets Groups Projects
Unverified Commit a8da0469 authored by Patrick Cloke's avatar Patrick Cloke Committed by GitHub
Browse files

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.
parent 41818cda
No related branches found
No related tags found
No related merge requests found
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): ...@@ -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): ...@@ -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 @@ ...@@ -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 ( ...@@ -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): ...@@ -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): ...@@ -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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment