From: Sage Weil Date: Thu, 22 Jul 2010 23:24:54 +0000 (-0700) Subject: osd: skip degraded objects we're already recoverying in recover_replicas X-Git-Tag: v0.21~48^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b59cb10dc89abc4c065c48044f602de2b90bf2f7;p=ceph.git osd: skip degraded objects we're already recoverying in recover_replicas Otherwise we'll start_recovery_op, dup the push, etc. Signed-off-by: Sage Weil --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 2c1921ceace0..4ed02be51df4 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -3992,17 +3992,17 @@ int ReplicatedPG::recover_replicas(int max) dout(10) << " peer osd" << peer << " missing " << peer_missing[peer] << dendl; dout(20) << " " << peer_missing[peer].missing << dendl; - if (peer_missing[peer].num_missing() == 0) - continue; - // oldest first! - sobject_t soid = peer_missing[peer].rmissing.begin()->second; - eversion_t v = peer_missing[peer].rmissing.begin()->first; - - started += recover_object_replicas(soid); - - if (started >= max) - return started; + Missing &m = peer_missing[peer]; + for (map::iterator p = m.rmissing.begin(); + p != m.rmissing.end() && started < max; + p++) { + sobject_t soid = p->second; + if (pushing.count(soid)) + dout(10) << " already pushing " << soid << dendl; + else + started += recover_object_replicas(soid); + } } // nothing to do!