From 0cac72adc175404a013e86e450c58e9fb3f94af4 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Sat, 4 May 2024 12:21:13 +0800 Subject: [PATCH] crimson/os/seastore/lba_manager: don't increase intermediate mappings' refcount if LBAManager::clone_mapping() is called to remap mappings TransactionManager::remap_pin() will increase the refcount itself Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/lba_manager.h | 3 +- .../lba_manager/btree/btree_lba_manager.h | 33 ++++++++++++++----- src/crimson/os/seastore/transaction_manager.h | 6 ++-- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/crimson/os/seastore/lba_manager.h b/src/crimson/os/seastore/lba_manager.h index e46298dd44f3d..b4d34c93616cb 100644 --- a/src/crimson/os/seastore/lba_manager.h +++ b/src/crimson/os/seastore/lba_manager.h @@ -101,7 +101,8 @@ public: laddr_t hint, extent_len_t len, laddr_t intermediate_key, - laddr_t intermediate_base) = 0; + laddr_t intermediate_base, + bool inc_ref) = 0; virtual alloc_extent_ret reserve_region( 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 c43d60dcb5b0b..c4124bcf0f5e8 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 @@ -250,7 +250,8 @@ public: laddr_t hint, extent_len_t len, laddr_t intermediate_key, - laddr_t intermediate_base) final + laddr_t intermediate_base, + bool inc_ref) final { assert(intermediate_key != L_ADDR_NULL); assert(intermediate_base != L_ADDR_NULL); @@ -263,27 +264,41 @@ public: nullptr}}; return seastar::do_with( std::move(alloc_infos), - [this, &t, intermediate_base, hint](auto &alloc_infos) { + [this, &t, intermediate_base, hint, inc_ref](auto &alloc_infos) { return _alloc_extents( t, hint, alloc_infos, EXTENT_DEFAULT_REF_COUNT - ).si_then([&t, this, intermediate_base](auto mappings) { + ).si_then([&t, this, intermediate_base, inc_ref](auto mappings) { assert(mappings.size() == 1); auto indirect_mapping = std::move(mappings.front()); assert(indirect_mapping->is_indirect()); - return update_refcount(t, intermediate_base, 1, false - ).si_then([imapping=std::move(indirect_mapping)](auto p) mutable { - auto mapping = std::move(p.mapping); + auto to_indirect = [](auto &mapping, const auto &imapping) mutable { ceph_assert(mapping->is_stable()); mapping->make_indirect( imapping->get_key(), imapping->get_length(), imapping->get_intermediate_key()); - return seastar::make_ready_future< - LBAMappingRef>(std::move(mapping)); - }); + }; + if (inc_ref) { + return update_refcount(t, intermediate_base, 1, false + ).si_then([imapping=std::move(indirect_mapping), + to_indirect=std::move(to_indirect)](auto p) mutable { + auto mapping = std::move(p.mapping); + to_indirect(mapping, imapping); + return seastar::make_ready_future< + LBAMappingRef>(std::move(mapping)); + }); + } else { + return _get_mapping(t, intermediate_base + ).si_then([imapping=std::move(indirect_mapping), + to_indirect=std::move(to_indirect)](auto mapping) mutable { + to_indirect(mapping, imapping); + return seastar::make_ready_future< + LBAMappingRef>(std::move(mapping)); + }); + } }).handle_error_interruptible( crimson::ct_error::input_output_error::pass_further{}, crimson::ct_error::assert_all{"unexpect enoent"} diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 783fea1724ed3..1f1ebeceb3d50 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -593,7 +593,8 @@ public: hint, mapping.get_length(), intermediate_key, - intermediate_base + intermediate_base, + true ); } @@ -1023,7 +1024,8 @@ private: remap_laddr, remap_length, intermediate_key, - intermediate_base); + intermediate_base, + false); } return fut.si_then([remap_laddr, remap_length, remap_paddr](auto &&ref) { assert(ref->get_key() == remap_laddr); -- 2.39.5