diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py
index ced6fab16f..b333175349 100644
--- a/synapse/handlers/federation.py
+++ b/synapse/handlers/federation.py
@@ -264,6 +264,7 @@ class FederationHandler(BaseHandler):
event_id=e_id
)
auth_events.update({a.event_id: a for a in auth})
+ auth_events.update({s.event_id: s for s in state})
state_events.update({s.event_id: s for s in state})
events_to_state[e_id] = state
@@ -271,34 +272,37 @@ class FederationHandler(BaseHandler):
set(auth_events.keys()) | set(state_events.keys())
)
- yield defer.gatherResults(
+ all_events = events + state_events.values() + auth_events.values()
+ required_auth = set(
+ a_id for event in all_events for a_id, _ in event.auth_events
+ )
+
+ missing_auth = required_auth - set(auth_events)
+ results = yield defer.gatherResults(
[
- self._handle_new_event(
- dest, a,
- auth_events={
- (auth_events[a_id].type, auth_events[a_id].state_key):
- auth_events[a_id]
- for a_id, _ in a.auth_events
- },
+ self.replication_layer.get_pdu(
+ [dest],
+ event_id,
+ outlier=True,
)
- for a in auth_events.values()
- if a.event_id not in seen_events
+ for event_id in missing_auth
],
- consumeErrors=True,
+ consumeErrors=True
).addErrback(unwrapFirstError)
+ auth_events.update({a.event_id: a for a in results})
yield defer.gatherResults(
[
self._handle_new_event(
- dest, s,
+ dest, a,
auth_events={
(auth_events[a_id].type, auth_events[a_id].state_key):
auth_events[a_id]
- for a_id, _ in s.auth_events
+ for a_id, _ in a.auth_events
},
)
- for s in state_events.values()
- if s.event_id not in seen_events
+ for a in auth_events.values()
+ if a.event_id not in seen_events
],
consumeErrors=True,
).addErrback(unwrapFirstError)
|