diff --git a/foyer-memory/src/raw.rs b/foyer-memory/src/raw.rs index d3521ee9..933c1713 100644 --- a/foyer-memory/src/raw.rs +++ b/foyer-memory/src/raw.rs @@ -308,7 +308,11 @@ where garbages.push(record); } + let usage = std::mem::take(&mut self.usage); self.entries = 0; + if usage > 0 { + self.metrics.memory_usage.decrease(usage as _); + } if count > 0 { self.metrics.memory_entries.decrease(count); self.metrics.memory_remove.increase(count); @@ -1659,6 +1663,28 @@ mod tests { assert_eq!(pieces, expected); } + #[test] + fn test_clear_resets_usage() { + let fifo = fifo_cache_for_test(); + + for i in 0..4 { + fifo.insert(i, i); + } + assert_eq!(fifo.usage(), 4); + assert_eq!(fifo.entries(), 4); + + fifo.clear(); + assert_eq!(fifo.usage(), 0); + assert_eq!(fifo.entries(), 0); + + // Clearing an empty cache must be idempotent, and accounting must remain + // correct when the cache is used again. + fifo.clear(); + fifo.insert(4, 4); + assert_eq!(fifo.usage(), 1); + assert_eq!(fifo.entries(), 1); + } + #[test] fn test_insert_size_over_capacity() { let cache: RawCache, Vec, TestProperties>, ModHasher, HashTableIndexer<_>> =