From bdfb2391f4ffdad24d594ecb672d80b5dcd253b8 Mon Sep 17 00:00:00 2001 From: Jianpeng Ma Date: Mon, 14 Sep 2015 13:53:06 +0800 Subject: [PATCH] osd/ReplicatedPG: Add verify checksum for SPARSE_READ. Signed-off-by: Jianpeng Ma --- src/osd/ReplicatedPG.cc | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index ce65cbd1c1c5..6e3b10155362 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -3968,7 +3968,7 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) } else { // read into a buffer bufferlist bl; - int total_read = 0; + uint32_t total_read = 0; int r = osd->store->fiemap(coll, ghobject_t(soid, ghobject_t::NO_GEN, info.pgid.shard), op.extent.offset, op.extent.length, bl); @@ -4027,6 +4027,22 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) break; } + // Why SPARSE_READ need checksum? In fact, librbd always use sparse-read. + // Maybe at first, there is no much whole objects. With continued use, more and more whole object exist. + // So from this point, for spare-read add checksum make sense. + if (total_read == oi.size && oi.is_data_digest()) { + uint32_t crc = data_bl.crc32c(-1); + if (oi.data_digest != crc) { + osd->clog->error() << info.pgid << std::hex + << " full-object read crc 0x" << crc + << " != expected 0x" << oi.data_digest + << std::dec << " on " << soid; + // FIXME fall back to replica or something? + result = -EIO; + break; + } + } + op.extent.length = total_read; ::encode(m, osd_op.outdata); // re-encode since it might be modified -- 2.47.3