net-pool 0.5.1

A set of types for network connection pool.
Documentation
use crate::backend::{Address, BackendState};
use std::sync::RwLock;
use std::sync::atomic::{AtomicUsize, Ordering};

/// 轮询策略
pub struct RRStrategy {
    /// 记录轮询索引
    index: AtomicUsize,
    /// 集合
    bss: RwLock<super::backends::BackendStates>,
}

impl RRStrategy {
    pub fn new() -> Self {
        RRStrategy::default()
    }
}

impl Default for RRStrategy {
    fn default() -> Self {
        RRStrategy {
            index: AtomicUsize::new(0),
            bss: RwLock::new(super::backends::BackendStates::new()),
        }
    }
}

impl super::Strategy for RRStrategy {
    fn contain(&self, addr: &Address) -> bool {
        let g = self.bss.read().unwrap();
        g.contain(addr)
    }

    fn add_backend(&self, id: Option<u32>, addr: Address) {
        let mut g = self.bss.write().unwrap();
        g.add(id, addr);
    }

    fn remove_backend(&self, addr: &Address) -> bool {
        let mut g = self.bss.write().unwrap();
        g.remove(addr)
    }

    fn get_backend(&self, _: &str) -> Option<BackendState> {
        let index = self.index.fetch_add(1, Ordering::Relaxed);
        let g = self.bss.read().unwrap();
        g.nth(index).map(|bs| bs.clone())
    }

    fn get_backend_by_id(&self, id: u32) -> Option<BackendState> {
        let g = self.bss.read().unwrap();
        g.get_by_id(id).map(|bs| bs.clone())
    }

    fn get_backend_by_code(&self, code: u64) -> Option<BackendState> {
        let g = self.bss.read().unwrap();
        g.get_by_code(code).map(|bs| bs.clone())
    }

    fn get_backends(&self) -> Vec<BackendState> {
        let g = self.bss.read().unwrap();
        let bss = g.get_all();
        bss.iter().map(|bs| bs.clone()).collect()
    }
}