From: Sage Weil Date: Wed, 10 Dec 2014 00:36:15 +0000 (-0800) Subject: osd: scrub: disqualify shards with digests that disagree with oi digest X-Git-Tag: v0.92~111^2~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=14f3c26a1fa7ebe49c2326dc6f1cc0e0c12bfe2c;p=ceph.git osd: scrub: disqualify shards with digests that disagree with oi digest 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 --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 5e3539f78f93..1066b96f04cf 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -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, diff --git a/src/osd/PGBackend.cc b/src/osd/PGBackend.cc index d931c79d35b9..fcb7c09c8c7e 100644 --- a/src/osd/PGBackend.cc +++ b/src/osd/PGBackend.cc @@ -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::const_iterator PGBackend::be_select_auth_object( const hobject_t &obj, const map &maps, + bool okseed, object_info_t *auth_oi) { map::const_iterator auth = maps.end(); @@ -498,6 +500,24 @@ 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 " + << 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::const_iterator void PGBackend::be_compare_scrubmaps( const map &maps, + bool okseed, map > &missing, map > &inconsistent, map &authoritative, @@ -534,7 +555,7 @@ void PGBackend::be_compare_scrubmaps( ++k) { object_info_t auth_oi; map::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) { diff --git a/src/osd/PGBackend.h b/src/osd/PGBackend.h index 561d512c740e..32d2a39ed995 100644 --- a/src/osd/PGBackend.h +++ b/src/osd/PGBackend.h @@ -591,14 +591,17 @@ pg_shard_t auth_shard, const ScrubMap::object &auth, const object_info_t& auth_oi, + bool okseed, const ScrubMap::object &candidate, ostream &errorstream); map::const_iterator be_select_auth_object( const hobject_t &obj, const map &maps, + bool okseed, object_info_t *auth_oi); void be_compare_scrubmaps( const map &maps, + bool okseed, ///< true if scrub digests have same seed our oi digests map > &missing, map > &inconsistent, map &authoritative,