From bbbc9bc7d8e3d920725bfd1adb0597bead960620 Mon Sep 17 00:00:00 2001 From: timedout Date: Sun, 11 Oct 2026 19:57:01 +0100 Subject: [PATCH] fix: Never add unknown events to the extremity tracker --- src/service/rooms/timeline/append.rs | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/service/rooms/timeline/append.rs b/src/service/rooms/timeline/append.rs index 07389355c..5f09c4638 100644 --- a/src/service/rooms/timeline/append.rs +++ b/src/service/rooms/timeline/append.rs @@ -94,18 +94,16 @@ impl super::Service { // We do this BEFORE setting the extremities so that there's never a // point in time where we have fresh extremities referencing stale // state. - let mut extremities: Vec<_> = self - .services - .state - .get_forward_extremities(&room_id) - .collect() - .await; - extremities = self + let extremities = self .progress_state_and_extremities( pdu, room_version_rules, state_before.clone(), - extremities, + self.services + .state + .get_forward_extremities(&room_id) + .collect() + .await, state_lock, ) .await?; @@ -222,14 +220,15 @@ impl super::Service { let Ok(prev_event) = self.get_pdu(&prev_event_id).await else { continue; }; - // Only retain prevs which are themselves not referenced AND - // soft-failed/rejected/outlier. + // Only retain prevs that we have, which are themselves not + // referenced AND soft-failed/rejected/outlier. let outlier_prevs = prev_event .prev_events() .map(ToOwned::to_owned) .stream() .broad_filter_map(|prev_id| async { - let (referenced, is_outlier, is_soft_failed, is_rejected) = tokio::join!( + let (exists, referenced, is_outlier, is_soft_failed, is_rejected) = tokio::join!( + self.pdu_exists(&prev_id), self.services .pdu_metadata .is_event_referenced(&room_id, &prev_id), @@ -237,7 +236,7 @@ impl super::Service { self.services.pdu_metadata.is_event_soft_failed(&prev_id), self.services.pdu_metadata.is_event_rejected(&prev_id) ); - (!referenced && (is_outlier || is_soft_failed || is_rejected)) + (exists && !referenced && (is_outlier || is_soft_failed || is_rejected)) .then_some(prev_id) }) .collect::>()