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.
This commit is contained in:
Patrick Cloke 2022-02-02 12:24:07 -05:00 committed by GitHub
parent 41818cda1f
commit a8da046907
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 8 deletions

1
changelog.d/11878.misc Normal file
View file

@ -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.

View file

@ -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", (room_id,))
self._attempt_to_invalidate_cache("get_users_in_room_with_profiles", (room_id,)) self._attempt_to_invalidate_cache(
"get_users_in_room_with_profiles", (room_id,)
)
# Purge other caches based on room state.
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,))

View file

@ -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)