changeset 349:534d28d9fe36

version: Add deleted entry in test version data
author Lewin Bormann <lbo@spheniscida.de>
date Thu, 05 Oct 2017 19:10:48 +0200
parents e349dc30f464
children e158f02819cb
files src/version.rs src/version_set.rs
diffstat 2 files changed, 50 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/src/version.rs	Thu Oct 05 19:10:18 2017 +0200
+++ b/src/version.rs	Thu Oct 05 19:10:48 2017 +0200
@@ -75,7 +75,7 @@
                 if let Ok(Some((k, v))) = self.table_cache.borrow_mut().get(f.borrow().num, ikey) {
                     // We don't need to check the sequence number; get() will not return an entry
                     // with a higher sequence number than the one in the supplied key.
-                    let (typ, seq, foundkey) = parse_internal_key(&k);
+                    let (typ, _, foundkey) = parse_internal_key(&k);
                     if typ == ValueType::TypeValue &&
                        self.user_cmp.cmp(foundkey, ukey) == Ordering::Equal {
                         return Ok(Some((v, stats)));
@@ -523,6 +523,7 @@
     use super::*;
     use cmp::DefaultCmp;
     use env::Env;
+    use key_types::ValueType;
     use mem_env::MemEnv;
     use options::{self, Options};
     use table_builder::TableBuilder;
@@ -549,16 +550,16 @@
     /// write_table creates a table with the given number and contents (must be sorted!) in the
     /// memenv. The sequence numbers given to keys start with startseq.
     pub fn write_table(me: &Box<Env>,
-                       contents: &[(&[u8], &[u8])],
+                       contents: &[(&[u8], &[u8], ValueType)],
                        startseq: u64,
                        num: FileNum)
                        -> FileMetaHandle {
         let dst = me.open_writable_file(Path::new(&table_file_name("db", num))).unwrap();
         let mut seq = startseq;
         let keys: Vec<Vec<u8>> = contents.iter()
-            .map(|&(k, _)| {
+            .map(|&(k, _, typ)| {
                 seq += 1;
-                LookupKey::new(k, seq - 1).internal_key().to_vec()
+                LookupKey::new_full(k, seq - 1, typ).internal_key().to_vec()
             })
             .collect();
 
@@ -585,42 +586,53 @@
         // and so on.
 
         // Level 0 (overlapping)
-        let f1: &[(&[u8], &[u8])] = &[("aaa".as_bytes(), "val1".as_bytes()),
-                                      ("aab".as_bytes(), "val2".as_bytes()),
-                                      ("aba".as_bytes(), "val3".as_bytes())];
+        let f1: &[(&[u8], &[u8], ValueType)] =
+            &[("aaa".as_bytes(), "val1".as_bytes(), ValueType::TypeValue),
+              ("aab".as_bytes(), "val2".as_bytes(), ValueType::TypeValue),
+              ("aba".as_bytes(), "val3".as_bytes(), ValueType::TypeValue)];
         let t1 = write_table(&env, f1, 1, 1);
-        let f2: &[(&[u8], &[u8])] = &[("aax".as_bytes(), "val1".as_bytes()),
-                                      ("bab".as_bytes(), "val2".as_bytes()),
-                                      ("bba".as_bytes(), "val3".as_bytes())];
+        let f2: &[(&[u8], &[u8], ValueType)] =
+            &[("aax".as_bytes(), "val1".as_bytes(), ValueType::TypeValue),
+              ("bab".as_bytes(), "val2".as_bytes(), ValueType::TypeValue),
+              ("bba".as_bytes(), "val3".as_bytes(), ValueType::TypeValue)];
         let t2 = write_table(&env, f2, 4, 2);
         // Level 1
-        let f3: &[(&[u8], &[u8])] = &[("aaa".as_bytes(), "val0".as_bytes()),
-                                      ("cab".as_bytes(), "val2".as_bytes()),
-                                      ("cba".as_bytes(), "val3".as_bytes())];
+        let f3: &[(&[u8], &[u8], ValueType)] =
+            &[("aaa".as_bytes(), "val0".as_bytes(), ValueType::TypeValue),
+              ("cab".as_bytes(), "val2".as_bytes(), ValueType::TypeValue),
+              ("cba".as_bytes(), "val3".as_bytes(), ValueType::TypeValue)];
         let t3 = write_table(&env, f3, 7, 3);
-        let f4: &[(&[u8], &[u8])] = &[("daa".as_bytes(), "val1".as_bytes()),
-                                      ("dab".as_bytes(), "val2".as_bytes()),
-                                      ("dba".as_bytes(), "val3".as_bytes())];
+        let f4: &[(&[u8], &[u8], ValueType)] =
+            &[("daa".as_bytes(), "val1".as_bytes(), ValueType::TypeValue),
+              ("dab".as_bytes(), "val2".as_bytes(), ValueType::TypeValue),
+              ("dba".as_bytes(), "val3".as_bytes(), ValueType::TypeValue)];
         let t4 = write_table(&env, f4, 10, 4);
-        let f5: &[(&[u8], &[u8])] = &[("eaa".as_bytes(), "val1".as_bytes()),
-                                      ("eab".as_bytes(), "val2".as_bytes()),
-                                      ("fab".as_bytes(), "val3".as_bytes())];
+        let f5: &[(&[u8], &[u8], ValueType)] =
+            &[("eaa".as_bytes(), "val1".as_bytes(), ValueType::TypeValue),
+              ("eab".as_bytes(), "val2".as_bytes(), ValueType::TypeValue),
+              ("fab".as_bytes(), "val3".as_bytes(), ValueType::TypeValue)];
         let t5 = write_table(&env, f5, 13, 5);
         // Level 2
-        let f6: &[(&[u8], &[u8])] = &[("cab".as_bytes(), "val1".as_bytes()),
-                                      ("fab".as_bytes(), "val2".as_bytes()),
-                                      ("fba".as_bytes(), "val3".as_bytes())];
+        let f6: &[(&[u8], &[u8], ValueType)] =
+            &[("cab".as_bytes(), "val1".as_bytes(), ValueType::TypeValue),
+              ("fab".as_bytes(), "val2".as_bytes(), ValueType::TypeValue),
+              ("fba".as_bytes(), "val3".as_bytes(), ValueType::TypeValue)];
         let t6 = write_table(&env, f6, 16, 6);
-        let f7: &[(&[u8], &[u8])] = &[("gaa".as_bytes(), "val1".as_bytes()),
-                                      ("gab".as_bytes(), "val2".as_bytes()),
-                                      ("gba".as_bytes(), "val3".as_bytes())];
-        let t7 = write_table(&env, f7, 19, 7);
+        let f7: &[(&[u8], &[u8], ValueType)] =
+            &[("gaa".as_bytes(), "val1".as_bytes(), ValueType::TypeValue),
+              ("gab".as_bytes(), "val2".as_bytes(), ValueType::TypeValue),
+              ("gba".as_bytes(), "val3".as_bytes(), ValueType::TypeValue),
+              ("gca".as_bytes(), "val3".as_bytes(), ValueType::TypeDeletion),
+              ("gda".as_bytes(), "val3".as_bytes(), ValueType::TypeValue)];
+        let t7 = write_table(&env, f7, 21, 7);
         // Level 3 (2 * 2 entries, for iterator behavior).
-        let f8: &[(&[u8], &[u8])] = &[("haa".as_bytes(), "val1".as_bytes()),
-                                      ("hba".as_bytes(), "val2".as_bytes())];
-        let t8 = write_table(&env, f8, 22, 8);
-        let f9: &[(&[u8], &[u8])] = &[("iaa".as_bytes(), "val1".as_bytes()),
-                                      ("iba".as_bytes(), "val2".as_bytes())];
+        let f8: &[(&[u8], &[u8], ValueType)] =
+            &[("haa".as_bytes(), "val1".as_bytes(), ValueType::TypeValue),
+              ("hba".as_bytes(), "val2".as_bytes(), ValueType::TypeValue)];
+        let t8 = write_table(&env, f8, 23, 8);
+        let f9: &[(&[u8], &[u8], ValueType)] =
+            &[("iaa".as_bytes(), "val1".as_bytes(), ValueType::TypeValue),
+              ("iba".as_bytes(), "val2".as_bytes(), ValueType::TypeValue)];
         let t9 = write_table(&env, f9, 25, 9);
 
 
@@ -657,7 +669,7 @@
     fn test_version_concat_iter() {
         let v = make_version().0;
 
-        let expected_entries = vec![0, 9, 6, 4];
+        let expected_entries = vec![0, 9, 8, 4];
         for l in 1..4 {
             let mut iter = v.new_concat_iter(l);
             let iter = LdbIteratorIter::wrap(&mut iter);
@@ -686,7 +698,7 @@
         opt.set_comparator(Box::new(InternalKeyCmp(Rc::new(Box::new(DefaultCmp)))));
 
         let mut miter = MergingIter::new(opt.cmp.clone(), iters);
-        assert_eq!(LdbIteratorIter::wrap(&mut miter).count(), 25);
+        assert_eq!(LdbIteratorIter::wrap(&mut miter).count(), 27);
 
         // Check that all elements are in order.
         let init = LookupKey::new("000".as_bytes(), MAX_SEQUENCE_NUMBER);
@@ -701,8 +713,8 @@
     fn test_version_summary() {
         let v = make_version().0;
         let expected = "level 0: 2 files, 434 bytes ([(1, 216), (2, 218)]); level 1: 3 files, 651 \
-                        bytes ([(3, 218), (4, 216), (5, 217)]); level 2: 2 files, 434 bytes ([(6, \
-                        218), (7, 216)]); level 3: 2 files, 400 bytes ([(8, 200), (9, 200)]); ";
+                        bytes ([(3, 218), (4, 216), (5, 217)]); level 2: 2 files, 468 bytes ([(6, \
+                        218), (7, 250)]); level 3: 2 files, 400 bytes ([(8, 200), (9, 200)]); ";
         assert_eq!(expected, &v.level_summary());
     }
 
@@ -719,6 +731,8 @@
               ("dab".as_bytes(), 1, Ok(None)),
               ("dac".as_bytes(), 100, Ok(None)),
               ("gba".as_bytes(), 100, Ok(Some("val3".as_bytes().to_vec()))),
+              // deleted key
+              ("gca".as_bytes(), 100, Ok(None)),
               ("gbb".as_bytes(), 100, Ok(None))];
 
         for ref c in cases {
--- a/src/version_set.rs	Thu Oct 05 19:10:18 2017 +0200
+++ b/src/version_set.rs	Thu Oct 05 19:10:48 2017 +0200
@@ -1043,7 +1043,7 @@
         // num_level_bytes()
         assert_eq!(434, vs.num_level_bytes(0));
         assert_eq!(651, vs.num_level_bytes(1));
-        assert_eq!(434, vs.num_level_bytes(2));
+        assert_eq!(468, vs.num_level_bytes(2));
         // num_level_files()
         assert_eq!(2, vs.num_level_files(0));
         assert_eq!(3, vs.num_level_files(1));