Mercurial > lbo > hg > leveldb-rs
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()));