[thin_pool] Support creating metadadata snapshot
This commit is contained in:
		| @@ -227,6 +227,52 @@ thin_pool::get_transaction_id() const | ||||
| 	return md_->sb_.trans_id_; | ||||
| } | ||||
|  | ||||
| void | ||||
| thin_pool::reserve_metadata_snap() | ||||
| { | ||||
| 	if (md_->sb_.metadata_snap_) | ||||
| 		throw std::runtime_error("pool metadata snapshot already exists."); | ||||
|  | ||||
| 	commit(); | ||||
|  | ||||
| 	md_->metadata_sm_->inc(superblock_detail::SUPERBLOCK_LOCATION); | ||||
| 	transaction_manager::write_ref wr = md_->tm_->shadow( | ||||
| 			superblock_detail::SUPERBLOCK_LOCATION, | ||||
| 			superblock_validator()).first; | ||||
|  | ||||
| 	superblock_detail::superblock sb; | ||||
| 	superblock_detail::superblock_disk *sbd = reinterpret_cast<superblock_detail::superblock_disk *>(wr.data()); | ||||
| 	superblock_detail::superblock_traits::unpack(*sbd, sb); | ||||
|  | ||||
| 	memset(sb.data_space_map_root_, 0, superblock_detail::SPACE_MAP_ROOT_SIZE); | ||||
| 	memset(sb.metadata_space_map_root_, 0, superblock_detail::SPACE_MAP_ROOT_SIZE); | ||||
| 	md_->metadata_sm_->inc(sb.data_mapping_root_); | ||||
| 	md_->metadata_sm_->inc(sb.device_details_root_); | ||||
|  | ||||
| 	superblock_detail::superblock_traits::pack(sb, *sbd); | ||||
|  | ||||
| 	md_->sb_.metadata_snap_ = wr.get_location(); | ||||
| } | ||||
|  | ||||
| void | ||||
| thin_pool::release_metadata_snap() | ||||
| { | ||||
| 	if (!md_->sb_.metadata_snap_) | ||||
| 		throw std::runtime_error("No pool metadata snapshot found"); | ||||
|  | ||||
| 	superblock_detail::superblock sb = read_superblock(md_->tm_->get_bm(), | ||||
| 							   md_->sb_.metadata_snap_); | ||||
| 	device_tree dtree(*md_->tm_, sb.device_details_root_, | ||||
| 			  device_tree_detail::device_details_traits::ref_counter()); | ||||
| 	dtree.destroy(); | ||||
| 	mapping_tree mtree(*md_->tm_, sb.data_mapping_root_, | ||||
| 			   mapping_tree_detail::block_traits::ref_counter(md_->tm_->get_sm())); | ||||
| 	mtree.destroy(); | ||||
| 	md_->metadata_sm_->dec(md_->sb_.metadata_snap_); | ||||
|  | ||||
| 	md_->sb_.metadata_snap_ = 0; | ||||
| } | ||||
|  | ||||
| block_address | ||||
| thin_pool::get_metadata_snap() const | ||||
| { | ||||
|   | ||||
| @@ -82,6 +82,9 @@ namespace thin_provisioning { | ||||
| 		void set_transaction_id(uint64_t id); | ||||
| 		uint64_t get_transaction_id() const; | ||||
|  | ||||
| 		// handling metadata snapshot | ||||
| 		void reserve_metadata_snap(); | ||||
| 		void release_metadata_snap(); | ||||
| 		block_address get_metadata_snap() const; | ||||
|  | ||||
| 		block_address alloc_data_block(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user