Files
mini_lsm/mini-lsm/src/tests/week2_day5.rs
Alex Chi 14c3be390c add week 2 day 5 + 6 tests
Signed-off-by: Alex Chi <iskyzh@gmail.com>
2024-01-26 15:19:56 +08:00

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);
}