From: Zhang Song Date: Wed, 3 Sep 2025 08:04:12 +0000 (+0800) Subject: crimson/os/seastore: avoid evicting promoted extent to the cold tier X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3f2b9584783bf475c5e4e7e023c585ba753c29a4;p=ceph.git crimson/os/seastore: avoid evicting promoted extent to the cold tier Signed-off-by: Zhang Song Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 1ec98a9b5a2c..5bcd0adf5b6a 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 8e70ba9434e0..873bc7294f97 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 8685a3d04a27..0f80e1c71254 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 2454c7d1cc96..cf99f1202721 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")), @@ -854,6 +855,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); @@ -863,7 +872,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); @@ -907,7 +917,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; @@ -1199,7 +1210,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()); @@ -1243,7 +1255,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 fe6f816efc36..985cf5321ed4 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 dd7ef23c37d3..834304bcdb4d 100644 --- a/src/test/crimson/seastore/test_transaction_manager.cc +++ b/src/test/crimson/seastore/test_transaction_manager.cc @@ -1149,7 +1149,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: {}",