From 077bda23a6573274e3c6e0012fc8e00f52ce8d6b Mon Sep 17 00:00:00 2001 From: Omar Pakker Date: Tue, 10 Feb 2026 15:39:15 +0100 Subject: [PATCH] feat(admin): Add resolver cache flush command This command allows an admin to flush a specific server from the resolver caches or flush the whole cache. --- docs/reference/admin/query.md | 13 +++++++++++++ src/admin/query/resolver.rs | 26 +++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/docs/reference/admin/query.md b/docs/reference/admin/query.md index ab14f971..c681e64d 100644 --- a/docs/reference/admin/query.md +++ b/docs/reference/admin/query.md @@ -112,6 +112,19 @@ Query the destinations cache Query the overrides cache +### `!admin query resolver flush-cache` + +Flush a given server from the resolver caches or flush them completely + +* Examples: + * Flush a specific server: + + `!admin query resolver flush-cache matrix.example.com` + + * Flush all resolver caches completely: + + `!admin query resolver flush-cache --all` + ## `!admin query pusher` pusher service diff --git a/src/admin/query/resolver.rs b/src/admin/query/resolver.rs index 5b2d8d3b..f263a297 100644 --- a/src/admin/query/resolver.rs +++ b/src/admin/query/resolver.rs @@ -1,5 +1,5 @@ use clap::Subcommand; -use conduwuit::{Result, utils::time}; +use conduwuit::{Err, Result, utils::time}; use futures::StreamExt; use ruma::OwnedServerName; @@ -7,6 +7,7 @@ use crate::{admin_command, admin_command_dispatch}; #[admin_command_dispatch] #[derive(Debug, Subcommand)] +#[allow(clippy::enum_variant_names)] /// Resolver service and caches pub enum ResolverCommand { /// Query the destinations cache @@ -18,6 +19,14 @@ pub enum ResolverCommand { OverridesCache { name: Option, }, + + /// Flush a specific server from the resolver caches or everything + FlushCache { + name: Option, + + #[arg(short, long)] + all: bool, + }, } #[admin_command] @@ -69,3 +78,18 @@ async fn overrides_cache(&self, server_name: Option) -> Result { Ok(()) } + +#[admin_command] +async fn flush_cache(&self, name: Option, all: bool) -> Result { + if all { + self.services.resolver.cache.clear().await; + writeln!(self, "Resolver caches cleared!").await + } else if let Some(name) = name { + self.services.resolver.cache.del_destination(&name); + self.services.resolver.cache.del_override(&name); + self.write_str(&format!("Cleared {name} from resolver caches!")) + .await + } else { + Err!("Missing name. Supply a name or use --all to flush the whole cache.") + } +}