mirror of
https://github.com/rustfs/rustfs.git
synced 2026-09-06 03:59:14 +00:00
fix(admin): report real peer health in site replication status (#7024)
`build_metrics_summary` emitted a single metric entry for the local deployment with `online` hardcoded to `true` and `last_online` stamped with the current time, so `mc admin replicate status` reported "I am online" rather than whether the remote site was reachable. A peer could be down for minutes with replication failing while the status page stayed green, leaving operators with no signal that the link had dropped. Emit an entry for every peer instead, deriving `online` from the `reachable_peers` set the handler already computes by probing each peer, and take `total_downtime`/`last_online` from the replication heartbeat's existing `EpHealth` tracking. Node-local replication counters stay on the local entry so a two-site cluster does not double-count its own traffic. The new `BucketTargetSys::endpoint_health` accessor deliberately does not call `init_hc`: unlike `is_offline` it must not create health entries as a side effect, or merely rendering the status page would mark an unknown peer online. Failure counters (`Errors`) are unchanged and still read zero; that is a separate defect in the bucket-level statistics path and is not addressed here.
This commit is contained in:
@@ -485,6 +485,19 @@ impl BucketTargetSys {
|
||||
mutex
|
||||
}
|
||||
|
||||
/// Snapshot the heartbeat-tracked health of `url`'s endpoint.
|
||||
///
|
||||
/// Returns `None` when the heartbeat has never seen the endpoint. Unlike
|
||||
/// [`Self::is_offline`] this deliberately does not call `init_hc`: a caller
|
||||
/// that only reports metrics must not create health entries as a side
|
||||
/// effect, or merely rendering a status page would mark an unknown peer
|
||||
/// online.
|
||||
pub async fn endpoint_health(&self, url: &Url) -> Option<EpHealth> {
|
||||
let key = endpoint_health_key(url);
|
||||
let health_map = self.h_mutex.read().await;
|
||||
health_map.get(&key).cloned()
|
||||
}
|
||||
|
||||
pub async fn is_offline(&self, url: &Url) -> bool {
|
||||
let key = endpoint_health_key(url);
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user