Generate room sync data concurrently (#17458)

This is also what we do for standard `/sync`.
This commit is contained in:
Erik Johnston 2024-07-19 12:09:39 +01:00 committed by GitHub
parent 71d83477cb
commit 43c865f7c9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 11 additions and 2 deletions

1
changelog.d/17458.misc Normal file
View File

@ -0,0 +1 @@
Speed up generating sliding sync responses.

View File

@ -28,6 +28,7 @@ from synapse.api.constants import AccountDataTypes, Direction, EventTypes, Membe
from synapse.events import EventBase from synapse.events import EventBase
from synapse.events.utils import strip_event from synapse.events.utils import strip_event
from synapse.handlers.relations import BundledAggregations from synapse.handlers.relations import BundledAggregations
from synapse.logging.opentracing import start_active_span, tag_args, trace
from synapse.storage.databases.main.roommember import extract_heroes_from_room_summary from synapse.storage.databases.main.roommember import extract_heroes_from_room_summary
from synapse.storage.databases.main.stream import CurrentStateDeltaMembership from synapse.storage.databases.main.stream import CurrentStateDeltaMembership
from synapse.storage.roommember import MemberSummary from synapse.storage.roommember import MemberSummary
@ -43,6 +44,7 @@ from synapse.types import (
) )
from synapse.types.handlers import OperationType, SlidingSyncConfig, SlidingSyncResult from synapse.types.handlers import OperationType, SlidingSyncConfig, SlidingSyncResult
from synapse.types.state import StateFilter from synapse.types.state import StateFilter
from synapse.util.async_helpers import concurrently_execute
from synapse.visibility import filter_events_for_client from synapse.visibility import filter_events_for_client
if TYPE_CHECKING: if TYPE_CHECKING:
@ -592,11 +594,14 @@ class SlidingSyncHandler:
# Fetch room data # Fetch room data
rooms: Dict[str, SlidingSyncResult.RoomResult] = {} rooms: Dict[str, SlidingSyncResult.RoomResult] = {}
for room_id, room_sync_config in relevant_room_map.items():
@trace
@tag_args
async def handle_room(room_id: str) -> None:
room_sync_result = await self.get_room_sync_data( room_sync_result = await self.get_room_sync_data(
user=sync_config.user, user=sync_config.user,
room_id=room_id, room_id=room_id,
room_sync_config=room_sync_config, room_sync_config=relevant_room_map[room_id],
room_membership_for_user_at_to_token=room_membership_for_user_map[ room_membership_for_user_at_to_token=room_membership_for_user_map[
room_id room_id
], ],
@ -606,6 +611,9 @@ class SlidingSyncHandler:
rooms[room_id] = room_sync_result rooms[room_id] = room_sync_result
with start_active_span("sliding_sync.generate_room_entries"):
await concurrently_execute(handle_room, relevant_room_map, 10)
extensions = await self.get_extensions_response( extensions = await self.get_extensions_response(
sync_config=sync_config, to_token=to_token sync_config=sync_config, to_token=to_token
) )