From de7e79fc06125c4bbe2703eb16269b907f5cf8e8 Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Thu, 10 Jun 2021 16:55:25 +0800 Subject: [PATCH] [btree_builder] Rename Builder to BTreeBuilder for clarity --- src/pdata/array_builder.rs | 2 +- src/pdata/btree_builder.rs | 67 +++++++++++++++++++---------------- src/pdata/space_map_common.rs | 2 +- src/pdata/space_map_disk.rs | 2 +- src/thin/restore.rs | 6 ++-- 5 files changed, 43 insertions(+), 36 deletions(-) diff --git a/src/pdata/array_builder.rs b/src/pdata/array_builder.rs index 015bdcb..d19a6bd 100644 --- a/src/pdata/array_builder.rs +++ b/src/pdata/array_builder.rs @@ -125,7 +125,7 @@ impl ArrayBuilder { pub fn complete(self, w: &mut WriteBatcher) -> Result { let blocks = self.block_builder.complete(w)?; - let mut index_builder = Builder::::new(Box::new(NoopRC {})); + let mut index_builder = BTreeBuilder::::new(Box::new(NoopRC {})); for (i, b) in blocks.iter().enumerate() { index_builder.push_value(w, i as u64, *b)?; diff --git a/src/pdata/btree_builder.rs b/src/pdata/btree_builder.rs index b5a320e..7c509ba 100644 --- a/src/pdata/btree_builder.rs +++ b/src/pdata/btree_builder.rs @@ -453,13 +453,13 @@ impl<'a, V: Pack + Unpack + Clone> NodeBuilder { //------------------------------------------ -pub struct Builder { +pub struct BTreeBuilder { leaf_builder: NodeBuilder, } -impl Builder { - pub fn new(value_rc: Box>) -> Builder { - Builder { +impl BTreeBuilder { + pub fn new(value_rc: Box>) -> BTreeBuilder { + BTreeBuilder { leaf_builder: NodeBuilder::new(Box::new(LeafIO {}), value_rc), } } @@ -473,33 +473,40 @@ impl Builder { } pub fn complete(self, w: &mut WriteBatcher) -> Result { - let mut nodes = self.leaf_builder.complete(w)?; - - // Now we iterate, adding layers of internal nodes until we end - // up with a single root. - while nodes.len() > 1 { - let mut builder = NodeBuilder::new( - Box::new(InternalIO {}), - Box::new(SMRefCounter::new(w.sm.clone())), - ); - - for n in nodes { - builder.push_value(w, n.key, n.block)?; - } - - nodes = builder.complete(w)?; - } - - assert!(nodes.len() == 1); - - // The root is expected to be referenced by only one parent, - // hence the ref count is increased before the availability - // of it's parent. - let root = nodes[0].block; - w.sm.lock().unwrap().inc(root, 1)?; - - Ok(root) + let nodes = self.leaf_builder.complete(w)?; + build_btree(w, nodes) } } //------------------------------------------ + +// Build a btree from a list of pre-built leaves +pub fn build_btree(w: &mut WriteBatcher, leaves: Vec) -> Result { + // Now we iterate, adding layers of internal nodes until we end + // up with a single root. + let mut nodes = leaves; + while nodes.len() > 1 { + let mut builder = NodeBuilder::new( + Box::new(InternalIO {}), + Box::new(SMRefCounter::new(w.sm.clone())), + ); + + for n in nodes { + builder.push_value(w, n.key, n.block)?; + } + + nodes = builder.complete(w)?; + } + + assert!(nodes.len() == 1); + + // The root is expected to be referenced by only one parent, + // hence the ref count is increased before the availability + // of it's parent. + let root = nodes[0].block; + w.sm.lock().unwrap().inc(root, 1)?; + + Ok(root) +} + +//------------------------------------------ diff --git a/src/pdata/space_map_common.rs b/src/pdata/space_map_common.rs index e2f8918..eb0ffdb 100644 --- a/src/pdata/space_map_common.rs +++ b/src/pdata/space_map_common.rs @@ -200,7 +200,7 @@ pub fn write_common(w: &mut WriteBatcher, sm: &dyn SpaceMap) -> Result<(Vec = Builder::new(Box::new(NoopRC {})); + let mut overflow_builder: BTreeBuilder = BTreeBuilder::new(Box::new(NoopRC {})); // how many bitmaps do we need? for bm in 0..div_up(sm.get_nr_blocks()? as usize, ENTRIES_PER_BITMAP) { diff --git a/src/pdata/space_map_disk.rs b/src/pdata/space_map_disk.rs index 88e1749..d70206b 100644 --- a/src/pdata/space_map_disk.rs +++ b/src/pdata/space_map_disk.rs @@ -10,7 +10,7 @@ use crate::write_batcher::*; pub fn write_disk_sm(w: &mut WriteBatcher, sm: &dyn SpaceMap) -> Result { let (index_entries, ref_count_root) = write_common(w, sm)?; - let mut index_builder: Builder = Builder::new(Box::new(NoopRC {})); + let mut index_builder: BTreeBuilder = BTreeBuilder::new(Box::new(NoopRC {})); for (i, ie) in index_entries.iter().enumerate() { index_builder.push_value(w, i as u64, *ie)?; } diff --git a/src/thin/restore.rs b/src/thin/restore.rs index e128c91..bb9df42 100644 --- a/src/thin/restore.rs +++ b/src/thin/restore.rs @@ -303,7 +303,7 @@ pub fn restore(opts: ThinRestoreOptions) -> Result<()> { let pass = pass.get_result()?; // Build the device details tree. - let mut details_builder: Builder = Builder::new(Box::new(NoopRC {})); + let mut details_builder: BTreeBuilder = BTreeBuilder::new(Box::new(NoopRC {})); for (thin_id, (detail, _)) in &pass.devices { details_builder.push_value(&mut w, *thin_id as u64, *detail)?; } @@ -314,14 +314,14 @@ pub fn restore(opts: ThinRestoreOptions) -> Result<()> { for (thin_id, (_, nodes)) in &pass.devices { ctx.report .info(&format!("building btree for device {}", thin_id)); - let mut builder: Builder = Builder::new(Box::new(NoopRC {})); + let mut builder: BTreeBuilder = BTreeBuilder::new(Box::new(NoopRC {})); builder.push_leaves(&mut w, nodes)?; let root = builder.complete(&mut w)?; devs.insert(*thin_id, root); } // Build the top level mapping tree - let mut builder: Builder = Builder::new(Box::new(NoopRC {})); + let mut builder: BTreeBuilder = BTreeBuilder::new(Box::new(NoopRC {})); for (thin_id, root) in devs { builder.push_value(&mut w, thin_id as u64, root)?; }