forked from MirrorHub/synapse
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:
parent
bab3eddac4
commit
c4aef549ad
3 changed files with 14 additions and 3 deletions
1
changelog.d/5146.bugfix
Normal file
1
changelog.d/5146.bugfix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Exclude soft-failed events from forward-extremity candidates: fixes "No forward extremities left!" error.
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue