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()
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
)
RecoveryHandle *h
);
+ void check_recovery_sources(const OSDMapRef osdmap);
+
/// @see PGBackend::handle_message
bool handle_message(
OpRequestRef op
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)
{
/*
}
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 {
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> {