mirror of
https://github.com/element-hq/synapse.git
synced 2024-12-14 11:57:44 +00:00
Include state from remote servers in pdu handling
If we've fetched state events from remote servers in order to resolve the state for a new event, we need to actually pass those events into resolve_events_with_factory (so that it can do the state res) and then persist the ones we need - otherwise other bits of the codebase get confused about why we have state groups pointing to non-existent events.
This commit is contained in:
parent
a215b698c4
commit
bd61c82bdf
1 changed files with 19 additions and 4 deletions
|
@ -326,6 +326,9 @@ class FederationHandler(BaseHandler):
|
|||
# Calculate the state of the previous events, and
|
||||
# de-conflict them to find the current state.
|
||||
auth_chains = set()
|
||||
event_map = {
|
||||
event_id: pdu,
|
||||
}
|
||||
try:
|
||||
# Get the state of the events we know about
|
||||
ours = yield self.store.get_state_groups_ids(room_id, seen)
|
||||
|
@ -365,18 +368,30 @@ class FederationHandler(BaseHandler):
|
|||
}
|
||||
state_maps.append(remote_state_map)
|
||||
|
||||
for x in remote_state:
|
||||
event_map[x.event_id] = x
|
||||
|
||||
# Resolve any conflicting state
|
||||
@defer.inlineCallbacks
|
||||
def fetch(ev_ids):
|
||||
return self.store.get_events(
|
||||
ev_ids, get_prev_content=False, check_redacted=False
|
||||
fetched = yield self.store.get_events(
|
||||
ev_ids, get_prev_content=False, check_redacted=False,
|
||||
)
|
||||
# add any events we fetch here to the `event_map` so that we
|
||||
# can use them to build the state event list below.
|
||||
event_map.update(fetched)
|
||||
defer.returnValue(fetched)
|
||||
|
||||
room_version = yield self.store.get_room_version(room_id)
|
||||
state_map = yield resolve_events_with_factory(
|
||||
room_version, state_maps, {event_id: pdu}, fetch,
|
||||
room_version, state_maps, event_map, fetch,
|
||||
)
|
||||
|
||||
state = (yield self.store.get_events(state_map.values())).values()
|
||||
# we need to give _process_received_pdu the actual state events
|
||||
# rather than event ids, so generate that now.
|
||||
state = [
|
||||
event_map[e] for e in six.itervalues(state_map)
|
||||
]
|
||||
auth_chain = list(auth_chains)
|
||||
except Exception:
|
||||
logger.warn(
|
||||
|
|
Loading…
Reference in a new issue