]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/EPM: initialize logical bucket and pinboard
authorZhang Song <zhangsong02@qianxin.com>
Thu, 31 Jul 2025 03:07:44 +0000 (11:07 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Tue, 7 Jul 2026 08:15:30 +0000 (16:15 +0800)
Signed-off-by: Zhang Song <zhangsong02@qianxin.com>
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/common/options/crimson.yaml.in
src/crimson/os/seastore/cache.h
src/crimson/os/seastore/extent_placement_manager.cc
src/crimson/os/seastore/extent_placement_manager.h
src/crimson/os/seastore/transaction_manager.cc

index c1797f23af2ec461f278d1680d832fc1df62c8df..20e090ae6c9b6c0cc0ba5295b35f4d41fff8d568 100644 (file)
@@ -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
index f7b881da33a5d1cafff78dc87f8b68aefb84af57..b7b0fc046e6654efbb34ceb234eec32de4de07a6 100644 (file)
@@ -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) {
index c6110a28de35690a1c54338de0580c7559da3679..1b093789d8a963e77a142817195cd5f206ac342a 100644 (file)
@@ -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());
index 0f80e1c712549be7554e14cdf1445ad6032803f9..d0beffb88e33c14cf19ebb63c83ccb3426120c32 100644 (file)
@@ -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<double>(
             "seastore_multiple_tiers_stop_evict_ratio"),
@@ -767,9 +776,21 @@ private:
           crimson::common::get_conf<double>(
             "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<Option::size_t>("seastore_logical_bucket_capacity"),
+          get_conf<Option::size_t>("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())
index 2dc0f9dedf51d4ea8d33adb516fa89dd0b777b24..71eb8fdd6122e1ca95e968302b6604bb7452add1 100644 (file)
@@ -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: {}",