From: Zhang Song Date: Thu, 19 Jun 2025 02:18:13 +0000 (+0800) Subject: crimson/os/seastore: set laddr before touch_extent during replay X-Git-Tag: testing/wip-vshankar-testing-20250805.100115-debug~40^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=89ef637e62653d6142c2e1f56ff39bee614f34dd;p=ceph-ci.git crimson/os/seastore: set laddr before touch_extent during replay Signed-off-by: Zhang Song --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 4bc45f6c5e4..ba068e171de 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -2076,7 +2076,12 @@ Cache::replay_delta( delta.laddr, delta.length, [](CachedExtent &) {}, - [this](CachedExtent &ext) { + [this, laddr=delta.laddr](CachedExtent &ext) { + assert(ext.is_logical() == (laddr != L_ADDR_NULL)); + if (ext.is_logical()) { + // ExtentPinboardTwoQ requires the laddr is set for warm out queue. + ext.cast()->set_laddr(laddr); + } // replay is not included by the cache hit metrics touch_extent(ext, nullptr, CACHE_HINT_TOUCH); }, @@ -2246,101 +2251,93 @@ Cache::do_get_caching_extent_by_type( extent_init_func_t &&on_cache, const Transaction::src_t* p_src) { - return [=, this, extent_init_func=std::move(extent_init_func)]() mutable { - switch (type) { - case extent_types_t::ROOT: - ceph_assert(0 == "ROOT is never directly read"); - return get_extent_ertr::make_ready_future(); - case extent_types_t::BACKREF_INTERNAL: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::BACKREF_LEAF: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::LADDR_INTERNAL: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::LADDR_LEAF: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::ROOT_META: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::OMAP_INNER: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::OMAP_LEAF: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::COLL_BLOCK: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::ONODE_BLOCK_STAGED: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::OBJECT_DATA_BLOCK: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::RETIRED_PLACEHOLDER: - ceph_assert(0 == "impossible"); - return get_extent_ertr::make_ready_future(); - case extent_types_t::TEST_BLOCK: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::TEST_BLOCK_PHYSICAL: - return do_get_caching_extent( - offset, length, std::move(extent_init_func), std::move(on_cache), p_src - ).safe_then([](auto extent) { - return CachedExtentRef(extent.detach(), false /* add_ref */); - }); - case extent_types_t::NONE: { - ceph_assert(0 == "NONE is an invalid extent type"); - return get_extent_ertr::make_ready_future(); - } - default: - ceph_assert(0 == "impossible"); - return get_extent_ertr::make_ready_future(); - } - }().safe_then([laddr](CachedExtentRef e) { - assert(e->is_logical() == (laddr != L_ADDR_NULL)); - if (e->is_logical()) { - e->cast()->set_laddr(laddr); - } - return get_extent_ertr::make_ready_future(e); - }); + switch (type) { + case extent_types_t::ROOT: + ceph_assert(0 == "ROOT is never directly read"); + return get_extent_ertr::make_ready_future(); + case extent_types_t::BACKREF_INTERNAL: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::BACKREF_LEAF: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::LADDR_INTERNAL: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::LADDR_LEAF: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::ROOT_META: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::OMAP_INNER: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::OMAP_LEAF: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::COLL_BLOCK: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::ONODE_BLOCK_STAGED: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::OBJECT_DATA_BLOCK: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::RETIRED_PLACEHOLDER: + ceph_assert(0 == "impossible"); + return get_extent_ertr::make_ready_future(); + case extent_types_t::TEST_BLOCK: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::TEST_BLOCK_PHYSICAL: + return do_get_caching_extent( + offset, length, std::move(extent_init_func), std::move(on_cache), p_src + ).safe_then([](auto extent) { + return CachedExtentRef(extent.detach(), false /* add_ref */); + }); + case extent_types_t::NONE: { + ceph_assert(0 == "NONE is an invalid extent type"); + return get_extent_ertr::make_ready_future(); + } + default: + ceph_assert(0 == "impossible"); + return get_extent_ertr::make_ready_future(); + } } cache_stats_t Cache::get_stats(