@@ -9,7 +9,11 @@ Build a simple key-value storage engine in a week!
|
|||||||
The tutorial is available at [https://skyzh.github.io/mini-lsm](https://skyzh.github.io/mini-lsm). You can use the provided starter
|
The tutorial is available at [https://skyzh.github.io/mini-lsm](https://skyzh.github.io/mini-lsm). You can use the provided starter
|
||||||
code to kick off your project, and follow the tutorial to implement the LSM tree.
|
code to kick off your project, and follow the tutorial to implement the LSM tree.
|
||||||
|
|
||||||
Join the mini-lsm community: [](https://skyzh.dev/join/discord)
|
## Community
|
||||||
|
|
||||||
|
You may join skyzh's Discord server and study with the mini-lsm community.
|
||||||
|
|
||||||
|
[](https://skyzh.dev/join/discord)
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
|
|||||||
@@ -218,6 +218,9 @@ impl LsmStorage {
|
|||||||
|
|
||||||
let iter = TwoMergeIterator::create(memtable_iter, table_iter)?;
|
let iter = TwoMergeIterator::create(memtable_iter, table_iter)?;
|
||||||
|
|
||||||
Ok(FusedIterator::new(LsmIterator::new(iter, map_bound(upper))?))
|
Ok(FusedIterator::new(LsmIterator::new(
|
||||||
|
iter,
|
||||||
|
map_bound(upper),
|
||||||
|
)?))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,9 @@ impl LsmStorage {
|
|||||||
let mut iters = Vec::new();
|
let mut iters = Vec::new();
|
||||||
iters.reserve(tables.len());
|
iters.reserve(tables.len());
|
||||||
for table in tables.iter() {
|
for table in tables.iter() {
|
||||||
iters.push(Box::new(SsTableIterator::create_and_seek_to_first(table.clone())?));
|
iters.push(Box::new(SsTableIterator::create_and_seek_to_first(
|
||||||
|
table.clone(),
|
||||||
|
)?));
|
||||||
}
|
}
|
||||||
let mut iter = MergeIterator::create(iters);
|
let mut iter = MergeIterator::create(iters);
|
||||||
|
|
||||||
|
|||||||
@@ -166,17 +166,16 @@ impl LeveledCompactionController {
|
|||||||
.copied()
|
.copied()
|
||||||
.collect::<HashSet<_>>();
|
.collect::<HashSet<_>>();
|
||||||
if let Some(upper_level) = task.upper_level {
|
if let Some(upper_level) = task.upper_level {
|
||||||
let new_upper_level_ssts =
|
let new_upper_level_ssts = snapshot.levels[upper_level - 1]
|
||||||
snapshot.levels[upper_level - 1]
|
.1
|
||||||
.1
|
.iter()
|
||||||
.iter()
|
.filter_map(|x| {
|
||||||
.filter_map(|x| {
|
if upper_level_sst_ids_set.remove(x) {
|
||||||
if upper_level_sst_ids_set.remove(x) {
|
return None;
|
||||||
return None;
|
}
|
||||||
}
|
Some(*x)
|
||||||
Some(*x)
|
})
|
||||||
})
|
.collect::<Vec<_>>();
|
||||||
.collect::<Vec<_>>();
|
|
||||||
assert!(upper_level_sst_ids_set.is_empty());
|
assert!(upper_level_sst_ids_set.is_empty());
|
||||||
snapshot.levels[upper_level - 1].1 = new_upper_level_ssts;
|
snapshot.levels[upper_level - 1].1 = new_upper_level_ssts;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -223,6 +223,9 @@ impl LsmStorage {
|
|||||||
|
|
||||||
let iter = TwoMergeIterator::create(memtable_iter, table_iter)?;
|
let iter = TwoMergeIterator::create(memtable_iter, table_iter)?;
|
||||||
|
|
||||||
Ok(FusedIterator::new(LsmIterator::new(iter, map_bound(upper))?))
|
Ok(FusedIterator::new(LsmIterator::new(
|
||||||
|
iter,
|
||||||
|
map_bound(upper),
|
||||||
|
)?))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user