use std::net::SocketAddr;
use std::path::PathBuf;
use std::sync::Arc;
use std::time::Duration;
use uuid::Uuid;
use crate::network::OutboundDialer;
use crate::types::NodeId;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BootstrapMode {
Bootstrap,
Join,
Rejoin,
}
#[derive(Clone)]
pub struct ControllerConfig {
pub node_id: NodeId,
pub bootstrap_servers: Vec<SocketAddr>,
pub directory_id: Uuid,
pub auto_join: bool,
pub observer_lag_bound: u64,
pub initial_voters: crabka_metadata::VoterSet,
pub controller_listen_addr: SocketAddr,
pub log_dir: PathBuf,
pub election_timeout: Duration,
pub heartbeat_interval: Duration,
pub client_id: String,
pub bootstrap_mode: BootstrapMode,
pub cluster_id: Option<Uuid>,
pub dialer: Option<Arc<dyn OutboundDialer>>,
pub handshake: Option<Arc<dyn crate::RaftListenerHandshake>>,
pub max_bytes_between_snapshots: u64,
pub max_snapshot_interval: Duration,
pub snapshot_interval_records: u64,
}
impl std::fmt::Debug for ControllerConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ControllerConfig")
.field("node_id", &self.node_id)
.field("bootstrap_servers", &self.bootstrap_servers)
.field("directory_id", &self.directory_id)
.field("auto_join", &self.auto_join)
.field("observer_lag_bound", &self.observer_lag_bound)
.field("initial_voters", &self.initial_voters)
.field("controller_listen_addr", &self.controller_listen_addr)
.field("log_dir", &self.log_dir)
.field("election_timeout", &self.election_timeout)
.field("heartbeat_interval", &self.heartbeat_interval)
.field("client_id", &self.client_id)
.field("bootstrap_mode", &self.bootstrap_mode)
.field("cluster_id", &self.cluster_id)
.field("dialer", &self.dialer.is_some())
.field("handshake", &self.handshake.is_some())
.field(
"max_bytes_between_snapshots",
&self.max_bytes_between_snapshots,
)
.field("max_snapshot_interval", &self.max_snapshot_interval)
.field("snapshot_interval_records", &self.snapshot_interval_records)
.finish()
}
}
impl ControllerConfig {
#[must_use]
pub fn for_tests(node_id: NodeId, log_dir: PathBuf) -> Self {
let listen: SocketAddr = "127.0.0.1:0".parse().expect("static");
let directory_id = Uuid::from_u128(u128::from(node_id));
Self {
node_id,
bootstrap_servers: vec![],
directory_id,
auto_join: false,
observer_lag_bound: 1000,
initial_voters: crabka_metadata::VoterSet::from_voters([crabka_metadata::Voter {
id: node_id,
directory_id,
endpoints: vec![crabka_metadata::VoterEndpoint {
name: "CONTROLLER".into(),
host: listen.ip().to_string(),
port: listen.port(),
}],
kraft_version: crabka_metadata::KRaftVersionRange::default(),
}]),
controller_listen_addr: listen,
log_dir,
election_timeout: Duration::from_secs(1),
heartbeat_interval: Duration::from_millis(200),
client_id: "crabka-controller-test".into(),
bootstrap_mode: BootstrapMode::Bootstrap,
cluster_id: None,
dialer: None,
handshake: None,
max_bytes_between_snapshots: 20 * 1024 * 1024,
max_snapshot_interval: Duration::from_hours(1),
snapshot_interval_records: 0,
}
}
}