From: Xuehan Xu Date: Fri, 3 Jul 2026 10:10:54 +0000 (+0800) Subject: crimson/os/seastore/journal/segmented_journal: scan the journal for the X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=64263d609d9c6979160ac98e8fd427515a76c7be;p=ceph.git crimson/os/seastore/journal/segmented_journal: scan the journal for the allocation map on boot if the cold tier is an RBM one Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/journal.cc b/src/crimson/os/seastore/journal.cc index 2f866de5db36..250fb76b18c1 100644 --- a/src/crimson/os/seastore/journal.cc +++ b/src/crimson/os/seastore/journal.cc @@ -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(store_index, provider, trimmer); + return std::make_unique( + store_index, provider, trimmer, scan_alloc_on_boot); } JournalRef make_circularbounded( diff --git a/src/crimson/os/seastore/journal.h b/src/crimson/os/seastore/journal.h index 6b757d02fa9c..259ed714ab5a 100644 --- a/src/crimson/os/seastore/journal.h +++ b/src/crimson/os/seastore/journal.h @@ -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, diff --git a/src/crimson/os/seastore/journal/segmented_journal.cc b/src/crimson/os/seastore/journal/segmented_journal.cc index 130054f0fd1a..8557cb51e3d4 100644 --- a/src/crimson/os/seastore/journal/segmented_journal.cc +++ b/src/crimson/os/seastore/journal/segmented_journal.cc @@ -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 { + 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, diff --git a/src/crimson/os/seastore/journal/segmented_journal.h b/src/crimson/os/seastore/journal/segmented_journal.h index 2b7135b2711f..312fa48fbfcf 100644 --- a/src/crimson/os/seastore/journal/segmented_journal.h +++ b/src/crimson/os/seastore/journal/segmented_journal.h @@ -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>; replay_segments_t replay_segments; diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 3fe575e0517f..f0fd2a5d222c 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -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, diff --git a/src/test/crimson/seastore/test_btree_lba_manager.cc b/src/test/crimson/seastore/test_btree_lba_manager.cc index 79d54b9c4fe1..1973226de4cd 100644 --- a/src/test/crimson/seastore/test_btree_lba_manager.cc +++ b/src/test/crimson/seastore/test_btree_lba_manager.cc @@ -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( "seastore_hot_tier_generations"); rewrite_gen_t cold_tier_generations = crimson::common::get_conf( diff --git a/src/test/crimson/seastore/test_seastore_journal.cc b/src/test/crimson/seastore/test_seastore_journal.cc index 77d57acf8b93..13e738269c47 100644 --- a/src/test/crimson/seastore/test_seastore_journal.cc +++ b/src/test/crimson/seastore/test_seastore_journal.cc @@ -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(std::move(f))); }).safe_then([this] {