use std::time::Duration;
pub trait SharedTrieCacheMetrics: Send + Sync {
fn observe_shared_node_update_duration(&self, duration: Duration);
fn observe_shared_value_update_duration(&self, duration: Duration);
fn observe_local_node_cache_length(&self, node_cache_len: usize);
fn observe_local_value_cache_length(&self, value_cache_len: usize);
fn observe_node_cache_inline_size(&self, cache_size: usize);
fn observe_value_cache_inline_size(&self, cache_size: usize);
fn observe_node_cache_heap_size(&self, cache_size: usize);
fn observe_value_cache_heap_size(&self, cache_size: usize);
fn observe_hits_stats(&self, stats: &TrieHitStatsSnapshot);
}
#[derive(Default, Copy, Clone, Debug)]
pub struct HitStatsSnapshot {
pub shared_hits: u64,
pub shared_fetch_attempts: u64,
pub local_hits: u64,
pub local_fetch_attempts: u64,
}
impl std::fmt::Display for HitStatsSnapshot {
fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
let shared_hits = self.shared_hits;
let shared_fetch_attempts = self.shared_fetch_attempts;
let local_hits = self.local_hits;
let local_fetch_attempts = self.local_fetch_attempts;
if shared_fetch_attempts == 0 && local_hits == 0 {
write!(fmt, "empty")
} else {
let percent_local = (local_hits as f32 / local_fetch_attempts as f32) * 100.0;
let percent_shared = (shared_hits as f32 / shared_fetch_attempts as f32) * 100.0;
write!(
fmt,
"local hit rate = {}% [{}/{}], shared hit rate = {}% [{}/{}]",
percent_local as u32,
local_hits,
local_fetch_attempts,
percent_shared as u32,
shared_hits,
shared_fetch_attempts
)
}
}
}
#[derive(Default, Debug, Clone, Copy)]
pub struct TrieHitStatsSnapshot {
pub node_cache: HitStatsSnapshot,
pub value_cache: HitStatsSnapshot,
}