changeset 379:57890f618949

block_builder: Introduce total-entries counter and add test for reset()
author Lewin Bormann <lbo@spheniscida.de>
date Sun, 08 Oct 2017 16:47:52 +0200
parents 39626ad17aa2
children 36b70e7af130
files src/block_builder.rs
diffstat 1 files changed, 31 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/block_builder.rs	Sun Oct 08 16:47:35 2017 +0200
+++ b/src/block_builder.rs	Sun Oct 08 16:47:52 2017 +0200
@@ -13,6 +13,7 @@
     restarts: Vec<u32>,
 
     last_key: Vec<u8>,
+    restart_counter: usize,
     counter: usize,
 }
 
@@ -26,6 +27,7 @@
             opt: o,
             restarts: restarts,
             last_key: Vec::new(),
+            restart_counter: 0,
             counter: 0,
         }
     }
@@ -46,17 +48,18 @@
         self.buffer.clear();
         self.restarts.clear();
         self.last_key.clear();
+        self.restart_counter = 0;
         self.counter = 0;
     }
 
     pub fn add(&mut self, key: &[u8], val: &[u8]) {
-        assert!(self.counter <= self.opt.block_restart_interval);
+        assert!(self.restart_counter <= self.opt.block_restart_interval);
         assert!(self.buffer.is_empty() ||
                 self.opt.cmp.cmp(self.last_key.as_slice(), key) == Ordering::Less);
 
         let mut shared = 0;
 
-        if self.counter < self.opt.block_restart_interval {
+        if self.restart_counter < self.opt.block_restart_interval {
             let smallest = if self.last_key.len() < key.len() {
                 self.last_key.len()
             } else {
@@ -69,7 +72,7 @@
         } else {
             self.restarts.push(self.buffer.len() as u32);
             self.last_key.resize(0, 0);
-            self.counter = 0;
+            self.restart_counter = 0;
         }
 
         let non_shared = key.len() - shared;
@@ -84,6 +87,7 @@
         self.last_key.resize(shared, 0);
         self.last_key.extend_from_slice(&key[shared..]);
 
+        self.restart_counter += 1;
         self.counter += 1;
     }
 
@@ -121,21 +125,42 @@
     fn test_block_builder_sanity() {
         let mut o = options::for_test();
         o.block_restart_interval = 3;
-
         let mut builder = BlockBuilder::new(o);
+        let d = get_data();
 
-        for &(k, v) in get_data().iter() {
+        for &(k, v) in d.iter() {
             builder.add(k, v);
-            assert!(builder.counter <= 3);
+            assert!(builder.restart_counter <= 3);
             assert_eq!(builder.last_key(), k);
         }
 
         assert_eq!(149, builder.size_estimate());
+        assert_eq!(d.len(), builder.entries());
+
         let block = builder.finish();
         assert_eq!(block.len(), 149);
     }
 
     #[test]
+    fn test_block_builder_reset() {
+        let mut o = options::for_test();
+        o.block_restart_interval = 3;
+        let mut builder = BlockBuilder::new(o);
+        let d = get_data();
+
+        for &(k, v) in d.iter() {
+            builder.add(k, v);
+            assert!(builder.restart_counter <= 3);
+            assert_eq!(builder.last_key(), k);
+        }
+
+        assert_eq!(d.len(), builder.entries());
+        builder.reset();
+        assert_eq!(0, builder.entries());
+        assert_eq!(4, builder.size_estimate());
+    }
+
+    #[test]
     #[should_panic]
     fn test_block_builder_panics() {
         let mut d = get_data();
@@ -147,8 +172,6 @@
             builder.add(k, v);
             assert_eq!(k, builder.last_key());
         }
-        assert_eq!(d.len(), builder.entries());
     }
-
     // Additional test coverage is provided by tests in block.rs.
 }