changeset 268:b8182038acbf

version_set/version: Set more methods public; reuse one InternalKeyCmp in Compaction.
author Lewin Bormann <lbo@spheniscida.de>
date Thu, 21 Sep 2017 15:37:25 +0200
parents 38e6d3133b46
children 6221c9630bf6
files src/version.rs src/version_set.rs
diffstat 2 files changed, 40 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/version.rs	Thu Sep 21 15:35:38 2017 +0200
+++ b/src/version.rs	Thu Sep 21 15:37:25 2017 +0200
@@ -117,7 +117,7 @@
     }
 
     /// level_summary returns a summary of the distribution of tables and bytes in this version.
-    fn level_summary(&self) -> String {
+    pub fn level_summary(&self) -> String {
         let mut acc = String::with_capacity(256);
         for level in 0..NUM_LEVELS {
             let fs = &self.files[level];
--- a/src/version_set.rs	Thu Sep 21 15:35:38 2017 +0200
+++ b/src/version_set.rs	Thu Sep 21 15:37:25 2017 +0200
@@ -7,7 +7,8 @@
 use merging_iter::MergingIter;
 use options::Options;
 use table_cache::TableCache;
-use types::{parse_file_name, share, NUM_LEVELS, FileNum, FileType, LdbIterator, Shared};
+use types::{parse_file_name, share, NUM_LEVELS, FileMetaData, FileNum, FileType, LdbIterator,
+            Shared};
 use version::{new_version_iter, total_size, FileMetaHandle, Version};
 use version_edit::VersionEdit;
 
@@ -18,12 +19,13 @@
 use std::path::Path;
 use std::rc::Rc;
 
-struct Compaction {
+pub struct Compaction {
     level: usize,
     max_file_size: usize,
     input_version: Option<Shared<Version>>,
     level_ixs: [usize; NUM_LEVELS],
     cmp: Rc<Box<Cmp>>,
+    icmp: InternalKeyCmp,
 
     // "parent" inputs from level and level+1.
     inputs: [Vec<FileMetaHandle>; 2],
@@ -44,6 +46,7 @@
             input_version: input,
             level_ixs: Default::default(),
             cmp: opt.cmp.clone(),
+            icmp: InternalKeyCmp(opt.cmp.clone()),
 
             inputs: Default::default(),
             grandparent_ix: 0,
@@ -59,17 +62,31 @@
         self.inputs[parent].push(f)
     }
 
-    fn num_inputs(&self, parent: usize) -> usize {
+    pub fn level(&self) -> usize {
+        self.level
+    }
+
+    pub fn input(&self, parent: usize, ix: usize) -> FileMetaData {
+        assert!(parent < 2);
+        assert!(ix < self.inputs[parent].len());
+        self.inputs[parent][ix].borrow().clone()
+    }
+
+    pub fn num_inputs(&self, parent: usize) -> usize {
         assert!(parent < 2);
         self.inputs[parent].len()
     }
 
-    fn edit(&mut self) -> &mut VersionEdit {
+    pub fn edit(&mut self) -> &mut VersionEdit {
         &mut self.edit
     }
 
+    pub fn into_edit(self) -> VersionEdit {
+        self.edit
+    }
+
     /// add_input_deletions marks the current input files as deleted in the inner VersionEdit.
-    fn add_input_deletions(&mut self) {
+    pub fn add_input_deletions(&mut self) {
         for parent in 0..2 {
             for f in &self.inputs[parent] {
                 self.edit.delete_file(self.level + parent, f.borrow().num);
@@ -80,7 +97,7 @@
     /// is_base_level_for checks whether the given key may exist in levels higher than this
     /// compaction's level plus 2. I.e., whether the levels for this compaction are the last ones
     /// to contain the key.
-    fn is_base_level_for<'a>(&mut self, k: UserKey<'a>) -> bool {
+    pub fn is_base_level_for<'a>(&mut self, k: UserKey<'a>) -> bool {
         assert!(self.input_version.is_some());
         let inp_version = self.input_version.as_ref().unwrap();
         for level in self.level + 2..NUM_LEVELS {
@@ -94,23 +111,23 @@
                     }
                     break;
                 }
+                // level_ixs contains cross-call state to speed up following lookups.
                 self.level_ixs[level] += 1;
             }
         }
         true
     }
 
-    fn is_trivial_move(&self) -> bool {
+    pub fn is_trivial_move(&self) -> bool {
         let inputs_size = total_size(self.grandparents.as_ref().unwrap().iter());
         self.num_inputs(0) == 1 && self.num_inputs(1) == 0 && inputs_size < 10 * self.max_file_size
     }
 
-    fn should_stop_before<'a>(&mut self, k: InternalKey<'a>) -> bool {
+    pub fn should_stop_before<'a>(&mut self, k: InternalKey<'a>) -> bool {
         assert!(self.grandparents.is_some());
         let grandparents = self.grandparents.as_ref().unwrap();
-        let icmp = InternalKeyCmp(self.cmp.clone());
         while self.grandparent_ix < grandparents.len() &&
-              icmp.cmp(k, &grandparents[self.grandparent_ix].borrow().largest) ==
+              self.icmp.cmp(k, &grandparents[self.grandparent_ix].borrow().largest) ==
               Ordering::Greater {
             if self.seen_key {
                 self.overlapped_bytes += grandparents[self.grandparent_ix].borrow().size;
@@ -172,8 +189,12 @@
         }
     }
 
-    /// live_files returns files currently needed.
-    fn live_files(&self) -> Vec<FileNum> {
+    pub fn current_summary(&self) -> String {
+        self.current.as_ref().unwrap().borrow().level_summary()
+    }
+
+    /// live_files returns the files that are currently active.
+    pub fn live_files(&self) -> HashSet<FileNum> {
         let mut files = HashSet::new();
         for version in &self.versions {
             for level in 0..NUM_LEVELS {
@@ -182,7 +203,7 @@
                 }
             }
         }
-        files.into_iter().collect()
+        files
     }
 
     /// release_compaction checks if the input_version of a compaction is held in the VersionSet,
@@ -222,7 +243,8 @@
         assert!(self.current.is_some());
         total_size(self.current.as_ref().unwrap().borrow().files[l].iter())
     }
-    fn num_level_files(&self, l: usize) -> usize {
+
+    pub fn num_level_files(&self, l: usize) -> usize {
         assert!(l < NUM_LEVELS);
         assert!(self.current.is_some());
         self.current.as_ref().unwrap().borrow().files[l].len()
@@ -280,7 +302,7 @@
         offset
     }
 
-    fn pick_compaction(&mut self) -> Option<Compaction> {
+    pub fn pick_compaction(&mut self) -> Option<Compaction> {
         assert!(self.current.is_some());
         let current = self.current();
         let current = current.borrow();
@@ -644,7 +666,7 @@
     }
 
     /// make_input_iterator returns an iterator over the inputs of a compaction.
-    fn make_input_iterator(&self, c: &Compaction) -> Box<LdbIterator> {
+    pub fn make_input_iterator(&self, c: &Compaction) -> Box<LdbIterator> {
         let cap = if c.level == 0 { c.num_inputs(0) + 1 } else { 2 };
         let mut iters: Vec<Box<LdbIterator>> = Vec::with_capacity(cap);
         for i in 0..2 {
@@ -1042,6 +1064,7 @@
         vs.add_version(v);
         // live_files()
         assert_eq!(9, vs.live_files().len());
+        assert!(vs.live_files().contains(&3));
         // num_level_bytes()
         assert_eq!(434, vs.num_level_bytes(0));
         assert_eq!(651, vs.num_level_bytes(1));