]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: scrub: disqualify shards with digests that disagree with oi digest
authorSage Weil <sage@redhat.com>
Wed, 10 Dec 2014 00:36:15 +0000 (16:36 -0800)
committerSage Weil <sage@redhat.com>
Sat, 20 Dec 2014 15:30:01 +0000 (07:30 -0800)
The auth may or may not know that the digest is truly bad.  Note that we
can only relate scrub digests to those in oi if the scrub used a seed of
-1; older OSDs use 0.

Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/PG.cc
src/osd/PGBackend.cc
src/osd/PGBackend.h

index 5e3539f78f93c3916c78e2cd0d51de5f957723c6..1066b96f04cfc7609a182e9e4b4fb2647343d20c 100644 (file)
@@ -4085,6 +4085,7 @@ void PG::scrub_compare_maps()
 
     get_pgbackend()->be_compare_scrubmaps(
       maps,
+      scrubber.seed == 0xffffffff,  // can we relate scrub digests to oi digests?
       scrubber.missing,
       scrubber.inconsistent,
       authoritative,
index d931c79d35b9050128024b7088085974b3eccb1b..fcb7c09c8c7e711126a355e26a9e5cd45578b048 100644 (file)
@@ -374,6 +374,7 @@ enum scrub_error_type PGBackend::be_compare_scrub_objects(
   pg_shard_t auth_shard,
   const ScrubMap::object &auth,
   const object_info_t& auth_oi,
+  bool okseed,
   const ScrubMap::object &candidate,
   ostream &errorstream)
 {
@@ -445,6 +446,7 @@ map<pg_shard_t, ScrubMap *>::const_iterator
   PGBackend::be_select_auth_object(
   const hobject_t &obj,
   const map<pg_shard_t,ScrubMap*> &maps,
+  bool okseed,
   object_info_t *auth_oi)
 {
   map<pg_shard_t, ScrubMap *>::const_iterator auth = maps.end();
@@ -498,6 +500,24 @@ 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 "
+              << i->second.digest << " != " << oi.data_digest
+              << 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 "
+              << i->second.omap_digest << " != " << oi.omap_digest
+              << dendl;
+      continue;
+    }
     dout(10) << __func__ << ": selecting osd " << j->first
             << " for obj " << obj
             << dendl;
@@ -509,6 +529,7 @@ map<pg_shard_t, ScrubMap *>::const_iterator
 
 void PGBackend::be_compare_scrubmaps(
   const map<pg_shard_t,ScrubMap*> &maps,
+  bool okseed,
   map<hobject_t, set<pg_shard_t> > &missing,
   map<hobject_t, set<pg_shard_t> > &inconsistent,
   map<hobject_t, pg_shard_t> &authoritative,
@@ -534,7 +555,7 @@ void PGBackend::be_compare_scrubmaps(
        ++k) {
     object_info_t auth_oi;
     map<pg_shard_t, ScrubMap *>::const_iterator auth =
-      be_select_auth_object(*k, maps, &auth_oi);
+      be_select_auth_object(*k, maps, okseed, &auth_oi);
     if (auth == maps.end()) {
       // Something is better than nothing
       // TODO: something is NOT better than nothing, do something like
@@ -560,6 +581,7 @@ void PGBackend::be_compare_scrubmaps(
          be_compare_scrub_objects(auth->first,
                                   auth->second->objects[*k],
                                   auth_oi,
+                                  okseed,
                                   j->second->objects[*k],
                                   ss);
         if (error != CLEAN) {
index 561d512c740e1c4880e8278477b9adb35de7f441..32d2a39ed9957d73d355c2a158b22641fbafec0e 100644 (file)
      pg_shard_t auth_shard,
      const ScrubMap::object &auth,
      const object_info_t& auth_oi,
+     bool okseed,
      const ScrubMap::object &candidate,
      ostream &errorstream);
    map<pg_shard_t, ScrubMap *>::const_iterator be_select_auth_object(
      const hobject_t &obj,
      const map<pg_shard_t,ScrubMap*> &maps,
+     bool okseed,
      object_info_t *auth_oi);
    void be_compare_scrubmaps(
      const map<pg_shard_t,ScrubMap*> &maps,
+     bool okseed,   ///< true if scrub digests have same seed our oi digests
      map<hobject_t, set<pg_shard_t> > &missing,
      map<hobject_t, set<pg_shard_t> > &inconsistent,
      map<hobject_t, pg_shard_t> &authoritative,