net_pool/strategy/
rr_strategy.rs1use crate::backend::{Address, BackendState};
2use std::sync::RwLock;
3use std::sync::atomic::{AtomicUsize, Ordering};
4
5pub struct RRStrategy {
7 index: AtomicUsize,
9 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}