patch memtable and add ts for wal

Signed-off-by: Alex Chi <iskyzh@gmail.com>
This commit is contained in:
Alex Chi
2024-01-25 23:09:16 +08:00
parent 89acc23208
commit 218c73f384
11 changed files with 256 additions and 96 deletions

View File

@@ -20,16 +20,24 @@ pub struct LsmIterator {
inner: LsmIteratorInner,
end_bound: Bound<Bytes>,
is_valid: bool,
read_ts: u64,
prev_key: Vec<u8>,
}
impl LsmIterator {
pub(crate) fn new(iter: LsmIteratorInner, end_bound: Bound<Bytes>) -> Result<Self> {
pub(crate) fn new(
iter: LsmIteratorInner,
end_bound: Bound<Bytes>,
read_ts: u64,
) -> Result<Self> {
let mut iter = Self {
is_valid: iter.is_valid(),
inner: iter,
end_bound,
read_ts,
prev_key: Vec::new(),
};
iter.move_to_non_delete()?;
iter.move_to_key()?;
Ok(iter)
}
@@ -47,9 +55,31 @@ impl LsmIterator {
Ok(())
}
fn move_to_non_delete(&mut self) -> Result<()> {
while self.is_valid() && self.inner.value().is_empty() {
self.next_inner()?;
fn move_to_key(&mut self) -> Result<()> {
loop {
while self.inner.is_valid() && self.inner.key().key_ref() == self.prev_key {
self.next_inner()?;
}
if !self.inner.is_valid() {
break;
}
self.prev_key.clear();
self.prev_key.extend(self.inner.key().key_ref());
while self.inner.is_valid()
&& self.inner.key().key_ref() == self.prev_key
&& self.inner.key().ts() > self.read_ts
{
self.next_inner()?;
}
if !self.inner.is_valid() {
break;
}
if self.inner.key().key_ref() != self.prev_key {
continue;
}
if !self.inner.value().is_empty() {
break;
}
}
Ok(())
}
@@ -72,7 +102,7 @@ impl StorageIterator for LsmIterator {
fn next(&mut self) -> Result<()> {
self.next_inner()?;
self.move_to_non_delete()?;
self.move_to_key()?;
Ok(())
}