From 2d0a1b5e7e9ebf100e2a4e4e9b97bd49ffd6b658 Mon Sep 17 00:00:00 2001 From: Zhang Song Date: Wed, 3 Sep 2025 16:04:12 +0800 Subject: [PATCH] crimson/os/seastore: avoid evicting promoted extent to the cold tier Signed-off-by: Zhang Song Signed-off-by: Xuehan Xu --- src/crimson/os/seastore/cache.cc | 12 ++++++----- src/crimson/os/seastore/cache.h | 6 ++++-- .../os/seastore/extent_placement_manager.h | 13 +++++++++--- .../os/seastore/transaction_manager.cc | 21 +++++++++++++++---- src/crimson/os/seastore/transaction_manager.h | 6 ++++++ .../seastore/test_transaction_manager.cc | 3 ++- 6 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 7a3d9cf6481..f773456fb9d 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -1212,14 +1212,15 @@ CachedExtentRef Cache::alloc_new_non_data_extent_by_type( extent_types_t type, ///< [in] type tag extent_len_t length, ///< [in] length placement_hint_t hint, ///< [in] user hint - rewrite_gen_t gen ///< [in] rewrite generation + rewrite_gen_t gen, ///< [in] rewrite generation + bool is_tracked ) { LOG_PREFIX(Cache::alloc_new_non_data_extent_by_type); SUBDEBUGT(seastore_cache, "allocate {} 0x{:x}B, hint={}, gen={}", t, type, length, hint, rewrite_gen_printer_t{gen}); ceph_assert(get_extent_category(type) == data_category_t::METADATA); - auto opt = alloc_option_t{hint, gen}; + auto opt = alloc_option_t{hint, gen, is_tracked}; switch (type) { case extent_types_t::ROOT: ceph_assert(0 == "ROOT is never directly alloc'd"); @@ -1264,7 +1265,8 @@ std::vector Cache::alloc_new_data_extents_by_type( extent_types_t type, ///< [in] type tag extent_len_t length, ///< [in] length placement_hint_t hint, ///< [in] user hint - rewrite_gen_t gen ///< [in] rewrite generation + rewrite_gen_t gen, ///< [in] rewrite generation + bool is_tracked ) { LOG_PREFIX(Cache::alloc_new_data_extents_by_type); @@ -1276,14 +1278,14 @@ std::vector Cache::alloc_new_data_extents_by_type( case extent_types_t::OBJECT_DATA_BLOCK: { auto extents = alloc_new_data_extents< - ObjectDataBlock>(t, length, {hint, gen}); + ObjectDataBlock>(t, length, {hint, gen, is_tracked}); res.insert(res.begin(), extents.begin(), extents.end()); } return res; case extent_types_t::TEST_BLOCK: { auto extents = alloc_new_data_extents< - TestBlock>(t, length, {hint, gen}); + TestBlock>(t, length, {hint, gen, is_tracked}); res.insert(res.begin(), extents.begin(), extents.end()); } return res; diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 290c7dcf4ea..4baea5a1528 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -1280,7 +1280,8 @@ public: extent_types_t type, ///< [in] type tag extent_len_t length, ///< [in] length placement_hint_t hint, ///< [in] user hint - rewrite_gen_t gen ///< [in] rewrite generation + rewrite_gen_t gen, ///< [in] rewrite generation + bool is_tracked ); /** @@ -1293,7 +1294,8 @@ public: extent_types_t type, ///< [in] type tag extent_len_t length, ///< [in] length placement_hint_t hint, ///< [in] user hint - rewrite_gen_t gen ///< [in] rewrite generation + rewrite_gen_t gen, ///< [in] rewrite generation + bool is_tracked ); /** diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index 8685a3d04a2..0f80e1c7125 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -354,6 +354,7 @@ public: struct alloc_option_t { placement_hint_t hint; rewrite_gen_t gen; + bool is_tracked; #ifdef UNIT_TESTS_BUILT std::optional external_paddr = std::nullopt; #endif @@ -374,7 +375,7 @@ public: assert(opt.gen == INIT_GENERATION || opt.hint == placement_hint_t::REWRITE); data_category_t category = get_extent_category(type); - opt.gen = adjust_generation(category, type, opt.hint, opt.gen); + opt.gen = adjust_generation(category, type, opt.hint, opt.gen, opt.is_tracked); paddr_t addr; #ifdef UNIT_TESTS_BUILT @@ -414,7 +415,7 @@ public: assert(opt.gen == INIT_GENERATION || opt.hint == placement_hint_t::REWRITE); data_category_t category = get_extent_category(type); - opt.gen = adjust_generation(category, type, opt.hint, opt.gen); + opt.gen = adjust_generation(category, type, opt.hint, opt.gen, opt.is_tracked); assert(opt.gen != INLINE_GENERATION); // XXX: bp might be extended to point to different memory (e.g. PMem) @@ -620,7 +621,8 @@ private: data_category_t category, extent_types_t type, placement_hint_t hint, - rewrite_gen_t gen) { + rewrite_gen_t gen, + bool is_tracked) { assert(is_real_type(type)); if (is_root_type(type)) { gen = INLINE_GENERATION; @@ -655,6 +657,11 @@ private: gen = background_process.adjust_generation(gen); } + if (is_tracked && gen >= hot_tier_generations && + hint != placement_hint_t::REWRITE) { + gen = hot_tier_generations - 1; + } + if (gen > dynamic_max_rewrite_generation) { gen = dynamic_max_rewrite_generation; } diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 6a853f6c14f..648cfb90250 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -39,6 +39,7 @@ TransactionManager::TransactionManager( journal(std::move(_journal)), epm(std::move(_epm)), backref_manager(std::move(_backref_manager)), + logical_bucket(nullptr), full_extent_integrity_check( crimson::common::get_conf( "seastore_full_integrity_check")), @@ -802,6 +803,14 @@ TransactionManager::rewrite_logical_extent( ceph_abort(); } + bool is_tracked = + support_logical_bucket() && + // lextent is from hot tier + !epm->is_cold_device(extent->get_paddr().get_device_id()) && + // lextent is cached by non volatile cache + logical_bucket->is_cached( + extent->get_laddr().get_object_prefix()); + if (get_extent_category(extent->get_type()) == data_category_t::METADATA) { assert(extent->is_fully_loaded()); cache->retire_extent(t, extent); @@ -811,7 +820,8 @@ TransactionManager::rewrite_logical_extent( extent->get_length(), extent->get_user_hint(), // get target rewrite generation - extent->get_rewrite_generation())->cast(); + extent->get_rewrite_generation(), + is_tracked)->cast(); nextent->rewrite(t, *extent, 0); DEBUGT("rewriting meta -- {} to {}", t, *extent, *nextent); @@ -855,7 +865,8 @@ TransactionManager::rewrite_logical_extent( extent->get_length(), extent->get_user_hint(), // get target rewrite generation - extent->get_rewrite_generation()); + extent->get_rewrite_generation(), + is_tracked); extent_len_t off = 0; auto left = extent->get_length(); extent_ref_count_t refcount = 0; @@ -1147,7 +1158,8 @@ TransactionManager::promote_extent( orig_ext->get_type(), orig_ext->get_length(), placement_hint_t::HOT, - INIT_GENERATION); + INIT_GENERATION, + true); promoted_extents.reserve(promoted_raw_extents.size()); @@ -1191,7 +1203,8 @@ TransactionManager::promote_extent( orig_ext->get_type(), orig_ext->get_length(), placement_hint_t::HOT, - INIT_GENERATION); + INIT_GENERATION, + true); auto lext = promoted_extent->cast(); lext->set_laddr(orig_ext->get_laddr()); lext->rewrite(t, *orig_ext, 0); diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 1f7774fedcd..71a9bcf8e4d 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -26,6 +26,7 @@ #include "crimson/os/seastore/logging.h" #include "crimson/os/seastore/seastore_types.h" #include "crimson/os/seastore/cache.h" +#include "crimson/os/seastore/logical_bucket.h" #include "crimson/os/seastore/root_meta.h" #include "crimson/os/seastore/lba_manager.h" #include "crimson/os/seastore/backref_manager.h" @@ -1293,6 +1294,10 @@ public: co_return mapping; } + bool support_logical_bucket() const { + return logical_bucket != nullptr; + } + ~TransactionManager(); private: @@ -1305,6 +1310,7 @@ private: BackrefManagerRef backref_manager; WritePipeline write_pipeline; + LogicalBucket *logical_bucket; bool full_extent_integrity_check = true; diff --git a/src/test/crimson/seastore/test_transaction_manager.cc b/src/test/crimson/seastore/test_transaction_manager.cc index bafac7c0beb..d392042394f 100644 --- a/src/test/crimson/seastore/test_transaction_manager.cc +++ b/src/test/crimson/seastore/test_transaction_manager.cc @@ -1140,7 +1140,8 @@ struct transaction_manager_test_t : get_extent_category(t), t, placement_hint_t::HOT, - gen); + gen, + false); if (expected_generations[t][gen] != epm_gen) { logger().error("caller: {}, extent type: {}, input generation: {}, " "expected generation : {}, adjust result from EPM: {}", -- 2.47.3