use myutil::*;
use std::{collections::HashMap, mem, net::SocketAddr};
use ttserver_def::{Resp, UUID};
pub type TS = u64;
pub type IDX = usize;
pub const TIMEOUT_SECS: usize = 5;
#[derive(Default)]
pub struct Proxy {
pub idx_map: HashMap<UUID, IDX>,
pub buckets: [Bucket; TIMEOUT_SECS],
}
impl Proxy {
pub fn clean_timeout(&mut self) {
let ts_deadline = ts!() - TIMEOUT_SECS as u64;
(0..TIMEOUT_SECS)
.filter(|&i| self.buckets[i].ts < ts_deadline)
.collect::<Vec<_>>()
.into_iter()
.for_each(|i| {
mem::take(&mut self.buckets[i]).res.keys().for_each(|k| {
self.idx_map.remove(k);
});
})
}
}
pub struct Bucket {
pub ts: TS,
pub res: HashMap<UUID, SlaveRes>,
}
impl Default for Bucket {
fn default() -> Self {
Bucket {
ts: 0,
res: HashMap::new(),
}
}
}
pub struct SlaveRes {
pub msg: HashMap<SocketAddr, Resp>,
pub num_to_wait: usize,
pub start_ts: u64,
pub do_resp: fn(&mut SlaveRes),
pub peeraddr: SocketAddr,
pub uuid: UUID,
}
impl Drop for SlaveRes {
fn drop(&mut self) {
(self.do_resp)(self)
}
}