]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/journal: tolerate journal rolls during commit
authorSamuel Just <sjust@redhat.com>
Tue, 19 Jan 2021 20:48:36 +0000 (12:48 -0800)
committerSamuel Just <sjust@redhat.com>
Mon, 1 Feb 2021 21:29:22 +0000 (13:29 -0800)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/journal.cc
src/crimson/os/seastore/journal.h

index a866058c5a63ca7775d5fd7fca0c3ac8b9c14c8c..f15e890193926245845fc0195e791acea25993ae 100644 (file)
@@ -191,6 +191,9 @@ Journal::write_record_ret Journal::write_record(
     rsize.mdlength,
     rsize.dlength,
     target);
+
+  auto segment_id = current_journal_segment->get_segment_id();
+
   // Start write under the current exclusive stage, but wait for it
   // in the device_submission concurrent stage to permit multiple
   // overlapping writes.
@@ -203,16 +206,22 @@ Journal::write_record_ret Journal::write_record(
       crimson::ct_error::assert_all{
        "Invalid error in Journal::write_record"
       }
-    ).safe_then([this, &handle] {
-      return handle.enter(write_pipeline->finalize);
-    }).safe_then([this, target] {
+    );
+  }).safe_then([this, &handle] {
+    return handle.enter(write_pipeline->finalize);
+  }).safe_then([this, target, segment_id] {
+    logger().debug(
+      "write_record: commit target {}",
+      target);
+    if (segment_id == current_journal_segment->get_segment_id()) {
+      assert(committed_to < target);
       committed_to = target;
-      return write_record_ret(
-       write_record_ertr::ready_future_marker{},
-       paddr_t{
-         current_journal_segment->get_segment_id(),
-         target});
-    });
+    }
+    return write_record_ret(
+      write_record_ertr::ready_future_marker{},
+      paddr_t{
+       segment_id,
+       target});
   });
 }
 
index ecdd64d316fc5ceeec070f13df7c74fa1807432e..85a665b43d0db9b282411e4b5e5e6270ce232499 100644 (file)
@@ -186,13 +186,14 @@ public:
       : roll_journal_segment_ertr::now();
     return roll.safe_then(
       [this, rsize, record=std::move(record), &handle]() mutable {
+       auto seq = next_journal_segment_seq - 1;
        return write_record(
          rsize, std::move(record),
          handle
-       ).safe_then([this, rsize](auto addr) {
+       ).safe_then([this, rsize, seq](auto addr) {
          return std::make_pair(
            addr.add_offset(rsize.mdlength),
-           get_journal_seq(addr));
+           journal_seq_t{seq, addr});
        });
       });
   }
@@ -250,10 +251,6 @@ private:
 
   WritePipeline *write_pipeline = nullptr;
 
-  journal_seq_t get_journal_seq(paddr_t addr) {
-    return journal_seq_t{next_journal_segment_seq-1, addr};
-  }
-
   /// prepare segment for writes, writes out segment header
   using initialize_segment_ertr = crimson::errorator<
     crimson::ct_error::input_output_error>;