From 0a96fa52a214d0cc707dbdf9693118ceddbfc150 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Wed, 10 Jan 2024 14:42:13 +0000 Subject: [PATCH] Pull less state out if we fail to backfill (#16788) Sometimes we fail to fetch events during backfill due to missing state, and we often end up querying the same bad events periodically (as people backpaginate). In such cases its likely we will continue to fail to get the state, and therefore we should try *before* loading the state that we have from the DB (as otherwise it's wasted DB and memory). --------- Co-authored-by: reivilibre --- changelog.d/16788.misc | 1 + synapse/handlers/federation_event.py | 21 ++++++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) create mode 100644 changelog.d/16788.misc diff --git a/changelog.d/16788.misc b/changelog.d/16788.misc new file mode 100644 index 00000000000..e58a5a7a320 --- /dev/null +++ b/changelog.d/16788.misc @@ -0,0 +1 @@ +Pull less state out of the DB when we retry fetching old events during backfill. diff --git a/synapse/handlers/federation_event.py b/synapse/handlers/federation_event.py index 398f19eec0b..12837429b9f 100644 --- a/synapse/handlers/federation_event.py +++ b/synapse/handlers/federation_event.py @@ -1141,16 +1141,8 @@ async def _compute_event_context_with_maybe_missing_prevs( partial_state_flags = await self._store.get_partial_state_events(seen) partial_state = any(partial_state_flags.values()) - # Get the state of the events we know about - ours = await self._state_storage_controller.get_state_groups_ids( - room_id, seen, await_full_state=False - ) - # state_maps is a list of mappings from (type, state_key) to event_id - state_maps: List[StateMap[str]] = list(ours.values()) - - # we don't need this any more, let's delete it. - del ours + state_maps: List[StateMap[str]] = [] # Ask the remote server for the states we don't # know about @@ -1169,6 +1161,17 @@ async def _compute_event_context_with_maybe_missing_prevs( state_maps.append(remote_state_map) + # Get the state of the events we know about. We do this *after* + # trying to fetch missing state over federation as that might fail + # and then we can skip loading the local state. + ours = await self._state_storage_controller.get_state_groups_ids( + room_id, seen, await_full_state=False + ) + state_maps.extend(ours.values()) + + # we don't need this any more, let's delete it. + del ours + room_version = await self._store.get_room_version_id(room_id) state_map = await self._state_resolution_handler.resolve_events_with_store( room_id,