[thin_check (rust)] Mappings top level weren't being ref counted

This commit is contained in:
Joe Thornber 2020-08-13 14:43:19 +01:00
parent 092447d17a
commit e1cfc3866b

View File

@ -47,6 +47,8 @@ struct BottomLevelVisitor {
data_sm: Arc<Mutex<dyn SpaceMap + Send>>, data_sm: Arc<Mutex<dyn SpaceMap + Send>>,
} }
//------------------------------------------
impl NodeVisitor<BlockTime> for BottomLevelVisitor { impl NodeVisitor<BlockTime> for BottomLevelVisitor {
fn visit(&mut self, _w: &BTreeWalker, _b: &Block, node: &Node<BlockTime>) -> Result<()> { fn visit(&mut self, _w: &BTreeWalker, _b: &Block, node: &Node<BlockTime>) -> Result<()> {
// FIXME: do other checks // FIXME: do other checks
@ -437,7 +439,7 @@ pub fn check(opts: &ThinCheckOptions) -> Result<()> {
} }
// mapping top level // mapping top level
let roots = btree_to_map::<u64>(engine.clone(), false, sb.mapping_root)?; let roots = btree_to_map_with_sm::<u64>(engine.clone(), metadata_sm.clone(), false, sb.mapping_root)?;
// Check the mappings filling in the data_sm as we go. // Check the mappings filling in the data_sm as we go.
report.set_title("mapping tree")?; report.set_title("mapping tree")?;
@ -498,6 +500,7 @@ pub fn check(opts: &ThinCheckOptions) -> Result<()> {
let root = unpack::<SMRoot>(&sb.metadata_sm_root[0..])?; let root = unpack::<SMRoot>(&sb.metadata_sm_root[0..])?;
let mut b = Block::new(root.bitmap_root); let mut b = Block::new(root.bitmap_root);
engine.read(&mut b)?; engine.read(&mut b)?;
metadata_sm.lock().unwrap().inc(root.bitmap_root, 1)?;
let entries = unpack::<MetadataIndex>(b.get_data())?.indexes; let entries = unpack::<MetadataIndex>(b.get_data())?.indexes;
// Unused entries will point to block 0 // Unused entries will point to block 0
@ -508,6 +511,8 @@ pub fn check(opts: &ThinCheckOptions) -> Result<()> {
.collect(); .collect();
inc_entries(&metadata_sm, &entries[0..])?; inc_entries(&metadata_sm, &entries[0..])?;
// We call this for the side effect of incrementing the ref counts
// for the metadata that holds the tree.
let _counts = btree_to_map_with_sm::<u32>( let _counts = btree_to_map_with_sm::<u32>(
engine.clone(), engine.clone(),
metadata_sm.clone(), metadata_sm.clone(),