use crate::sim::rng::sim_random_range;
use std::ops::Range;
use std::time::Duration;
#[derive(Debug, Clone)]
pub struct StorageConfiguration {
pub iops: u64,
pub bandwidth: u64,
pub read_latency: Range<Duration>,
pub write_latency: Range<Duration>,
pub sync_latency: Range<Duration>,
pub read_fault_probability: f64,
pub write_fault_probability: f64,
pub crash_fault_probability: f64,
pub misdirect_write_probability: f64,
pub misdirect_read_probability: f64,
pub phantom_write_probability: f64,
pub sync_failure_probability: f64,
}
impl Default for StorageConfiguration {
fn default() -> Self {
Self {
iops: 25_000,
bandwidth: 150_000_000, read_latency: Duration::from_micros(50)..Duration::from_micros(200),
write_latency: Duration::from_micros(100)..Duration::from_micros(500),
sync_latency: Duration::from_millis(1)..Duration::from_millis(5),
read_fault_probability: 0.0,
write_fault_probability: 0.0,
crash_fault_probability: 0.0,
misdirect_write_probability: 0.0,
misdirect_read_probability: 0.0,
phantom_write_probability: 0.0,
sync_failure_probability: 0.0,
}
}
}
impl StorageConfiguration {
pub fn new() -> Self {
Self::default()
}
pub fn random_for_seed() -> Self {
Self {
iops: sim_random_range(10_000..100_000),
bandwidth: sim_random_range(50_000_000..500_000_000),
read_latency: Duration::from_micros(sim_random_range(20..100))
..Duration::from_micros(sim_random_range(100..500)),
write_latency: Duration::from_micros(sim_random_range(50..200))
..Duration::from_micros(sim_random_range(200..1000)),
sync_latency: Duration::from_micros(sim_random_range(500..2000))
..Duration::from_micros(sim_random_range(2000..10000)),
read_fault_probability: sim_random_range(0..100) as f64 / 100_000.0,
write_fault_probability: sim_random_range(0..100) as f64 / 100_000.0,
crash_fault_probability: sim_random_range(0..50) as f64 / 100_000.0,
misdirect_write_probability: sim_random_range(0..10) as f64 / 100_000.0,
misdirect_read_probability: sim_random_range(0..10) as f64 / 100_000.0,
phantom_write_probability: sim_random_range(0..20) as f64 / 100_000.0,
sync_failure_probability: sim_random_range(0..50) as f64 / 100_000.0,
}
}
pub fn fast_local() -> Self {
let one_us = Duration::from_micros(1);
Self {
iops: 1_000_000, bandwidth: 1_000_000_000, read_latency: one_us..one_us,
write_latency: one_us..one_us,
sync_latency: one_us..one_us,
read_fault_probability: 0.0,
write_fault_probability: 0.0,
crash_fault_probability: 0.0,
misdirect_write_probability: 0.0,
misdirect_read_probability: 0.0,
phantom_write_probability: 0.0,
sync_failure_probability: 0.0,
}
}
}