]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore: ensure extent is loaded if missing from cache wip-logstoremanager
authormyoungwon oh <ohmyoungwon@gmail.com>
Wed, 25 Feb 2026 12:58:53 +0000 (21:58 +0900)
committermyoungwon oh <ohmyoungwon@gmail.com>
Thu, 26 Feb 2026 02:09:24 +0000 (11:09 +0900)
Signed-off-by: Myoungwon Oh <ohmyoungwon@gmail.com>
src/crimson/os/seastore/omap_manager/log/log_manager.cc

index 73178502c41dc7ab7cad7c72268df25e98264959..58c87054ec542bfc96ccabe7faafcedd1a5358c0 100644 (file)
@@ -68,14 +68,24 @@ LogManager::omap_set_keys(
   std::pair<std::string, ceph::bufferlist> 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> {
     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<LogNode>(
+       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<LogNode>();
     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<LogNode>();
       }
       LogNodeRef cur = e;