From: Sage Weil Date: Mon, 22 Dec 2014 15:32:36 +0000 (-0800) Subject: osd: scrub: only assume shard digest == oi digest for replicated pools X-Git-Tag: v0.92~105^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F3236%2Fhead;p=ceph.git 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 --- diff --git a/src/osd/PGBackend.cc b/src/osd/PGBackend.cc index eac5dbf5a2f..4f753c1f3ed 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 c2e56586deb..caeaaec1d25 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()) {