[thin] Stop metadata counting on the first error

This commit is contained in:
Ming-Hung Tsai 2020-08-11 22:42:32 +08:00
parent 12725983db
commit b16ff123b7
3 changed files with 26 additions and 10 deletions

View File

@ -296,7 +296,8 @@ namespace {
out << "checking space map counts" << end_message();
nested_output::nest _ = out.push();
count_metadata(tm, sb, bc);
if (!count_metadata(tm, sb, bc))
return FATAL;
// Finally we need to check the metadata space map agrees
// with the counts we've just calculated.
@ -358,6 +359,7 @@ namespace {
options_(check_opts),
out_(cerr, 2),
info_out_(cout, 0),
expected_rc_(true), // set stop on the first error
err_(NO_ERROR) {
if (output_opts == OUTPUT_QUIET) {
@ -398,7 +400,7 @@ namespace {
err_ << examine_metadata_space_map(tm, sb, options_.sm_opts_, out_, expected_rc_);
// check the data space map
if (core_sm)
if (err_ != FATAL && core_sm)
err_ << compare_space_maps(data_sm, *core_sm, out_);
} else
err_ << examine_data_mappings(tm, sb, options_.data_mapping_opts_, out_,

View File

@ -8,7 +8,7 @@ using namespace thin_provisioning;
//----------------------------------------------------------------
namespace {
void count_trees(transaction_manager::ptr tm,
bool count_trees(transaction_manager::ptr tm,
superblock_detail::superblock const &sb,
block_counter &bc) {
@ -27,11 +27,15 @@ namespace {
mapping_tree_detail::block_traits::ref_counter(space_map::ptr()));
count_btree_blocks(mtree, bc, vc);
}
return true;
}
void count_space_maps(transaction_manager::ptr tm,
bool count_space_maps(transaction_manager::ptr tm,
superblock_detail::superblock const &sb,
block_counter &bc) {
bool ret = true;
// Count the metadata space map (no-throw)
try {
persistent_space_map::ptr metadata_sm =
@ -39,36 +43,46 @@ namespace {
metadata_sm->count_metadata(bc);
} catch (std::exception &e) {
cerr << e.what() << endl;
ret = false;
}
// Count the data space map (no-throw)
{
try {
persistent_space_map::ptr data_sm =
open_disk_sm(*tm, static_cast<void const *>(&sb.data_space_map_root_));
data_sm->count_metadata(bc);
} catch (std::exception &e) {
cerr << e.what() << endl;
ret = false;
}
return ret;
}
}
//----------------------------------------------------------------
void thin_provisioning::count_metadata(transaction_manager::ptr tm,
bool thin_provisioning::count_metadata(transaction_manager::ptr tm,
superblock_detail::superblock const &sb,
block_counter &bc,
bool skip_metadata_snap) {
bool ret = true;
// Count the superblock
bc.inc(superblock_detail::SUPERBLOCK_LOCATION);
count_trees(tm, sb, bc);
ret &= count_trees(tm, sb, bc);
// Count the metadata snap, if present
if (!skip_metadata_snap && sb.metadata_snap_ != superblock_detail::SUPERBLOCK_LOCATION) {
bc.inc(sb.metadata_snap_);
superblock_detail::superblock snap = read_superblock(tm->get_bm(), sb.metadata_snap_);
count_trees(tm, snap, bc);
ret &= count_trees(tm, snap, bc);
}
count_space_maps(tm, sb, bc);
ret &= count_space_maps(tm, sb, bc);
return ret;
}
//----------------------------------------------------------------

View File

@ -7,7 +7,7 @@
//----------------------------------------------------------------
namespace thin_provisioning {
void count_metadata(transaction_manager::ptr tm,
bool count_metadata(transaction_manager::ptr tm,
superblock_detail::superblock const &sb,
block_counter &bc,
bool skip_metadata_snap = false);