From: Yingxin Cheng Date: Wed, 2 Apr 2025 07:57:22 +0000 (+0800) Subject: crimson/os/seastore/../btree_lba_manager: get_mapping() to reuse get_indirect_pin() X-Git-Tag: v20.3.0~129^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1adc50f5d3ae4b6d21de54329ecd8f28ab2bfc34;p=ceph.git crimson/os/seastore/../btree_lba_manager: get_mapping() to reuse get_indirect_pin() There is no guarantee that the direct pin must match exactly. Signed-off-by: Yingxin Cheng --- 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 be05a76bb8a1..cc56775c4168 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 @@ -176,18 +176,14 @@ BtreeLBAManager::get_mappings( auto key = pin->get_key(); auto intermediate_key = pin->get_raw_val().get_laddr(); auto intermediate_len = pin->get_length(); - return _get_mappings(c, btree, intermediate_key, intermediate_len - ).si_then([FNAME, c, laddr, length, key, intermediate_key, - intermediate_len, &ret](auto pin_list) { - ceph_assert(pin_list.size() == 1); - auto& pin = pin_list.front(); - assert(!pin->is_indirect()); - assert(pin->get_key() <= intermediate_key); - assert(pin->get_key() + pin->get_length() >= intermediate_key + intermediate_len); + return get_indirect_pin(c, btree, key, intermediate_key, intermediate_len + ).si_then([FNAME, c, &ret, laddr, length](auto pin) { TRACET("{}~0x{:x} got indirect pin {}~0x{:x}->{}({}~0x{:x})", - c.trans, laddr, length, key, intermediate_len, intermediate_key, - pin->get_key(), pin->get_length()); - pin->make_indirect(key, intermediate_len, intermediate_key); + c.trans, laddr, length, + pin->get_key(), pin->get_length(), + pin->get_intermediate_key(), + pin->get_intermediate_base(), + pin->get_intermediate_length()); ret.emplace_back(std::move(pin)); return get_mappings_iertr::now(); }); @@ -235,6 +231,28 @@ BtreeLBAManager::_get_mappings( }); } +BtreeLBAManager::get_indirect_pin_ret +BtreeLBAManager::get_indirect_pin( + op_context_t c, + LBABtree& btree, + laddr_t key, + laddr_t intermediate_key, + extent_len_t length) +{ + return _get_mappings(c, btree, intermediate_key, length + ).si_then([key, intermediate_key, length](auto pin_list) { + ceph_assert(pin_list.size() == 1); + auto& pin = pin_list.front(); + assert(!pin->is_indirect()); + assert(pin->get_key() <= intermediate_key); + assert(pin->get_key() + pin->get_length() >= intermediate_key + length); + pin->make_indirect(key, length, intermediate_key); + assert(pin->get_key() == key); + assert(pin->get_length() == length); + return std::move(pin); + }); +} + BtreeLBAManager::get_mapping_ret BtreeLBAManager::get_mapping( Transaction &t, @@ -257,12 +275,14 @@ BtreeLBAManager::get_mapping( assert(laddr == pin->get_key()); auto len = pin->get_length(); laddr_t direct_laddr = pin->get_raw_val().get_laddr(); - return _get_mapping(c, btree, direct_laddr - ).si_then([FNAME, c, laddr, len](auto pin) { - ceph_assert(len == pin->get_length()); - TRACET("{} got indirect pin->{}~0x{:x}", - c.trans, laddr, pin->get_key(), len); - pin->make_indirect(laddr, len); + return get_indirect_pin(c, btree, laddr, direct_laddr, len + ).si_then([FNAME, c, laddr](auto pin) { + TRACET("{} got indirect pin {}~0x{:x}->{}({}~0x{:x})", + c.trans, laddr, + pin->get_key(), pin->get_length(), + pin->get_intermediate_key(), + pin->get_intermediate_base(), + pin->get_intermediate_length()); return get_mapping_iertr::make_ready_future(std::move(pin)); }); }); 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 ed9903309186..56f8a1d6fc4c 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 @@ -713,6 +713,14 @@ private: laddr_t offset, extent_len_t length); + using get_indirect_pin_ret = get_mappings_iertr::future; + get_indirect_pin_ret get_indirect_pin( + op_context_t c, + LBABtree& btree, + laddr_t key, + laddr_t intermediate_key, + extent_len_t length); + using _decref_intermediate_ret = ref_iertr::future< std::optional>; _decref_intermediate_ret _decref_intermediate(