2 files changed, 26 insertions, 1 deletions
diff --git a/changelog.d/12718.feature b/changelog.d/12718.feature
new file mode 100644
index 0000000000..1056f519a4
--- /dev/null
+++ b/changelog.d/12718.feature
@@ -0,0 +1 @@
+Update [MSC2716](https://github.com/matrix-org/matrix-spec-proposals/pull/2716) implementation to process marker events from the current state to avoid markers being lost in timeline gaps for federated servers which would cause the imported history to be undiscovered.
diff --git a/synapse/handlers/federation_event.py b/synapse/handlers/federation_event.py
index 05c122f224..ca82df8a6d 100644
--- a/synapse/handlers/federation_event.py
+++ b/synapse/handlers/federation_event.py
@@ -477,7 +477,23 @@ class FederationEventHandler:
# and discover that we do not have it.
event.internal_metadata.proactively_send = False
- return await self.persist_events_and_notify(room_id, [(event, context)])
+ stream_id_after_persist = await self.persist_events_and_notify(
+ room_id, [(event, context)]
+ )
+
+ # If we're joining the room again, check if there is new marker
+ # state indicating that there is new history imported somewhere in
+ # the DAG. Multiple markers can exist in the current state with
+ # unique state_keys.
+ #
+ # Do this after the state from the remote join was persisted (via
+ # `persist_events_and_notify`). Otherwise we can run into a
+ # situation where the create event doesn't exist yet in the
+ # `current_state_events`
+ for e in state:
+ await self._handle_marker_event(origin, e)
+
+ return stream_id_after_persist
async def update_state_for_partial_state_event(
self, destination: str, event: EventBase
@@ -1230,6 +1246,14 @@ class FederationEventHandler:
# Nothing to retrieve then (invalid marker)
return
+ already_seen_insertion_event = await self._store.have_seen_event(
+ marker_event.room_id, insertion_event_id
+ )
+ if already_seen_insertion_event:
+ # No need to process a marker again if we have already seen the
+ # insertion event that it was pointing to
+ return
+
logger.debug(
"_handle_marker_event: backfilling insertion event %s", insertion_event_id
)
|