patch memtable and add ts for wal
Signed-off-by: Alex Chi <iskyzh@gmail.com>
This commit is contained in:
@@ -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(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user