From: Samuel Just Date: Thu, 5 Sep 2013 21:30:46 +0000 (-0700) Subject: ReplicatedPG/Backend: handle down pull sources X-Git-Tag: v0.71~68^2~15 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=31c604225c80a4dcfa392f4ed265a8c06ddf98bf;p=ceph.git ReplicatedPG/Backend: handle down pull sources Signed-off-by: Samuel Just --- diff --git a/src/osd/PGBackend.h b/src/osd/PGBackend.h index 27dbd91b80e7..43283baa7601 100644 --- a/src/osd/PGBackend.h +++ b/src/osd/PGBackend.h @@ -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 * @@ -174,6 +177,8 @@ 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() diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index da57630e78ba..10d743d95e46 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -61,6 +61,28 @@ void ReplicatedBackend::recover_object( dout(10) << __func__ << dendl; } +void ReplicatedBackend::check_recovery_sources(const OSDMapRef osdmap) +{ + for(map >::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::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 ) diff --git a/src/osd/ReplicatedBackend.h b/src/osd/ReplicatedBackend.h index e703d4c333c0..44ff3bc62a83 100644 --- a/src/osd/ReplicatedBackend.h +++ b/src/osd/ReplicatedBackend.h @@ -59,6 +59,8 @@ public: RecoveryHandle *h ); + void check_recovery_sources(const OSDMapRef osdmap); + /// @see PGBackend::handle_message bool handle_message( OpRequestRef op diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 462aed0c3eef..88b68b68fdf5 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -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 >::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::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 { diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h index fa32e8bf8706..a8ae42ceb51e 100644 --- a/src/osd/ReplicatedPG.h +++ b/src/osd/ReplicatedPG.h @@ -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 class BlessedGenContext : public GenContext {