Skip to main content

rs_zero/cache/
stats.rs

1use std::sync::{
2    Arc,
3    atomic::{AtomicU64, Ordering},
4};
5
6/// Snapshot of cache operations recorded by [`CacheStats`].
7#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
8pub struct CacheStatsSnapshot {
9    /// Successful cache reads.
10    pub hits: u64,
11    /// Cache misses that required a loader call.
12    pub misses: u64,
13    /// Negative cache hits for known not-found values.
14    pub negative_hits: u64,
15    /// Loader failures.
16    pub loader_errors: u64,
17    /// Cache write failures.
18    pub set_errors: u64,
19    /// Cache delete failures.
20    pub delete_errors: u64,
21}
22
23#[derive(Debug, Default)]
24struct CacheStatsInner {
25    hits: AtomicU64,
26    misses: AtomicU64,
27    negative_hits: AtomicU64,
28    loader_errors: AtomicU64,
29    set_errors: AtomicU64,
30    delete_errors: AtomicU64,
31}
32
33/// Shared cache statistics collector.
34#[derive(Debug, Clone, Default)]
35pub struct CacheStats {
36    inner: Arc<CacheStatsInner>,
37}
38
39impl CacheStats {
40    /// Records a cache hit.
41    pub fn record_hit(&self) {
42        self.inner.hits.fetch_add(1, Ordering::Relaxed);
43    }
44
45    /// Records a cache miss.
46    pub fn record_miss(&self) {
47        self.inner.misses.fetch_add(1, Ordering::Relaxed);
48    }
49
50    /// Records a negative cache hit.
51    pub fn record_negative_hit(&self) {
52        self.inner.negative_hits.fetch_add(1, Ordering::Relaxed);
53    }
54
55    /// Records a loader error.
56    pub fn record_loader_error(&self) {
57        self.inner.loader_errors.fetch_add(1, Ordering::Relaxed);
58    }
59
60    /// Records a cache write error.
61    pub fn record_set_error(&self) {
62        self.inner.set_errors.fetch_add(1, Ordering::Relaxed);
63    }
64
65    /// Records a cache delete error.
66    pub fn record_delete_error(&self) {
67        self.inner.delete_errors.fetch_add(1, Ordering::Relaxed);
68    }
69
70    /// Returns the current counters.
71    pub fn snapshot(&self) -> CacheStatsSnapshot {
72        CacheStatsSnapshot {
73            hits: self.inner.hits.load(Ordering::Relaxed),
74            misses: self.inner.misses.load(Ordering::Relaxed),
75            negative_hits: self.inner.negative_hits.load(Ordering::Relaxed),
76            loader_errors: self.inner.loader_errors.load(Ordering::Relaxed),
77            set_errors: self.inner.set_errors.load(Ordering::Relaxed),
78            delete_errors: self.inner.delete_errors.load(Ordering::Relaxed),
79        }
80    }
81}