Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Only clear the get_users_in_room caches when necessary. #11878

Merged
merged 2 commits into from
Feb 2, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/11878.misc
Original file line number Diff line number Diff line change
@@ -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.
11 changes: 8 additions & 3 deletions synapse/storage/_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def process_replication_rows(
pass

def _invalidate_state_caches(
self, room_id: str, members_changed: Iterable[str]
self, room_id: str, members_changed: Collection[str]
) -> None:
"""Invalidates caches that are based on the current state, but does
not stream invalidations down replication.
Expand All @@ -66,11 +66,16 @@ def _invalidate_state_caches(
room_id: Room where state 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}:
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,))
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_current_state_ids", (room_id,))

Expand Down
16 changes: 11 additions & 5 deletions synapse/storage/databases/main/cache.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

import itertools
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.replication.tcp.streams import BackfillStream, CachesStream
Expand All @@ -25,7 +25,11 @@
EventsStreamEventRow,
)
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.util.iterutils import batch_iter

Expand Down Expand Up @@ -236,16 +240,18 @@ def _invalidate_all_cache_and_stream(self, txn, cache_func):
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):
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.

We special case this so that we can batch the cache invalidations into a
single replication poke.

Args:
txn
room_id (str): Room where state changed
members_changed (iterable[str]): The user_ids of members that have changed
room_id: Room where state changed
members_changed: The user_ids of members that have changed
"""
txn.call_after(self._invalidate_state_caches, room_id, members_changed)

Expand Down