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
*/
struct LBANode : CachedExtent {
using LBANodeRef = TCachedExtentRef<LBANode>;
- using lookup_range_ertr = LBAManager::get_mappings_ertr;
- using lookup_range_ret = LBAManager::get_mappings_ret;
btree_range_pin_t pin;
*
* 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
*
});
}
+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,
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<BtreeLBAPin>(
+ 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,
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,
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,
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,