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.
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});
});
}
: 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});
});
});
}
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>;