From 4360a17dd3e7dec30cb74e0bf54fbfaae8e2fa13 Mon Sep 17 00:00:00 2001 From: jordan Date: Sat, 7 Mar 2026 19:13:31 -0700 Subject: [PATCH] fix: health reachable_nodes uses alive filter, cluster status includes self in node_count - handle_health: use all_members() filtered to Alive state instead of members() which returned 0 when nodes were in Suspect state - handle_cluster_status: add +1 for self since members map excludes local node --- .../src/gateway/handlers/query_handlers.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/crates/stemedb-cluster/src/gateway/handlers/query_handlers.rs b/crates/stemedb-cluster/src/gateway/handlers/query_handlers.rs index 82f61b4..06b3188 100644 --- a/crates/stemedb-cluster/src/gateway/handlers/query_handlers.rs +++ b/crates/stemedb-cluster/src/gateway/handlers/query_handlers.rs @@ -7,6 +7,7 @@ use std::sync::Arc; use tracing::instrument; use crate::gateway::service::GatewayState; +use crate::membership::NodeState; use crate::sharding::ShardId; use super::types::{ApiError, ClusterStatusResponse, HealthResponse, NodeStatusInfo, QueryParams}; @@ -90,10 +91,15 @@ pub async fn handle_query( /// GET /v1/health - Health check. #[instrument(skip(state))] pub async fn handle_health(State(state): State>) -> Json { - let members = state.membership.members(); + let all_members = state.membership.all_members(); + let alive_count = all_members.iter().filter(|(_, s)| *s == NodeState::Alive).count(); let joined = state.membership.is_joined(); - Json(HealthResponse { healthy: joined, reachable_nodes: members.len(), joined }) + Json(HealthResponse { + healthy: joined && alive_count > 0, + reachable_nodes: alive_count, + joined, + }) } /// GET /v1/cluster/status - Cluster status. @@ -112,8 +118,9 @@ pub async fn handle_cluster_status( }) .collect(); + // +1 for self (members map excludes the local node) Json(ClusterStatusResponse { - node_count: all_members.len(), + node_count: all_members.len() + 1, shard_count: meta.num_shards() as u32, meta_version: meta.version, nodes,