fix: Don't hard fail on events which depend on soft-failed events

This commit is contained in:
timedout
2026-05-09 18:01:04 +01:00
parent ec76147784
commit ab277409bc
2 changed files with 25 additions and 21 deletions
@@ -215,6 +215,17 @@ pub async fn handle_incoming_pdu<'a>(
.get_room_create_event(room_id)
.await;
let start_time = Instant::now();
self.federation_handletime
.write()
.insert(room_id.into(), (event_id.to_owned(), start_time));
defer! {{
self.federation_handletime
.write()
.remove(room_id);
}};
let (incoming_pdu, val) = self
.handle_outlier_pdu(origin, create_event, event_id, room_id, value, false)
.await?;
@@ -281,17 +292,6 @@ pub async fn handle_incoming_pdu<'a>(
.await?;
// Done with prev events, now handling the incoming event
let start_time = Instant::now();
self.federation_handletime
.write()
.insert(room_id.into(), (event_id.to_owned(), start_time));
defer! {{
self.federation_handletime
.write()
.remove(room_id);
}};
self.upgrade_outlier_to_timeline_pdu(incoming_pdu, val, create_event, origin, room_id)
.boxed()
.await
@@ -1,7 +1,7 @@
use std::{borrow::Borrow, collections::BTreeMap, sync::Arc, time::Instant};
use conduwuit::{
Err, Result, debug, debug_info, err, implement, is_equal_to,
Err, Result, debug, debug_info, debug_warn, err, implement, is_equal_to,
matrix::{Event, EventTypeExt, PduEvent, StateKey, state_res},
trace,
utils::{
@@ -50,10 +50,10 @@ pub(super) async fn upgrade_outlier_to_timeline_pdu<Pdu>(
.pdu_metadata
.is_event_soft_failed(incoming_pdu.event_id())
);
if rejected || soft_failed {
// TODO: debug_warn instead of warn
warn!(%rejected, %soft_failed, "Event is not accepted");
return Err!(Request(InvalidParam("Event has been rejected or soft-failed")));
if rejected {
return Err!(Request(InvalidParam("Event has been rejected")));
} else if soft_failed {
return Err!(Request(InvalidParam("Event has been soft-failed")));
}
// If any of the auth events are rejected, this event is also rejected.
@@ -376,15 +376,19 @@ pub(super) async fn upgrade_outlier_to_timeline_pdu<Pdu>(
self.services
.pdu_metadata
.mark_event_soft_failed(incoming_pdu.event_id());
return Err!(Request(InvalidParam("Event has been soft failed")));
debug_warn!(
elapsed = ?timer.elapsed(),
"Event has been soft-failed",
);
} else {
debug_info!(
elapsed = ?timer.elapsed(),
"Accepted",
);
}
// Event has passed all auth/stateres checks
drop(state_lock);
debug_info!(
elapsed = ?timer.elapsed(),
"Accepted",
);
Ok(pdu_id)
}