use std::time::Duration;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Tier {
Hot,
Warm,
Cold,
}
impl Tier {
pub fn expected_latency(&self) -> (Duration, Duration) {
match self {
Tier::Hot => (Duration::from_micros(1), Duration::from_millis(1)),
Tier::Warm => (Duration::from_millis(1), Duration::from_millis(10)),
Tier::Cold => (Duration::from_millis(10), Duration::from_millis(100)),
}
}
}
#[derive(Debug, Clone)]
pub struct LatencyMeasurement {
pub tier: Tier,
pub latency: Duration,
pub throughput_ops: Option<f64>,
pub measured_at: std::time::Instant,
}
#[derive(Debug, Clone)]
pub struct LatencyBudget {
pub total: Duration,
pub per_operation: Duration,
pub max_operations: usize,
}
impl Default for LatencyBudget {
fn default() -> Self {
Self {
total: Duration::from_millis(50),
per_operation: Duration::from_millis(5),
max_operations: 10,
}
}
}
#[derive(Debug, Clone)]
pub struct TierStats {
pub tier: Tier,
pub count: usize,
pub size_bytes: usize,
pub capacity_bytes: usize,
pub usage_ratio: f32,
}
pub trait Latency: Send + Sync {
fn probe(&mut self, tier: Tier) -> LatencyMeasurement;
fn budget(&self) -> LatencyBudget;
fn set_budget(&mut self, budget: LatencyBudget);
fn available_capacity(&self, tier: Tier) -> usize;
fn recommend_tier(&self, expected_accesses: u32) -> Tier;
fn tier_stats(&self, tier: Tier) -> TierStats;
fn all_stats(&self) -> Vec<TierStats> {
vec![
self.tier_stats(Tier::Hot),
self.tier_stats(Tier::Warm),
self.tier_stats(Tier::Cold),
]
}
}