@@ -148,6 +148,11 @@ fn key_within(user_key: &[u8], table_begin: KeySlice, table_end: KeySlice) -> bo
|
||||
table_begin.raw_ref() <= user_key && user_key <= table_end.raw_ref()
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum CompactionFilter {
|
||||
Prefix(Bytes),
|
||||
}
|
||||
|
||||
/// The storage interface of the LSM tree.
|
||||
pub(crate) struct LsmStorageInner {
|
||||
pub(crate) state: Arc<RwLock<Arc<LsmStorageState>>>,
|
||||
@@ -160,6 +165,8 @@ pub(crate) struct LsmStorageInner {
|
||||
pub(crate) manifest: Option<Manifest>,
|
||||
#[allow(dead_code)]
|
||||
pub(crate) mvcc: Option<LsmMvccInner>,
|
||||
#[allow(dead_code)]
|
||||
pub(crate) compaction_filters: Arc<Mutex<Vec<CompactionFilter>>>,
|
||||
}
|
||||
|
||||
/// A thin wrapper for `LsmStorageInner` and the user interface for MiniLSM.
|
||||
@@ -243,6 +250,10 @@ impl MiniLsm {
|
||||
}))
|
||||
}
|
||||
|
||||
pub fn add_compaction_filter(&self, compaction_filter: CompactionFilter) {
|
||||
self.inner.add_compaction_filter(compaction_filter)
|
||||
}
|
||||
|
||||
pub fn get(&self, key: &[u8]) -> Result<Option<Bytes>> {
|
||||
self.inner.get(key)
|
||||
}
|
||||
@@ -418,6 +429,7 @@ impl LsmStorageInner {
|
||||
manifest: Some(manifest),
|
||||
options: options.into(),
|
||||
mvcc: None,
|
||||
compaction_filters: Arc::new(Mutex::new(Vec::new())),
|
||||
};
|
||||
storage.sync_dir()?;
|
||||
|
||||
@@ -428,6 +440,11 @@ impl LsmStorageInner {
|
||||
self.state.read().memtable.sync_wal()
|
||||
}
|
||||
|
||||
pub fn add_compaction_filter(&self, compaction_filter: CompactionFilter) {
|
||||
let mut compaction_filters = self.compaction_filters.lock();
|
||||
compaction_filters.push(compaction_filter);
|
||||
}
|
||||
|
||||
/// Get a key from the storage. In day 7, this can be further optimized by using a bloom filter.
|
||||
pub fn get(&self, key: &[u8]) -> Result<Option<Bytes>> {
|
||||
let snapshot = {
|
||||
|
@@ -341,6 +341,9 @@ pub fn check_compaction_ratio(storage: Arc<MiniLsm>) {
|
||||
for idx in 1..level_size.len() {
|
||||
let prev_size = level_size[idx - 1];
|
||||
let this_size = level_size[idx];
|
||||
if this_size == 0 {
|
||||
continue;
|
||||
}
|
||||
assert!(
|
||||
// do not add hard requirement on level size multiplier considering bloom filters...
|
||||
this_size as f64 / prev_size as f64 >= (level_size_multiplier as f64 - 0.5),
|
||||
|
Reference in New Issue
Block a user