From: Yingxin Cheng Date: Thu, 27 May 2021 08:48:47 +0000 (+0800) Subject: crimson/seastore: implement and test get_mapping(t, laddr) X-Git-Tag: v17.1.0~1808^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c165a289e6dbbb7bb551ce812e3494561a451c87;p=ceph.git crimson/seastore: implement and test get_mapping(t, laddr) 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 c464994d6fdfd..df8104b240b73 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 @@ -107,7 +107,16 @@ BtreeLBAManager::get_mapping( Transaction &t, laddr_t offset) { - ceph_abort("not implemented"); + logger().debug("BtreeLBAManager::get_mapping: {}", offset); + return get_root(t + ).safe_then([this, &t, offset] (auto extent) { + return extent->lookup_pin(get_context(t), offset); + }).safe_then([] (auto &&e) { + logger().debug("BtreeLBAManager::get_mapping: got mapping {}", *e); + return get_mapping_ret( + get_mapping_ertr::ready_future_marker{}, + std::move(e)); + }); } BtreeLBAManager::find_hole_ret diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h index 516defd14b407..6ded255f1bae7 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node.h @@ -50,8 +50,6 @@ using BtreeLBAPinRef = std::unique_ptr; */ struct LBANode : CachedExtent { using LBANodeRef = TCachedExtentRef; - using lookup_range_ertr = LBAManager::get_mappings_ertr; - using lookup_range_ret = LBAManager::get_mappings_ret; btree_range_pin_t pin; @@ -79,11 +77,24 @@ struct LBANode : CachedExtent { * * Returns mappings within range [addr, addr+len) */ + using lookup_range_ertr = LBAManager::get_mappings_ertr; + using lookup_range_ret = LBAManager::get_mappings_ret; virtual lookup_range_ret lookup_range( op_context_t c, laddr_t addr, extent_len_t len) = 0; + /** + * lookup_pin + * + * Returns the mapping at addr + */ + using lookup_pin_ertr = LBAManager::get_mapping_ertr; + using lookup_pin_ret = LBAManager::get_mapping_ret; + virtual lookup_pin_ret lookup_pin( + op_context_t c, + laddr_t addr) = 0; + /** * insert * diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc index fe03f8046fe3b..5139dae4ef42d 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.cc @@ -87,6 +87,22 @@ LBAInternalNode::lookup_range_ret LBAInternalNode::lookup_range( }); } +LBAInternalNode::lookup_pin_ret LBAInternalNode::lookup_pin( + op_context_t c, + laddr_t addr) +{ + auto iter = get_containing_child(addr); + return get_lba_btree_extent( + c, + this, + get_meta().depth - 1, + iter->get_val(), + get_paddr() + ).safe_then([c, addr] (LBANodeRef extent) { + return extent->lookup_pin(c, addr); + }).finally([ref=LBANodeRef(this)] {}); +} + LBAInternalNode::insert_ret LBAInternalNode::insert( op_context_t c, laddr_t laddr, @@ -486,6 +502,25 @@ LBALeafNode::lookup_range_ret LBALeafNode::lookup_range( std::move(ret)); } +LBALeafNode::lookup_pin_ret LBALeafNode::lookup_pin( + op_context_t c, + laddr_t addr) +{ + logger().debug("LBALeafNode::lookup_pin {}", addr); + auto iter = find(addr); + if (iter == end()) { + return crimson::ct_error::enoent::make(); + } + auto val = iter->get_val(); + auto begin = iter->get_key(); + return lookup_pin_ret( + lookup_pin_ertr::ready_future_marker{}, + std::make_unique( + this, + val.paddr.maybe_relative_to(get_paddr()), + lba_node_meta_t{ begin, begin + val.len, 0})); +} + LBALeafNode::insert_ret LBALeafNode::insert( op_context_t c, laddr_t laddr, diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h index e2cc70eb03a6d..07385e2ffaa4d 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree_node_impl.h @@ -99,6 +99,10 @@ struct LBAInternalNode laddr_t addr, extent_len_t len) final; + lookup_pin_ret lookup_pin( + op_context_t c, + laddr_t addr) final; + insert_ret insert( op_context_t c, laddr_t laddr, @@ -374,6 +378,10 @@ struct LBALeafNode laddr_t addr, extent_len_t len) final; + lookup_pin_ret lookup_pin( + op_context_t c, + laddr_t addr) final; + insert_ret insert( op_context_t c, laddr_t laddr, diff --git a/src/test/crimson/seastore/test_btree_lba_manager.cc b/src/test/crimson/seastore/test_btree_lba_manager.cc index 281ad92c0188d..131b7a6d65963 100644 --- a/src/test/crimson/seastore/test_btree_lba_manager.cc +++ b/src/test/crimson/seastore/test_btree_lba_manager.cc @@ -272,15 +272,23 @@ struct btree_lba_manager_test : void check_mappings(test_transaction_t &t) { for (auto &&i: t.mappings) { + auto laddr = i.first; + auto len = i.second.len; + auto ret_list = lba_manager->get_mappings( - *t.t, i.first, i.second.len + *t.t, laddr, len ).unsafe_get0(); EXPECT_EQ(ret_list.size(), 1); auto &ret = *ret_list.begin(); EXPECT_EQ(i.second.addr, ret->get_paddr()); - EXPECT_EQ(i.first, ret->get_laddr()); - EXPECT_EQ(i.second.len, ret->get_length()); - // TODO: test get_mapping() + EXPECT_EQ(laddr, ret->get_laddr()); + EXPECT_EQ(len, ret->get_length()); + + auto ret_pin = lba_manager->get_mapping( + *t.t, laddr).unsafe_get0(); + EXPECT_EQ(i.second.addr, ret_pin->get_paddr()); + EXPECT_EQ(laddr, ret_pin->get_laddr()); + EXPECT_EQ(len, ret_pin->get_length()); } lba_manager->scan_mappings( *t.t,