From: Samuel Just Date: Thu, 2 Dec 2021 21:45:47 +0000 (+0000) Subject: crimson/os/seastore/lba_manager: initialize lba node pins using get_extent X-Git-Tag: v17.1.0~289^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=4fefd8004343413d1097df2b0e02b6eaed8de86e;p=ceph.git crimson/os/seastore/lba_manager: initialize lba node pins using get_extent Signed-off-by: Samuel Just --- 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 cd51ab9a0b1e6..11d23f8bfc0d7 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 @@ -409,22 +409,17 @@ BtreeLBAManager::get_physical_extent_if_live( segment_off_t len) { ceph_assert(is_lba_node(type)); - return cache.get_extent_by_type( - t, - type, - addr, - laddr, - len - ).si_then([=, &t](CachedExtentRef extent) { - auto c = get_context(t); - return with_btree_ret( - c, - [c, extent](auto &btree) { - return btree.init_cached_extent( - c, - extent); - }); - }); + auto c = get_context(t); + return with_btree_ret( + c, + [c, type, addr, laddr, len](auto &btree) { + if (type == extent_types_t::LADDR_INTERNAL) { + return btree.get_internal_if_live(c, addr, laddr, len); + } else { + assert(type == extent_types_t::LADDR_LEAF); + return btree.get_leaf_if_live(c, addr, laddr, len); + } + }); } BtreeLBAManager::BtreeLBAManager( diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc b/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc index 2d1a7aba64dc9..8f48affe1f4a3 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree.cc @@ -336,6 +336,76 @@ LBABtree::init_cached_extent_ret LBABtree::init_cached_extent( } } +LBABtree::get_internal_if_live_ret +LBABtree::get_internal_if_live( + op_context_t c, + paddr_t addr, + laddr_t laddr, + segment_off_t len) +{ + LOG_PREFIX(BtreeLBAManager::get_leaf_if_live); + return lower_bound( + c, laddr + ).si_then([FNAME, c, addr, laddr, len](auto iter) { + for (depth_t d = 2; d <= iter.get_depth(); ++d) { + CachedExtent &node = *iter.get_internal(d).node; + auto internal_node = node.cast(); + if (internal_node->get_paddr() == addr) { + DEBUGT( + "extent laddr {} addr {}~{} found: {}", + c.trans, + laddr, + addr, + len, + *internal_node); + assert(internal_node->get_node_meta().begin == laddr); + return CachedExtentRef(internal_node); + } + } + DEBUGT( + "extent laddr {} addr {}~{} is not live, no matching internal node", + c.trans, + laddr, + addr, + len); + return CachedExtentRef(); + }); +} + +LBABtree::get_leaf_if_live_ret +LBABtree::get_leaf_if_live( + op_context_t c, + paddr_t addr, + laddr_t laddr, + segment_off_t len) +{ + LOG_PREFIX(BtreeLBAManager::get_leaf_if_live); + return lower_bound( + c, laddr + ).si_then([FNAME, c, addr, laddr, len](auto iter) { + if (iter.leaf.node->get_paddr() == addr) { + DEBUGT( + "extent laddr {} addr {}~{} found: {}", + c.trans, + laddr, + addr, + len, + *iter.leaf.node); + return CachedExtentRef(iter.leaf.node); + } else { + DEBUGT( + "extent laddr {} addr {}~{} is not live, does not match node {}", + c.trans, + laddr, + addr, + len, + *iter.leaf.node); + return CachedExtentRef(); + } + }); +} + + LBABtree::rewrite_lba_extent_ret LBABtree::rewrite_lba_extent( op_context_t c, CachedExtentRef e) @@ -408,27 +478,35 @@ LBABtree::get_internal_node_ret LBABtree::get_internal_node( offset, depth); assert(depth > 1); + auto init_internal = [c, depth](LBAInternalNode &node) { + auto meta = node.get_meta(); + if (node.get_size()) { + ceph_assert(meta.begin <= node.begin()->get_key()); + ceph_assert(meta.end > (node.end() - 1)->get_key()); + } + ceph_assert(depth == meta.depth); + assert(!node.is_pending()); + assert(!node.pin.is_linked()); + node.pin.set_range(meta); + if (c.pins) { + c.pins->add_pin(node.pin); + } + }; return c.cache.get_extent( c.trans, offset, - LBA_BLOCK_SIZE - ).si_then([FNAME, c, offset, depth](LBAInternalNodeRef ret) { + LBA_BLOCK_SIZE, + init_internal + ).si_then([FNAME, c, offset, init_internal](LBAInternalNodeRef ret) { DEBUGT( "read internal at offset {} {}", c.trans, offset, *ret); - auto meta = ret->get_meta(); - if (ret->get_size()) { - ceph_assert(meta.begin <= ret->begin()->get_key()); - ceph_assert(meta.end > (ret->end() - 1)->get_key()); - } - ceph_assert(depth == meta.depth); - if (!ret->is_pending() && !ret->pin.is_linked()) { - ret->pin.set_range(meta); - if (c.pins) { - c.pins->add_pin(ret->pin); - } + // This can only happen during init_cached_extent + if (c.pins && !ret->is_pending() && !ret->pin.is_linked()) { + assert(ret->is_dirty()); + init_internal(*ret); } return get_internal_node_ret( interruptible::ready_future_marker{}, @@ -445,27 +523,35 @@ LBABtree::get_leaf_node_ret LBABtree::get_leaf_node( "reading leaf at offset {}", c.trans, offset); + auto init_leaf = [c](LBALeafNode &node) { + auto meta = node.get_meta(); + if (node.get_size()) { + ceph_assert(meta.begin <= node.begin()->get_key()); + ceph_assert(meta.end > (node.end() - 1)->get_key()); + } + ceph_assert(1 == meta.depth); + assert(!node.is_pending()); + assert(!node.pin.is_linked()); + node.pin.set_range(meta); + if (c.pins) { + c.pins->add_pin(node.pin); + } + }; return c.cache.get_extent( c.trans, offset, - LBA_BLOCK_SIZE - ).si_then([FNAME, c, offset](LBALeafNodeRef ret) { + LBA_BLOCK_SIZE, + init_leaf + ).si_then([FNAME, c, offset, init_leaf](LBALeafNodeRef ret) { DEBUGT( "read leaf at offset {} {}", c.trans, offset, *ret); - auto meta = ret->get_meta(); - if (ret->get_size()) { - ceph_assert(meta.begin <= ret->begin()->get_key()); - ceph_assert(meta.end > (ret->end() - 1)->get_key()); - } - ceph_assert(1 == meta.depth); - if (!ret->is_pending() && !ret->pin.is_linked()) { - ret->pin.set_range(meta); - if (c.pins) { - c.pins->add_pin(ret->pin); - } + // This can only happen during init_cached_extent + if (c.pins && !ret->is_pending() && !ret->pin.is_linked()) { + assert(ret->is_dirty()); + init_leaf(*ret); } return get_leaf_node_ret( interruptible::ready_future_marker{}, diff --git a/src/crimson/os/seastore/lba_manager/btree/lba_btree.h b/src/crimson/os/seastore/lba_manager/btree/lba_btree.h index 078113c09d425..f78f49ddc9607 100644 --- a/src/crimson/os/seastore/lba_manager/btree/lba_btree.h +++ b/src/crimson/os/seastore/lba_manager/btree/lba_btree.h @@ -384,6 +384,24 @@ public: using init_cached_extent_ret = init_cached_extent_iertr::future; init_cached_extent_ret init_cached_extent(op_context_t c, CachedExtentRef e); + /// get_leaf_if_live: get leaf node at laddr/addr if still live + using get_leaf_if_live_iertr = base_iertr; + using get_leaf_if_live_ret = get_leaf_if_live_iertr::future; + get_leaf_if_live_ret get_leaf_if_live( + op_context_t c, + paddr_t addr, + laddr_t laddr, + segment_off_t len); + + /// get_internal_if_live: get internal node at laddr/addr if still live + using get_internal_if_live_iertr = base_iertr; + using get_internal_if_live_ret = get_internal_if_live_iertr::future; + get_internal_if_live_ret get_internal_if_live( + op_context_t c, + paddr_t addr, + laddr_t laddr, + segment_off_t len); + /** * rewrite_lba_extent *