From: Yingxin Cheng Date: Fri, 22 Jul 2022 09:00:51 +0000 (+0800) Subject: crimson/os/seastore: consider dirty tail during replay X-Git-Tag: v18.0.0~426^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=945e7fc11f1bbf30c719442e9fb37dc8a2a65ffe;p=ceph.git crimson/os/seastore: consider dirty tail during replay Signed-off-by: Yingxin Cheng --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index ff127f14c47a..109318020329 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 76fb53708969..e763264d41dc 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 f50d229f32dd..05a8434a33db 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 766dbe7cba6d..289b3fa43835 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 24ada40f7366..a8b3c043a6fd 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 a02221de5723..272c66958f67 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 0d1709c62eec..58cce663a926 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 3b116482ca18..2a0f6b16f83a 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");