mirror of
https://github.com/sadoyan/aralez.git
synced 2026-06-28 02:12:22 +08:00
fix 404 error on multipath and cleanup fn: clone_idmap_into
This commit is contained in:
@@ -147,11 +147,8 @@ pub fn clone_idmap_into(original: &UpstreamsDashMap, cloned: &UpstreamsIdMap) {
|
|||||||
cloned.clear();
|
cloned.clear();
|
||||||
for outer_entry in original.iter() {
|
for outer_entry in original.iter() {
|
||||||
let inner_map = outer_entry.value();
|
let inner_map = outer_entry.value();
|
||||||
let new_inner_map = DashMap::new();
|
|
||||||
for inner_entry in inner_map.iter() {
|
for inner_entry in inner_map.iter() {
|
||||||
let path = inner_entry.key();
|
|
||||||
let (vec, _) = inner_entry.value();
|
let (vec, _) = inner_entry.value();
|
||||||
let new_vec = vec.clone();
|
|
||||||
for x in vec.iter() {
|
for x in vec.iter() {
|
||||||
let mut id = String::new();
|
let mut id = String::new();
|
||||||
write!(
|
write!(
|
||||||
@@ -175,22 +172,8 @@ pub fn clone_idmap_into(original: &UpstreamsDashMap, cloned: &UpstreamsIdMap) {
|
|||||||
let hash = hasher.finalize();
|
let hash = hasher.finalize();
|
||||||
let hex_hash = base16ct::lower::encode_string(&hash);
|
let hex_hash = base16ct::lower::encode_string(&hash);
|
||||||
let hh = hex_hash[0..50].to_string();
|
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());
|
cloned.insert(hh, x.to_owned());
|
||||||
}
|
}
|
||||||
new_inner_map.insert(path.clone(), new_vec);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
info!("Upstreams are fully populated. Ready to server requests");
|
info!("Upstreams are fully populated. Ready to server requests");
|
||||||
|
|||||||
@@ -20,21 +20,22 @@ pub trait GetHost {
|
|||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl GetHost for LB {
|
impl GetHost for LB {
|
||||||
fn get_host(&self, peer: &str, path: &str, backend_id: Option<&str>) -> Option<Arc<InnerMap>> {
|
fn get_host(&self, peer: &str, path: &str, backend_id: Option<&str>) -> Option<Arc<InnerMap>> {
|
||||||
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 host_entry = self.ump_upst.get(peer)?;
|
||||||
let mut end = path.len();
|
let mut end = path.len();
|
||||||
loop {
|
loop {
|
||||||
let slice = &path[..end];
|
let slice = &path[..end];
|
||||||
if let Some(entry) = host_entry.get(slice) {
|
if let Some(entry) = host_entry.get(slice) {
|
||||||
let (servers, index) = entry.value();
|
let (servers, index) = entry.value();
|
||||||
if !servers.is_empty() {
|
if let Some(b) = backend_id {
|
||||||
let idx = index.fetch_add(1, Ordering::Relaxed) % servers.len();
|
if let Some(bb) = self.ump_byid.get(b) {
|
||||||
return Some(servers[idx].clone());
|
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('/') {
|
if let Some(pos) = slice.rfind('/') {
|
||||||
end = pos;
|
end = pos;
|
||||||
@@ -45,10 +46,20 @@ impl GetHost for LB {
|
|||||||
if let Some(entry) = host_entry.get("/") {
|
if let Some(entry) = host_entry.get("/") {
|
||||||
let (servers, index) = entry.value();
|
let (servers, index) = entry.value();
|
||||||
if !servers.is_empty() {
|
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
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user