]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/journal/segmented_journal: scan the journal for the
authorXuehan Xu <xuxuehan@qianxin.com>
Fri, 3 Jul 2026 10:10:54 +0000 (18:10 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Fri, 31 Jul 2026 01:40:20 +0000 (09:40 +0800)
allocation map on boot if the cold tier is an RBM one

Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/journal.cc
src/crimson/os/seastore/journal.h
src/crimson/os/seastore/journal/segmented_journal.cc
src/crimson/os/seastore/journal/segmented_journal.h
src/crimson/os/seastore/transaction_manager.cc
src/test/crimson/seastore/test_btree_lba_manager.cc
src/test/crimson/seastore/test_seastore_journal.cc

index 2f866de5db365aff1c538463475e1c64d8654eac..250fb76b18c12ae4d2aff03132ea640b62542039 100644 (file)
@@ -38,9 +38,11 @@ namespace journal {
 JournalRef make_segmented(
   store_index_t store_index,
   SegmentProvider &provider,
-  JournalTrimmer &trimmer)
+  JournalTrimmer &trimmer,
+  bool scan_alloc_on_boot)
 {
-  return std::make_unique<SegmentedJournal>(store_index, provider, trimmer);
+  return std::make_unique<SegmentedJournal>(
+    store_index, provider, trimmer, scan_alloc_on_boot);
 }
 
 JournalRef make_circularbounded(
index 6b757d02fa9c4d3bf16aca6aae1626739c788588..259ed714ab5a69b250b0426ac6dfa0aaf6560da8 100644 (file)
@@ -132,7 +132,8 @@ namespace journal {
 JournalRef make_segmented(
   store_index_t store_index,
   SegmentProvider &provider,
-  JournalTrimmer &trimmer);
+  JournalTrimmer &trimmer,
+  bool scan_alloc_on_boot);
 
 JournalRef make_circularbounded(
   store_index_t store_index,
index 130054f0fd1a813626f5aeae1a838a48f2627f1f..8557cb51e3d43b9c2de3547e95676654abacc4df 100644 (file)
@@ -30,7 +30,8 @@ namespace crimson::os::seastore::journal {
 SegmentedJournal::SegmentedJournal(
   store_index_t store_index,
   SegmentProvider &segment_provider,
-  JournalTrimmer &trimmer)
+  JournalTrimmer &trimmer,
+  bool scan_alloc_on_startup)
   : store_index(store_index),
     segment_seq_allocator(
       new SegmentSeqAllocator(segment_type_t::JOURNAL)),
@@ -49,7 +50,8 @@ SegmentedJournal::SegmentedJournal(
                        "seastore_journal_batch_preferred_fullness"),
                      journal_segment_allocator),
     sm_group(*segment_provider.get_segment_manager_group()),
-    trimmer{trimmer}
+    trimmer{trimmer},
+    scan_alloc_on_startup(scan_alloc_on_startup)
 {
 }
 
@@ -322,10 +324,19 @@ SegmentedJournal::replay_ret SegmentedJournal::replay(
   auto segment_headers = co_await sm_group.find_journal_segment_headers();
   INFO("got {} segments", segment_headers.size());
   co_await prep_replay_segments(std::move(segment_headers));
-  auto d_handler = [&handler, this](
+  alloc_map_t alloc_map;
+  if (scan_alloc_on_startup) {
+    alloc_map = co_await scan_alloc_map();
+  }
+  auto d_handler = [&handler, this, &alloc_map](
     const record_locator_t &locator,
     const delta_info_t &delta,
     sea_time_point modify_time) -> replay_ertr::future<bool> {
+    if (auto it = alloc_map.find(delta.paddr);
+        it != alloc_map.end() &&
+        it->second > locator.write_result.start_seq) {
+      co_return true;
+    }
     auto ret = co_await handler(
       locator,
       delta,
index 2b7135b2711fdd0f257f8f4d6370f9533e88e620..312fa48fbfcf4992c5cca271244324d104e66671 100644 (file)
@@ -28,7 +28,8 @@ public:
   SegmentedJournal(
       store_index_t store_index,
       SegmentProvider &segment_provider,
-      JournalTrimmer &trimmer);
+      JournalTrimmer &trimmer,
+      bool scan_alloc_on_startup);
   ~SegmentedJournal() {}
 
   JournalTrimmer &get_trimmer() final {
@@ -99,6 +100,7 @@ private:
     std::size_t num_dirty_deltas = 0;
   } stats;
 
+  const bool scan_alloc_on_startup = false;
   using replay_segments_t = std::vector<
     std::pair<journal_seq_t, segment_header_t>>;
   replay_segments_t replay_segments;
index 3fe575e0517fa044a62b0cec3e7ce562a9816390..f0fd2a5d222cf267ee1311c71a24c0372868447e 100644 (file)
@@ -1824,6 +1824,7 @@ TransactionManagerRef make_transaction_manager(
   JournalRef journal;
 
   AsyncCleanerRef cold_cleaner = nullptr;
+  bool scan_alloc_on_boot = false;
 
   if (cold_sms) {
     assert(!cold_rbs);
@@ -1844,6 +1845,7 @@ TransactionManagerRef make_transaction_manager(
     }
     cold_cleaner = std::move(segment_cleaner);
   } else if (cold_rbs) {
+    scan_alloc_on_boot = true;
     cold_cleaner = RBMCleaner::create(
       store_index,
       std::move(cold_rbs),
@@ -1871,7 +1873,8 @@ TransactionManagerRef make_transaction_manager(
     journal = journal::make_segmented(
       store_index,
       *segment_cleaner,
-      *journal_trimmer);
+      *journal_trimmer,
+      scan_alloc_on_boot);
   } else {
     cleaner = RBMCleaner::create(
       store_index,
index 79d54b9c4fe123b393e86019e5bf2daf041c9d4d..1973226de4cd023f5b55e2acc1f1524494e21f73 100644 (file)
@@ -138,7 +138,7 @@ struct btree_test_base :
         segment_manager::get_ephemeral_device_config(0, 1, 0));
     }).safe_then([this] {
       sms.reset(new SegmentManagerGroup());
-      journal = journal::make_segmented(0, *this, *this);
+      journal = journal::make_segmented(0, *this, *this, false);
       rewrite_gen_t hot_tier_generations = crimson::common::get_conf<uint64_t>(
        "seastore_hot_tier_generations");
       rewrite_gen_t cold_tier_generations = crimson::common::get_conf<uint64_t>(
index 77d57acf8b93b5cfa81f53cb0495cfc4c0f75026..13e738269c47eebadf1e7a7f00970ff34f1d46e2 100644 (file)
@@ -157,7 +157,7 @@ struct journal_test_t : seastar_test_suite_t, SegmentProvider, JournalTrimmer {
       block_size = segment_manager->get_block_size();
       sms.reset(new SegmentManagerGroup());
       next = segment_id_t(segment_manager->get_device_id(), 0);
-      journal = journal::make_segmented(0, *this, *this);
+      journal = journal::make_segmented(0, *this, *this, false);
       journal->set_write_pipeline(&pipeline);
       sms->add_segment_manager(segment_manager.get());
       return journal->open_for_mkfs();
@@ -182,7 +182,7 @@ struct journal_test_t : seastar_test_suite_t, SegmentProvider, JournalTrimmer {
   auto replay(T &&f) {
     return journal->close(
     ).safe_then([this, f=std::move(f)]() mutable {
-      journal = journal::make_segmented(0, *this, *this);
+      journal = journal::make_segmented(0, *this, *this, false);
       journal->set_write_pipeline(&pipeline);
       return journal->replay(std::forward<T>(std::move(f)));
     }).safe_then([this] {