net_pool/strategy/
h_strategy.rs

1use crate::backend::{Address, BackendState};
2use crate::utils::bytes_to_hash_code;
3use std::sync::RwLock;
4
5/// 普通hash策略
6
7pub 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}