From c022923cfdb9afe785dd97fb1b06e4ebe1ee01d8 Mon Sep 17 00:00:00 2001 From: timedout Date: Mon, 3 Aug 2026 15:26:01 +0100 Subject: [PATCH] feat: Mark servers as online/offline based on transaction responses --- src/service/sending/mod.rs | 2 ++ src/service/sending/sender.rs | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/service/sending/mod.rs b/src/service/sending/mod.rs index 6433fdd8e..52e56d50e 100644 --- a/src/service/sending/mod.rs +++ b/src/service/sending/mod.rs @@ -488,6 +488,8 @@ pub fn hit_unhealthy(&self, server_name: OwnedServerName) { /// /// TODO: flush senders too pub fn mark_healthy(&self, server_name: &ServerName) { + // TODO: We need to make sure the sender flush DOESN'T trigger if this is called + // by the senders themselves. let mut map = self.remote_health.write(); map.remove(server_name); } diff --git a/src/service/sending/sender.rs b/src/service/sending/sender.rs index c4703ba43..683131e47 100644 --- a/src/service/sending/sender.rs +++ b/src/service/sending/sender.rs @@ -142,7 +142,14 @@ async fn handle_response<'a>( ) { match response { | Ok(dest) => self.handle_response_ok(&dest, futures, statuses).await, - | Err((dest, e)) => Self::handle_response_err(dest, statuses, &e), + | Err((dest, e)) => { + if e.status_code().is_server_error() + && let Destination::Federation(dest) = &dest + { + self.hit_unhealthy(dest.clone()); + } + Self::handle_response_err(dest, statuses, &e); + }, } } @@ -171,6 +178,9 @@ async fn handle_response_ok<'a>( ) { let _cork = self.db.db.cork(); self.db.delete_all_active_requests_for(dest).await; + if let Destination::Federation(server_name) = dest { + self.mark_healthy(server_name); + } // Find events that have been added since starting the last request let new_events = self