scirs2_core/distributed/cluster/
state.rs

1//! Cluster state management
2//!
3//! This module handles cluster state tracking, including leadership,
4//! topology updates, and cluster health status.
5
6use crate::error::CoreResult;
7use std::time::{Duration, Instant};
8
9use super::types::{ClusterTopology, NodeInfo};
10
11/// Cluster state management
12#[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    /// Create a new cluster state
27    pub fn new() -> Self {
28        Self {
29            leader_node: None,
30            topology: ClusterTopology::new(),
31            last_updated: Instant::now(),
32        }
33    }
34
35    /// Update the cluster topology with new node information
36    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    /// Check if leader election is needed
43    pub fn needs_leader_election(&self) -> bool {
44        self.leader_node.is_none() || self.last_updated.elapsed() > Duration::from_secs(300)
45        // Re-elect every 5 minutes
46    }
47
48    /// Set the cluster leader
49    pub fn set_leader(&mut self, nodeid: String) {
50        self.leader_node = Some(nodeid);
51        self.last_updated = Instant::now();
52    }
53
54    /// Get the current cluster leader
55    pub fn get_leader(&self) -> Option<&String> {
56        self.leader_node.as_ref()
57    }
58
59    /// Get the cluster topology
60    pub fn get_topology(&self) -> &ClusterTopology {
61        &self.topology
62    }
63
64    /// Get the last update timestamp
65    pub fn last_updated(&self) -> Instant {
66        self.last_updated
67    }
68
69    /// Check if the cluster state is stale
70    pub fn is_stale(&self, max_age: Duration) -> bool {
71        self.last_updated.elapsed() > max_age
72    }
73
74    /// Reset cluster state
75    pub fn reset(&mut self) {
76        self.leader_node = None;
77        self.topology = ClusterTopology::new();
78        self.last_updated = Instant::now();
79    }
80}