DEBUG(
"initialize header block in CircularJournalSpace length {}, head: {}",
bl.length(), header);
- return write_header(
- ).safe_then([this]() {
- return open_ret(
- open_ertr::ready_future_marker{},
- get_written_to());
- }).handle_error(
+ co_await write_header(
+ ).handle_error(
open_ertr::pass_further{},
crimson::ct_error::assert_all{
- "Invalid error write_header"
+ "Invalid error write_header"
}
);
+
+ co_return get_written_to();
}
ceph_assert(initialized);
if (written_to.segment_seq == NULL_SEG_SEQ) {
written_to.segment_seq = 0;
}
- return open_ret(
- open_ertr::ready_future_marker{},
- get_written_to());
+ co_return get_written_to();
}
ceph::bufferlist CircularJournalSpace::encode_header()
LOG_PREFIX(CircularJournalSpace::device_write_bl);
auto length = bl.length();
if (offset + length >= get_journal_end()) {
- return crimson::ct_error::erange::make();
+ co_return co_await submit_ertr::future<>(crimson::ct_error::erange::make());
}
DEBUG(
"overwrite in CircularJournalSpace, offset {}, length {}",
offset,
length);
- return device->writev(offset, bl
+ co_await device->writev(offset, bl
).handle_error(
submit_ertr::pass_further{},
crimson::ct_error::assert_all{ "Invalid error device->write" }
auto bptr = bufferptr(ceph::buffer::create_page_aligned(
device->get_block_size()));
DEBUG("reading {}", device->get_shard_journal_start());
- return device->read(device->get_shard_journal_start(), bptr
- ).safe_then([bptr, FNAME, this]() mutable
- -> read_header_ret {
- bufferlist bl;
- bl.append(bptr);
- auto bp = bl.cbegin();
- cbj_header_t cbj_header;
- try {
- decode(cbj_header, bp);
- } catch (ceph::buffer::error &e) {
- ERROR("unable to read header block");
- return crimson::ct_error::enoent::make();
- }
- if (!device->is_end_to_end_data_protection()) {
- auto bliter = bl.cbegin();
- auto test_crc = bliter.crc32c(
- ceph::encoded_sizeof_bounded<cbj_header_t>(),
- -1);
- ceph_le32 recorded_crc_le;
- decode(recorded_crc_le, bliter);
- uint32_t recorded_crc = recorded_crc_le;
- if (test_crc != recorded_crc) {
- ERROR("error, header crc mismatch.");
- return read_header_ret(
- read_header_ertr::ready_future_marker{},
- std::nullopt);
- }
+ co_await device->read(device->get_shard_journal_start(), bptr);
+
+ bufferlist bl;
+ bl.append(bptr);
+ auto bp = bl.cbegin();
+ cbj_header_t cbj_header;
+ bool decode_failed = false;
+ try {
+ decode(cbj_header, bp);
+ } catch (ceph::buffer::error &e) {
+ ERROR("unable to read header block");
+ decode_failed = true;
+ }
+ if (decode_failed) {
+ co_return co_await read_header_ret(crimson::ct_error::enoent::make());
+ }
+ if (!device->is_end_to_end_data_protection()) {
+ auto bliter = bl.cbegin();
+ auto test_crc = bliter.crc32c(
+ ceph::encoded_sizeof_bounded<cbj_header_t>(),
+ -1);
+ ceph_le32 recorded_crc_le;
+ decode(recorded_crc_le, bliter);
+ uint32_t recorded_crc = recorded_crc_le;
+ if (test_crc != recorded_crc) {
+ ERROR("error, header crc mismatch.");
+ co_return std::nullopt;
}
- return read_header_ret(
- read_header_ertr::ready_future_marker{},
- std::make_pair(cbj_header, bl)
- );
- });
+ }
+ co_return std::make_pair(cbj_header, bl);
}
CircularJournalSpace::submit_ertr::future<>
assert(bl.length() < get_block_size());
bufferptr bp = bufferptr(ceph::buffer::create_page_aligned(get_block_size()));
iter.copy(bl.length(), bp.c_str());
- return device->write(device->get_shard_journal_start(), std::move(bp)
+ co_await device->write(device->get_shard_journal_start(), std::move(bp)
).handle_error(
submit_ertr::pass_further{},
crimson::ct_error::assert_all{ "Invalid error device->write" }