]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG/Backend: handle down pull sources
authorSamuel Just <sam.just@inktank.com>
Thu, 5 Sep 2013 21:30:46 +0000 (14:30 -0700)
committerSamuel Just <sam.just@inktank.com>
Thu, 26 Sep 2013 18:24:27 +0000 (11:24 -0700)
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/PGBackend.h
src/osd/ReplicatedBackend.cc
src/osd/ReplicatedBackend.h
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 27dbd91b80e74e72e7863fe2b20f24844e4916c1..43283baa7601b723d6e9aa7e13e21332d24d298b 100644 (file)
@@ -78,6 +78,9 @@
 
      virtual void failed_push(int from, const hobject_t &soid) = 0;
 
+     
+     virtual void cancel_pull(const hobject_t &soid) = 0;
+
      /**
       * Bless a context
       *
      OpRequestRef op ///< [in] message received
      ) = 0; ///< @return true if the message was handled
 
+   virtual void check_recovery_sources(const OSDMapRef osdmap) = 0;
+
    /**
     * implementation should clear itself, contexts blessed prior to on_change
     * won't be called after on_change()
index da57630e78ba3dfb6b5c638ca9bb557b84072208..10d743d95e46eaaa89aab69b81b4f0a85faecec1 100644 (file)
@@ -61,6 +61,28 @@ void ReplicatedBackend::recover_object(
   dout(10) << __func__ << dendl;
 }
 
+void ReplicatedBackend::check_recovery_sources(const OSDMapRef osdmap)
+{
+  for(map<int, set<hobject_t> >::iterator i = pull_from_peer.begin();
+      i != pull_from_peer.end();
+      ) {
+    if (osdmap->is_down(i->first)) {
+      dout(10) << "check_recovery_sources resetting pulls from osd." << i->first
+              << ", osdmap has it marked down" << dendl;
+      for (set<hobject_t>::iterator j = i->second.begin();
+          j != i->second.end();
+          ++j) {
+       assert(pulling.count(*j) == 1);
+       get_parent()->cancel_pull(*j);
+       pulling.erase(*j);
+      }
+      pull_from_peer.erase(i++);
+    } else {
+      ++i;
+    }
+  }
+}
+
 bool ReplicatedBackend::handle_message(
   OpRequestRef op
   )
index e703d4c333c0972b4d0d445748b89dffea2f0494..44ff3bc62a8386d47d531d12860dd14b0faca21f 100644 (file)
@@ -59,6 +59,8 @@ public:
     RecoveryHandle *h
     );
 
+  void check_recovery_sources(const OSDMapRef osdmap);
+
   /// @see PGBackend::handle_message
   bool handle_message(
     OpRequestRef op
index 462aed0c3eefa6c6c2b230ac2b925c4272ec7a9f..88b68b68fdf5760df42438ea04bcc1be449e84df 100644 (file)
@@ -7391,6 +7391,14 @@ void ReplicatedPG::_clear_recovery_state()
   pull_from_peer.clear();
 }
 
+void ReplicatedPG::cancel_pull(const hobject_t &soid)
+{
+  assert(recovering.count(soid));
+  recovering.erase(soid);
+  finish_recovery_op(soid);
+  pg_log.set_last_requested(0); // get recover_primary to start over
+}
+
 void ReplicatedPG::check_recovery_sources(const OSDMapRef osdmap)
 {
   /*
@@ -7407,26 +7415,10 @@ void ReplicatedPG::check_recovery_sources(const OSDMapRef osdmap)
     }
     dout(10) << "check_recovery_sources source osd." << *p << " now down" << dendl;
     now_down.insert(*p);
-
-    // reset pulls?
-    map<int, set<hobject_t> >::iterator j = pull_from_peer.find(*p);
-    if (j != pull_from_peer.end()) {
-      dout(10) << "check_recovery_sources resetting pulls from osd." << *p
-              << ", osdmap has it marked down" << dendl;
-      for (set<hobject_t>::iterator i = j->second.begin();
-          i != j->second.end();
-          ++i) {
-       assert(pulling.count(*i) == 1);
-       pulling.erase(*i);
-       finish_recovery_op(*i);
-      }
-      pg_log.set_last_requested(0);
-      pull_from_peer.erase(j++);
-    }
-
-    // remove from missing_loc_sources
     missing_loc_sources.erase(p++);
   }
+  pgbackend->check_recovery_sources(osdmap);
+
   if (now_down.empty()) {
     dout(10) << "check_recovery_sources no source osds (" << missing_loc_sources << ") went down" << dendl;
   } else {
index fa32e8bf8706fa27a11c47698b4c6b7891bda12d..a8ae42ceb51e1ee4eb09e2e3f9029a407cbbbf5a 100644 (file)
@@ -148,6 +148,7 @@ public:
   void on_global_recover(
     const hobject_t &oid);
   void failed_push(int from, const hobject_t &soid);
+  void cancel_pull(const hobject_t &soid);
 
   template <typename T>
   class BlessedGenContext : public GenContext<T> {