]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/btree: allow fixed-kv-btree to query Cache when
authorXuehan Xu <xuxuehan@qianxin.com>
Thu, 31 Jul 2025 13:41:37 +0000 (21:41 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Tue, 12 Aug 2025 05:43:25 +0000 (13:43 +0800)
getting child nodes during the booting

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/btree/fixed_kv_btree.h
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/transaction_manager.cc

index 954cca7fd692417c2bbed4e7fa269f38aae22346..275a0406ecc44efb9a02e8a82d98e2f5a607d01c 100644 (file)
@@ -1437,7 +1437,7 @@ private:
         }
       }
     };
-    return c.cache.template get_absent_extent<internal_node_t>(
+    return c.cache.template maybe_get_absent_extent<internal_node_t>(
       c.trans,
       offset,
       node_size,
@@ -1521,7 +1521,7 @@ private:
         }
       }
     };
-    return c.cache.template get_absent_extent<leaf_node_t>(
+    return c.cache.template maybe_get_absent_extent<leaf_node_t>(
       c.trans,
       offset,
       node_size,
index 71f94ad059aa8b102998c2ecff83ca00124e8683..06f23c8f3d290ee04606b60ae468b36715e49df6 100644 (file)
@@ -411,6 +411,7 @@ public:
 
     SUBTRACET(seastore_cache, "{} {}~0x{:x} is absent on t, query cache ...",
              t, T::TYPE, offset, length);
+    ceph_assert(!booting);
     const auto t_src = t.get_src();
 
     // partial read
@@ -468,6 +469,49 @@ public:
       std::forward<Func>(extent_init_func));
   }
 
+  template <typename T, typename Func>
+  get_extent_iertr::future<TCachedExtentRef<T>> maybe_get_absent_extent(
+    Transaction &t,
+    paddr_t offset,
+    extent_len_t length,
+    Func &&extent_init_func) {
+    LOG_PREFIX(Cache::maybe_get_absent_extent);
+    if (unlikely(booting)) {
+#ifndef NDEBUG
+      CachedExtentRef ret;
+      auto r = t.get_extent(offset, &ret);
+      if (r != Transaction::get_extent_ret::ABSENT) {
+       SUBERRORT(seastore_cache, "unexpected non-absent extent {}", t, *ret);
+       ceph_abort();
+      }
+#endif
+
+      SUBTRACET(seastore_cache, "{} {}~0x{:x} is absent on t, query cache ...",
+               t, T::TYPE, offset, length);
+      const auto t_src = t.get_src();
+      auto f = [&t, this, t_src](CachedExtent &ext) {
+       // XXX: is_stable_dirty() may not be linked in lba tree
+       assert(ext.is_stable());
+       assert(T::TYPE == ext.get_type());
+       cache_access_stats_t& access_stats = get_by_ext(
+         get_by_src(stats.access_by_src_ext, t_src),
+         T::TYPE);
+       ++access_stats.load_absent;
+       ++stats.access.load_absent;
+
+       t.add_to_read_set(CachedExtentRef(&ext));
+       touch_extent_fully(ext, &t_src, t.get_cache_hint());
+      };
+      return trans_intr::make_interruptible(
+       do_get_caching_extent<T>(
+         offset, length, 0, length,
+         std::forward<Func>(extent_init_func), std::move(f), &t_src)
+      );
+    }
+    return get_absent_extent<T>(t, offset, length, 0, length,
+      std::forward<Func>(extent_init_func));
+  }
+
   CachedExtentRef peek_extent_viewable_by_trans(
     Transaction &t,
     CachedExtentRef extent) final
@@ -1557,6 +1601,9 @@ public:
     return stats.omap_tree_depth;
   }
 
+  void boot_done() {
+    booting = false;
+  }
 private:
   void touch_extent_fully(
       CachedExtent &ext,
@@ -1943,6 +1990,8 @@ private:
       return CachedExtentRef();
     }
   }
+
+  bool booting = true;
 };
 using CacheRef = std::unique_ptr<Cache>;
 
index 075d38287cf98ca4ba35aa5ef16d408a47999b04..8f004894eba43c2fb1c5185a0c0c4785b8da73e8 100644 (file)
@@ -174,6 +174,7 @@ TransactionManager::mount()
     return epm->open_for_write();
   }).safe_then([FNAME, this] {
     epm->start_background();
+    cache->boot_done();
     INFO("done");
   }).handle_error(
     mount_ertr::pass_further{},