diff --git a/src/service/rooms/event_handler/mod.rs b/src/service/rooms/event_handler/mod.rs index 17ba310da..6197bc87e 100644 --- a/src/service/rooms/event_handler/mod.rs +++ b/src/service/rooms/event_handler/mod.rs @@ -19,6 +19,7 @@ use ruma::{ OwnedEventId, OwnedRoomId, RoomId, events::room::create::RoomCreateEventContent, room_version_rules::RoomVersionRules, }; +use tokio::sync::Notify; use crate::{Dep, globals, rooms, sending, server_keys}; @@ -26,6 +27,7 @@ pub struct Service { pub mutex_federation: RoomMutexMap, pub federation_handletime: SyncRwLock, services: Services, + server_shutdown: Notify, } struct Services { @@ -72,6 +74,7 @@ impl crate::Service for Service { timeline: args.depend::("rooms::timeline"), server: args.server.clone(), }, + server_shutdown: Notify::new(), })) } @@ -86,6 +89,8 @@ impl crate::Service for Service { } fn name(&self) -> &str { crate::service::make_name(std::module_path!()) } + + fn interrupt(&self) { self.server_shutdown.notify_waiters(); } } impl Service { diff --git a/src/service/rooms/event_handler/policy_server.rs b/src/service/rooms/event_handler/policy_server.rs index bf3d41940..726f54ebb 100644 --- a/src/service/rooms/event_handler/policy_server.rs +++ b/src/service/rooms/event_handler/policy_server.rs @@ -259,8 +259,10 @@ async fn handle_policy_server_error( retries, "Policy server rate-limited us; retrying after {retry_after:?}" ); - // TODO: select between this sleep and shutdown signal - sleep(saturated).await; + tokio::select! { + () = self.server_shutdown.notified() => (), + () = sleep(saturated) => (), + } if !self.services.server.running() { return Err(error); }