]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/journal: return next write location from open_for_write
authorSamuel Just <sjust@redhat.com>
Thu, 20 Aug 2020 20:54:38 +0000 (13:54 -0700)
committerSamuel Just <sjust@redhat.com>
Fri, 25 Sep 2020 19:41:11 +0000 (12:41 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/journal.cc
src/crimson/os/seastore/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 0e900b081b319b1f4261f124905c87926717ed03..fa1e1b2a9fb2f424f12eb3479519a5a21d1712f8 100644 (file)
@@ -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<segment_seq_t>
+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<segment_seq_t>
 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<segment_off_t>(block_size)}
+      });
+  });
 }
 
 Journal::find_replay_segments_fut Journal::find_replay_segments()
index a08b8fc1bf81e03d2eead24c0205863fea325bc4..81885af3a7b1e2de89e5708c81d347c250cebb9b 100644 (file)
@@ -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<journal_seq_t>;
+  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<segment_seq_t> 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<segment_seq_t> roll_journal_segment();
 
   /// returns true iff current segment has insufficient space
   bool needs_roll(segment_off_t length) const;
index d5152df9b505d972f7d6890e71d4531573ef2526..0b7f88e2ef717a34fcc6cce49fca54830d7d1be6 100644 (file)
@@ -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(),
index 28059c4c90138533f130f12b26097d52e3a7751a..3b58a0ccacef980017f5f3163b2652a716bee58f 100644 (file)
@@ -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) {
index 2529f3753fea010b597ef2136b369862cd8b735b..2f4c87476b8c07474cd35627916c44d643357672 100644 (file)
@@ -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");
        }