]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: scrub: only assume shard digest == oi digest for replicated pools 3236/head
authorSage Weil <sage@redhat.com>
Mon, 22 Dec 2014 15:32:36 +0000 (07:32 -0800)
committerSage Weil <sage@redhat.com>
Mon, 22 Dec 2014 15:32:36 +0000 (07:32 -0800)
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 <sage@redhat.com>
src/osd/PGBackend.cc
src/osd/ReplicatedPG.cc

index eac5dbf5a2ff4f41bfbf6e6e4a7f1d844088fa62..4f753c1f3ed394b5c9f61dfb70c61112159c07ad 100644 (file)
@@ -504,23 +504,25 @@ map<pg_shard_t, ScrubMap *>::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
index c2e56586deb06de3678cdb194720f4d1914229a1..caeaaec1d2518a0b2def5c293182538c76563b3a 100644 (file)
@@ -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()) {