From c21c4dfb10e6b50f042c9bffbddb7b7a03726a1b Mon Sep 17 00:00:00 2001 From: Amirmohammad Sadat Shokouhi Date: Mon, 2 Mar 2026 16:06:51 +0330 Subject: [PATCH 1/3] Add primary index for resolver rotation --- crates/slipstream-client/src/runtime.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/slipstream-client/src/runtime.rs b/crates/slipstream-client/src/runtime.rs index d7145542..db585f17 100644 --- a/crates/slipstream-client/src/runtime.rs +++ b/crates/slipstream-client/src/runtime.rs @@ -129,12 +129,18 @@ pub async fn run_client(config: &ClientConfig<'_>) -> Result { let _state = state; let mut reconnect_delay = Duration::from_millis(RECONNECT_SLEEP_MIN_MS); + let mut primary_idx: usize = 0; loop { let mut resolvers = resolve_resolvers(config.resolvers, mtu, config.debug_poll)?; if resolvers.is_empty() { return Err(ClientError::new("At least one resolver is required")); } + if !resolvers.is_empty() { + let rotate_by = primary_idx % resolvers.len(); + resolvers.rotate_left(rotate_by); + primary_idx = primary_idx.wrapping_add(1); + } let mut local_addr_storage = socket_addr_to_storage(udp.local_addr().map_err(map_io)?); From b27dce3087aaf37694a12f943ae9f4bb48bdab7d Mon Sep 17 00:00:00 2001 From: Amirmohammad Sadat Shokouhi Date: Mon, 2 Mar 2026 16:19:19 +0330 Subject: [PATCH 2/3] Implement resolver rotation in runtime Added logic to rotate resolver specifications for retries. --- crates/slipstream-client/src/runtime.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/crates/slipstream-client/src/runtime.rs b/crates/slipstream-client/src/runtime.rs index db585f17..32defa17 100644 --- a/crates/slipstream-client/src/runtime.rs +++ b/crates/slipstream-client/src/runtime.rs @@ -132,6 +132,15 @@ pub async fn run_client(config: &ClientConfig<'_>) -> Result { let mut primary_idx: usize = 0; loop { + let mut resolver_specs: Vec<_> = config.resolvers.iter().cloned().collect(); + + if !resolver_specs.is_empty() { + let rotate_by = primary_idx % resolver_specs.len(); + resolver_specs.rotate_left(rotate_by); + primary_idx = primary_idx.wrapping_add(1); + } + + let mut resolvers = resolve_resolvers(resolver_specs.as_slice(), mtu, config.debug_poll)?; let mut resolvers = resolve_resolvers(config.resolvers, mtu, config.debug_poll)?; if resolvers.is_empty() { return Err(ClientError::new("At least one resolver is required")); From ad1b9d6f61d612898ac116bcece141144378d9d5 Mon Sep 17 00:00:00 2001 From: Amirmohammad Sadat Shokouhi Date: Mon, 2 Mar 2026 16:24:52 +0330 Subject: [PATCH 3/3] Simplify resolver specification handling --- crates/slipstream-client/src/runtime.rs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/crates/slipstream-client/src/runtime.rs b/crates/slipstream-client/src/runtime.rs index 32defa17..13442fa5 100644 --- a/crates/slipstream-client/src/runtime.rs +++ b/crates/slipstream-client/src/runtime.rs @@ -132,7 +132,7 @@ pub async fn run_client(config: &ClientConfig<'_>) -> Result { let mut primary_idx: usize = 0; loop { - let mut resolver_specs: Vec<_> = config.resolvers.iter().cloned().collect(); + let mut resolver_specs: Vec<_> = config.resolvers.to_vec(); if !resolver_specs.is_empty() { let rotate_by = primary_idx % resolver_specs.len(); @@ -141,15 +141,9 @@ pub async fn run_client(config: &ClientConfig<'_>) -> Result { } let mut resolvers = resolve_resolvers(resolver_specs.as_slice(), mtu, config.debug_poll)?; - let mut resolvers = resolve_resolvers(config.resolvers, mtu, config.debug_poll)?; if resolvers.is_empty() { return Err(ClientError::new("At least one resolver is required")); } - if !resolvers.is_empty() { - let rotate_by = primary_idx % resolvers.len(); - resolvers.rotate_left(rotate_by); - primary_idx = primary_idx.wrapping_add(1); - } let mut local_addr_storage = socket_addr_to_storage(udp.local_addr().map_err(map_io)?);