From 9ed8c230fa4c5a458ad079477afa807e13a7b9a4 Mon Sep 17 00:00:00 2001 From: timedout Date: Tue, 11 Aug 2026 15:56:12 +0100 Subject: [PATCH] feat: Update servers-in-backoff command to annotate stale info --- src/admin/debug/commands.rs | 22 ++++++++++++---------- src/service/federation/mod.rs | 13 +++++++++---- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/src/admin/debug/commands.rs b/src/admin/debug/commands.rs index 6bd5da6db..2f1c00482 100644 --- a/src/admin/debug/commands.rs +++ b/src/admin/debug/commands.rs @@ -1243,16 +1243,14 @@ impl crate::Context<'_> { room_id: Option, name: Option, ) -> Result { - let backoff_map = { - // We can't send the backoff map to another thread, so we clone it here. - let map = self.services.federation.remote_health.read(); - map.clone() - }; + let backoff_map = self.services.federation.remote_health(); if backoff_map.is_empty() { return Err!("No servers in backoff."); } + let stale_map = self.services.federation.stale_destinations(); + if let Some(specific_server_name) = name { let entry = backoff_map.get(&specific_server_name); return match entry { @@ -1267,9 +1265,9 @@ impl crate::Context<'_> { }; } - self.write_str("| Server Name | Retries | Next connection attempt |\n") + self.write_str("| Server Name | Retries | Next connection attempt | Is stale |\n") .await?; - self.write_str("| ----------- | ------- | ----------------------- |\n") + self.write_str("| ----------- | ------- | ----------------------- | -------- |\n") .await?; if let Some(specific_room) = room_id { @@ -1277,15 +1275,19 @@ impl crate::Context<'_> { self.services.rooms.state_cache.room_servers(&specific_room); while let Some(server_name) = servers_in_room.next().await { let Some((retries, retry_at)) = backoff_map.get(&server_name) else { continue }; - self.write_str(&format!("| {server_name} | {retries} | {retry_at} |\n")) - .await?; + let is_stale = if stale_map.contains(&server_name) { "Yes" } else { "No" }; + self.write_str(&format!( + "| {server_name} | {retries} | {retry_at} | {is_stale} |\n" + )) + .await?; } return Ok(()); } for (server_name, (retries, retry_at)) in &backoff_map { - self.write_str(&format!("| {server_name} | {retries} | {retry_at} |\n")) + let is_stale = if stale_map.contains(server_name) { "Yes" } else { "No" }; + self.write_str(&format!("| {server_name} | {retries} | {retry_at} | {is_stale} |\n")) .await?; } diff --git a/src/service/federation/mod.rs b/src/service/federation/mod.rs index ce9285d78..6beba9275 100644 --- a/src/service/federation/mod.rs +++ b/src/service/federation/mod.rs @@ -24,7 +24,7 @@ use crate::{Dep, client, moderation, server_keys}; pub struct Service { services: Services, pub remote_health: SyncRwLock>, - stale_destinations: SyncRwLock>, + pub stale_destinations: SyncRwLock>, } struct Services { @@ -173,8 +173,13 @@ impl Service { .insert(server_name.to_owned()); } - /// Returns true if the destination has been marked stale. - fn is_destination_stale(&self, server_name: &ServerName) -> bool { - self.stale_destinations.read().contains(server_name) + /// Returns a clone of the internal remote health tracking map. + pub fn remote_health(&self) -> HashMap { + self.remote_health.read().clone() + } + + /// Returns a clone of the internal stale destinations set. + pub fn stale_destinations(&self) -> HashSet { + self.stale_destinations.read().clone() } }