]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG: clear peer_(missing|log)_requested in check_recovery_sources
authorSamuel Just <sam.just@inktank.com>
Mon, 25 Jun 2012 04:38:57 +0000 (21:38 -0700)
committerSamuel Just <sam.just@inktank.com>
Fri, 29 Jun 2012 18:05:33 +0000 (11:05 -0700)
Otherwise, we might fail to re-request the information from a
previously down osd.

Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/PG.h
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index b915121183df1d30b5ae7f399a4f98d75271e5bd..50afe6cac96a05f9a995444321fe64fc6b701ed0 100644 (file)
@@ -722,7 +722,7 @@ public:
   void clear_recovery_state();
   virtual void _clear_recovery_state() = 0;
   void defer_recovery();
-  virtual bool check_recovery_sources(const OSDMapRef newmap) = 0;
+  virtual void check_recovery_sources(const OSDMapRef newmap) = 0;
   void start_recovery_op(const hobject_t& soid);
   void finish_recovery_op(const hobject_t& soid, bool dequeue=false);
 
index 6e256f8ee813a741b953e9dd28ad8e52c59b391c..b65920326cf3dd0c6ef8352bb9cf86298516fe91 100644 (file)
@@ -5744,7 +5744,7 @@ void ReplicatedPG::_clear_recovery_state()
   pull_from_peer.clear();
 }
 
-bool ReplicatedPG::check_recovery_sources(const OSDMapRef osdmap)
+void ReplicatedPG::check_recovery_sources(const OSDMapRef osdmap)
 {
   /*
    * check that any peers we are planning to (or currently) pulling
@@ -5782,29 +5782,49 @@ bool ReplicatedPG::check_recovery_sources(const OSDMapRef osdmap)
   }
   if (now_down.empty()) {
     dout(10) << "check_recovery_sources no source osds (" << missing_loc_sources << ") went down" << dendl;
-    return false;
+  } else {
+    dout(10) << "check_recovery_sources sources osds " << now_down << " now down, remaining sources are "
+            << missing_loc_sources << dendl;
+    
+    // filter missing_loc
+    map<hobject_t, set<int> >::iterator p = missing_loc.begin();
+    while (p != missing_loc.end()) {
+      set<int>::iterator q = p->second.begin();
+      while (q != p->second.end())
+       if (now_down.count(*q)) {
+         p->second.erase(q++);
+       } else {
+         assert(missing_loc_sources.count(*q));
+         q++;
+       }
+      if (p->second.empty())
+       missing_loc.erase(p++);
+      else
+       p++;
+    }
   }
-  dout(10) << "check_recovery_sources sources osds " << now_down << " now down, remaining sources are "
-          << missing_loc_sources << dendl;
 
-  // filter missing_loc
-  map<hobject_t, set<int> >::iterator p = missing_loc.begin();
-  while (p != missing_loc.end()) {
-    set<int>::iterator q = p->second.begin();
-    while (q != p->second.end())
-      if (now_down.count(*q)) {
-       p->second.erase(q++);
-      } else {
-       assert(missing_loc_sources.count(*q));
-       q++;
-      }
-    if (p->second.empty())
-      missing_loc.erase(p++);
-    else
-      p++;
+  for (set<int>::iterator i = peer_log_requested.begin();
+       i != peer_log_requested.end();
+       ) {
+    if (!osdmap->is_up(*i)) {
+      dout(10) << "peer_log_requested removing " << *i << dendl;
+      peer_log_requested.erase(i++);
+    } else {
+      ++i;
+    }
   }
 
-  return true;
+  for (set<int>::iterator i = peer_missing_requested.begin();
+       i != peer_missing_requested.end();
+       ) {
+    if (!osdmap->is_up(*i)) {
+      dout(10) << "peer_missing_requested removing " << *i << dendl;
+      peer_missing_requested.erase(i++);
+    } else {
+      ++i;
+    }
+  }
 }
   
 
index f09d5d05a4ce9fc05e6da7e88edd43b8fffed5dd..a715e9e3c85294e883efaae19d898c1caffc81f0 100644 (file)
@@ -637,7 +637,7 @@ protected:
   void finish_degraded_object(const hobject_t& oid);
 
   // Cancels/resets pulls from peer
-  bool check_recovery_sources(const OSDMapRef map);
+  void check_recovery_sources(const OSDMapRef map);
   int pull(const hobject_t& oid, eversion_t v);
 
   // low level ops