});
}
-Journal::read_record_metadata_ret Journal::read_record_metadata(
- paddr_t start)
+Journal::read_validate_record_metadata_ret Journal::read_validate_record_metadata(
+ paddr_t start,
+ segment_nonce_t nonce)
{
if (start.offset + block_size > (int64_t)segment_manager.get_segment_size()) {
- return read_record_metadata_ret(
- read_record_metadata_ertr::ready_future_marker{},
+ return read_validate_record_metadata_ret(
+ read_validate_record_metadata_ertr::ready_future_marker{},
std::nullopt);
}
return segment_manager.read(start, block_size
).safe_then(
- [this, start](bufferptr bptr) mutable
- -> read_record_metadata_ret {
- logger().debug("read_record_metadata: reading {}", start);
+ [=](bufferptr bptr) mutable
+ -> read_validate_record_metadata_ret {
+ logger().debug("read_validate_record_metadata: reading {}", start);
bufferlist bl;
bl.append(bptr);
auto bp = bl.cbegin();
try {
decode(header, bp);
} catch (ceph::buffer::error &e) {
- return read_record_metadata_ret(
- read_record_metadata_ertr::ready_future_marker{},
+ return read_validate_record_metadata_ret(
+ read_validate_record_metadata_ertr::ready_future_marker{},
+ std::nullopt);
+ }
+ if (header.segment_nonce != nonce) {
+ return read_validate_record_metadata_ret(
+ read_validate_record_metadata_ertr::ready_future_marker{},
std::nullopt);
}
if (header.mdlength > block_size) {
[header=std::move(header), bl=std::move(bl)](
auto &&bptail) mutable {
bl.push_back(bptail);
- return read_record_metadata_ret(
- read_record_metadata_ertr::ready_future_marker{},
+ return read_validate_record_metadata_ret(
+ read_validate_record_metadata_ertr::ready_future_marker{},
std::make_pair(std::move(header), std::move(bl)));
});
} else {
- return read_record_metadata_ret(
- read_record_metadata_ertr::ready_future_marker{},
- std::make_pair(std::move(header), std::move(bl))
- );
+ return read_validate_record_metadata_ret(
+ read_validate_record_metadata_ertr::ready_future_marker{},
+ std::make_pair(std::move(header), std::move(bl))
+ );
+ }
+ }).safe_then([=](auto p) {
+ if (p && validate_metadata(p->second)) {
+ return read_validate_record_metadata_ret(
+ read_validate_record_metadata_ertr::ready_future_marker{},
+ std::move(*p)
+ );
+ } else {
+ return read_validate_record_metadata_ret(
+ read_validate_record_metadata_ertr::ready_future_marker{},
+ std::nullopt);
}
});
}
[=](paddr_t ¤t) {
return crimson::do_until(
[=, ¤t]() -> scan_segment_ertr::future<bool> {
- return read_record_metadata(current).safe_then
+ return read_validate_record_metadata(current, nonce).safe_then
([=, ¤t](auto p)
-> scan_segment_ertr::future<bool> {
if (!p.has_value()) {
record_size_t rsize,
record_t &&record);
- /// validate metadata
+ /// validate embedded metadata checksum
static bool validate_metadata(const bufferlist &bl);
+ /// read and validate data
+ using read_validate_data_ertr = SegmentManager::read_ertr;
+ using read_validate_data_ret = read_validate_data_ertr::future<bool>;
+ read_validate_data_ret read_validate_data(
+ paddr_t record_base,
+ const record_header_t &header ///< caller must ensure lifetime through
+ /// future resolution
+ );
+
+
/// do record write
using write_record_ertr = crimson::errorator<
crimson::ct_error::input_output_error>;
replay_segments_t>;
find_replay_segments_fut find_replay_segments();
- /// read record metadata for record starting at start
- using read_record_metadata_ertr = replay_ertr;
- using read_record_metadata_ret = read_record_metadata_ertr::future<
- std::optional<std::pair<record_header_t, bufferlist>>
- >;
- read_record_metadata_ret read_record_metadata(
- paddr_t start);
-
/// attempts to decode deltas from bl, return nullopt if unsuccessful
std::optional<std::vector<delta_info_t>> try_decode_deltas(
record_header_t header,
record_header_t header,
bufferlist &bl);
+ /// read record metadata for record starting at start
+ using read_validate_record_metadata_ertr = replay_ertr;
+ using read_validate_record_metadata_ret =
+ read_validate_record_metadata_ertr::future<
+ std::optional<std::pair<record_header_t, bufferlist>>
+ >;
+ read_validate_record_metadata_ret read_validate_record_metadata(
+ paddr_t start,
+ segment_nonce_t nonce);
+
/**
* scan_segment
*