rs_perf.add_time_avg(rs_getlog_latency, "getlog_latency", "Getlog recovery state latency");
rs_perf.add_time_avg(rs_waitactingchange_latency, "waitactingchange_latency", "Waitactingchange recovery state latency");
rs_perf.add_time_avg(rs_incomplete_latency, "incomplete_latency", "Incomplete recovery state latency");
+ rs_perf.add_time_avg(rs_down_latency, "down_latency", "Down recovery state latency");
rs_perf.add_time_avg(rs_getmissing_latency, "getmissing_latency", "Getmissing recovery state latency");
rs_perf.add_time_avg(rs_waitupthru_latency, "waitupthru_latency", "Waitupthru recovery state latency");
rs_getlog_latency,
rs_waitactingchange_latency,
rs_incomplete_latency,
+ rs_down_latency,
rs_getmissing_latency,
rs_waitupthru_latency,
rs_last,
pg->reset_min_peer_features();
get_infos();
- if (peer_info_requested.empty() && !prior_set->pg_down) {
+ if (prior_set->pg_down) {
+ post_event(IsDown());
+ } else if (peer_info_requested.empty()) {
post_event(GotInfo());
}
}
}
if (!any_up_complete_now && any_down_now) {
dout(10) << " no osds up+complete from interval " << interval << dendl;
- pg->state_set(PG_STATE_DOWN);
- pg->publish_stats_to_osd();
+ post_event(IsDown());
return discard_event();
}
break;
pg->osd->recoverystate_perf->tinc(rs_waitactingchange_latency, dur);
}
+/*------Down--------*/
+PG::RecoveryState::Down::Down(my_context ctx)
+ : my_base(ctx),
+ NamedState(context< RecoveryMachine >().pg->cct, "Started/Primary/Peering/Down")
+{
+ context< RecoveryMachine >().log_enter(state_name);
+ PG *pg = context< RecoveryMachine >().pg;
+
+ pg->state_clear(PG_STATE_PEERING);
+ pg->state_set(PG_STATE_DOWN);
+
+ unique_ptr<PriorSet> &prior_set = context< Peering >().prior_set;
+ assert(pg->blocked_by.empty());
+ pg->blocked_by.insert(prior_set->down.begin(), prior_set->down.end());
+ pg->publish_stats_to_osd();
+}
+
+void PG::RecoveryState::Down::exit()
+{
+ context< RecoveryMachine >().log_exit(state_name, enter_time);
+ PG *pg = context< RecoveryMachine >().pg;
+
+ pg->state_clear(PG_STATE_DOWN);
+ utime_t dur = ceph_clock_now(pg->cct) - enter_time;
+ pg->osd->recoverystate_perf->tinc(rs_down_latency, dur);
+
+ pg->blocked_by.clear();
+ pg->publish_stats_to_osd();
+}
+
/*------Incomplete--------*/
PG::RecoveryState::Incomplete::Incomplete(my_context ctx)
: my_base(ctx),
struct IsIncomplete : boost::statechart::event< IsIncomplete > {
IsIncomplete() : boost::statechart::event< IsIncomplete >() {}
};
+ struct Down;
+ struct IsDown : boost::statechart::event< IsDown > {
+ IsDown() : boost::statechart::event< IsDown >() {}
+ };
struct Primary : boost::statechart::state< Primary, Started, Peering >, NamedState {
explicit Primary(my_context ctx);
typedef boost::mpl::list <
boost::statechart::custom_reaction< QueryState >,
boost::statechart::transition< GotInfo, GetLog >,
- boost::statechart::custom_reaction< MNotifyRec >
+ boost::statechart::custom_reaction< MNotifyRec >,
+ boost::statechart::transition< IsDown, Down >
> reactions;
boost::statechart::result react(const QueryState& q);
boost::statechart::result react(const MNotifyRec& infoevt);
boost::statechart::result react(const MLogRec& logrec);
};
+ struct Down : boost::statechart::state< Down, Peering>, NamedState {
+ explicit Down(my_context ctx);
+ void exit();
+ };
+
struct Incomplete : boost::statechart::state< Incomplete, Peering>, NamedState {
typedef boost::mpl::list <
boost::statechart::custom_reaction< AdvMap >,