summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--changelog.d/14408.misc1
-rw-r--r--synapse/federation/sender/__init__.py18
2 files changed, 18 insertions, 1 deletions
diff --git a/changelog.d/14408.misc b/changelog.d/14408.misc
new file mode 100644
index 0000000000..2c77d97591
--- /dev/null
+++ b/changelog.d/14408.misc
@@ -0,0 +1 @@
+Faster joins: send events to initial list of servers if we don't have the full state yet.
diff --git a/synapse/federation/sender/__init__.py b/synapse/federation/sender/__init__.py
index 3ad483efe0..fc1d8c88a7 100644
--- a/synapse/federation/sender/__init__.py
+++ b/synapse/federation/sender/__init__.py
@@ -434,7 +434,23 @@ class FederationSender(AbstractFederationSender):
                         # If there are no prev event IDs then the state is empty
                         # and so no remote servers in the room
                         destinations = set()
-                    else:
+
+                    if destinations is None:
+                        # During partial join we use the set of servers that we got
+                        # when beginning the join. It's still possible that we send
+                        # events to servers that left the room in the meantime, but
+                        # we consider that an acceptable risk since it is only our own
+                        # events that we leak and not other server's ones.
+                        partial_state_destinations = (
+                            await self.store.get_partial_state_servers_at_join(
+                                event.room_id
+                            )
+                        )
+
+                        if len(partial_state_destinations) > 0:
+                            destinations = partial_state_destinations
+
+                    if destinations is None:
                         # We check the external cache for the destinations, which is
                         # stored per state group.