From 931ae4679cadc78f15e6abb2499e86a073876685 Mon Sep 17 00:00:00 2001 From: myoungwon oh Date: Wed, 25 Feb 2026 21:58:53 +0900 Subject: [PATCH] crimson/os/seastore: ensure extent is loaded if missing from cache Signed-off-by: Myoungwon Oh --- .../seastore/omap_manager/log/log_manager.cc | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/crimson/os/seastore/omap_manager/log/log_manager.cc b/src/crimson/os/seastore/omap_manager/log/log_manager.cc index 73178502c41..58c87054ec5 100644 --- a/src/crimson/os/seastore/omap_manager/log/log_manager.cc +++ b/src/crimson/os/seastore/omap_manager/log/log_manager.cc @@ -68,14 +68,24 @@ LogManager::omap_set_keys( std::pair ow_kv; // To prevent missing remove_kv even when overwritten is not done bool ow_done = false; - auto f = [&](const std::string &k, const bufferlist &v, bool has_ow_key) - -> omap_set_key_ret { + auto resync_node = [&](LogNodeRef e) + -> log_load_extent_iertr::future { CachedExtentRef node; Transaction::get_extent_ret ret; // To find mutable extent in the same transaction - ret = t.get_extent(ext->get_paddr(), &node); + ret = t.get_extent(e->get_paddr(), &node); assert(ret == Transaction::get_extent_ret::PRESENT); - assert(node); + if (!node) { + // Do full reload if not cached + node = co_await log_load_extent( + t, e->get_laddr(), BEGIN_KEY, END_KEY); + } + ceph_assert(node); + co_return std::move(node); + }; + auto f = [&](const std::string &k, const bufferlist &v, bool has_ow_key) + -> omap_set_key_ret { + CachedExtentRef node = co_await resync_node(ext); LogNodeRef log_node = node->template cast(); bool can_ow = has_ow_key && log_node->can_ow(); if (can_ow) { @@ -142,11 +152,7 @@ LogManager::omap_set_keys( if (!is_log_key(p.first)) { co_await remove_kv(t, log_root.addr, p.first, nullptr); // reload latest log list e because e was updated if the key is in e - CachedExtentRef node; - Transaction::get_extent_ret ret; - ret = t.get_extent(e->get_paddr(), &node); - assert(ret == Transaction::get_extent_ret::PRESENT); - assert(node); + CachedExtentRef node = co_await resync_node(e); e = node->template cast(); } LogNodeRef cur = e; -- 2.47.3