Exclude soft-failed events from fwd-extremity candidates. (#5146)

When considering the candidates to be forward-extremities, we must exclude soft
failures.

Hopefully fixes #5090.
This commit is contained in:
Richard van der Hoff 2019-05-21 16:10:54 +01:00 committed by GitHub
parent bab3eddac4
commit c4aef549ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 3 deletions

1
changelog.d/5146.bugfix Normal file
View File

@ -0,0 +1 @@
Exclude soft-failed events from forward-extremity candidates: fixes "No forward extremities left!" error.

View File

@ -1916,6 +1916,11 @@ class FederationHandler(BaseHandler):
event.room_id, latest_event_ids=extrem_ids, event.room_id, latest_event_ids=extrem_ids,
) )
logger.debug(
"Doing soft-fail check for %s: state %s",
event.event_id, current_state_ids,
)
# Now check if event pass auth against said current state # Now check if event pass auth against said current state
auth_types = auth_types_for_event(event) auth_types = auth_types_for_event(event)
current_state_ids = [ current_state_ids = [
@ -1932,7 +1937,7 @@ class FederationHandler(BaseHandler):
self.auth.check(room_version, event, auth_events=current_auth_events) self.auth.check(room_version, event, auth_events=current_auth_events)
except AuthError as e: except AuthError as e:
logger.warn( logger.warn(
"Failed current state auth resolution for %r because %s", "Soft-failing %r because %s",
event, e, event, e,
) )
event.internal_metadata.soft_failed = True event.internal_metadata.soft_failed = True

View File

@ -575,10 +575,11 @@ class EventsStore(
def _get_events(txn, batch): def _get_events(txn, batch):
sql = """ sql = """
SELECT prev_event_id SELECT prev_event_id, internal_metadata
FROM event_edges FROM event_edges
INNER JOIN events USING (event_id) INNER JOIN events USING (event_id)
LEFT JOIN rejections USING (event_id) LEFT JOIN rejections USING (event_id)
LEFT JOIN event_json USING (event_id)
WHERE WHERE
prev_event_id IN (%s) prev_event_id IN (%s)
AND NOT events.outlier AND NOT events.outlier
@ -588,7 +589,11 @@ class EventsStore(
) )
txn.execute(sql, batch) txn.execute(sql, batch)
results.extend(r[0] for r in txn) results.extend(
r[0]
for r in txn
if not json.loads(r[1]).get("soft_failed")
)
for chunk in batch_iter(event_ids, 100): for chunk in batch_iter(event_ids, 100):
yield self.runInteraction("_get_events_which_are_prevs", _get_events, chunk) yield self.runInteraction("_get_events_which_are_prevs", _get_events, chunk)