From: Xuehan Xu Date: Wed, 11 Jun 2025 07:26:23 +0000 (+0800) Subject: crimson/os/seastore/cache: add maybe_wait_accessible() for lba bottom-up X-Git-Tag: testing/wip-vshankar-testing-20250710.130520-debug~43^2~7 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=11f33e0f0e7a7dfde75817ad16a1e4b5e893ecb7;p=ceph-ci.git crimson/os/seastore/cache: add maybe_wait_accessible() for lba bottom-up search Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index e7a78fe2383..f0e65ee9235 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -464,6 +464,73 @@ public: return view->is_data_stable(); } + get_extent_iertr::future<> maybe_wait_accessible( + Transaction &t, + CachedExtent &extent) final { + // as of now, only lba tree nodes can go in here, + // so it must be fully loaded. + assert(extent.is_valid()); + assert(extent.is_fully_loaded()); + const auto t_src = t.get_src(); + auto ext_type = extent.get_type(); + assert(!is_retired_placeholder_type(ext_type)); + cache_access_stats_t& access_stats = get_by_ext( + get_by_src(stats.access_by_src_ext, t_src), + ext_type); + if (extent.is_stable()) { + // stable from trans-view + bool needs_touch = false, needs_step_2 = false; + assert(!extent.is_pending_in_trans(t.get_trans_id())); + auto ret = t.maybe_add_to_read_set(&extent); + if (ret.added) { + if (extent.is_stable_dirty()) { + ++access_stats.cache_dirty; + ++stats.access.cache_dirty; + } else { + ++access_stats.cache_lru; + ++stats.access.cache_lru; + } + if (ret.is_paddr_known) { + touch_extent(extent, &t_src, t.get_cache_hint()); + } else { + needs_touch = true; + } + } else { + // already exists + if (extent.is_stable_dirty()) { + ++access_stats.trans_dirty; + ++stats.access.trans_dirty; + } else { + ++access_stats.trans_lru; + ++stats.access.trans_lru; + } + } + // step 2 maybe reordered after wait_io(), + // always try step 2 if paddr unknown + needs_step_2 = !ret.is_paddr_known; + + return trans_intr::make_interruptible( + extent.wait_io() + ).then_interruptible([&extent, needs_touch, + needs_step_2, &t, this, t_src] { + if (needs_step_2) { + t.maybe_add_to_read_set_step_2(&extent); + } + if (needs_touch) { + touch_extent(extent, &t_src, t.get_cache_hint()); + } + return get_extent_iertr::now(); + }); + } else { + assert(extent.is_mutable()); + assert(!extent.is_pending_io()); + assert(extent.is_pending_in_trans(t.get_trans_id())); + ++access_stats.trans_pending; + ++stats.access.trans_pending; + return get_extent_iertr::now(); + } + } + get_extent_iertr::future get_extent_viewable_by_trans( Transaction &t, diff --git a/src/crimson/os/seastore/linked_tree_node.h b/src/crimson/os/seastore/linked_tree_node.h index 61415c75934..809268d8a61 100644 --- a/src/crimson/os/seastore/linked_tree_node.h +++ b/src/crimson/os/seastore/linked_tree_node.h @@ -249,6 +249,8 @@ public: return ext->template cast(); }); } + virtual get_child_iertr::future<> maybe_wait_accessible( + Transaction &, CachedExtent&) = 0; virtual bool is_viewable_extent_data_stable(Transaction &, CachedExtentRef) = 0; virtual bool is_viewable_extent_stable(Transaction &, CachedExtentRef) = 0; virtual ~ExtentTransViewRetriever() {}