From 2845dc5923b28337f2855bd3a0110d0b781ba0d3 Mon Sep 17 00:00:00 2001 From: Taqman-probe Date: Sat, 27 Jun 2026 13:51:12 +0900 Subject: [PATCH] fix 404 error on multipath and cleanup fn: clone_idmap_into --- src/utils/tools.rs | 17 ----------------- src/web/gethosts.rs | 33 ++++++++++++++++++++++----------- 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/src/utils/tools.rs b/src/utils/tools.rs index 0cb99c5..b401abc 100644 --- a/src/utils/tools.rs +++ b/src/utils/tools.rs @@ -147,11 +147,8 @@ pub fn clone_idmap_into(original: &UpstreamsDashMap, cloned: &UpstreamsIdMap) { cloned.clear(); for outer_entry in original.iter() { let inner_map = outer_entry.value(); - let new_inner_map = DashMap::new(); for inner_entry in inner_map.iter() { - let path = inner_entry.key(); let (vec, _) = inner_entry.value(); - let new_vec = vec.clone(); for x in vec.iter() { let mut id = String::new(); write!( @@ -175,22 +172,8 @@ pub fn clone_idmap_into(original: &UpstreamsDashMap, cloned: &UpstreamsIdMap) { let hash = hasher.finalize(); let hex_hash = base16ct::lower::encode_string(&hash); let hh = hex_hash[0..50].to_string(); - let to_add = InnerMap { - address: Arc::from("127.0.0.1"), - port: 0, - is_ssl: false, - is_http2: false, - to_https: false, - rate_limit: None, - x4xx_limit: None, - healthcheck: None, - redirect_to: None, - authorization: None, - }; - cloned.insert(id, Arc::from(to_add)); cloned.insert(hh, x.to_owned()); } - new_inner_map.insert(path.clone(), new_vec); } } info!("Upstreams are fully populated. Ready to server requests"); diff --git a/src/web/gethosts.rs b/src/web/gethosts.rs index b34ec0a..452e0a4 100644 --- a/src/web/gethosts.rs +++ b/src/web/gethosts.rs @@ -20,21 +20,22 @@ pub trait GetHost { #[async_trait] impl GetHost for LB { fn get_host(&self, peer: &str, path: &str, backend_id: Option<&str>) -> Option> { - if let Some(b) = backend_id { - if let Some(bb) = self.ump_byid.get(b) { - return Some(bb.value().clone()); - } - } let host_entry = self.ump_upst.get(peer)?; let mut end = path.len(); loop { let slice = &path[..end]; if let Some(entry) = host_entry.get(slice) { let (servers, index) = entry.value(); - if !servers.is_empty() { - let idx = index.fetch_add(1, Ordering::Relaxed) % servers.len(); - return Some(servers[idx].clone()); + if let Some(b) = backend_id { + if let Some(bb) = self.ump_byid.get(b) { + let target = bb.value(); + if servers.iter().any(|s| s.address == target.address && s.port == target.port) { + return Some(target.clone()); + } + } } + let idx = index.fetch_add(1, Ordering::Relaxed) % servers.len(); + return Some(servers[idx].clone()); } if let Some(pos) = slice.rfind('/') { end = pos; @@ -45,10 +46,20 @@ impl GetHost for LB { if let Some(entry) = host_entry.get("/") { let (servers, index) = entry.value(); if !servers.is_empty() { - let idx = index.fetch_add(1, Ordering::Relaxed) % servers.len(); - return Some(servers[idx].clone()); + + if let Some(b) = backend_id { + if let Some(bb) = self.ump_byid.get(b) { + let target = bb.value(); + if servers.iter().any(|s| s.address == target.address && s.port == target.port) { + return Some(target.clone()); + } + } + } + + let idx = index.fetch_add(1, Ordering::Relaxed) % servers.len(); + return Some(servers[idx].clone()); + } } - } None }