[thin] Stop metadata counting on the first error
This commit is contained in:
		| @@ -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_, | ||||
|   | ||||
| @@ -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; | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------------- | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user