From d87918a6a61a5f3a0d39349854749e75df828f3c Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 22 Dec 2014 07:32:36 -0800 Subject: [PATCH] osd: scrub: only assume shard digest == oi digest for replicated pools For an EC object, the digest we get from scrub is for the *shard*, and that is not the same as the *object* digest in the object_info_t. Skip these checks; we already have the per-shard digest that is verified in the EC backend. Fixes: #10409 Signed-off-by: Sage Weil --- src/osd/PGBackend.cc | 34 ++++++++++++++++++---------------- src/osd/ReplicatedPG.cc | 32 +++++++++++++++++--------------- 2 files changed, 35 insertions(+), 31 deletions(-) diff --git a/src/osd/PGBackend.cc b/src/osd/PGBackend.cc index eac5dbf5a2ff..4f753c1f3ed3 100644 --- a/src/osd/PGBackend.cc +++ b/src/osd/PGBackend.cc @@ -504,23 +504,25 @@ map::const_iterator // invalid object info, probably corrupt continue; } - if (okseed && oi.is_data_digest() && i->second.digest_present && - oi.data_digest != i->second.digest) { - dout(10) << __func__ << ": rejecting osd " << j->first - << " for obj " << obj - << ", data digest mismatch 0x" << std::hex - << i->second.digest << " != 0x" << oi.data_digest - << std::dec << dendl; - continue; - } - if (okseed && oi.is_omap_digest() && i->second.omap_digest_present && + if (parent->get_pool().is_replicated()) { + if (okseed && oi.is_data_digest() && i->second.digest_present && + oi.data_digest != i->second.digest) { + dout(10) << __func__ << ": rejecting osd " << j->first + << " for obj " << obj + << ", data digest mismatch 0x" << std::hex + << i->second.digest << " != 0x" << oi.data_digest + << std::dec << dendl; + continue; + } + if (okseed && oi.is_omap_digest() && i->second.omap_digest_present && oi.omap_digest != i->second.omap_digest) { - dout(10) << __func__ << ": rejecting osd " << j->first - << " for obj " << obj - << ", omap digest mismatch 0x" << std::hex - << i->second.omap_digest << " != 0x" << oi.omap_digest - << std::dec << dendl; - continue; + dout(10) << __func__ << ": rejecting osd " << j->first + << " for obj " << obj + << ", omap digest mismatch 0x" << std::hex + << i->second.omap_digest << " != 0x" << oi.omap_digest + << std::dec << dendl; + continue; + } } dout(10) << __func__ << ": selecting osd " << j->first << " for obj " << obj diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index c2e56586deb0..caeaaec1d251 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -12390,21 +12390,23 @@ void ReplicatedPG::_scrub(ScrubMap& scrubmap) dout(20) << mode << " " << soid << " " << oi << dendl; - if (oi.is_data_digest() && p->second.digest_present && - oi.data_digest != p->second.digest) { - osd->clog->error() << mode << " " << info.pgid << " " << soid - << " on disk data digest 0x" << std::hex - << p->second.digest << " != 0x" - << oi.data_digest << std::dec; - ++scrubber.deep_errors; - } - if (oi.is_omap_digest() && p->second.omap_digest_present && - oi.omap_digest != p->second.omap_digest) { - osd->clog->error() << mode << " " << info.pgid << " " << soid - << " on disk omap digest 0x" << std::hex - << p->second.omap_digest << " != 0x" - << oi.omap_digest << std::dec; - ++scrubber.deep_errors; + if (pool.info.is_replicated()) { + if (oi.is_data_digest() && p->second.digest_present && + oi.data_digest != p->second.digest) { + osd->clog->error() << mode << " " << info.pgid << " " << soid + << " on disk data digest 0x" << std::hex + << p->second.digest << " != 0x" + << oi.data_digest << std::dec; + ++scrubber.deep_errors; + } + if (oi.is_omap_digest() && p->second.omap_digest_present && + oi.omap_digest != p->second.omap_digest) { + osd->clog->error() << mode << " " << info.pgid << " " << soid + << " on disk omap digest 0x" << std::hex + << p->second.omap_digest << " != 0x" + << oi.omap_digest << std::dec; + ++scrubber.deep_errors; + } } if (soid.is_snap()) { -- 2.47.3