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: v9.0.1~90^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d51806f5b330d5f112281fbb95ea6addf994324e;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 --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 03bf405ea031..7c4c6975b12f 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -3667,15 +3667,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; } }