use rand_distr::Exp;
use std::{
ops::RangeInclusive,
time::{Duration, SystemTime},
};
#[cfg(feature = "unstable-fs")]
use crate::fs::FsConfig;
#[derive(Clone)]
pub(crate) struct Config {
pub(crate) duration: Duration,
pub(crate) tick: Duration,
pub(crate) epoch: SystemTime,
pub(crate) ephemeral_ports: RangeInclusive<u16>,
pub(crate) tcp_capacity: usize,
pub(crate) udp_capacity: usize,
pub(crate) enable_tokio_io: bool,
pub(crate) random_node_order: bool,
#[cfg(feature = "unstable-fs")]
pub(crate) fs: FsConfig,
}
#[derive(Clone, Default)]
pub(crate) struct Link {
pub(crate) latency: Option<Latency>,
pub(crate) message_loss: Option<MessageLoss>,
}
#[derive(Clone)]
pub(crate) struct Latency {
pub(crate) min_message_latency: Duration,
pub(crate) max_message_latency: Duration,
pub(crate) latency_distribution: Exp<f64>,
}
#[derive(Clone)]
pub(crate) struct MessageLoss {
pub(crate) fail_rate: f64,
pub(crate) repair_rate: f64,
}
impl Default for Config {
fn default() -> Config {
Config {
duration: Duration::from_secs(10),
tick: Duration::from_millis(1),
epoch: SystemTime::now(),
ephemeral_ports: 49152..=65535,
tcp_capacity: 64,
udp_capacity: 64,
enable_tokio_io: false,
random_node_order: false,
#[cfg(feature = "unstable-fs")]
fs: FsConfig::default(),
}
}
}
impl Link {
pub(crate) fn latency(&self) -> &Latency {
self.latency.as_ref().expect("`Latency` missing")
}
pub(crate) fn latency_mut(&mut self) -> &mut Latency {
self.latency.as_mut().expect("`Latency` missing")
}
pub(crate) fn message_loss(&self) -> &MessageLoss {
self.message_loss.as_ref().expect("`MessageLoss` missing")
}
pub(crate) fn message_loss_mut(&mut self) -> &mut MessageLoss {
self.message_loss.as_mut().expect("`MessageLoss` missing")
}
}
impl Default for Latency {
fn default() -> Latency {
Latency {
min_message_latency: Duration::from_millis(0),
max_message_latency: Duration::from_millis(100),
latency_distribution: Exp::new(5.0).unwrap(),
}
}
}
impl Default for MessageLoss {
fn default() -> MessageLoss {
MessageLoss {
fail_rate: 0.0,
repair_rate: 1.0,
}
}
}