From: Xuehan Xu Date: Thu, 31 Jul 2025 13:41:37 +0000 (+0800) Subject: crimson/os/seastore/btree: allow fixed-kv-btree to query Cache when X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6692edfe70ccf9aac71a2f5f5c054d29ea3d4545;p=ceph.git crimson/os/seastore/btree: allow fixed-kv-btree to query Cache when getting child nodes during the booting Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/btree/fixed_kv_btree.h b/src/crimson/os/seastore/btree/fixed_kv_btree.h index 954cca7fd69..275a0406ecc 100644 --- a/src/crimson/os/seastore/btree/fixed_kv_btree.h +++ b/src/crimson/os/seastore/btree/fixed_kv_btree.h @@ -1437,7 +1437,7 @@ private: } } }; - return c.cache.template get_absent_extent( + return c.cache.template maybe_get_absent_extent( c.trans, offset, node_size, @@ -1521,7 +1521,7 @@ private: } } }; - return c.cache.template get_absent_extent( + return c.cache.template maybe_get_absent_extent( c.trans, offset, node_size, diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 71f94ad059a..06f23c8f3d2 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -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(extent_init_func)); } + template + get_extent_iertr::future> 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( + offset, length, 0, length, + std::forward(extent_init_func), std::move(f), &t_src) + ); + } + return get_absent_extent(t, offset, length, 0, length, + std::forward(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; diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 075d38287cf..8f004894eba 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -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{},