summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--synapse/handlers/federation.py57
1 files changed, 30 insertions, 27 deletions
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index 6727155c38..86953bf8c8 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -30,6 +30,7 @@ from synapse.types import UserID
 
 from twisted.internet import defer
 
+import itertools
 import logging
 
 
@@ -112,14 +113,6 @@ class FederationHandler(BaseHandler):
 
         logger.debug("Event: %s", event)
 
-        event_ids = set()
-        if state:
-            event_ids |= {e.event_id for e in state}
-        if auth_chain:
-            event_ids |= {e.event_id for e in auth_chain}
-
-        seen_ids = (yield self.store.have_events(event_ids)).keys()
-
         # FIXME (erikj): Awful hack to make the case where we are not currently
         # in the room work
         current_state = None
@@ -131,27 +124,37 @@ class FederationHandler(BaseHandler):
             logger.debug("Got event for room we're not in.")
             current_state = state
 
+        event_ids = set()
+        if state:
+            event_ids |= {e.event_id for e in state}
+        if auth_chain:
+            event_ids |= {e.event_id for e in auth_chain}
+
+        seen_ids = (yield self.store.have_events(event_ids)).keys()
+
         if state and auth_chain is not None:
-            for list_of_pdus in [auth_chain, state]:
-                for e in list_of_pdus:
-                    if e.event_id in seen_ids:
-                        continue
+            # If we have any state or auth_chain given to us by the replication
+            # layer, then we should handle them (if we haven't before.)
+            for e in itertools.chain(auth_chain, state):
+                if e.event_id in seen_ids:
+                    continue
 
-                    e.internal_metadata.outlier = True
-                    try:
-                        auth_ids = [e_id for e_id, _ in e.auth_events]
-                        auth = {
-                            (e.type, e.state_key): e for e in auth_chain
-                            if e.event_id in auth_ids
-                        }
-                        yield self._handle_new_event(
-                            origin, e, auth_events=auth
-                        )
-                    except:
-                        logger.exception(
-                            "Failed to handle state event %s",
-                            e.event_id,
-                        )
+                e.internal_metadata.outlier = True
+                try:
+                    auth_ids = [e_id for e_id, _ in e.auth_events]
+                    auth = {
+                        (e.type, e.state_key): e for e in auth_chain
+                        if e.event_id in auth_ids
+                    }
+                    yield self._handle_new_event(
+                        origin, e, auth_events=auth
+                    )
+                    seen_ids.add(e.event_id)
+                except:
+                    logger.exception(
+                        "Failed to handle state event %s",
+                        e.event_id,
+                    )
 
         try:
             yield self._handle_new_event(