From 88b98841172b7b458a409ab94e4f23192b7f7426 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 20 Aug 2020 13:54:38 -0700 Subject: [PATCH] crimson/os/seastore/journal: return next write location from open_for_write Signed-off-by: Samuel Just --- src/crimson/os/seastore/journal.cc | 25 +++++++++++++------ src/crimson/os/seastore/journal.h | 11 ++++---- .../os/seastore/transaction_manager.cc | 2 +- .../seastore/test_btree_lba_manager.cc | 2 +- .../crimson/seastore/test_seastore_journal.cc | 5 ++-- 5 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/crimson/os/seastore/journal.cc b/src/crimson/os/seastore/journal.cc index 0e900b081b319..fa1e1b2a9fb2f 100644 --- a/src/crimson/os/seastore/journal.cc +++ b/src/crimson/os/seastore/journal.cc @@ -25,8 +25,8 @@ Journal::Journal(SegmentManager &segment_manager) segment_manager(segment_manager) {} -Journal::initialize_segment_ertr::future<> Journal::initialize_segment( - Segment &segment) +Journal::initialize_segment_ertr::future +Journal::initialize_segment(Segment &segment) { auto new_tail = segment_provider->get_journal_tail_target(); logger().debug( @@ -36,8 +36,9 @@ Journal::initialize_segment_ertr::future<> Journal::initialize_segment( // write out header ceph_assert(segment.get_write_ptr() == 0); bufferlist bl; + segment_seq_t seq = current_journal_segment_seq++; auto header = segment_header_t{ - current_journal_segment_seq++, + seq, segment.get_segment_id(), segment_provider->get_journal_tail_target()}; ::encode(header, bl); @@ -46,8 +47,9 @@ Journal::initialize_segment_ertr::future<> Journal::initialize_segment( return segment.write(0, bl).safe_then( [=] { segment_provider->update_journal_tail_committed(new_tail); + return seq; }, - init_ertr::pass_further{}, + initialize_segment_ertr::pass_further{}, crimson::ct_error::assert_all{ "TODO" }); } @@ -128,7 +130,7 @@ bool Journal::needs_roll(segment_off_t length) const current_journal_segment->get_write_capacity(); } -Journal::roll_journal_segment_ertr::future<> +Journal::roll_journal_segment_ertr::future Journal::roll_journal_segment() { auto old_segment_id = current_journal_segment ? @@ -159,9 +161,18 @@ Journal::roll_journal_segment() ); } -Journal::init_ertr::future<> Journal::open_for_write() +Journal::open_for_write_ret Journal::open_for_write() { - return roll_journal_segment(); + return roll_journal_segment().safe_then([this](auto seq) { + return open_for_write_ret( + open_for_write_ertr::ready_future_marker{}, + journal_seq_t{ + seq, + paddr_t{ + current_journal_segment->get_segment_id(), + static_cast(block_size)} + }); + }); } Journal::find_replay_segments_fut Journal::find_replay_segments() diff --git a/src/crimson/os/seastore/journal.h b/src/crimson/os/seastore/journal.h index a08b8fc1bf81e..81885af3a7b1e 100644 --- a/src/crimson/os/seastore/journal.h +++ b/src/crimson/os/seastore/journal.h @@ -105,10 +105,11 @@ public: * to submit_record. Should be called after replay if not a new * Journal. */ - using init_ertr = crimson::errorator< + using open_for_write_ertr = crimson::errorator< crimson::ct_error::input_output_error >; - init_ertr::future<> open_for_write(); + using open_for_write_ret = open_for_write_ertr::future; + open_for_write_ret open_for_write(); /** * close journal @@ -138,7 +139,7 @@ public: return crimson::ct_error::erange::make(); } auto roll = needs_roll(total) - ? roll_journal_segment() + ? roll_journal_segment().safe_then([](auto){}) : roll_journal_segment_ertr::now(); return roll.safe_then( [this, rsize, record=std::move(record)]() mutable { @@ -186,7 +187,7 @@ private: /// prepare segment for writes, writes out segment header using initialize_segment_ertr = crimson::errorator< crimson::ct_error::input_output_error>; - initialize_segment_ertr::future<> initialize_segment( + initialize_segment_ertr::future initialize_segment( Segment &segment); struct record_size_t { @@ -222,7 +223,7 @@ private: /// close current segment and initialize next one using roll_journal_segment_ertr = crimson::errorator< crimson::ct_error::input_output_error>; - roll_journal_segment_ertr::future<> roll_journal_segment(); + roll_journal_segment_ertr::future roll_journal_segment(); /// returns true iff current segment has insufficient space bool needs_roll(segment_off_t length) const; diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index d5152df9b505d..0b7f88e2ef717 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -33,7 +33,7 @@ TransactionManager::TransactionManager( TransactionManager::mkfs_ertr::future<> TransactionManager::mkfs() { - return journal.open_for_write().safe_then([this] { + return journal.open_for_write().safe_then([this](auto addr) { logger().debug("TransactionManager::mkfs: about to do_with"); return seastar::do_with( create_transaction(), diff --git a/src/test/crimson/seastore/test_btree_lba_manager.cc b/src/test/crimson/seastore/test_btree_lba_manager.cc index 28059c4c90138..3b58a0ccacef9 100644 --- a/src/test/crimson/seastore/test_btree_lba_manager.cc +++ b/src/test/crimson/seastore/test_btree_lba_manager.cc @@ -79,7 +79,7 @@ struct btree_lba_manager_test : return segment_manager->init( ).safe_then([this] { return journal.open_for_write(); - }).safe_then([this] { + }).safe_then([this](auto addr) { return seastar::do_with( make_transaction(), [this](auto &transaction) { diff --git a/src/test/crimson/seastore/test_seastore_journal.cc b/src/test/crimson/seastore/test_seastore_journal.cc index 2529f3753fea0..2f4c87476b8c0 100644 --- a/src/test/crimson/seastore/test_seastore_journal.cc +++ b/src/test/crimson/seastore/test_seastore_journal.cc @@ -98,7 +98,8 @@ struct journal_test_t : seastar_test_suite_t, JournalSegmentProvider { return segment_manager->init( ).safe_then([this] { return journal->open_for_write(); - }).handle_error( + }).safe_then( + [](auto){}, crimson::ct_error::all_same_way([] { ASSERT_FALSE("Unable to mount"); })); @@ -134,7 +135,7 @@ struct journal_test_t : seastar_test_suite_t, JournalSegmentProvider { replay( [&advance, &delta_checker] - (auto base, const auto &di) mutable { + (auto seq, auto base, const auto &di) mutable { if (!delta_checker) { EXPECT_FALSE("No Deltas Left"); } -- 2.39.5