Skip to content

Commit

Permalink
Faster load recents for sync (#16783)
Browse files Browse the repository at this point in the history
This hopefully reduces the amount of state we need to keep in memory
  • Loading branch information
erikjohnston authored Jan 10, 2024
1 parent c9ac102 commit cbe8a80
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 7 deletions.
1 change: 1 addition & 0 deletions changelog.d/16783.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Faster load recents for sync by reducing amount of state pulled out.
14 changes: 8 additions & 6 deletions synapse/handlers/sync.py
Original file line number Diff line number Diff line change
Expand Up @@ -583,10 +583,11 @@ async def _load_filtered_recents(
# `recents`, so partial state is only a problem when a membership
# event turns up in `recents` but has not made it into the current
# state.
current_state_ids_map = (
await self.store.get_partial_current_state_ids(room_id)
current_state_ids = (
await self.store.check_if_events_in_current_state(
{e.event_id for e in recents if e.is_state()}
)
)
current_state_ids = frozenset(current_state_ids_map.values())

recents = await filter_events_for_client(
self._storage_controllers,
Expand Down Expand Up @@ -667,10 +668,11 @@ async def _load_filtered_recents(
# `loaded_recents`, so partial state is only a problem when a
# membership event turns up in `loaded_recents` but has not made it
# into the current state.
current_state_ids_map = (
await self.store.get_partial_current_state_ids(room_id)
current_state_ids = (
await self.store.check_if_events_in_current_state(
{e.event_id for e in loaded_recents if e.is_state()}
)
)
current_state_ids = frozenset(current_state_ids_map.values())

loaded_recents = await filter_events_for_client(
self._storage_controllers,
Expand Down
17 changes: 16 additions & 1 deletion synapse/storage/databases/main/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
Any,
Collection,
Dict,
FrozenSet,
Iterable,
List,
Mapping,
Expand Down Expand Up @@ -55,7 +56,7 @@
)
from synapse.storage.databases.main.events_worker import EventsWorkerStore
from synapse.storage.databases.main.roommember import RoomMemberWorkerStore
from synapse.types import JsonDict, JsonMapping, StateKey, StateMap
from synapse.types import JsonDict, JsonMapping, StateKey, StateMap, StrCollection
from synapse.types.state import StateFilter
from synapse.util.caches import intern_string
from synapse.util.caches.descriptors import cached, cachedList
Expand Down Expand Up @@ -323,6 +324,20 @@ def _get_current_state_ids_txn(txn: LoggingTransaction) -> StateMap[str]:
"get_partial_current_state_ids", _get_current_state_ids_txn
)

async def check_if_events_in_current_state(
self, event_ids: StrCollection
) -> FrozenSet[str]:
"""Checks and returns which of the given events is part of the current state."""
rows = await self.db_pool.simple_select_many_batch(
table="current_state_events",
column="event_id",
iterable=event_ids,
retcols=("event_id",),
desc="check_if_events_in_current_state",
)

return frozenset(event_id for event_id, in rows)

# FIXME: how should this be cached?
@cancellable
async def get_partial_filtered_current_state_ids(
Expand Down

0 comments on commit cbe8a80

Please sign in to comment.