From 8a1399e3bb6b60214416e9216ce4f205c15aba8d Mon Sep 17 00:00:00 2001 From: Ming-Hung Tsai Date: Wed, 15 Sep 2021 21:26:18 +0800 Subject: [PATCH] [cache_dump (rust)] Make use of the --repair option Ignore non-fatal errors, and regenerate unavailable dirty bits if --repair was applied. --- src/cache/dump.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/cache/dump.rs b/src/cache/dump.rs index a5b9309..86579c4 100644 --- a/src/cache/dump.rs +++ b/src/cache/dump.rs @@ -222,7 +222,7 @@ pub fn dump_metadata( engine: Arc, out: &mut dyn MetadataVisitor, sb: &Superblock, - _repair: bool, + repair: bool, ) -> anyhow::Result<()> { let xml_sb = ir::Superblock { uuid: "".to_string(), @@ -236,7 +236,7 @@ pub fn dump_metadata( out.mappings_b()?; let valid_mappings = match sb.version { 1 => { - let w = ArrayWalker::new(engine.clone(), false); + let w = ArrayWalker::new(engine.clone(), repair); let mut emitter = format1::MappingEmitter::new(sb.cache_blocks as usize, out); w.walk(&mut emitter, sb.mapping_root)?; emitter.get_valid() @@ -246,9 +246,8 @@ pub fn dump_metadata( let dirty_bits; if let Some(root) = sb.dirty_root { let (bits, errs) = - read_bitset(engine.clone(), root, sb.cache_blocks as usize, false); - // TODO: allow errors in repair mode - if errs.is_some() { + read_bitset(engine.clone(), root, sb.cache_blocks as usize, repair); + if errs.is_some() && !repair { return Err(anyhow!("errors in bitset {}", errs.unwrap())); } dirty_bits = bits; @@ -258,7 +257,7 @@ pub fn dump_metadata( return Err(anyhow!("format 2 selected, but no dirty bitset present")); } - let w = ArrayWalker::new(engine.clone(), false); + let w = ArrayWalker::new(engine.clone(), repair); let mut emitter = format2::MappingEmitter::new(sb.cache_blocks as usize, dirty_bits, out); w.walk(&mut emitter, sb.mapping_root)?; @@ -272,7 +271,7 @@ pub fn dump_metadata( out.hints_b()?; { - let w = ArrayWalker::new(engine.clone(), false); + let w = ArrayWalker::new(engine.clone(), repair); let mut emitter = HintEmitter::new(out, valid_mappings); w.walk(&mut emitter, sb.hint_root)?; } @@ -296,7 +295,7 @@ pub fn dump(opts: CacheDumpOptions) -> anyhow::Result<()> { } let mut out = xml::XmlWriter::new(writer); - dump_metadata(ctx.engine.clone(), &mut out, &sb, opts.repair) + dump_metadata(ctx.engine, &mut out, &sb, opts.repair) } //------------------------------------------