puffin/puffin_manager/
cache.rs1use std::sync::Arc;
16
17use prometheus::IntGaugeVec;
18
19use crate::file_metadata::FileMetadata;
20const PUFFIN_METADATA_TYPE: &str = "puffin_metadata";
22
23pub type PuffinMetadataCacheRef = Arc<PuffinMetadataCache>;
24
25pub struct PuffinMetadataCache {
27 cache: moka::sync::Cache<String, Arc<FileMetadata>>,
28 cache_bytes: IntGaugeVec,
29}
30
31fn puffin_metadata_weight(k: &str, v: &Arc<FileMetadata>) -> u32 {
32 (k.len() + v.memory_usage()) as u32
33}
34
35impl PuffinMetadataCache {
36 pub fn new(capacity: u64, cache_bytes: &'static IntGaugeVec) -> Self {
37 common_telemetry::debug!("Building PuffinMetadataCache with capacity: {capacity}");
38 Self {
39 cache: moka::sync::CacheBuilder::new(capacity)
40 .name("puffin_metadata")
41 .weigher(|k: &String, v| puffin_metadata_weight(k, v))
42 .eviction_listener(move |k, v, _cause| {
43 let size = puffin_metadata_weight(&k, &v);
44 cache_bytes
45 .with_label_values(&[PUFFIN_METADATA_TYPE])
46 .sub(size.into());
47 })
48 .build(),
49 cache_bytes: cache_bytes.clone(),
50 }
51 }
52
53 pub fn get_metadata(&self, file_id: &str) -> Option<Arc<FileMetadata>> {
55 self.cache.get(file_id)
56 }
57
58 pub fn put_metadata(&self, file_id: String, metadata: Arc<FileMetadata>) {
60 let size = puffin_metadata_weight(&file_id, &metadata);
61 self.cache_bytes
62 .with_label_values(&[PUFFIN_METADATA_TYPE])
63 .add(size.into());
64 self.cache.insert(file_id, metadata);
65 }
66
67 pub fn remove(&self, file_id: &str) {
69 self.cache.invalidate(file_id);
70 }
71}