]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: skip degraded objects we're already recoverying in recover_replicas
authorSage Weil <sage@newdream.net>
Thu, 22 Jul 2010 23:24:54 +0000 (16:24 -0700)
committerSage Weil <sage@newdream.net>
Fri, 23 Jul 2010 22:51:37 +0000 (15:51 -0700)
Otherwise we'll start_recovery_op, dup the push, etc.

Signed-off-by: Sage Weil <sage@newdream.net>
src/osd/ReplicatedPG.cc

index 2c1921ceace096312498ab9ec83aee1d4dcda2a9..4ed02be51df44f0e53334185826c0b8a45db5e66 100644 (file)
@@ -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<eversion_t, sobject_t>::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!