changeset 353:c8dade1cb8e1

memtable: Actually, do return deleted values from MemTableIterator
author Lewin Bormann <lbo@spheniscida.de>
date Thu, 05 Oct 2017 20:02:00 +0200
parents 742cfffd2892
children 55b7a2eef262
files src/memtable.rs
diffstat 1 files changed, 13 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/src/memtable.rs	Thu Oct 05 19:45:55 2017 +0200
+++ b/src/memtable.rs	Thu Oct 05 20:02:00 2017 +0200
@@ -72,31 +72,17 @@
 /// from the MemtableKey format used in the inner map; all key-taking or -returning methods deal
 /// with InternalKeys.
 ///
-/// This iterator skips deleted entries.
+/// This iterator does not skip deleted entries.
 pub struct MemtableIterator {
     skipmapiter: SkipMapIter,
 }
 
 impl LdbIterator for MemtableIterator {
     fn advance(&mut self) -> bool {
-        // Make sure this is actually needed.
-        let (mut key, mut val) = (vec![], vec![]);
-        loop {
-            if !self.skipmapiter.advance() {
-                return false;
-            }
-            if self.skipmapiter.current(&mut key, &mut val) {
-                let (_, _, tag, _, _) = parse_memtable_key(&key);
-
-                if tag & 0xff == ValueType::TypeValue as u64 {
-                    return true;
-                } else {
-                    continue;
-                }
-            } else {
-                return false;
-            }
+        if !self.skipmapiter.advance() {
+            return false;
         }
+        self.skipmapiter.valid()
     }
     fn reset(&mut self) {
         self.skipmapiter.reset();
@@ -131,19 +117,14 @@
         }
 
         if self.skipmapiter.current(key, val) {
-            let (keylen, keyoff, tag, vallen, valoff) = parse_memtable_key(&key);
-
-            if tag & 0xff == ValueType::TypeValue as u64 {
-                val.clear();
-                val.extend_from_slice(&key[valoff..valoff + vallen]);
-                // zero-allocation truncation.
-                shift_left(key, keyoff);
-                // Truncate key to key+tag.
-                key.truncate(keylen + u64::required_space());
-                return true;
-            } else {
-                panic!("should not happen");
-            }
+            let (keylen, keyoff, _, vallen, valoff) = parse_memtable_key(&key);
+            val.clear();
+            val.extend_from_slice(&key[valoff..valoff + vallen]);
+            // zero-allocation truncation.
+            shift_left(key, keyoff);
+            // Truncate key to key+tag.
+            key.truncate(keylen + u64::required_space());
+            return true;
         } else {
             panic!("should not happen");
         }
@@ -309,7 +290,7 @@
                             "122".as_bytes(),
                             "124".as_bytes(),
                             // deleted entry:
-                            // "125".as_bytes(),
+                            "125".as_bytes(),
                             "126".as_bytes()];
         let mut i = 0;