net_pool/strategy/
h_strategy.rs1use crate::backend::{Address, BackendState};
2use crate::utils::bytes_to_hash_code;
3use std::sync::RwLock;
4
5pub struct HashStrategy(RwLock<super::backends::BackendStates>);
8
9impl HashStrategy {
10 pub fn new() -> Self {
11 HashStrategy::default()
12 }
13}
14
15impl Default for HashStrategy {
16 fn default() -> Self {
17 HashStrategy(RwLock::new(super::backends::BackendStates::new()))
18 }
19}
20
21impl super::Strategy for HashStrategy {
22 fn contain(&self, addr: &Address) -> bool {
23 let g = self.0.read().unwrap();
24 g.contain(addr)
25 }
26
27 fn add_backend(&self, id: Option<u32>, addr: Address) {
28 let mut g = self.0.write().unwrap();
29 g.add(id, addr);
30 }
31
32 fn remove_backend(&self, addr: &Address) -> bool {
33 let mut g = self.0.write().unwrap();
34 g.remove(&addr)
35 }
36
37 fn get_backend(&self, key: &str) -> Option<BackendState> {
38 let code = bytes_to_hash_code(key.as_bytes());
39 let g = self.0.read().unwrap();
40 let n = (code % g.get_all().len() as u64) as usize;
41 g.nth(n).map(|bs| bs.clone())
42 }
43
44 fn get_backend_by_id(&self, id: u32) -> Option<BackendState> {
45 let g = self.0.read().unwrap();
46 g.get_by_id(id).map(|bs| bs.clone())
47 }
48
49 fn get_backend_by_code(&self, code: u64) -> Option<BackendState> {
50 let g = self.0.read().unwrap();
51 g.get_by_code(code).map(|bs| bs.clone())
52 }
53
54 fn get_backends(&self) -> Vec<BackendState> {
55 let g = self.0.read().unwrap();
56 let bss = g.get_all();
57 bss.iter().map(|bs| bs.clone()).collect()
58 }
59}