From: Xuehan Xu Date: Fri, 23 Jul 2021 12:39:49 +0000 (+0800) Subject: crimson/os/seastore: refactor extent rewrite procedure X-Git-Tag: v17.1.0~919^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=32d16c393a39827c003292e10063f13f9406c28a;p=ceph.git crimson/os/seastore: refactor extent rewrite procedure Move logical extents' rewrite from LBManager to TransactionManager Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/lba_manager.h b/src/crimson/os/seastore/lba_manager.h index 735c4d69be45..406cf8a35ffa 100644 --- a/src/crimson/os/seastore/lba_manager.h +++ b/src/crimson/os/seastore/lba_manager.h @@ -161,6 +161,18 @@ public: Transaction &t, CachedExtentRef extent) = 0; + /** + * delayed_update_mapping + * + * update lba mapping for delayed allocated extents + */ + using update_le_mapping_iertr = base_iertr; + using update_le_mapping_ret = base_iertr::future<>; + virtual update_le_mapping_ret update_mapping( + Transaction& t, + laddr_t laddr, + paddr_t prev_addr, + paddr_t paddr) = 0; /** * get_physical_extent_if_live * diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc index aa058a976e37..5e0d608199d2 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.cc @@ -338,50 +338,14 @@ BtreeLBAManager::rewrite_extent_ret BtreeLBAManager::rewrite_extent( ERRORT("{} has been invalidated", t, *extent); } assert(!extent->has_been_invalidated()); + assert(!extent->is_logical()); logger().debug( "{}: rewriting {}", __func__, *extent); - if (extent->is_logical()) { - auto lextent = extent->cast(); - cache.retire_extent(t, extent); - auto nlextent = cache.alloc_new_extent_by_type( - t, - lextent->get_type(), - lextent->get_length())->cast(); - lextent->get_bptr().copy_out( - 0, - lextent->get_length(), - nlextent->get_bptr().c_str()); - nlextent->set_laddr(lextent->get_laddr()); - nlextent->set_pin(lextent->get_pin().duplicate()); - - logger().debug( - "{}: rewriting {} into {}", - __func__, - *lextent, - *nlextent); - - return update_mapping( - t, - lextent->get_laddr(), - [prev_addr = lextent->get_paddr(), addr = nlextent->get_paddr()]( - const lba_map_val_t &in) { - lba_map_val_t ret = in; - ceph_assert(in.paddr == prev_addr); - ret.paddr = addr; - return ret; - }).si_then( - [nlextent](auto) {}, - rewrite_extent_iertr::pass_further{}, - /* ENOENT in particular should be impossible */ - crimson::ct_error::assert_all{ - "Invalid error in BtreeLBAManager::rewrite_extent after update_mapping" - } - ); - } else if (is_lba_node(*extent)) { + if (is_lba_node(*extent)) { auto c = get_context(t); return with_btree( c, @@ -393,6 +357,33 @@ BtreeLBAManager::rewrite_extent_ret BtreeLBAManager::rewrite_extent( } } +BtreeLBAManager::update_le_mapping_ret +BtreeLBAManager::update_mapping( + Transaction& t, + laddr_t laddr, + paddr_t prev_addr, + paddr_t addr) +{ + return update_mapping( + t, + laddr, + [prev_addr, addr]( + const lba_map_val_t &in) { + assert(!addr.is_null()); + lba_map_val_t ret = in; + ceph_assert(in.paddr == prev_addr); + ret.paddr = addr; + return ret; + }).si_then( + [](auto) {}, + update_le_mapping_iertr::pass_further{}, + /* ENOENT in particular should be impossible */ + crimson::ct_error::assert_all{ + "Invalid error in BtreeLBAManager::rewrite_extent after update_mapping" + } + ); +} + BtreeLBAManager::get_physical_extent_if_live_ret BtreeLBAManager::get_physical_extent_if_live( Transaction &t, diff --git a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h index a0834b159c24..f2574a0c233f 100644 --- a/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h +++ b/src/crimson/os/seastore/lba_manager/btree/btree_lba_manager.h @@ -103,6 +103,12 @@ public: Transaction &t, CachedExtentRef extent) final; + update_le_mapping_ret update_mapping( + Transaction& t, + laddr_t laddr, + paddr_t prev_addr, + paddr_t paddr) final; + get_physical_extent_if_live_ret get_physical_extent_if_live( Transaction &t, extent_types_t type, diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 3ef0f5af59b5..52c9ffb3e326 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -281,6 +281,44 @@ TransactionManager::get_next_dirty_extents( return cache->get_next_dirty_extents(t, seq, max_bytes); } +TransactionManager::rewrite_extent_ret +TransactionManager::rewrite_logical_extent( + Transaction& t, + LogicalCachedExtentRef extent) +{ + LOG_PREFIX(TransactionManager::rewrite_logical_extent); + if (extent->has_been_invalidated()) { + ERRORT("{} has been invalidated", t, *extent); + } + assert(!extent->has_been_invalidated()); + DEBUGT("rewriting {}", t, *extent); + + auto lextent = extent->cast(); + cache->retire_extent(t, extent); + auto nlextent = cache->alloc_new_extent_by_type( + t, + lextent->get_type(), + lextent->get_length())->cast(); + lextent->get_bptr().copy_out( + 0, + lextent->get_length(), + nlextent->get_bptr().c_str()); + nlextent->set_laddr(lextent->get_laddr()); + nlextent->set_pin(lextent->get_pin().duplicate()); + + DEBUGT( + "rewriting {} into {}", + t, + *lextent, + *nlextent); + + return lba_manager->update_mapping( + t, + lextent->get_laddr(), + lextent->get_paddr(), + nlextent->get_paddr()); +} + TransactionManager::rewrite_extent_ret TransactionManager::rewrite_extent( Transaction &t, CachedExtentRef extent) @@ -300,7 +338,12 @@ TransactionManager::rewrite_extent_ret TransactionManager::rewrite_extent( cache->duplicate_for_write(t, extent); return rewrite_extent_iertr::now(); } - return lba_manager->rewrite_extent(t, extent); + + if (extent->is_logical()) { + return rewrite_logical_extent(t, extent->cast()); + } else { + return lba_manager->rewrite_extent(t, extent); + } } TransactionManager::get_extent_if_live_ret TransactionManager::get_extent_if_live( diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index f12aac95ff0a..9a692109c5fc 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -511,6 +511,9 @@ private: seastar::metrics::metric_group metrics; void register_metrics(); + rewrite_extent_ret rewrite_logical_extent( + Transaction& t, + LogicalCachedExtentRef extent); public: // Testing interfaces auto get_segment_cleaner() {