From 945e7fc11f1bbf30c719442e9fb37dc8a2a65ffe Mon Sep 17 00:00:00 2001 From: Yingxin Cheng Date: Fri, 22 Jul 2022 17:00:51 +0800 Subject: [PATCH] crimson/os/seastore: consider dirty tail during replay Signed-off-by: Yingxin Cheng --- src/crimson/os/seastore/cache.cc | 47 +++++++++++++------ src/crimson/os/seastore/cache.h | 4 +- src/crimson/os/seastore/journal.h | 4 +- .../journal/circular_bounded_journal.cc | 4 +- .../os/seastore/journal/segmented_journal.cc | 1 + .../os/seastore/transaction_manager.cc | 4 +- src/test/crimson/seastore/test_cbjournal.cc | 6 ++- .../crimson/seastore/test_seastore_journal.cc | 3 +- 8 files changed, 50 insertions(+), 23 deletions(-) diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index ff127f14c47..10931802032 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -1598,30 +1598,28 @@ Cache::replay_delta( journal_seq_t journal_seq, paddr_t record_base, const delta_info_t &delta, + const journal_seq_t &dirty_tail, const journal_seq_t &alloc_tail, sea_time_point &modify_time) { LOG_PREFIX(Cache::replay_delta); + assert(dirty_tail != JOURNAL_SEQ_NULL); assert(alloc_tail != JOURNAL_SEQ_NULL); ceph_assert(modify_time != NULL_TIME); - if (delta.type == extent_types_t::ROOT) { - TRACE("replay root delta at {} {}, remove extent ... -- {}, prv_root={}", - journal_seq, record_base, delta, *root); - remove_extent(root); - root->apply_delta_and_adjust_crc(record_base, delta.bl); - root->dirty_from_or_retired_at = journal_seq; - root->state = CachedExtent::extent_state_t::DIRTY; - DEBUG("replayed root delta at {} {}, add extent -- {}, root={}", - journal_seq, record_base, delta, *root); - root->set_modify_time(modify_time); - add_extent(root); + + if (delta.type == extent_types_t::JOURNAL_TAIL) { + // this delta should have been dealt with during segment cleaner mounting return replay_delta_ertr::now(); - } else if (delta.type == extent_types_t::ALLOC_INFO) { + } + + // replay alloc + if (delta.type == extent_types_t::ALLOC_INFO) { if (journal_seq < alloc_tail) { DEBUG("journal_seq {} < alloc_tail {}, don't replay {}", journal_seq, alloc_tail, delta); return replay_delta_ertr::now(); } + alloc_delta_t alloc_delta; decode(alloc_delta, delta.bl); std::vector backref_list; @@ -1640,11 +1638,30 @@ Cache::replay_delta( alloc_blk.type, journal_seq)); } - if (!backref_list.empty()) + if (!backref_list.empty()) { backref_batch_update(std::move(backref_list), journal_seq); + } return replay_delta_ertr::now(); - } else if (delta.type == extent_types_t::JOURNAL_TAIL) { - // this delta should have been dealt with during segment cleaner mounting + } + + // replay dirty + if (journal_seq < dirty_tail) { + DEBUG("journal_seq {} < dirty_tail {}, don't replay {}", + journal_seq, alloc_tail, delta); + return replay_delta_ertr::now(); + } + + if (delta.type == extent_types_t::ROOT) { + TRACE("replay root delta at {} {}, remove extent ... -- {}, prv_root={}", + journal_seq, record_base, delta, *root); + remove_extent(root); + root->apply_delta_and_adjust_crc(record_base, delta.bl); + root->dirty_from_or_retired_at = journal_seq; + root->state = CachedExtent::extent_state_t::DIRTY; + DEBUG("replayed root delta at {} {}, add extent -- {}, root={}", + journal_seq, record_base, delta, *root); + root->set_modify_time(modify_time); + add_extent(root); return replay_delta_ertr::now(); } else { auto _get_extent_if_cached = [this](paddr_t addr) diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 76fb5370896..e763264d41d 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -763,8 +763,8 @@ public: journal_seq_t seq, paddr_t record_block_base, const delta_info_t &delta, - const journal_seq_t &, // journal seq from which alloc - // delta should be replayed + const journal_seq_t &dirty_tail, + const journal_seq_t &alloc_tail, sea_time_point &modify_time); /** diff --git a/src/crimson/os/seastore/journal.h b/src/crimson/os/seastore/journal.h index f50d229f32d..05a8434a33d 100644 --- a/src/crimson/os/seastore/journal.h +++ b/src/crimson/os/seastore/journal.h @@ -93,8 +93,8 @@ public: using delta_handler_t = std::function< replay_ret(const record_locator_t&, const delta_info_t&, - const journal_seq_t, // journal seq from which - // alloc delta should replayed + const journal_seq_t&, // dirty_tail + const journal_seq_t&, // alloc_tail sea_time_point modify_time)>; virtual replay_ret replay( delta_handler_t &&delta_handler) = 0; diff --git a/src/crimson/os/seastore/journal/circular_bounded_journal.cc b/src/crimson/os/seastore/journal/circular_bounded_journal.cc index 766dbe7cba6..289b3fa4383 100644 --- a/src/crimson/os/seastore/journal/circular_bounded_journal.cc +++ b/src/crimson/os/seastore/journal/circular_bounded_journal.cc @@ -392,9 +392,11 @@ Journal::replay_ret CircularBoundedJournal::replay( &d_handler](auto& p) { auto& modify_time = p.first; auto& delta = p.second; - return d_handler(locator, + return d_handler( + locator, delta, locator.write_result.start_seq, + locator.write_result.start_seq, modify_time); }); }).safe_then([]() { diff --git a/src/crimson/os/seastore/journal/segmented_journal.cc b/src/crimson/os/seastore/journal/segmented_journal.cc index 24ada40f736..a8b3c043a6f 100644 --- a/src/crimson/os/seastore/journal/segmented_journal.cc +++ b/src/crimson/os/seastore/journal/segmented_journal.cc @@ -309,6 +309,7 @@ SegmentedJournal::replay_segment( return handler( locator, delta, + segment_provider.get_dirty_tail(), segment_provider.get_alloc_tail(), modify_time); }); diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index a02221de572..272c66958f6 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -91,7 +91,8 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount() [this]( const auto &offsets, const auto &e, - const journal_seq_t alloc_tail, + const journal_seq_t &dirty_tail, + const journal_seq_t &alloc_tail, auto modify_time) { auto start_seq = offsets.write_result.start_seq; @@ -102,6 +103,7 @@ TransactionManager::mount_ertr::future<> TransactionManager::mount() start_seq, offsets.record_block_base, e, + dirty_tail, alloc_tail, modify_time); }); diff --git a/src/test/crimson/seastore/test_cbjournal.cc b/src/test/crimson/seastore/test_cbjournal.cc index 0d1709c62ee..58cce663a92 100644 --- a/src/test/crimson/seastore/test_cbjournal.cc +++ b/src/test/crimson/seastore/test_cbjournal.cc @@ -212,7 +212,11 @@ struct cbjournal_test_t : public seastar_test_suite_t auto replay() { cbj->replay( - [this](const auto &offsets, const auto &e, auto j_seq, auto last_modified) + [this](const auto &offsets, + const auto &e, + auto &dirty_seq, + auto &alloc_seq, + auto last_modified) -> Journal::replay_ret { bool found = false; for (auto &i : entries) { diff --git a/src/test/crimson/seastore/test_seastore_journal.cc b/src/test/crimson/seastore/test_seastore_journal.cc index 3b116482ca1..2a0f6b16f83 100644 --- a/src/test/crimson/seastore/test_seastore_journal.cc +++ b/src/test/crimson/seastore/test_seastore_journal.cc @@ -197,7 +197,8 @@ struct journal_test_t : seastar_test_suite_t, SegmentProvider { &delta_checker] (const auto &offsets, const auto &di, - const journal_seq_t, + const journal_seq_t &, + const journal_seq_t &, auto t) mutable { if (!delta_checker) { EXPECT_FALSE("No Deltas Left"); -- 2.39.5