changeset 91:f6b6a82fb7cd

Fix MemtableIterator: Key returned from iterator should include tag See https://github.com/google/leveldb/blob/master/db/memtable.cc#L61
author Lewin Bormann <lbo@spheniscida.de>
date Fri, 02 Sep 2016 22:47:04 +0200
parents ab7984e1e49c
children 05da3cfbbcbc
files src/memtable.rs src/skipmap.rs
diffstat 2 files changed, 23 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/memtable.rs	Fri Sep 02 22:12:28 2016 +0200
+++ b/src/memtable.rs	Fri Sep 02 22:47:04 2016 +0200
@@ -39,15 +39,14 @@
     }
 }
 
+/// A LookupKey is the first part of a memtable key, consisting of [keylen: varint32, key: *u8,
+/// tag: u64]
+/// keylen is the length of key plus 8 (for the tag; this for LevelDB compatibility)
 pub struct LookupKey {
     key: Vec<u8>,
     key_offset: usize,
 }
 
-/// Encapsulates a user key + sequence number, which is used for lookups in the internal map
-/// implementation of a MemTable.
-/// Format: [keylen: varint32, key: *u8, tag: u64]
-/// keylen is the length of key plus 8 (for the tag; this for LevelDB compatibility)
 impl LookupKey {
     #[allow(unused_assignments)]
     fn new(k: &[u8], s: SequenceNumber) -> LookupKey {
@@ -279,7 +278,7 @@
             let (keylen, keyoff, tag, vallen, valoff) = parse_memtable_key(foundkey);
 
             if tag & 0xff == ValueType::TypeValue as u64 {
-                return Some((&foundkey[keyoff..keyoff + keylen],
+                return Some((&foundkey[keyoff..keyoff + keylen + 8],
                              &foundkey[valoff..valoff + vallen]));
             } else {
                 panic!("should not happen");
@@ -388,6 +387,8 @@
         assert!(!iter.valid());
         iter.next();
         assert!(iter.valid());
+        assert_eq!(iter.current().unwrap().0,
+                   vec![97, 98, 99, 1, 120, 0, 0, 0, 0, 0, 0].as_slice());
         iter.reset();
         assert!(!iter.valid());
     }
@@ -416,22 +417,31 @@
         let mt = get_memtable();
         let mut iter = mt.iter();
 
+        // Bigger sequence number comes first
         iter.next();
         assert!(iter.valid());
-        assert_eq!(iter.current().unwrap().0, vec![97, 98, 99].as_slice());
+        assert_eq!(iter.current().unwrap().0,
+                   vec![97, 98, 99, 1, 120, 0, 0, 0, 0, 0, 0].as_slice());
+
+        iter.next();
+        assert!(iter.valid());
+        assert_eq!(iter.current().unwrap().0,
+                   vec![97, 98, 99, 1, 115, 0, 0, 0, 0, 0, 0].as_slice());
 
         iter.next();
         assert!(iter.valid());
-        assert_eq!(iter.current().unwrap().0, vec![97, 98, 99].as_slice());
-
-        iter.next();
-        assert!(iter.valid());
-        assert_eq!(iter.current().unwrap().0, vec![97, 98, 100].as_slice());
+        assert_eq!(iter.current().unwrap().0,
+                   vec![97, 98, 100, 1, 121, 0, 0, 0, 0, 0, 0].as_slice());
 
         iter.prev();
+        assert!(iter.valid());
+        assert_eq!(iter.current().unwrap().0,
+                   vec![97, 98, 99, 1, 115, 0, 0, 0, 0, 0, 0].as_slice());
+
         iter.prev();
         assert!(iter.valid());
-        assert_eq!(iter.current().unwrap().0, vec![97, 98, 99].as_slice());
+        assert_eq!(iter.current().unwrap().0,
+                   vec![97, 98, 99, 1, 120, 0, 0, 0, 0, 0, 0].as_slice());
 
         iter.prev();
         assert!(!iter.valid());
--- a/src/skipmap.rs	Fri Sep 02 22:12:28 2016 +0200
+++ b/src/skipmap.rs	Fri Sep 02 22:47:04 2016 +0200
@@ -430,6 +430,7 @@
 
         iter.next();
         assert!(iter.valid());
+        assert_eq!(iter.current().unwrap().0, "aba".as_bytes());
         iter.seek(&"abz".as_bytes().to_vec());
         assert_eq!(iter.current().unwrap(),
                    ("abz".as_bytes(), "def".as_bytes()));