From: Zhang Song Date: Thu, 31 Jul 2025 03:07:44 +0000 (+0800) Subject: crimson/os/seastore/EPM: initialize logical bucket and pinboard X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ae9050ae07f268a0fa0400e1fa12a4da9c2aa83e;p=ceph-ci.git crimson/os/seastore/EPM: initialize logical bucket and pinboard Signed-off-by: Zhang Song Signed-off-by: Xuehan Xu --- diff --git a/src/common/options/crimson.yaml.in b/src/common/options/crimson.yaml.in index c1797f23af2..20e090ae6c9 100644 --- a/src/common/options/crimson.yaml.in +++ b/src/common/options/crimson.yaml.in @@ -336,3 +336,13 @@ options: level: advanced desc: Size in bytes of extents to be promoted from cold devices, set 0 to disable promotion default: 2_M +- name: seastore_logical_bucket_capacity + type: size + level: advanced + desc: Size in bytes of memory used by logical bucket + default: 200_M +- name: seastore_logical_bucket_proceed_size_per_cycle + type: size + level: advanced + desc: Size in bytes of extents to be demoted from logical bucket + default: 2_M diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index f7b881da33a..b7b0fc046e6 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -746,6 +746,10 @@ public: return epm.get_block_size(); } + ExtentPinboard *get_extent_pinboard() { + return pinboard.get(); + } + // Interfaces only for tests. public: CachedExtentRef test_query_cache(paddr_t offset) { diff --git a/src/crimson/os/seastore/extent_placement_manager.cc b/src/crimson/os/seastore/extent_placement_manager.cc index c6110a28de3..1b093789d8a 100644 --- a/src/crimson/os/seastore/extent_placement_manager.cc +++ b/src/crimson/os/seastore/extent_placement_manager.cc @@ -192,7 +192,8 @@ SegmentedOolWriter::alloc_write_ool_extents( void ExtentPlacementManager::init( JournalTrimmerImplRef &&trimmer, AsyncCleanerRef &&cleaner, - AsyncCleanerRef &&cold_cleaner) + AsyncCleanerRef &&cold_cleaner, + ExtentPinboard *pinboard) { LOG_PREFIX(ExtentPlacementManager::init); writer_refs.clear(); @@ -279,7 +280,8 @@ void ExtentPlacementManager::init( background_process.init(std::move(trimmer), std::move(cleaner), std::move(cold_cleaner), - hot_tier_generations); + hot_tier_generations, + pinboard); if (cold_segment_cleaner) { ceph_assert(get_main_backend_type() == backend_type_t::SEGMENTED); ceph_assert(background_process.has_cold_tier()); diff --git a/src/crimson/os/seastore/extent_placement_manager.h b/src/crimson/os/seastore/extent_placement_manager.h index 0f80e1c7125..d0beffb88e3 100644 --- a/src/crimson/os/seastore/extent_placement_manager.h +++ b/src/crimson/os/seastore/extent_placement_manager.h @@ -11,6 +11,8 @@ #include "crimson/os/seastore/journal/segment_allocator.h" #include "crimson/os/seastore/journal/record_submitter.h" #include "crimson/os/seastore/transaction.h" +#include "crimson/os/seastore/extent_pinboard.h" +#include "crimson/os/seastore/logical_bucket.h" #include "crimson/os/seastore/random_block_manager.h" #include "crimson/os/seastore/random_block_manager/block_rb_manager.h" #include "crimson/os/seastore/randomblock_manager_group.h" @@ -290,7 +292,8 @@ public: cold_tier_generations, hot_tier_generations); } - void init(JournalTrimmerImplRef &&, AsyncCleanerRef &&, AsyncCleanerRef &&); + void init(JournalTrimmerImplRef &&, AsyncCleanerRef &&, AsyncCleanerRef &&, + ExtentPinboard *pinboard); SegmentSeqAllocator &get_ool_segment_seq_allocator() const { return *ool_segment_seq_allocator; @@ -333,6 +336,10 @@ public: bool report_detail, double seconds) const; + LogicalBucket *get_logical_bucket() { + return background_process.get_logical_bucket(); + } + using mount_ertr = crimson::errorator< crimson::ct_error::input_output_error>; using mount_ret = mount_ertr::future<>; @@ -742,7 +749,8 @@ private: void init(JournalTrimmerImplRef &&_trimmer, AsyncCleanerRef &&_cleaner, AsyncCleanerRef &&_cold_cleaner, - rewrite_gen_t hot_tier_generations) { + rewrite_gen_t hot_tier_generations, + ExtentPinboard *_pinboard) { trimmer = std::move(_trimmer); trimmer->set_background_callback(this); main_cleaner = std::move(_cleaner); @@ -759,6 +767,7 @@ private: cleaners_by_device_id[id] = cold_cleaner.get(); } + using crimson::common::get_conf; eviction_state.init( crimson::common::get_conf( "seastore_multiple_tiers_stop_evict_ratio"), @@ -767,9 +776,21 @@ private: crimson::common::get_conf( "seastore_multiple_tiers_fast_evict_ratio"), hot_tier_generations); + + pinboard = _pinboard; + ceph_assert(pinboard != nullptr); + pinboard->set_background_callback(this); + + logical_bucket = create_logical_bucket( + get_conf("seastore_logical_bucket_capacity"), + get_conf("seastore_logical_bucket_proceed_size_per_cycle")); } } + LogicalBucket *get_logical_bucket() { + return logical_bucket.get(); + } + backend_type_t get_backend_type() const { return trimmer->get_backend_type(); } @@ -796,6 +817,8 @@ private: main_cleaner->set_extent_callback(cb); if (has_cold_tier()) { cold_cleaner->set_extent_callback(cb); + pinboard->set_extent_callback(cb); + logical_bucket->set_extent_callback(cb); } } @@ -972,7 +995,8 @@ private: bool main_cleaner_should_fast_evict() const { return has_cold_tier() && - main_cleaner->can_clean_space() && + (main_cleaner->can_clean_space() || + (logical_bucket && logical_bucket->could_demote())) && eviction_state.is_fast_mode(); } @@ -1135,6 +1159,8 @@ private: JournalTrimmerImplRef trimmer; AsyncCleanerRef main_cleaner; + ExtentPinboard *pinboard = nullptr; + LogicalBucketRef logical_bucket; /* * cold tier (optional, see has_cold_tier()) diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 2dc0f9dedf5..71eb8fdd612 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -47,6 +47,10 @@ TransactionManager::TransactionManager( { epm->set_extent_callback(this); journal->set_write_pipeline(&write_pipeline); + if (epm->has_cold_tier()) { + logical_bucket = epm->get_logical_bucket(); + assert(support_logical_bucket()); + } } TransactionManager::mkfs_ertr::future<> TransactionManager::mkfs() @@ -1530,7 +1534,8 @@ TransactionManagerRef make_transaction_manager( epm->init(std::move(journal_trimmer), std::move(cleaner), - std::move(cold_segment_cleaner)); + std::move(cold_segment_cleaner), + cache->get_extent_pinboard()); epm->set_primary_device(primary_device); INFO("main backend type: {}, cold tier: {}",