diff options
author | Richard van der Hoff <richard@matrix.org> | 2018-09-26 19:49:59 +0100 |
---|---|---|
committer | Richard van der Hoff <richard@matrix.org> | 2018-09-27 11:37:39 +0100 |
commit | 333bee27f53916bf5354a39a79aa468967730326 (patch) | |
tree | 7fcc0fd48e3e78722d92b90bf3e0ffc7e31d355f | |
parent | Include state from remote servers in pdu handling (diff) | |
download | synapse-333bee27f53916bf5354a39a79aa468967730326.tar.xz |
Include event when resolving state for missing prevs
If we have a forward extremity for a room as `E`, and you receive `A`, `B`, s.t. `A -> B -> E`, and `B` also points to an unknown event `X`, then we need to do state res between `X` and `E`. When that happens, we need to make sure we include `X` in the state that goes into the state res alg. Fixes #3934.
-rw-r--r-- | synapse/handlers/federation.py | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/synapse/handlers/federation.py b/synapse/handlers/federation.py index cdad565d04..d05b63673f 100644 --- a/synapse/handlers/federation.py +++ b/synapse/handlers/federation.py @@ -323,8 +323,8 @@ class FederationHandler(BaseHandler): affected=pdu.event_id, ) - # Calculate the state of the previous events, and - # de-conflict them to find the current state. + # Calculate the state after each of the previous events, and + # resolve them to find the correct state at the current event. auth_chains = set() event_map = { event_id: pdu, @@ -358,6 +358,20 @@ class FederationHandler(BaseHandler): ) ) + # we want the state *after* p; get_state_for_room returns the + # state *before* p. + remote_event = yield self.federation_client.get_pdu( + [origin], p, outlier=True, + ) + + if remote_event is None: + raise Exception( + "Unable to get missing prev_event %s" % (p, ) + ) + + if remote_event.is_state(): + remote_state.append(remote_event) + # XXX hrm I'm not convinced that duplicate events will compare # for equality, so I'm not sure this does what the author # hoped. |