summary refs log tree commit diff
path: root/synapse/handlers/federation.py
diff options
context:
space:
mode:
authorMark Haines <mjark@negativecurvature.net>2015-05-22 16:09:54 +0100
committerMark Haines <mjark@negativecurvature.net>2015-05-22 16:09:54 +0100
commit36317f3dad7bec8a601f0eeac5f499b0f13f0523 (patch)
treed161e029d6d5da40c3cf7fd1d6dbd8f3163af6a1 /synapse/handlers/federation.py
parentMerge pull request #159 from matrix-org/erikj/metrics_interface_config (diff)
parentAdd doc strings (diff)
downloadsynapse-36317f3dad7bec8a601f0eeac5f499b0f13f0523.tar.xz
Merge pull request #156 from matrix-org/erikj/join_perf
Make joining #matrix:matrix.org over federation quicker
Diffstat (limited to 'synapse/handlers/federation.py')
-rw-r--r--synapse/handlers/federation.py78
1 files changed, 56 insertions, 22 deletions
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index d35d9f603c..d85b1cf5de 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -517,30 +517,59 @@ class FederationHandler(BaseHandler):
                 # FIXME
                 pass
 
-            for e in auth_chain:
-                e.internal_metadata.outlier = True
+            auth_ids_to_deferred = {}
+
+            def process_auth_ev(ev):
+                auth_ids = [e_id for e_id, _ in ev.auth_events]
+
+                prev_ds = [
+                    auth_ids_to_deferred[i]
+                    for i in auth_ids
+                    if i in auth_ids_to_deferred
+                ]
+
+                d = defer.Deferred()
+
+                auth_ids_to_deferred[ev.event_id] = d
+
+                @defer.inlineCallbacks
+                def f(*_):
+                    ev.internal_metadata.outlier = True
+
+                    try:
+                        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, ev, auth_events=auth
+                        )
+                    except:
+                        logger.exception(
+                            "Failed to handle auth event %s",
+                            ev.event_id,
+                        )
+
+                    d.callback(None)
+
+                if prev_ds:
+                    dx = defer.DeferredList(prev_ds)
+                    dx.addBoth(f)
+                else:
+                    f()
 
+            for e in auth_chain:
                 if e.event_id == event.event_id:
-                    continue
+                    return
+                process_auth_ev(e)
 
-                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 auth event %s",
-                        e.event_id,
-                    )
+            yield defer.DeferredList(auth_ids_to_deferred.values())
 
-            for e in state:
+            @defer.inlineCallbacks
+            def handle_state(e):
                 if e.event_id == event.event_id:
-                    continue
+                    return
 
                 e.internal_metadata.outlier = True
                 try:
@@ -558,6 +587,8 @@ class FederationHandler(BaseHandler):
                         e.event_id,
                     )
 
+            yield defer.DeferredList([handle_state(e) for e in state])
+
             auth_ids = [e_id for e_id, _ in event.auth_events]
             auth_events = {
                 (e.type, e.state_key): e for e in auth_chain
@@ -893,9 +924,12 @@ class FederationHandler(BaseHandler):
         # This is a hack to fix some old rooms where the initial join event
         # didn't reference the create event in its auth events.
         if event.type == EventTypes.Member and not event.auth_events:
-            if len(event.prev_events) == 1:
-                c = yield self.store.get_event(event.prev_events[0][0])
-                if c.type == EventTypes.Create:
+            if len(event.prev_events) == 1 and event.depth < 5:
+                c = yield self.store.get_event(
+                    event.prev_events[0][0],
+                    allow_none=True,
+                )
+                if c and c.type == EventTypes.Create:
                     auth_events[(c.type, c.state_key)] = c
 
         try: