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.
This commit is contained in:
Richard van der Hoff 2018-09-26 19:49:59 +01:00
parent bd61c82bdf
commit 333bee27f5

View File

@ -323,8 +323,8 @@ class FederationHandler(BaseHandler):
affected=pdu.event_id, affected=pdu.event_id,
) )
# Calculate the state of the previous events, and # Calculate the state after each of the previous events, and
# de-conflict them to find the current state. # resolve them to find the correct state at the current event.
auth_chains = set() auth_chains = set()
event_map = { event_map = {
event_id: pdu, 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 # XXX hrm I'm not convinced that duplicate events will compare
# for equality, so I'm not sure this does what the author # for equality, so I'm not sure this does what the author
# hoped. # hoped.