net_pool/strategy/
rr_strategy.rs

1use crate::backend::{Address, BackendState};
2use std::sync::RwLock;
3use std::sync::atomic::{AtomicUsize, Ordering};
4
5/// 轮询策略
6pub struct RRStrategy {
7    /// 记录轮询索引
8    index: AtomicUsize,
9    /// 集合
10    bss: RwLock<super::backends::BackendStates>,
11}
12
13impl RRStrategy {
14    pub fn new() -> Self {
15        RRStrategy::default()
16    }
17}
18
19impl Default for RRStrategy {
20    fn default() -> Self {
21        RRStrategy {
22            index: AtomicUsize::new(0),
23            bss: RwLock::new(super::backends::BackendStates::new()),
24        }
25    }
26}
27
28impl super::Strategy for RRStrategy {
29    fn contain(&self, addr: &Address) -> bool {
30        let g = self.bss.read().unwrap();
31        g.contain(addr)
32    }
33
34    fn add_backend(&self, id: Option<u32>, addr: Address) {
35        let mut g = self.bss.write().unwrap();
36        g.add(id, addr);
37    }
38
39    fn remove_backend(&self, addr: &Address) -> bool {
40        let mut g = self.bss.write().unwrap();
41        g.remove(addr)
42    }
43
44    fn get_backend(&self, _: &str) -> Option<BackendState> {
45        let index = self.index.fetch_add(1, Ordering::Relaxed);
46        let g = self.bss.read().unwrap();
47        g.nth(index).map(|bs| bs.clone())
48    }
49
50    fn get_backend_by_id(&self, id: u32) -> Option<BackendState> {
51        let g = self.bss.read().unwrap();
52        g.get_by_id(id).map(|bs| bs.clone())
53    }
54
55    fn get_backend_by_code(&self, code: u64) -> Option<BackendState> {
56        let g = self.bss.read().unwrap();
57        g.get_by_code(code).map(|bs| bs.clone())
58    }
59
60    fn get_backends(&self) -> Vec<BackendState> {
61        let g = self.bss.read().unwrap();
62        let bss = g.get_all();
63        bss.iter().map(|bs| bs.clone()).collect()
64    }
65}