From 8480382f098e928d32f6cc98629ba821cedb705b Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Wed, 16 Feb 2022 17:46:58 +0800 Subject: [PATCH] crimson/os/seastore/btree: move 'with_btree*' from lba manager to fixed kv btree Signed-off-by: Xuehan Xu --- .../os/seastore/btree/fixed_kv_btree.h | 114 ++++++++++++++++++ .../lba_manager/btree/btree_lba_manager.cc | 33 +++-- .../lba_manager/btree/btree_lba_manager.h | 67 +--------- 3 files changed, 141 insertions(+), 73 deletions(-) diff --git a/src/crimson/os/seastore/btree/fixed_kv_btree.h b/src/crimson/os/seastore/btree/fixed_kv_btree.h index 1892992690ea9..81c8b9cd66867 100644 --- a/src/crimson/os/seastore/btree/fixed_kv_btree.h +++ b/src/crimson/os/seastore/btree/fixed_kv_btree.h @@ -1676,5 +1676,119 @@ private: } }; +template +struct is_fixed_kv_tree : std::false_type {}; + +template < + typename node_key_t, + typename node_val_t, + typename internal_node_t, + typename leaf_node_t, + size_t node_size> +struct is_fixed_kv_tree< + FixedKVBtree< + node_key_t, + node_val_t, + internal_node_t, + leaf_node_t, + node_size>> : std::true_type {}; + +template +phy_tree_root_t& get_phy_tree_root(root_t& r); + +template < + typename tree_type_t, + typename node_key_t, + typename F, + std::enable_if_t::value, int> = 0> +auto with_btree( + Cache &cache, + op_context_t c, + F &&f) { + using base_ertr = crimson::errorator< + crimson::ct_error::input_output_error>; + using base_iertr = trans_iertr; + return cache.get_root( + c.trans + ).si_then([c, f=std::forward(f), &cache](RootBlockRef croot) mutable { + return seastar::do_with( + tree_type_t(get_phy_tree_root(croot->get_root())), + [c, croot, f=std::move(f), &cache](auto &btree) mutable { + return f( + btree + ).si_then([c, croot, &btree, &cache] { + if (btree.is_root_dirty()) { + auto mut_croot = cache.duplicate_for_write( + c.trans, croot + )->template cast(); + get_phy_tree_root(mut_croot->get_root()) = + btree.get_root_undirty(); + } + return base_iertr::now(); + }); + }); + }); +} + +template < + typename tree_type_t, + typename State, + typename node_key_t, + typename F, + std::enable_if_t::value, int> = 0> +auto with_btree_state( + Cache &cache, + op_context_t c, + State &&init, + F &&f) { + return seastar::do_with( + std::forward(init), + [&cache, c, f=std::forward(f)](auto &state) mutable { + return with_btree( + cache, + c, + [&state, f=std::move(f)](auto &btree) mutable { + return f(btree, state); + }).si_then([&state] { + return seastar::make_ready_future(std::move(state)); + }); + }); +} + +template < + typename tree_type_t, + typename State, + typename node_key_t, + typename F, + std::enable_if_t::value, int> = 0> +auto with_btree_state( + Cache &cache, + op_context_t c, + F &&f) { + return crimson::os::seastore::with_btree_state( + cache, c, State{}, std::forward(f)); +} + +template < + typename tree_type_t, + typename Ret, + typename node_key_t, + typename F> +auto with_btree_ret( + Cache &cache, + op_context_t c, + F &&f) { + return with_btree_state( + cache, + c, + [f=std::forward(f)](auto &btree, auto &ret) mutable { + return f( + btree + ).si_then([&ret](auto &&_ret) { + ret = std::move(_ret); + }); + }); +} + } 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 c43fa4470bd44..db812ca3368b3 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 @@ -26,6 +26,13 @@ Transaction::tree_stats_t& get_tree_stats< crimson::os::seastore::lba_manager::btree::LBABtree>(Transaction &t) { return t.get_lba_tree_stats(); } + +template<> +phy_tree_root_t& get_phy_tree_root< + crimson::os::seastore::lba_manager::btree::LBABtree>(root_t &r) { + return r.lba_root; +} + } namespace crimson::os::seastore::lba_manager::btree { @@ -54,7 +61,8 @@ BtreeLBAManager::get_mappings( LOG_PREFIX(BtreeLBAManager::get_mappings); TRACET("{}~{}", t, offset, length); auto c = get_context(t); - return with_btree_state( + return with_btree_state( + cache, c, [c, offset, length, FNAME](auto &btree, auto &ret) { return LBABtree::iterate_repeat( @@ -112,7 +120,8 @@ BtreeLBAManager::get_mapping( LOG_PREFIX(BtreeLBAManager::get_mapping); TRACET("{}", t, offset); auto c = get_context(t); - return with_btree_ret( + return with_btree_ret( + cache, c, [FNAME, c, offset](auto &btree) { return btree.lower_bound( @@ -155,7 +164,8 @@ BtreeLBAManager::alloc_extent( auto c = get_context(t); ++stats.num_alloc_extents; auto lookup_attempts = stats.num_alloc_extents_iter_nexts; - return with_btree_state( + return crimson::os::seastore::with_btree_state( + cache, c, hint, [this, FNAME, c, hint, len, addr, lookup_attempts, &t](auto &btree, auto &state) { @@ -333,7 +343,7 @@ BtreeLBAManager::init_cached_extent_ret BtreeLBAManager::init_cached_extent( TRACET("{}", t, *e); return seastar::do_with(bool(), [this, e, &t](bool &ret) { auto c = get_context(t); - return with_btree(c, [c, e, &ret](auto &btree) + return with_btree(cache, c, [c, e, &ret](auto &btree) -> base_iertr::future<> { LOG_PREFIX(BtreeLBAManager::init_cached_extent); DEBUGT("extent {}", c.trans, *e); @@ -352,7 +362,8 @@ BtreeLBAManager::scan_mappings_ret BtreeLBAManager::scan_mappings( DEBUGT("begin: {}, end: {}", t, begin, end); auto c = get_context(t); - return with_btree( + return with_btree( + cache, c, [c, f=std::move(f), begin, end](auto &btree) mutable { return LBABtree::iterate_repeat( @@ -383,7 +394,8 @@ BtreeLBAManager::scan_mapped_space_ret BtreeLBAManager::scan_mapped_space( return seastar::do_with( std::move(f), [this, c](auto &visitor) { - return with_btree( + return with_btree( + cache, c, [c, &visitor](auto &btree) { return LBABtree::iterate_repeat( @@ -419,7 +431,8 @@ BtreeLBAManager::rewrite_extent_ret BtreeLBAManager::rewrite_extent( if (is_lba_node(*extent)) { DEBUGT("rewriting lba extent -- {}", t, *extent); auto c = get_context(t); - return with_btree( + return with_btree( + cache, c, [c, extent](auto &btree) mutable { return btree.rewrite_extent(c, extent); @@ -475,7 +488,8 @@ BtreeLBAManager::get_physical_extent_if_live( t, type, laddr, addr, len); ceph_assert(is_lba_node(type)); auto c = get_context(t); - return with_btree_ret( + return with_btree_ret( + cache, c, [c, type, addr, laddr, len](auto &btree) { if (type == extent_types_t::LADDR_INTERNAL) { @@ -551,7 +565,8 @@ BtreeLBAManager::_update_mapping_ret BtreeLBAManager::_update_mapping( update_func_t &&f) { auto c = get_context(t); - return with_btree_ret( + return with_btree_ret( + cache, c, [f=std::move(f), c, addr](auto &btree) mutable { return btree.lower_bound( 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 5cf8c5a05bc57..16c300f3a1382 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 @@ -26,7 +26,9 @@ namespace crimson::os::seastore::lba_manager::btree { -using LBABtree = FixedKVBtree; +using LBABtree = FixedKVBtree< + laddr_t, lba_map_val_t, LBAInternalNode, + LBALeafNode, LBA_BLOCK_SIZE>; using BtreeLBAPin = BtreeNodePin; @@ -154,69 +156,6 @@ private: seastar::metrics::metric_group metrics; void register_metrics(); - template - auto with_btree( - op_context_t c, - F &&f) { - return cache.get_root( - c.trans - ).si_then([this, c, f=std::forward(f)](RootBlockRef croot) mutable { - return seastar::do_with( - LBABtree(croot->get_root().lba_root), - [this, c, croot, f=std::move(f)](auto &btree) mutable { - return f( - btree - ).si_then([this, c, croot, &btree] { - if (btree.is_root_dirty()) { - auto mut_croot = cache.duplicate_for_write( - c.trans, croot - )->cast(); - mut_croot->get_root().lba_root = btree.get_root_undirty(); - } - return base_iertr::now(); - }); - }); - }); - } - - template - auto with_btree_state( - op_context_t c, - State &&init, - F &&f) { - return seastar::do_with( - std::forward(init), - [this, c, f=std::forward(f)](auto &state) mutable { - (void)this; // silence incorrect clang warning about capture - return with_btree(c, [&state, f=std::move(f)](auto &btree) mutable { - return f(btree, state); - }).si_then([&state] { - return seastar::make_ready_future(std::move(state)); - }); - }); - } - - template - auto with_btree_state( - op_context_t c, - F &&f) { - return with_btree_state(c, State{}, std::forward(f)); - } - - template - auto with_btree_ret( - op_context_t c, - F &&f) { - return with_btree_state( - c, - [f=std::forward(f)](auto &btree, auto &ret) mutable { - return f( - btree - ).si_then([&ret](auto &&_ret) { - ret = std::move(_ret); - }); - }); - } /** * update_refcount -- 2.39.5