From fc2ac3d10f19602565d51a5a4244259234cc4140 Mon Sep 17 00:00:00 2001 From: Alexey <247128645+axkurcom@users.noreply.github.com> Date: Mon, 23 Feb 2026 16:09:09 +0300 Subject: [PATCH] ME Pool Reinit polishing --- src/config/load.rs | 64 ++++++++++++++++++++++++++++++ src/config/types.rs | 2 + src/transport/middle_proxy/pool.rs | 2 + 3 files changed, 68 insertions(+) diff --git a/src/config/load.rs b/src/config/load.rs index 5a8b8a5..fa61539 100644 --- a/src/config/load.rs +++ b/src/config/load.rs @@ -375,4 +375,68 @@ mod tests { .unwrap_or(false)); let _ = std::fs::remove_file(path); } + + #[test] + fn update_every_overrides_legacy_fields() { + let toml = r#" + [general] + update_every = 123 + proxy_secret_auto_reload_secs = 700 + proxy_config_auto_reload_secs = 800 + + [censorship] + tls_domain = "example.com" + + [access.users] + user = "00000000000000000000000000000000" + "#; + let dir = std::env::temp_dir(); + let path = dir.join("telemt_update_every_override_test.toml"); + std::fs::write(&path, toml).unwrap(); + let cfg = ProxyConfig::load(&path).unwrap(); + assert_eq!(cfg.general.effective_update_every_secs(), 123); + let _ = std::fs::remove_file(path); + } + + #[test] + fn update_every_fallback_to_legacy_min() { + let toml = r#" + [general] + proxy_secret_auto_reload_secs = 600 + proxy_config_auto_reload_secs = 120 + + [censorship] + tls_domain = "example.com" + + [access.users] + user = "00000000000000000000000000000000" + "#; + let dir = std::env::temp_dir(); + let path = dir.join("telemt_update_every_legacy_min_test.toml"); + std::fs::write(&path, toml).unwrap(); + let cfg = ProxyConfig::load(&path).unwrap(); + assert_eq!(cfg.general.update_every, None); + assert_eq!(cfg.general.effective_update_every_secs(), 120); + let _ = std::fs::remove_file(path); + } + + #[test] + fn update_every_zero_is_rejected() { + let toml = r#" + [general] + update_every = 0 + + [censorship] + tls_domain = "example.com" + + [access.users] + user = "00000000000000000000000000000000" + "#; + let dir = std::env::temp_dir(); + let path = dir.join("telemt_update_every_zero_test.toml"); + std::fs::write(&path, toml).unwrap(); + let err = ProxyConfig::load(&path).unwrap_err().to_string(); + assert!(err.contains("general.update_every must be > 0")); + let _ = std::fs::remove_file(path); + } } diff --git a/src/config/types.rs b/src/config/types.rs index 54a20f3..eb16885 100644 --- a/src/config/types.rs +++ b/src/config/types.rs @@ -342,6 +342,8 @@ impl Default for GeneralConfig { } impl GeneralConfig { + /// Resolve the active updater interval for ME infrastructure refresh tasks. + /// `update_every` has priority, otherwise legacy proxy_*_auto_reload_secs are used. pub fn effective_update_every_secs(&self) -> u64 { self.update_every .unwrap_or_else(|| self.proxy_secret_auto_reload_secs.min(self.proxy_config_auto_reload_secs)) diff --git a/src/transport/middle_proxy/pool.rs b/src/transport/middle_proxy/pool.rs index 858d4bf..bd7c9cc 100644 --- a/src/transport/middle_proxy/pool.rs +++ b/src/transport/middle_proxy/pool.rs @@ -240,6 +240,7 @@ impl MePool { rng: &SecureRandom, drain_timeout: Option, ) { + // Stage 1: prewarm writers for new endpoint maps before draining old ones. self.reconcile_connections(rng).await; let desired_by_dc = self.desired_dc_endpoints().await; @@ -269,6 +270,7 @@ impl MePool { missing_dc.sort_unstable(); warn!( missing_dc = ?missing_dc, + // Keep stale writers alive when fresh coverage is incomplete. "ME reinit coverage incomplete after map update; keeping stale writers" ); return;