From: Jianpeng Ma Date: Tue, 14 Apr 2015 01:11:58 +0000 (+0800) Subject: osd: Fix ec pg repair endless when met unrecover object. X-Git-Tag: v0.94.8~20^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=47d5dfc0323e8d7614ad5793d85c1476b63c18e6;p=ceph.git osd: Fix ec pg repair endless when met unrecover object. In repair_object, if bad_peer is replica, it don't add soid in MissingLoc for ec pool. If there are more bad replica for ec pool which cause object can't recover, the later recoverying will endless. Signed-off-by: Jianpeng Ma Signed-off-by: Kefu Chai (cherry picked from commit d51806f5b330d5f112281fbb95ea6addf994324e) --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index fc2f6689d43..3266d5e5655 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -3744,15 +3744,20 @@ void PG::repair_object( assert(waiting_for_unreadable_object.empty()); pg_log.missing_add(soid, oi.version, eversion_t()); + + pg_log.set_last_requested(0); + dout(10) << __func__ << ": primary = " << primary << dendl; + } + + if (is_ec_pg() || bad_peer == primary) { + // we'd better collect all shard for EC pg, and prepare good peers as the + // source of pull in the case of replicated pg. missing_loc.add_missing(soid, oi.version, eversion_t()); list >::iterator i; for (i = ok_peers->begin(); - i != ok_peers->end(); - ++i) + i != ok_peers->end(); + ++i) missing_loc.add_location(soid, i->second); - - pg_log.set_last_requested(0); - dout(10) << __func__ << ": primary = " << primary << dendl; } }