0
0
Fork 1
mirror of https://mau.dev/maunium/synapse.git synced 2024-06-01 10:18:54 +02:00

Faster load recents for sync (#16783)

This hopefully reduces the amount of state we need to keep in memory
This commit is contained in:
Erik Johnston 2024-01-10 15:11:59 +00:00 committed by GitHub
parent c9ac102668
commit cbe8a80d10
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 7 deletions

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

@ -0,0 +1 @@
Faster load recents for sync by reducing amount of state pulled out.

View file

@ -583,10 +583,11 @@ class SyncHandler:
# `recents`, so partial state is only a problem when a membership # `recents`, so partial state is only a problem when a membership
# event turns up in `recents` but has not made it into the current # event turns up in `recents` but has not made it into the current
# state. # state.
current_state_ids_map = ( current_state_ids = (
await self.store.get_partial_current_state_ids(room_id) 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( recents = await filter_events_for_client(
self._storage_controllers, self._storage_controllers,
@ -667,10 +668,11 @@ class SyncHandler:
# `loaded_recents`, so partial state is only a problem when a # `loaded_recents`, so partial state is only a problem when a
# membership event turns up in `loaded_recents` but has not made it # membership event turns up in `loaded_recents` but has not made it
# into the current state. # into the current state.
current_state_ids_map = ( current_state_ids = (
await self.store.get_partial_current_state_ids(room_id) 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( loaded_recents = await filter_events_for_client(
self._storage_controllers, self._storage_controllers,

View file

@ -24,6 +24,7 @@ from typing import (
Any, Any,
Collection, Collection,
Dict, Dict,
FrozenSet,
Iterable, Iterable,
List, List,
Mapping, Mapping,
@ -55,7 +56,7 @@ from synapse.storage.database import (
) )
from synapse.storage.databases.main.events_worker import EventsWorkerStore from synapse.storage.databases.main.events_worker import EventsWorkerStore
from synapse.storage.databases.main.roommember import RoomMemberWorkerStore 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.types.state import StateFilter
from synapse.util.caches import intern_string from synapse.util.caches import intern_string
from synapse.util.caches.descriptors import cached, cachedList from synapse.util.caches.descriptors import cached, cachedList
@ -323,6 +324,20 @@ class StateGroupWorkerStore(EventsWorkerStore, SQLBaseStore):
"get_partial_current_state_ids", _get_current_state_ids_txn "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? # FIXME: how should this be cached?
@cancellable @cancellable
async def get_partial_filtered_current_state_ids( async def get_partial_filtered_current_state_ids(