scirs2_core/distributed/cluster/
state.rs1use crate::error::CoreResult;
7use std::time::{Duration, Instant};
8
9use super::types::{ClusterTopology, NodeInfo};
10
11#[derive(Debug)]
13pub struct ClusterState {
14 leader_node: Option<String>,
15 topology: ClusterTopology,
16 last_updated: Instant,
17}
18
19impl Default for ClusterState {
20 fn default() -> Self {
21 Self::new()
22 }
23}
24
25impl ClusterState {
26 pub fn new() -> Self {
28 Self {
29 leader_node: None,
30 topology: ClusterTopology::new(),
31 last_updated: Instant::now(),
32 }
33 }
34
35 pub fn update_topology(&mut self, nodes: &[NodeInfo]) -> CoreResult<()> {
37 self.topology.update(nodes);
38 self.last_updated = Instant::now();
39 Ok(())
40 }
41
42 pub fn needs_leader_election(&self) -> bool {
44 self.leader_node.is_none() || self.last_updated.elapsed() > Duration::from_secs(300)
45 }
47
48 pub fn set_leader(&mut self, nodeid: String) {
50 self.leader_node = Some(nodeid);
51 self.last_updated = Instant::now();
52 }
53
54 pub fn get_leader(&self) -> Option<&String> {
56 self.leader_node.as_ref()
57 }
58
59 pub fn get_topology(&self) -> &ClusterTopology {
61 &self.topology
62 }
63
64 pub fn last_updated(&self) -> Instant {
66 self.last_updated
67 }
68
69 pub fn is_stale(&self, max_age: Duration) -> bool {
71 self.last_updated.elapsed() > max_age
72 }
73
74 pub fn reset(&mut self) {
76 self.leader_node = None;
77 self.topology = ClusterTopology::new();
78 self.last_updated = Instant::now();
79 }
80}