Files
telemt/src/transport/middle_proxy/health.rs
T

48 lines
1.6 KiB
Rust
Raw Normal View History

2026-02-14 01:36:14 +03:00
use std::net::SocketAddr;
use std::sync::Arc;
use std::time::Duration;
use tracing::{debug, info, warn};
2026-02-15 14:02:00 +03:00
use rand::seq::SliceRandom;
2026-02-14 01:36:14 +03:00
use crate::crypto::SecureRandom;
use super::MePool;
2026-02-15 14:02:00 +03:00
pub async fn me_health_monitor(pool: Arc<MePool>, rng: Arc<SecureRandom>, _min_connections: usize) {
2026-02-14 01:36:14 +03:00
loop {
tokio::time::sleep(Duration::from_secs(30)).await;
2026-02-15 14:02:00 +03:00
// Per-DC coverage check
let map = pool.proxy_map_v4.read().await.clone();
let writer_addrs: std::collections::HashSet<SocketAddr> = pool
.writers
.read()
.await
.iter()
2026-02-17 03:40:39 +03:00
.map(|w| w.addr)
2026-02-15 14:02:00 +03:00
.collect();
for (dc, addrs) in map.iter() {
let dc_addrs: Vec<SocketAddr> = addrs
.iter()
.map(|(ip, port)| SocketAddr::new(*ip, *port))
.collect();
let has_coverage = dc_addrs.iter().any(|a| writer_addrs.contains(a));
if !has_coverage {
warn!(dc = %dc, "DC has no ME coverage, reconnecting...");
let mut shuffled = dc_addrs.clone();
shuffled.shuffle(&mut rand::rng());
for addr in shuffled {
2026-02-14 01:36:14 +03:00
match pool.connect_one(addr, &rng).await {
2026-02-15 14:02:00 +03:00
Ok(()) => {
info!(%addr, dc = %dc, "ME reconnected for DC coverage");
break;
}
Err(e) => debug!(%addr, dc = %dc, error = %e, "ME reconnect failed"),
2026-02-14 01:36:14 +03:00
}
}
}
}
}
}