From 624870109effe8b6f191704872408150f95c2c3a Mon Sep 17 00:00:00 2001 From: Alexey <247128645+axkurcom@users.noreply.github.com> Date: Tue, 3 Mar 2026 20:50:31 +0300 Subject: [PATCH] Upstream Connect in defaults Co-Authored-By: brekotis <93345790+brekotis@users.noreply.github.com> --- src/config/defaults.rs | 10 +++++++--- src/config/hot_reload.rs | 2 ++ src/config/load.rs | 8 ++++++++ src/config/types.rs | 5 +++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/config/defaults.rs b/src/config/defaults.rs index d92ae78..83b263d 100644 --- a/src/config/defaults.rs +++ b/src/config/defaults.rs @@ -12,8 +12,8 @@ const DEFAULT_ME_SINGLE_ENDPOINT_SHADOW_WRITERS: u8 = 2; const DEFAULT_ME_ADAPTIVE_FLOOR_IDLE_SECS: u64 = 90; const DEFAULT_ME_ADAPTIVE_FLOOR_MIN_WRITERS_SINGLE_ENDPOINT: u8 = 1; const DEFAULT_ME_ADAPTIVE_FLOOR_RECOVER_GRACE_SECS: u64 = 180; -const DEFAULT_UPSTREAM_CONNECT_RETRY_ATTEMPTS: u32 = 3; -const DEFAULT_UPSTREAM_UNHEALTHY_FAIL_THRESHOLD: u32 = 4; +const DEFAULT_UPSTREAM_CONNECT_RETRY_ATTEMPTS: u32 = 2; +const DEFAULT_UPSTREAM_UNHEALTHY_FAIL_THRESHOLD: u32 = 5; const DEFAULT_LISTEN_ADDR_IPV6: &str = "::"; const DEFAULT_ACCESS_USER: &str = "default"; const DEFAULT_ACCESS_SECRET: &str = "00000000000000000000000000000000"; @@ -205,13 +205,17 @@ pub(crate) fn default_upstream_connect_retry_attempts() -> u32 { } pub(crate) fn default_upstream_connect_retry_backoff_ms() -> u64 { - 250 + 100 } pub(crate) fn default_upstream_unhealthy_fail_threshold() -> u32 { DEFAULT_UPSTREAM_UNHEALTHY_FAIL_THRESHOLD } +pub(crate) fn default_upstream_connect_failfast_hard_errors() -> bool { + false +} + pub(crate) fn default_crypto_pending_buffer() -> usize { 256 * 1024 } diff --git a/src/config/hot_reload.rs b/src/config/hot_reload.rs index caec078..5ec911c 100644 --- a/src/config/hot_reload.rs +++ b/src/config/hot_reload.rs @@ -135,6 +135,8 @@ fn warn_non_hot_changes(old: &ProxyConfig, new: &ProxyConfig) { != new.general.upstream_connect_retry_backoff_ms || old.general.upstream_unhealthy_fail_threshold != new.general.upstream_unhealthy_fail_threshold + || old.general.upstream_connect_failfast_hard_errors + != new.general.upstream_connect_failfast_hard_errors { warn!("config reload: general.upstream_* changed; restart required"); } diff --git a/src/config/load.rs b/src/config/load.rs index e549b55..9dbd7c3 100644 --- a/src/config/load.rs +++ b/src/config/load.rs @@ -676,6 +676,10 @@ mod tests { cfg.general.upstream_unhealthy_fail_threshold, default_upstream_unhealthy_fail_threshold() ); + assert_eq!( + cfg.general.upstream_connect_failfast_hard_errors, + default_upstream_connect_failfast_hard_errors() + ); assert_eq!(cfg.general.update_every, default_update_every()); assert_eq!(cfg.server.listen_addr_ipv4, default_listen_addr_ipv4()); assert_eq!(cfg.server.listen_addr_ipv6, default_listen_addr_ipv6_opt()); @@ -751,6 +755,10 @@ mod tests { general.upstream_unhealthy_fail_threshold, default_upstream_unhealthy_fail_threshold() ); + assert_eq!( + general.upstream_connect_failfast_hard_errors, + default_upstream_connect_failfast_hard_errors() + ); assert_eq!(general.update_every, default_update_every()); let server = ServerConfig::default(); diff --git a/src/config/types.rs b/src/config/types.rs index 0d255ba..137f585 100644 --- a/src/config/types.rs +++ b/src/config/types.rs @@ -472,6 +472,10 @@ pub struct GeneralConfig { #[serde(default = "default_upstream_unhealthy_fail_threshold")] pub upstream_unhealthy_fail_threshold: u32, + /// Skip additional retries for hard non-transient upstream connect errors. + #[serde(default = "default_upstream_connect_failfast_hard_errors")] + pub upstream_connect_failfast_hard_errors: bool, + /// Ignore STUN/interface IP mismatch (keep using Middle Proxy even if NAT detected). #[serde(default)] pub stun_iface_mismatch_ignore: bool, @@ -682,6 +686,7 @@ impl Default for GeneralConfig { upstream_connect_retry_attempts: default_upstream_connect_retry_attempts(), upstream_connect_retry_backoff_ms: default_upstream_connect_retry_backoff_ms(), upstream_unhealthy_fail_threshold: default_upstream_unhealthy_fail_threshold(), + upstream_connect_failfast_hard_errors: default_upstream_connect_failfast_hard_errors(), stun_iface_mismatch_ignore: false, unknown_dc_log_path: default_unknown_dc_log_path(), log_level: LogLevel::Normal,