use crate::error::CoreResult;
use std::time::{Duration, Instant};
use super::types::{ClusterTopology, NodeInfo};
#[derive(Debug)]
pub struct ClusterState {
leader_node: Option<String>,
topology: ClusterTopology,
last_updated: Instant,
}
impl Default for ClusterState {
fn default() -> Self {
Self::new()
}
}
impl ClusterState {
pub fn new() -> Self {
Self {
leader_node: None,
topology: ClusterTopology::new(),
last_updated: Instant::now(),
}
}
pub fn update_topology(&mut self, nodes: &[NodeInfo]) -> CoreResult<()> {
self.topology.update(nodes);
self.last_updated = Instant::now();
Ok(())
}
pub fn needs_leader_election(&self) -> bool {
self.leader_node.is_none() || self.last_updated.elapsed() > Duration::from_secs(300)
}
pub fn set_leader(&mut self, nodeid: String) {
self.leader_node = Some(nodeid);
self.last_updated = Instant::now();
}
pub fn get_leader(&self) -> Option<&String> {
self.leader_node.as_ref()
}
pub fn get_topology(&self) -> &ClusterTopology {
&self.topology
}
pub fn last_updated(&self) -> Instant {
self.last_updated
}
pub fn is_stale(&self, max_age: Duration) -> bool {
self.last_updated.elapsed() > max_age
}
pub fn reset(&mut self) {
self.leader_node = None;
self.topology = ClusterTopology::new();
self.last_updated = Instant::now();
}
}