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.pull/3968/head
parent
bd61c82bdf
commit
333bee27f5
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue