From: Xuehan Xu Date: Sun, 27 Mar 2022 08:44:16 +0000 (+0800) Subject: crimson/os/seastore/transaction_manager: prepare extents for lba_manager/backref_mana... X-Git-Tag: v18.0.0~915^2~5 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=de4260d5ec3f666e4b50961037cdaefc8f25f576;p=ceph-ci.git crimson/os/seastore/transaction_manager: prepare extents for lba_manager/backref_manager's complete_transaction Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/lba_manager.h b/src/crimson/os/seastore/lba_manager.h index 122d0ada7af..244523d1163 100644 --- a/src/crimson/os/seastore/lba_manager.h +++ b/src/crimson/os/seastore/lba_manager.h @@ -110,7 +110,12 @@ public: laddr_t addr) = 0; virtual void complete_transaction( - Transaction &t) = 0; + Transaction &t, + std::vector &to_clear, ///< extents whose pins are to be cleared, + // as the results of their retirements + std::vector &to_link ///< fresh extents whose pins are to be inserted + // into backref manager's pin set + ) = 0; /** * Should be called after replay on each cached extent. 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 d4bebf764f3..085a7613780 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 @@ -252,16 +252,12 @@ static depth_t get_depth(const CachedExtent &e) } void BtreeLBAManager::complete_transaction( - Transaction &t) + Transaction &t, + std::vector &to_clear, + std::vector &to_link) { LOG_PREFIX(BtreeLBAManager::complete_transaction); DEBUGT("start", t); - std::vector to_clear; - to_clear.reserve(t.get_retired_set().size()); - for (auto &e: t.get_retired_set()) { - if (e->is_logical() || is_lba_node(*e)) - to_clear.push_back(e); - } // need to call check_parent from leaf->parent std::sort( to_clear.begin(), to_clear.end(), @@ -273,14 +269,6 @@ void BtreeLBAManager::complete_transaction( pin_set.retire(pin); } - // ...but add_pin from parent->leaf - std::vector to_link; - to_link.reserve(t.get_fresh_block_stats().num); - t.for_each_fresh_block([&](auto &e) { - if (e->is_valid() && (is_lba_node(*e) || e->is_logical())) - to_link.push_back(e); - }); - std::sort( to_link.begin(), to_link.end(), [](auto &l, auto &r) -> bool { return get_depth(*l) > get_depth(*r); }); 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 63b44d3080a..a109c9f1f17 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 @@ -99,7 +99,9 @@ public: } void complete_transaction( - Transaction &t) final; + Transaction &t, + std::vector &, + std::vector &) final; /** * init_cached_extent diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index aec0b57a9d4..7251b07fac9 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -375,7 +375,35 @@ TransactionManager::submit_transaction_direct( submit_result.record_block_base, start_seq, segment_cleaner.get()); - lba_manager->complete_transaction(tref); + + std::vector lba_to_clear; + std::vector backref_to_clear; + lba_to_clear.reserve(tref.get_retired_set().size()); + backref_to_clear.reserve(tref.get_retired_set().size()); + for (auto &e: tref.get_retired_set()) { + if (e->is_logical() || is_lba_node(e->get_type())) + lba_to_clear.push_back(e); + else if (is_backref_node(e->get_type())) + backref_to_clear.push_back(e); + } + + // ...but add_pin from parent->leaf + std::vector lba_to_link; + std::vector backref_to_link; + lba_to_link.reserve(tref.get_fresh_block_stats().num); + backref_to_link.reserve(tref.get_fresh_block_stats().num); + tref.for_each_fresh_block([&](auto &e) { + if (e->is_valid()) { + if (is_lba_node(e->get_type()) || e->is_logical()) + lba_to_link.push_back(e); + else if (is_backref_node(e->get_type())) + backref_to_link.push_back(e); + } + }); + + lba_manager->complete_transaction(tref, lba_to_clear, lba_to_link); + backref_manager->complete_transaction(tref, backref_to_clear, backref_to_link); + segment_cleaner->update_journal_tail_target( cache->get_oldest_dirty_from().value_or(start_seq)); return segment_cleaner->maybe_release_segment(tref); diff --git a/src/test/crimson/seastore/test_btree_lba_manager.cc b/src/test/crimson/seastore/test_btree_lba_manager.cc index 351536bd904..8e21f0affe8 100644 --- a/src/test/crimson/seastore/test_btree_lba_manager.cc +++ b/src/test/crimson/seastore/test_btree_lba_manager.cc @@ -315,7 +315,21 @@ struct btree_lba_manager_test : btree_test_base { btree_lba_manager_test() = default; void complete_commit(Transaction &t) final { - lba_manager->complete_transaction(t); + std::vector lba_to_clear; + lba_to_clear.reserve(t.get_retired_set().size()); + for (auto &e: t.get_retired_set()) { + if (e->is_logical() || is_lba_node(e->get_type())) + lba_to_clear.push_back(e); + } + std::vector lba_to_link; + lba_to_link.reserve(t.get_fresh_block_stats().num); + t.for_each_fresh_block([&](auto &e) { + if (e->is_valid() && + (is_lba_node(e->get_type()) || e->is_logical())) + lba_to_link.push_back(e); + }); + + lba_manager->complete_transaction(t, lba_to_clear, lba_to_link); } LBAManager::mkfs_ret test_structure_setup(Transaction &t) final {