fix(server): handle MinIO cluster health probe (#3833)

This commit is contained in:
cxymds
2026-06-25 09:37:57 +08:00
committed by GitHub
parent ad6184b126
commit c6ef37d5a7
5 changed files with 39 additions and 6 deletions
+2
View File
@@ -422,6 +422,7 @@ impl PathCategory {
|| path.starts_with("/health/")
|| path == "/minio/health/live"
|| path == "/minio/health/ready"
|| path == "/minio/health/cluster"
{
PathCategory::Probe
} else {
@@ -772,6 +773,7 @@ mod tests {
assert_eq!(PathCategory::classify("/health/ready"), PathCategory::Probe);
assert_eq!(PathCategory::classify("/minio/health/live"), PathCategory::Probe);
assert_eq!(PathCategory::classify("/minio/health/ready"), PathCategory::Probe);
assert_eq!(PathCategory::classify("/minio/health/cluster"), PathCategory::Probe);
}
#[test]
+30 -3
View File
@@ -21,8 +21,9 @@ use crate::server::cors;
use crate::server::hybrid::HybridBody;
use crate::server::{
ADMIN_PREFIX, CONSOLE_PREFIX, HEALTH_COMPAT_LIVE_PATH, HEALTH_PREFIX, HEALTH_READY_PATH, MINIO_ADMIN_PREFIX,
MINIO_ADMIN_V3_PREFIX, MINIO_HEALTH_LIVE_PATH, MINIO_HEALTH_READY_PATH, RPC_PREFIX, RUSTFS_ADMIN_PREFIX,
active_http_requests, collect_dependency_readiness_report, has_path_prefix, is_admin_path, is_table_catalog_path,
MINIO_ADMIN_V3_PREFIX, MINIO_HEALTH_CLUSTER_PATH, MINIO_HEALTH_LIVE_PATH, MINIO_HEALTH_READY_PATH, RPC_PREFIX,
RUSTFS_ADMIN_PREFIX, active_http_requests, collect_dependency_readiness_report, has_path_prefix, is_admin_path,
is_table_catalog_path,
};
use crate::storage::apply_cors_headers;
use crate::storage::request_context::{
@@ -885,7 +886,7 @@ fn resolve_public_health_probe(method: &Method, path: &str) -> Option<HealthProb
match path {
HEALTH_PREFIX | HEALTH_COMPAT_LIVE_PATH | MINIO_HEALTH_LIVE_PATH => Some(HealthProbe::Liveness),
HEALTH_READY_PATH | MINIO_HEALTH_READY_PATH => Some(HealthProbe::Readiness),
HEALTH_READY_PATH | MINIO_HEALTH_READY_PATH | MINIO_HEALTH_CLUSTER_PATH => Some(HealthProbe::Readiness),
_ => None,
}
}
@@ -1291,6 +1292,7 @@ impl ConditionalCorsLayer {
"/health/ready",
"/minio/health/live",
"/minio/health/ready",
"/minio/health/cluster",
"/profile/cpu",
"/profile/memory",
];
@@ -1925,6 +1927,31 @@ mod tests {
.await;
}
#[tokio::test]
#[serial]
async fn public_health_endpoint_layer_handles_minio_health_cluster_before_inner_service() {
async_with_vars([(rustfs_config::ENV_HEALTH_ENDPOINT_ENABLE, Some("true"))], async {
let inner = CountingHybridService::default();
let calls = inner.calls();
let mut service = PublicHealthEndpointLayer.layer(inner);
let response = service
.call(
Request::builder()
.method(Method::GET)
.uri(MINIO_HEALTH_CLUSTER_PATH)
.body(Full::<Bytes>::from(Bytes::new()))
.expect("request"),
)
.await
.expect("health response");
assert!(response.status() == StatusCode::OK || response.status() == StatusCode::SERVICE_UNAVAILABLE);
assert_eq!(calls.load(Ordering::SeqCst), 0);
})
.await;
}
#[tokio::test]
#[serial]
async fn public_health_endpoint_layer_forwards_unknown_health_path_when_endpoint_disabled() {
+3 -3
View File
@@ -51,9 +51,9 @@ pub(crate) use module_switch::{
};
pub(crate) use prefix::{
ADMIN_PREFIX, CONSOLE_PREFIX, FAVICON_PATH, HEALTH_COMPAT_LIVE_PATH, HEALTH_PREFIX, HEALTH_READY_PATH, LICENSE,
MINIO_ADMIN_PREFIX, MINIO_ADMIN_V3_PREFIX, MINIO_HEALTH_LIVE_PATH, MINIO_HEALTH_READY_PATH, PROFILE_CPU_PATH,
PROFILE_MEMORY_PATH, RPC_PREFIX, RUSTFS_ADMIN_PREFIX, TABLE_CATALOG_COMPAT_PREFIX, TABLE_CATALOG_PREFIX, TONIC_PREFIX,
VERSION, has_path_prefix, is_admin_path, is_table_catalog_path,
MINIO_ADMIN_PREFIX, MINIO_ADMIN_V3_PREFIX, MINIO_HEALTH_CLUSTER_PATH, MINIO_HEALTH_LIVE_PATH, MINIO_HEALTH_READY_PATH,
PROFILE_CPU_PATH, PROFILE_MEMORY_PATH, RPC_PREFIX, RUSTFS_ADMIN_PREFIX, TABLE_CATALOG_COMPAT_PREFIX, TABLE_CATALOG_PREFIX,
TONIC_PREFIX, VERSION, has_path_prefix, is_admin_path, is_table_catalog_path,
};
pub(crate) use readiness::DependencyReadiness;
pub(crate) use readiness::DependencyReadinessReport;
+3
View File
@@ -40,6 +40,9 @@ pub(crate) const MINIO_HEALTH_LIVE_PATH: &str = "/minio/health/live";
/// MinIO-compatible health readiness probe alias path.
pub(crate) const MINIO_HEALTH_READY_PATH: &str = "/minio/health/ready";
/// MinIO-compatible cluster health probe alias path.
pub(crate) const MINIO_HEALTH_CLUSTER_PATH: &str = "/minio/health/cluster";
/// Predefined administrative prefix for RustFS server routes.
/// This prefix is used for endpoints that handle administrative tasks
/// such as configuration, monitoring, and management.
+1
View File
@@ -139,6 +139,7 @@ fn is_probe_path(path: &str) -> bool {
| crate::server::HEALTH_READY_PATH
| crate::server::MINIO_HEALTH_LIVE_PATH
| crate::server::MINIO_HEALTH_READY_PATH
| crate::server::MINIO_HEALTH_CLUSTER_PATH
| crate::server::FAVICON_PATH
);