use std::collections::{BTreeMap, VecDeque};
use std::net::IpAddr;
use std::time::{Duration, Instant};
use crate::spec::HealthProbe;
#[derive(Debug, Default)]
pub(super) struct InstRt {
pub(super) pid: i64,
pub(super) since: Option<Instant>,
pub(super) ip: Option<IpAddr>,
pub(super) failures: u32,
pub(super) healthy: Option<bool>,
pub(super) passed: bool,
pub(super) next_probe: Option<Instant>,
pub(super) last_probe: String,
pub(super) unhealthy_restarts: u32,
pub(super) restarts: VecDeque<Instant>,
pub(super) in_rotation: bool,
pub(super) delivered: BTreeMap<String, u64>,
}
impl InstRt {
pub(super) fn started(&mut self, now: Instant) {
self.since = Some(now);
self.failures = 0;
self.healthy = None;
self.passed = false;
}
pub(super) fn record_probe(&mut self, ok: bool, p: &HealthProbe, now: Instant) {
if ok {
self.failures = 0;
self.healthy = Some(true);
self.passed = true;
self.unhealthy_restarts = 0;
return;
}
let since = self.since.map_or(Duration::ZERO, |s| now.duration_since(s));
if p.failure_counts(self.passed, since) {
self.failures += 1;
if self.failures >= p.retries {
self.healthy = Some(false);
}
}
}
}