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