From 8c2825276fec6e03434f1924482788ea3281a9fc Mon Sep 17 00:00:00 2001 From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Date: Fri, 1 Jul 2022 10:19:27 +0100 Subject: [PATCH] Skip waiting for full state for incoming events (#13144) When we receive an event over federation during a faster join, there is no need to wait for full state, since we have a whole reconciliation process designed to take the partial state into account. --- changelog.d/13144.misc | 1 + synapse/state/__init__.py | 12 +++++++++--- tests/test_state.py | 4 +++- 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 changelog.d/13144.misc diff --git a/changelog.d/13144.misc b/changelog.d/13144.misc new file mode 100644 index 000000000..34762e2fc --- /dev/null +++ b/changelog.d/13144.misc @@ -0,0 +1 @@ +Faster joins: skip waiting for full state when processing incoming events over federation. diff --git a/synapse/state/__init__.py b/synapse/state/__init__.py index 9d3fe6610..d5cbdb3ee 100644 --- a/synapse/state/__init__.py +++ b/synapse/state/__init__.py @@ -249,8 +249,12 @@ class StateHandler: partial_state = True logger.debug("calling resolve_state_groups from compute_event_context") + # we've already taken into account partial state, so no need to wait for + # complete state here. entry = await self.resolve_state_groups_for_events( - event.room_id, event.prev_event_ids() + event.room_id, + event.prev_event_ids(), + await_full_state=False, ) state_ids_before_event = entry.state @@ -335,7 +339,7 @@ class StateHandler: @measure_func() async def resolve_state_groups_for_events( - self, room_id: str, event_ids: Collection[str] + self, room_id: str, event_ids: Collection[str], await_full_state: bool = True ) -> _StateCacheEntry: """Given a list of event_ids this method fetches the state at each event, resolves conflicts between them and returns them. @@ -343,6 +347,8 @@ class StateHandler: Args: room_id event_ids + await_full_state: if true, will block if we do not yet have complete + state at these events. Returns: The resolved state @@ -350,7 +356,7 @@ class StateHandler: logger.debug("resolve_state_groups event_ids %s", event_ids) state_groups = await self._state_storage_controller.get_state_group_for_events( - event_ids + event_ids, await_full_state=await_full_state ) state_group_ids = state_groups.values() diff --git a/tests/test_state.py b/tests/test_state.py index b005dd8d0..7b3f52f68 100644 --- a/tests/test_state.py +++ b/tests/test_state.py @@ -131,7 +131,9 @@ class _DummyStore: async def get_room_version_id(self, room_id): return RoomVersions.V1.identifier - async def get_state_group_for_events(self, event_ids): + async def get_state_group_for_events( + self, event_ids, await_full_state: bool = True + ): res = {} for event in event_ids: res[event] = self._event_to_state_group[event]