Add metadata_counter.{h,cc}
This commit is contained in:
		| @@ -81,6 +81,7 @@ SOURCE=\ | ||||
| 	thin-provisioning/mapping_tree.cc \ | ||||
| 	thin-provisioning/metadata.cc \ | ||||
| 	thin-provisioning/metadata_checker.cc \ | ||||
| 	thin-provisioning/metadata_counter.cc \ | ||||
| 	thin-provisioning/metadata_dumper.cc \ | ||||
| 	thin-provisioning/restore_emitter.cc \ | ||||
| 	thin-provisioning/rmap_visitor.cc \ | ||||
|   | ||||
							
								
								
									
										73
									
								
								thin-provisioning/metadata_counter.cc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								thin-provisioning/metadata_counter.cc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| #include "thin-provisioning/metadata_counter.h" | ||||
| #include "persistent-data/space-maps/core.h" | ||||
| #include "persistent-data/space-maps/disk_structures.h" | ||||
|  | ||||
| using namespace persistent_data; | ||||
| using namespace thin_provisioning; | ||||
|  | ||||
| //---------------------------------------------------------------- | ||||
|  | ||||
| void thin_provisioning::count_trees(transaction_manager::ptr tm, | ||||
| 				    superblock_detail::superblock &sb, | ||||
| 				    block_counter &bc) { | ||||
|  | ||||
| 	// Count the device tree | ||||
| 	{ | ||||
| 		noop_value_counter<device_tree_detail::device_details> vc; | ||||
| 		device_tree dtree(*tm, sb.device_details_root_, | ||||
| 				  device_tree_detail::device_details_traits::ref_counter()); | ||||
| 		count_btree_blocks(dtree, bc, vc); | ||||
| 	} | ||||
|  | ||||
| 	// Count the mapping tree | ||||
| 	{ | ||||
| 		noop_value_counter<mapping_tree_detail::block_time> vc; | ||||
| 		mapping_tree mtree(*tm, sb.data_mapping_root_, | ||||
| 				   mapping_tree_detail::block_traits::ref_counter(space_map::ptr())); | ||||
| 		count_btree_blocks(mtree, bc, vc); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void thin_provisioning::count_space_maps(transaction_manager::ptr tm, | ||||
| 					 superblock_detail::superblock &sb, | ||||
| 					 block_counter &bc) { | ||||
| 	// Count the metadata space map (no-throw) | ||||
| 	try { | ||||
| 		persistent_space_map::ptr metadata_sm = | ||||
| 			open_metadata_sm(*tm, static_cast<void *>(&sb.metadata_space_map_root_)); | ||||
| 		metadata_sm->count_metadata(bc); | ||||
| 	} catch (std::exception &e) { | ||||
| 		cerr << e.what() << endl; | ||||
| 	} | ||||
|  | ||||
| 	// Count the data space map (no-throw) | ||||
| 	try { | ||||
| 		persistent_space_map::ptr data_sm = | ||||
| 			open_disk_sm(*tm, static_cast<void *>(&sb.data_space_map_root_)); | ||||
| 		data_sm->count_metadata(bc); | ||||
| 	} catch (std::exception &e) { | ||||
| 		cerr << e.what() << endl; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void thin_provisioning::count_metadata(transaction_manager::ptr tm, | ||||
| 				       superblock_detail::superblock &sb, | ||||
| 				       block_counter &bc, | ||||
| 				       bool skip_metadata_snap) { | ||||
| 	// Count the superblock | ||||
| 	bc.inc(superblock_detail::SUPERBLOCK_LOCATION); | ||||
| 	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); | ||||
| 	} | ||||
|  | ||||
| 	count_trees(tm, sb, bc); | ||||
| 	count_space_maps(tm, sb, bc); | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------------- | ||||
							
								
								
									
										24
									
								
								thin-provisioning/metadata_counter.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								thin-provisioning/metadata_counter.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| #ifndef METADATA_COUNTER_H | ||||
| #define METADATA_COUNTER_H | ||||
|  | ||||
| #include "thin-provisioning/metadata.h" | ||||
| #include "persistent-data/data-structures/btree_counter.h" | ||||
|  | ||||
| //---------------------------------------------------------------- | ||||
|  | ||||
| namespace thin_provisioning { | ||||
| 	void count_trees(transaction_manager::ptr tm, | ||||
| 			 superblock_detail::superblock &sb, | ||||
| 			 block_counter &bc); | ||||
| 	void count_space_maps(transaction_manager::ptr tm, | ||||
| 			      superblock_detail::superblock &sb, | ||||
| 			      block_counter &bc); | ||||
| 	void count_metadata(transaction_manager::ptr tm, | ||||
| 			    superblock_detail::superblock &sb, | ||||
| 			    block_counter &bc, | ||||
| 			    bool skip_metadata_snap = false); | ||||
| } | ||||
|  | ||||
| //---------------------------------------------------------------- | ||||
|  | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user