Fix getting an event for a room the server forgot it was in
This commit is contained in:
parent
54e688277a
commit
c34ffd2736
|
@ -125,60 +125,72 @@ class FederationHandler(BaseHandler):
|
||||||
)
|
)
|
||||||
if not is_in_room and not event.internal_metadata.is_outlier():
|
if not is_in_room and not event.internal_metadata.is_outlier():
|
||||||
logger.debug("Got event for room we're not in.")
|
logger.debug("Got event for room we're not in.")
|
||||||
current_state = state
|
|
||||||
|
|
||||||
event_ids = set()
|
try:
|
||||||
if state:
|
event_stream_id, max_stream_id = yield self._persist_auth_tree(
|
||||||
event_ids |= {e.event_id for e in state}
|
auth_chain, state, event
|
||||||
if auth_chain:
|
)
|
||||||
event_ids |= {e.event_id for e in auth_chain}
|
except AuthError as e:
|
||||||
|
raise FederationError(
|
||||||
|
"ERROR",
|
||||||
|
e.code,
|
||||||
|
e.msg,
|
||||||
|
affected=event.event_id,
|
||||||
|
)
|
||||||
|
|
||||||
seen_ids = set(
|
else:
|
||||||
(yield self.store.have_events(event_ids)).keys()
|
event_ids = set()
|
||||||
)
|
if state:
|
||||||
|
event_ids |= {e.event_id for e in state}
|
||||||
|
if auth_chain:
|
||||||
|
event_ids |= {e.event_id for e in auth_chain}
|
||||||
|
|
||||||
if state and auth_chain is not None:
|
seen_ids = set(
|
||||||
# If we have any state or auth_chain given to us by the replication
|
(yield self.store.have_events(event_ids)).keys()
|
||||||
# layer, then we should handle them (if we haven't before.)
|
|
||||||
|
|
||||||
event_infos = []
|
|
||||||
|
|
||||||
for e in itertools.chain(auth_chain, state):
|
|
||||||
if e.event_id in seen_ids:
|
|
||||||
continue
|
|
||||||
e.internal_metadata.outlier = True
|
|
||||||
auth_ids = [e_id for e_id, _ in e.auth_events]
|
|
||||||
auth = {
|
|
||||||
(e.type, e.state_key): e for e in auth_chain
|
|
||||||
if e.event_id in auth_ids
|
|
||||||
}
|
|
||||||
event_infos.append({
|
|
||||||
"event": e,
|
|
||||||
"auth_events": auth,
|
|
||||||
})
|
|
||||||
seen_ids.add(e.event_id)
|
|
||||||
|
|
||||||
yield self._handle_new_events(
|
|
||||||
origin,
|
|
||||||
event_infos,
|
|
||||||
outliers=True
|
|
||||||
)
|
)
|
||||||
|
|
||||||
try:
|
if state and auth_chain is not None:
|
||||||
_, event_stream_id, max_stream_id = yield self._handle_new_event(
|
# If we have any state or auth_chain given to us by the replication
|
||||||
origin,
|
# layer, then we should handle them (if we haven't before.)
|
||||||
event,
|
|
||||||
state=state,
|
event_infos = []
|
||||||
backfilled=backfilled,
|
|
||||||
current_state=current_state,
|
for e in itertools.chain(auth_chain, state):
|
||||||
)
|
if e.event_id in seen_ids:
|
||||||
except AuthError as e:
|
continue
|
||||||
raise FederationError(
|
e.internal_metadata.outlier = True
|
||||||
"ERROR",
|
auth_ids = [e_id for e_id, _ in e.auth_events]
|
||||||
e.code,
|
auth = {
|
||||||
e.msg,
|
(e.type, e.state_key): e for e in auth_chain
|
||||||
affected=event.event_id,
|
if e.event_id in auth_ids
|
||||||
)
|
}
|
||||||
|
event_infos.append({
|
||||||
|
"event": e,
|
||||||
|
"auth_events": auth,
|
||||||
|
})
|
||||||
|
seen_ids.add(e.event_id)
|
||||||
|
|
||||||
|
yield self._handle_new_events(
|
||||||
|
origin,
|
||||||
|
event_infos,
|
||||||
|
outliers=True
|
||||||
|
)
|
||||||
|
|
||||||
|
try:
|
||||||
|
_, event_stream_id, max_stream_id = yield self._handle_new_event(
|
||||||
|
origin,
|
||||||
|
event,
|
||||||
|
state=state,
|
||||||
|
backfilled=backfilled,
|
||||||
|
current_state=current_state,
|
||||||
|
)
|
||||||
|
except AuthError as e:
|
||||||
|
raise FederationError(
|
||||||
|
"ERROR",
|
||||||
|
e.code,
|
||||||
|
e.msg,
|
||||||
|
affected=event.event_id,
|
||||||
|
)
|
||||||
|
|
||||||
# if we're receiving valid events from an origin,
|
# if we're receiving valid events from an origin,
|
||||||
# it's probably a good idea to mark it as not in retry-state
|
# it's probably a good idea to mark it as not in retry-state
|
||||||
|
|
Loading…
Reference in New Issue