82 lines
2.4 KiB
Rust
82 lines
2.4 KiB
Rust
|
|
use tempfile::tempdir;
|
||
|
|
|
||
|
|
use crate::{
|
||
|
|
compact::{
|
||
|
|
CompactionOptions, LeveledCompactionOptions, SimpleLeveledCompactionOptions,
|
||
|
|
TieredCompactionOptions,
|
||
|
|
},
|
||
|
|
lsm_storage::{LsmStorageOptions, MiniLsm},
|
||
|
|
tests::harness::dump_files_in_dir,
|
||
|
|
};
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_integration_leveled() {
|
||
|
|
test_integration(CompactionOptions::Leveled(LeveledCompactionOptions {
|
||
|
|
level_size_multiplier: 2,
|
||
|
|
level0_file_num_compaction_trigger: 2,
|
||
|
|
max_levels: 3,
|
||
|
|
base_level_size_mb: 1,
|
||
|
|
}))
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_integration_tiered() {
|
||
|
|
test_integration(CompactionOptions::Tiered(TieredCompactionOptions {
|
||
|
|
num_tiers: 3,
|
||
|
|
max_size_amplification_percent: 200,
|
||
|
|
size_ratio: 1,
|
||
|
|
min_merge_width: 3,
|
||
|
|
}))
|
||
|
|
}
|
||
|
|
|
||
|
|
#[test]
|
||
|
|
fn test_integration_simple() {
|
||
|
|
test_integration(CompactionOptions::Simple(SimpleLeveledCompactionOptions {
|
||
|
|
size_ratio_percent: 200,
|
||
|
|
level0_file_num_compaction_trigger: 2,
|
||
|
|
max_levels: 3,
|
||
|
|
}));
|
||
|
|
}
|
||
|
|
|
||
|
|
fn test_integration(compaction_options: CompactionOptions) {
|
||
|
|
let dir = tempdir().unwrap();
|
||
|
|
let storage = MiniLsm::open(
|
||
|
|
&dir,
|
||
|
|
LsmStorageOptions::default_for_week2_test(compaction_options.clone()),
|
||
|
|
)
|
||
|
|
.unwrap();
|
||
|
|
for i in 0..=20 {
|
||
|
|
storage.put(b"0", format!("v{}", i).as_bytes()).unwrap();
|
||
|
|
if i % 2 == 0 {
|
||
|
|
storage.put(b"1", format!("v{}", i).as_bytes()).unwrap();
|
||
|
|
} else {
|
||
|
|
storage.delete(b"1").unwrap();
|
||
|
|
}
|
||
|
|
if i % 2 == 1 {
|
||
|
|
storage.put(b"2", format!("v{}", i).as_bytes()).unwrap();
|
||
|
|
} else {
|
||
|
|
storage.delete(b"2").unwrap();
|
||
|
|
}
|
||
|
|
storage
|
||
|
|
.inner
|
||
|
|
.force_freeze_memtable(&storage.inner.state_lock.lock())
|
||
|
|
.unwrap();
|
||
|
|
}
|
||
|
|
storage.close().unwrap();
|
||
|
|
// ensure all SSTs are flushed
|
||
|
|
assert!(storage.inner.state.read().memtable.is_empty());
|
||
|
|
assert!(storage.inner.state.read().imm_memtables.is_empty());
|
||
|
|
storage.dump_structure();
|
||
|
|
drop(storage);
|
||
|
|
dump_files_in_dir(&dir);
|
||
|
|
|
||
|
|
let storage = MiniLsm::open(
|
||
|
|
&dir,
|
||
|
|
LsmStorageOptions::default_for_week2_test(compaction_options.clone()),
|
||
|
|
)
|
||
|
|
.unwrap();
|
||
|
|
assert_eq!(&storage.get(b"0").unwrap().unwrap()[..], b"v20".as_slice());
|
||
|
|
assert_eq!(&storage.get(b"1").unwrap().unwrap()[..], b"v20".as_slice());
|
||
|
|
assert_eq!(storage.get(b"2").unwrap(), None);
|
||
|
|
}
|