summary refs log tree commit diff
diff options
context:
space:
mode:
authorSean Quah <8349537+squahtx@users.noreply.github.com>2022-07-22 10:13:01 +0100
committerGitHub <noreply@github.com>2022-07-22 10:13:01 +0100
commit158782c3ce1eb92e98df50645b03afcab4f22db0 (patch)
treef059bd235eb7e151fa368cdcf702edc8ceeb3b6a
parentRemove old empty/redundant slaved stores. (#13349) (diff)
downloadsynapse-158782c3ce1eb92e98df50645b03afcab4f22db0.tar.xz
Skip soft fail checks for rooms with partial state (#13354)
When a room has the partial state flag, we may not have an accurate
`m.room.member` event for event senders in the room's current state, and
so cannot perform soft fail checks correctly. Skip the soft fail check
entirely in this case.

As an alternative, we could block until we have full state, but that
would prevent us from receiving incoming events over federation, which
is undesirable.

Signed-off-by: Sean Quah <seanq@matrix.org>
Diffstat (limited to '')
-rw-r--r--changelog.d/13354.misc1
-rw-r--r--synapse/handlers/federation_event.py10
2 files changed, 11 insertions, 0 deletions
diff --git a/changelog.d/13354.misc b/changelog.d/13354.misc
new file mode 100644
index 0000000000..e08ee7866a
--- /dev/null
+++ b/changelog.d/13354.misc
@@ -0,0 +1 @@
+Faster room joins: skip soft fail checks while Synapse only has partial room state, since the current membership of event senders may not be accurately known.
diff --git a/synapse/handlers/federation_event.py b/synapse/handlers/federation_event.py
index a5f4ce7c8a..9d9f1696f2 100644
--- a/synapse/handlers/federation_event.py
+++ b/synapse/handlers/federation_event.py
@@ -1664,11 +1664,21 @@ class FederationEventHandler:
         """Checks if we should soft fail the event; if so, marks the event as
         such.
 
+        Does nothing for events in rooms with partial state, since we may not have an
+        accurate membership event for the sender in the current state.
+
         Args:
             event
             state_ids: The state at the event if we don't have all the event's prev events
             origin: The host the event originates from.
         """
+        if await self._store.is_partial_state_room(event.room_id):
+            # We might not know the sender's membership in the current state, so don't
+            # soft fail anything. Even if we do have a membership for the sender in the
+            # current state, it may have been derived from state resolution between
+            # partial and full state and may not be accurate.
+            return
+
         extrem_ids_list = await self._store.get_latest_event_ids_in_room(event.room_id)
         extrem_ids = set(extrem_ids_list)
         prev_event_ids = set(event.prev_event_ids())