xet_client/chunk_cache/
cache_manager.rs1use std::cell::RefCell;
2use std::collections::HashMap;
3use std::path::PathBuf;
4use std::sync::{Arc, LazyLock, Mutex, Weak};
5
6use super::error::ChunkCacheError;
7use super::{CacheConfig, ChunkCache, DiskCache};
8
9static CACHE_MANAGER: LazyLock<CacheManager> = LazyLock::new(CacheManager::new);
12
13pub fn get_cache(config: &CacheConfig) -> Result<Arc<dyn ChunkCache>, ChunkCacheError> {
15 CACHE_MANAGER.get(config)
16}
17
18struct CacheManager {
19 vals: Mutex<HashMap<PathBuf, RefCell<Weak<dyn ChunkCache>>>>,
20}
21
22impl CacheManager {
23 fn new() -> Self {
24 Self {
25 vals: Mutex::new(HashMap::new()),
26 }
27 }
28
29 fn get(&self, config: &CacheConfig) -> Result<Arc<dyn ChunkCache>, ChunkCacheError> {
34 let mut vals = self.vals.lock()?;
35 if let Some(v) = vals.get_mut(&config.cache_directory) {
36 let weak = v.borrow().clone();
37 if let Some(value) = weak.upgrade() {
39 return Ok(value);
40 }
41 let result: Arc<dyn ChunkCache> = Arc::new(DiskCache::initialize(config)?);
44 v.replace(Arc::downgrade(&result));
45 Ok(result)
46 } else {
47 let result: Arc<dyn ChunkCache> = Arc::new(DiskCache::initialize(config)?);
49 vals.insert(config.cache_directory.clone(), RefCell::new(Arc::downgrade(&result)));
50 Ok(result)
51 }
52 }
53}