148 lines
5.1 KiB
Rust
148 lines
5.1 KiB
Rust
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");
|
|
}
|