lsm_tree/
descriptor_table.rs1use crate::GlobalSegmentId;
6use quick_cache::{sync::Cache as QuickCache, UnitWeighter};
7use std::{fs::File, sync::Arc};
8
9const TAG_BLOCK: u8 = 0;
10const TAG_BLOB: u8 = 1;
11
12type Item = Arc<File>;
13
14#[derive(Eq, std::hash::Hash, PartialEq)]
15struct CacheKey(u8, u64, u64);
16
17pub struct DescriptorTable {
19 inner: QuickCache<CacheKey, Item, UnitWeighter, rustc_hash::FxBuildHasher>,
20}
21
22impl DescriptorTable {
23 #[must_use]
24 pub fn new(capacity: usize) -> Self {
25 use quick_cache::sync::DefaultLifecycle;
26
27 #[allow(clippy::default_trait_access)]
28 let quick_cache = QuickCache::with(
29 1_000,
30 capacity as u64,
31 UnitWeighter,
32 Default::default(),
33 DefaultLifecycle::default(),
34 );
35
36 Self { inner: quick_cache }
37 }
38
39 #[doc(hidden)]
40 pub fn clear(&self) {
41 self.inner.clear();
42 }
43
44 #[must_use]
45 pub fn access_for_table(&self, id: &GlobalSegmentId) -> Option<Arc<File>> {
46 let key = CacheKey(TAG_BLOCK, id.tree_id(), id.segment_id());
47 self.inner.get(&key)
48 }
49
50 pub fn insert_for_table(&self, id: GlobalSegmentId, item: Item) {
51 let key = CacheKey(TAG_BLOCK, id.tree_id(), id.segment_id());
52 self.inner.insert(key, item);
53 }
54
55 #[must_use]
56 pub fn access_for_blob_file(&self, id: &GlobalSegmentId) -> Option<Arc<File>> {
57 let key = CacheKey(TAG_BLOB, id.tree_id(), id.segment_id());
58 self.inner.get(&key)
59 }
60
61 pub fn insert_for_blob_file(&self, id: GlobalSegmentId, item: Item) {
62 let key = CacheKey(TAG_BLOB, id.tree_id(), id.segment_id());
63 self.inner.insert(key, item);
64 }
65}