summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-09-05 14:30:46 -0700
committerSamuel Just <sam.just@inktank.com>2013-09-26 11:24:27 -0700
commit31c604225c80a4dcfa392f4ed265a8c06ddf98bf (patch)
tree7c6b889f5cd190c616f7a0ec150afa83691d9b8b
parent4bc0eab15105b23429ae1782c0698b0c65d1ca64 (diff)
downloadceph-31c604225c80a4dcfa392f4ed265a8c06ddf98bf.tar.gz
ReplicatedPG/Backend: handle down pull sources
Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r--src/osd/PGBackend.h5
-rw-r--r--src/osd/ReplicatedBackend.cc22
-rw-r--r--src/osd/ReplicatedBackend.h2
-rw-r--r--src/osd/ReplicatedPG.cc28
-rw-r--r--src/osd/ReplicatedPG.h1
5 files changed, 40 insertions, 18 deletions
diff --git a/src/osd/PGBackend.h b/src/osd/PGBackend.h
index 27dbd91b80e..43283baa760 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 da57630e78b..10d743d95e4 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<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
)
diff --git a/src/osd/ReplicatedBackend.h b/src/osd/ReplicatedBackend.h
index e703d4c333c..44ff3bc62a8 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 462aed0c3ee..88b68b68fdf 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<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 {
diff --git a/src/osd/ReplicatedPG.h b/src/osd/ReplicatedPG.h
index fa32e8bf870..a8ae42ceb51 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 <typename T>
class BlessedGenContext : public GenContext<T> {