From: Samuel Just Date: Tue, 19 Jan 2021 20:48:36 +0000 (-0800) Subject: crimson/os/seastore/journal: tolerate journal rolls during commit X-Git-Tag: v17.1.0~3095^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=dfb1adaed6c6b4c1bba2cdbeadefb37521be1cc0;p=ceph.git crimson/os/seastore/journal: tolerate journal rolls during commit Signed-off-by: Samuel Just --- diff --git a/src/crimson/os/seastore/journal.cc b/src/crimson/os/seastore/journal.cc index a866058c5a63c..f15e890193926 100644 --- a/src/crimson/os/seastore/journal.cc +++ b/src/crimson/os/seastore/journal.cc @@ -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}); }); } diff --git a/src/crimson/os/seastore/journal.h b/src/crimson/os/seastore/journal.h index ecdd64d316fc5..85a665b43d0db 100644 --- a/src/crimson/os/seastore/journal.h +++ b/src/crimson/os/seastore/journal.h @@ -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>;