[thin_pool] Support creating metadadata snapshot

This commit is contained in:
Ming-Hung Tsai 2020-06-02 19:07:13 +08:00
parent e33c60c7e2
commit 524de134a4
2 changed files with 49 additions and 0 deletions

View File

@ -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
{

View File

@ -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();