From: Zhang Song Date: Fri, 8 Aug 2025 07:50:52 +0000 (+0800) Subject: crimson/os/seastore: update logical bucket cache when processing X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c969a8b9b5784c4df75ccf80e89e3ae4f9c11b92;p=ceph.git crimson/os/seastore: update logical bucket cache when processing read/write transactions All client accessed extents are to be tracked by logical bucket cache before eviction Signed-off-by: Zhang Song Signed-off-by: Xuehan Xu --- diff --git a/src/common/hobject.h b/src/common/hobject.h index 2dbd2e298e0d..cb37b00cd8cf 100644 --- a/src/common/hobject.h +++ b/src/common/hobject.h @@ -60,6 +60,12 @@ public: static bool is_meta_pool(int64_t pool) { return pool == POOL_META; } + static int64_t get_logical_pool(int64_t pool) { + if (is_temp_pool(pool)) + return get_temp_pool(pool); // it's reversible + else + return pool; + } public: object_t oid; @@ -114,10 +120,7 @@ public: return is_meta_pool(pool); } int64_t get_logical_pool() const { - if (is_temp_pool(pool)) - return get_temp_pool(pool); // it's reversible - else - return pool; + return get_logical_pool(pool); } hobject_t() : snap(0), hash(0), max(false), pool(INT64_MIN) { diff --git a/src/crimson/os/seastore/object_data_handler.cc b/src/crimson/os/seastore/object_data_handler.cc index dd6153950607..8a0d683c065d 100644 --- a/src/crimson/os/seastore/object_data_handler.cc +++ b/src/crimson/os/seastore/object_data_handler.cc @@ -1590,6 +1590,8 @@ ObjectDataHandler::read_ret ObjectDataHandler::read( "ObjectDataHandler::read hit invalid error" ) ); + auto prefix = l_start.get_laddr().get_object_prefix(); + bool all_cold = true; for (auto &pin : rpins) { if (pin.mapping.is_zero_reserved()) { ret.append_zero(pin.unaligned_len); @@ -1608,6 +1610,13 @@ ObjectDataHandler::read_ret ObjectDataHandler::read( assert(pin.unaligned_start_offset == 0); ret.append(std::move(aligned_bl)); } + DEBUGT("got extent: {}", ctx.t, *maybe_indirect_extent.extent); + auto paddr = maybe_indirect_extent.extent->get_paddr(); + all_cold &= ctx.tm.is_cold_device(paddr.get_device_id()); + } + if (!all_cold) { + assert(ctx.tm.is_prefix_cached(prefix)); + ctx.tm.update_logical_bucket_for_read(prefix); } co_return std::move(ret); } diff --git a/src/crimson/os/seastore/transaction.h b/src/crimson/os/seastore/transaction.h index c7ff9071af94..73beb38d0f24 100644 --- a/src/crimson/os/seastore/transaction.h +++ b/src/crimson/os/seastore/transaction.h @@ -576,6 +576,7 @@ public: views.clear(); copied_lba_keys.clear(); update_copied_lba_key = nullptr; + touched_prefix.clear(); } bool did_reset() const { @@ -692,6 +693,14 @@ public: return cache_hint; } + void touch_laddr_prefix(laddr_t laddr) { + touched_prefix.insert(laddr.get_object_prefix()); + } + + std::unordered_set &get_touched_laddr_prefix() { + return touched_prefix; + } + btree_cursor_stats_t cursor_stats; bool force_rewrite_conflict = false; @@ -918,6 +927,8 @@ private: */ retired_extent_set_t retired_set; + std::unordered_set touched_prefix; + /// stats to collect when commit or invalidate tree_stats_t onode_tree_stats; tree_stats_t omap_tree_stats; // exclude omap tree depth diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index a32573a1cc92..8b9facf3f484 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -162,6 +162,10 @@ TransactionManager::mount() assert(paddr.is_absolute()); cache->update_tree_extents_num(type, 1); epm->mark_space_used(paddr, len); + if (support_logical_bucket() && + !epm->is_cold_device(paddr.get_device_id())) { + logical_bucket->move_to_top(laddr.get_object_prefix()); + } }); } else { return backref_manager->scan_mapped_space( @@ -188,6 +192,10 @@ TransactionManager::mount() assert(backref_key == P_ADDR_NULL); cache->update_tree_extents_num(type, 1); epm->mark_space_used(paddr, len); + if (support_logical_bucket() && + !epm->is_cold_device(paddr.get_device_id())) { + logical_bucket->move_to_top(laddr.get_object_prefix()); + } } }); } @@ -809,6 +817,11 @@ TransactionManager::do_submit_transaction( journal->get_trimmer().update_journal_tails( cache->get_oldest_dirty_from().value_or(start_seq), cache->get_oldest_backref_dirty_from().value_or(start_seq)); + if (support_logical_bucket()) { + for (auto &prefix : tref.get_touched_laddr_prefix()) { + logical_bucket->move_to_top(prefix.get_object_prefix()); + } + } }).handle_error( submit_transaction_iertr::pass_further{}, crimson::ct_error::assert_all("Hit error submitting to journal") @@ -1226,6 +1239,7 @@ TransactionManager::promote_extent( true, write_policy_t::WRITE_BACK }); + t.touch_laddr_prefix(orig_ext->get_laddr().get_object_prefix()); promoted_extents.reserve(promoted_raw_extents.size()); @@ -1276,6 +1290,7 @@ TransactionManager::promote_extent( lext->rewrite(t, *orig_ext, 0); assert(!extent->get_paddr().is_absolute() || !cache->is_on_cold_tier(lext->get_paddr())); + t.touch_laddr_prefix(orig_ext->get_laddr().get_object_prefix()); //TODO: this memory copy should be saved orig_ext->get_bptr().copy_out( 0, diff --git a/src/crimson/os/seastore/transaction_manager.h b/src/crimson/os/seastore/transaction_manager.h index 5c88925a7ddc..53272f5a6f43 100644 --- a/src/crimson/os/seastore/transaction_manager.h +++ b/src/crimson/os/seastore/transaction_manager.h @@ -625,6 +625,17 @@ public: exts.begin(), exts.end()), EXTENT_DEFAULT_REF_COUNT); } + auto &front = exts.front(); + if (front->get_write_policy() != write_policy_t::WRITE_THROUGH && + front->get_rewrite_generation() <= epm->get_max_hot_gen()) { + auto prefix = front->get_laddr().get_object_prefix(); + t.touch_laddr_prefix(prefix); + if (auto pool = prefix.get_pool(); + unlikely(hobject_t::is_temp_pool(pool))) { + prefix.set_pool(hobject_t::get_logical_pool(pool)); + t.touch_laddr_prefix(prefix); + } + } for (auto &ext : exts) { SUBDEBUGT(seastore_tm, "allocated {}", t, *ext); } @@ -851,6 +862,24 @@ public: }); } + // non-trivial method, should only be used in DEBUG build + bool is_prefix_cached(laddr_t prefix) { + if (!logical_bucket) { + return true; + } + return logical_bucket->is_cached(prefix); + } + + void update_logical_bucket_for_read(laddr_t prefix) { + if (logical_bucket) { + logical_bucket->move_to_top(prefix.get_object_prefix()); + } + } + + bool is_cold_device(device_id_t id) const { + return epm->is_cold_device(id); + } + /** * submit_transaction * @@ -1299,7 +1328,7 @@ public: } bool support_logical_bucket() const { - return logical_bucket != nullptr; + return epm->has_cold_tier() && logical_bucket != nullptr; } ~TransactionManager();