diff --git a/src/service/rooms/event_handler/fetch_and_handle_outliers.rs b/src/service/rooms/event_handler/fetch_and_handle_outliers.rs index 4fe4ad0a..51d10d71 100644 --- a/src/service/rooms/event_handler/fetch_and_handle_outliers.rs +++ b/src/service/rooms/event_handler/fetch_and_handle_outliers.rs @@ -3,11 +3,7 @@ use std::{ time::Instant, }; -use conduwuit::{ - Event, PduEvent, debug, debug_error, implement, - matrix::event::gen_event_id_canonical_json, trace, utils::continue_exponential_backoff_secs, - warn, -}; +use conduwuit::{Event, PduEvent, debug, debug_error, implement, matrix::event::gen_event_id_canonical_json, trace, utils::continue_exponential_backoff_secs, warn, debug_warn}; use ruma::{ CanonicalJsonValue, EventId, OwnedEventId, RoomId, ServerName, api::federation::event::get_event, @@ -70,6 +66,30 @@ where let mut events_all = HashSet::with_capacity(todo_auth_events.len()); while let Some(next_id) = todo_auth_events.pop_front() { + if let Some((time, tries)) = self + .services + .globals + .bad_event_ratelimiter + .read() + .get(&*next_id) + { + // Exponential backoff + const MIN_DURATION: u64 = 60 * 2; + const MAX_DURATION: u64 = 60 * 60; + if continue_exponential_backoff_secs( + MIN_DURATION, + MAX_DURATION, + time.elapsed(), + *tries, + ) { + debug_warn!( + tried = ?*tries, + elapsed = ?time.elapsed(), + "Backing off from {next_id}", + ); + continue; + } + } if events_all.contains(&next_id) { continue;