From 694a78e782e51cf9905fdaba70a3c3108205850c Mon Sep 17 00:00:00 2001 From: Sunil Sabnis Date: Thu, 21 May 2026 18:22:16 -0400 Subject: [PATCH] Fix healthcheck for empty pools --- pgdog/src/healthcheck.rs | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/pgdog/src/healthcheck.rs b/pgdog/src/healthcheck.rs index 171c9f70f..6643f136a 100644 --- a/pgdog/src/healthcheck.rs +++ b/pgdog/src/healthcheck.rs @@ -10,7 +10,7 @@ use hyper_util::rt::TokioIo; use tokio::net::TcpListener; use tracing::info; -use crate::backend::databases::databases; +use crate::backend::databases::{databases, Databases}; pub async fn server(port: u16) -> std::io::Result<()> { info!("healthcheck endpoint http://0.0.0.0:{}", port); @@ -36,17 +36,7 @@ async fn healthcheck( _: Request, ) -> Result>, Infallible> { let databases = databases(); - let broken = databases.all().iter().all(|(_, cluster)| { - let pools = cluster - .shards() - .iter() - .map(|shard| shard.pools()) - .collect::>() - .into_iter() - .flatten() - .collect::>(); - pools.iter().all(|p| !p.healthy()) - }); + let broken = broken(&databases); let response = if broken { "down" } else { "up" }; let status = if broken { 502 } else { 200 }; @@ -59,3 +49,24 @@ async fn healthcheck( Ok(response) } + +fn broken(databases: &Databases) -> bool { + let mut pools = databases + .all() + .values() + .flat_map(|cluster| cluster.shards()) + .flat_map(|shard| shard.pools()) + .peekable(); + + pools.peek().is_some() && pools.all(|pool| !pool.healthy()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn no_pools_is_healthy() { + assert!(!broken(&Databases::default())); + } +}