From 0d069f46af308f734229337c68e5856e0ff2c47f Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Thu, 5 Sep 2019 19:11:36 +0200 Subject: [PATCH] crimson/osd: dissect crc checking on reads into separated procedure. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/pg_backend.cc | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 58c087678eb5f..864bf77a57a13 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -210,6 +210,22 @@ PGBackend::evict_object_state(const hobject_t& oid) return seastar::now(); } +static inline bool _read_verify_data( + const object_info_t& oi, + const ceph::bufferlist& data) +{ + if (oi.is_data_digest() && oi.size == data.length()) { + // whole object? can we verify the checksum? + if (auto crc = data.crc32c(-1); crc != oi.data_digest) { + logger().error("full-object read crc {} != expected {} on {}", + crc, oi.data_digest, oi.soid); + // todo: mark soid missing, perform recovery, and retry + return false; + } + } + return true; +} + seastar::future PGBackend::read(const object_info_t& oi, size_t offset, size_t length, @@ -233,22 +249,13 @@ seastar::future PGBackend::read(const object_info_t& oi, // read size was trimmed to zero and it is expected to do nothing, return seastar::make_ready_future(); } - std::optional maybe_crc; - if (oi.is_data_digest() && offset == 0 && length >= oi.size) { - maybe_crc = oi.data_digest; - } return _read(oi.soid, offset, length, flags).then( - [maybe_crc, soid=oi.soid, size=oi.size](auto bl) { - // whole object? can we verify the checksum? - if (maybe_crc && bl.length() == size) { - if (auto crc = bl.crc32c(-1); crc != *maybe_crc) { - logger().error("full-object read crc {} != expected {} on {}", - crc, *maybe_crc, soid); - // todo: mark soid missing, perform recovery, and retry - throw crimson::osd::object_corrupted{}; - } + [&oi](auto&& bl) { + if (const bool is_fine = _read_verify_data(oi, bl); is_fine) { + return seastar::make_ready_future(std::move(bl)); + } else { + throw crimson::osd::object_corrupted{}; } - return seastar::make_ready_future(std::move(bl)); }); } -- 2.39.5