Skip to content

Commit

Permalink
Pull less state out if we fail to backfill (#16788)
Browse files Browse the repository at this point in the history
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 <oliverw@matrix.org>
  • Loading branch information
erikjohnston and reivilibre authored Jan 10, 2024
1 parent 1485cfd commit 0a96fa5
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 9 deletions.
1 change: 1 addition & 0 deletions changelog.d/16788.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Pull less state out of the DB when we retry fetching old events during backfill.
21 changes: 12 additions & 9 deletions synapse/handlers/federation_event.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand Down

0 comments on commit 0a96fa5

Please sign in to comment.