Files
mini_lsm/mini-lsm/src/tests/week1_day1.rs

148 lines
5.1 KiB
Rust
Raw Normal View History

use std::sync::Arc;
use tempfile::tempdir;
use crate::{
lsm_storage::{LsmStorageInner, LsmStorageOptions},
mem_table::MemTable,
};
#[test]
fn test_task1_memtable_get() {
let memtable = MemTable::create(0);
memtable.for_testing_put_slice(b"key1", b"value1").unwrap();
memtable.for_testing_put_slice(b"key2", b"value2").unwrap();
memtable.for_testing_put_slice(b"key3", b"value3").unwrap();
assert_eq!(
&memtable.for_testing_get_slice(b"key1").unwrap()[..],
b"value1"
);
assert_eq!(
&memtable.for_testing_get_slice(b"key2").unwrap()[..],
b"value2"
);
assert_eq!(
&memtable.for_testing_get_slice(b"key3").unwrap()[..],
b"value3"
);
}
#[test]
fn test_task1_memtable_overwrite() {
let memtable = MemTable::create(0);
memtable.for_testing_put_slice(b"key1", b"value1").unwrap();
memtable.for_testing_put_slice(b"key2", b"value2").unwrap();
memtable.for_testing_put_slice(b"key3", b"value3").unwrap();
memtable.for_testing_put_slice(b"key1", b"value11").unwrap();
memtable.for_testing_put_slice(b"key2", b"value22").unwrap();
memtable.for_testing_put_slice(b"key3", b"value33").unwrap();
assert_eq!(
&memtable.for_testing_get_slice(b"key1").unwrap()[..],
b"value11"
);
assert_eq!(
&memtable.for_testing_get_slice(b"key2").unwrap()[..],
b"value22"
);
assert_eq!(
&memtable.for_testing_get_slice(b"key3").unwrap()[..],
b"value33"
);
}
#[test]
fn test_task2_storage_integration() {
let dir = tempdir().unwrap();
let storage = Arc::new(
LsmStorageInner::open(dir.path(), LsmStorageOptions::default_for_week1_test()).unwrap(),
);
assert_eq!(&storage.get(b"0").unwrap(), &None);
storage.put(b"1", b"233").unwrap();
storage.put(b"2", b"2333").unwrap();
storage.put(b"3", b"23333").unwrap();
assert_eq!(&storage.get(b"1").unwrap().unwrap()[..], b"233");
assert_eq!(&storage.get(b"2").unwrap().unwrap()[..], b"2333");
assert_eq!(&storage.get(b"3").unwrap().unwrap()[..], b"23333");
storage.delete(b"2").unwrap();
assert!(storage.get(b"2").unwrap().is_none());
storage.delete(b"0").unwrap(); // should NOT report any error
}
#[test]
fn test_task3_storage_integration() {
let dir = tempdir().unwrap();
let storage =
LsmStorageInner::open(dir.path(), LsmStorageOptions::default_for_week1_test()).unwrap();
storage.put(b"1", b"233").unwrap();
storage.put(b"2", b"2333").unwrap();
storage.put(b"3", b"23333").unwrap();
storage
.force_freeze_memtable(&storage.state_lock.lock())
.unwrap();
assert_eq!(storage.state.read().imm_memtables.len(), 1);
let previous_approximate_size = storage.state.read().imm_memtables[0].approximate_size();
assert!(previous_approximate_size >= 15);
storage.put(b"1", b"2333").unwrap();
storage.put(b"2", b"23333").unwrap();
storage.put(b"3", b"233333").unwrap();
storage
.force_freeze_memtable(&storage.state_lock.lock())
.unwrap();
assert_eq!(storage.state.read().imm_memtables.len(), 2);
assert!(
storage.state.read().imm_memtables[1].approximate_size() == previous_approximate_size,
"wrong order of memtables?"
);
assert!(storage.state.read().imm_memtables[0].approximate_size() > previous_approximate_size);
}
#[test]
fn test_task3_freeze_on_capacity() {
let dir = tempdir().unwrap();
let mut options = LsmStorageOptions::default_for_week1_test();
options.target_sst_size = 1024;
options.num_memtable_limit = 1000;
let storage = Arc::new(LsmStorageInner::open(dir.path(), options).unwrap());
for _ in 0..1000 {
storage.put(b"1", b"2333").unwrap();
}
let num_imm_memtables = storage.state.read().imm_memtables.len();
assert!(num_imm_memtables >= 1, "no memtable frozen?");
for _ in 0..1000 {
storage.delete(b"1").unwrap();
}
assert!(
storage.state.read().imm_memtables.len() > num_imm_memtables,
"no more memtable frozen?"
);
}
#[test]
fn test_task4_storage_integration() {
let dir = tempdir().unwrap();
let storage = Arc::new(
LsmStorageInner::open(dir.path(), LsmStorageOptions::default_for_week1_test()).unwrap(),
);
assert_eq!(&storage.get(b"0").unwrap(), &None);
storage.put(b"1", b"233").unwrap();
storage.put(b"2", b"2333").unwrap();
storage.put(b"3", b"23333").unwrap();
storage
.force_freeze_memtable(&storage.state_lock.lock())
.unwrap();
storage.delete(b"1").unwrap();
storage.delete(b"2").unwrap();
storage.put(b"3", b"2333").unwrap();
storage.put(b"4", b"23333").unwrap();
storage
.force_freeze_memtable(&storage.state_lock.lock())
.unwrap();
storage.put(b"1", b"233333").unwrap();
storage.put(b"3", b"233333").unwrap();
assert_eq!(storage.state.read().imm_memtables.len(), 2);
assert_eq!(&storage.get(b"1").unwrap().unwrap()[..], b"233333");
assert_eq!(&storage.get(b"2").unwrap(), &None);
assert_eq!(&storage.get(b"3").unwrap().unwrap()[..], b"233333");
assert_eq!(&storage.get(b"4").unwrap().unwrap()[..], b"23333");
}