use std::time::Duration;
#[derive(Debug, Clone)]
pub struct RaftConfig {
pub node_id: u64,
pub group_id: u64,
pub peers: Vec<u64>,
pub learners: Vec<u64>,
pub starts_as_learner: bool,
pub election_timeout_min: Duration,
pub election_timeout_max: Duration,
pub heartbeat_interval: Duration,
}
impl RaftConfig {
pub fn cluster_size(&self) -> usize {
self.peers.len() + 1
}
pub fn quorum(&self) -> usize {
self.cluster_size() / 2 + 1
}
}
#[cfg(test)]
mod tests {
use super::*;
fn cfg(peers: Vec<u64>, learners: Vec<u64>) -> RaftConfig {
RaftConfig {
node_id: 1,
group_id: 0,
peers,
learners,
starts_as_learner: false,
election_timeout_min: Duration::from_millis(150),
election_timeout_max: Duration::from_millis(300),
heartbeat_interval: Duration::from_millis(50),
}
}
#[test]
fn quorum_excludes_learners() {
let c = cfg(vec![], vec![2, 3]);
assert_eq!(c.cluster_size(), 1);
assert_eq!(c.quorum(), 1);
let c = cfg(vec![2, 3], vec![4]);
assert_eq!(c.cluster_size(), 3);
assert_eq!(c.quorum(), 2);
let c = cfg(vec![2, 3, 4, 5], vec![6, 7]);
assert_eq!(c.cluster_size(), 5);
assert_eq!(c.quorum(), 3);
}
}