diff options
author | Sage Weil <sage@newdream.net> | 2012-02-23 16:22:08 -0800 |
---|---|---|
committer | Sage Weil <sage.weil@dreamhost.com> | 2012-02-24 11:33:57 -0800 |
commit | e22a45a18de83dfa4cc5ed23a17705d03389acb6 (patch) | |
tree | 1733d97b964d748ebea6a40da518b41776000547 | |
parent | c9416e6184905501159e96115f734bdf65a74d28 (diff) | |
download | ceph-e22a45a18de83dfa4cc5ed23a17705d03389acb6.tar.gz |
osd: query recovery state machine
For now, just append this to the end of the pg <pgid> query json dump.
We definitely want to do something smarter here, but I'm not sure whether
json or plaintext is the way to go.
Signed-off-by: Sage Weil <sage@newdream.net>
-rw-r--r-- | src/osd/PG.cc | 48 | ||||
-rw-r--r-- | src/osd/PG.h | 16 | ||||
-rw-r--r-- | src/osd/ReplicatedPG.cc | 5 |
3 files changed, 69 insertions, 0 deletions
diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 0558f181cf3..689df3369cf 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -3787,6 +3787,12 @@ boost::statechart::result PG::RecoveryState::Started::react(const AdvMap& advmap return discard_event(); } +boost::statechart::result PG::RecoveryState::Started::react(const QueryState& q) +{ + q.ss << state_name << ":\n"; + return discard_event(); +} + void PG::RecoveryState::Started::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -3827,6 +3833,12 @@ boost::statechart::result PG::RecoveryState::Reset::react(const ActMap&) return transit< Started >(); } +boost::statechart::result PG::RecoveryState::Reset::react(const QueryState& q) +{ + q.ss << state_name << ":\n"; + return discard_event(); +} + void PG::RecoveryState::Reset::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -3925,6 +3937,22 @@ boost::statechart::result PG::RecoveryState::Peering::react(const AdvMap& advmap return forward_event(); } +boost::statechart::result PG::RecoveryState::Peering::react(const QueryState& q) +{ + q.ss << state_name << ":\n"; + q.ss << " probing osds " << prior_set->probe << "\n"; + if (prior_set->down.size()) + q.ss << " would also like to query down osds " << prior_set->down << "\n"; + if (prior_set->pg_down) + q.ss << " peering is blocked due to down osds\n"; + for (map<int,epoch_t>::iterator p = prior_set->blocked_by.begin(); + p != prior_set->blocked_by.end(); + p++) + q.ss << " starting osd." << p->first << " (last lost_at " << p->second + << ") or marking it lost may let us proceed\n"; + return forward_event(); +} + void PG::RecoveryState::Peering::exit() { dout(10) << "Leaving Peering" << dendl; @@ -4075,6 +4103,12 @@ boost::statechart::result PG::RecoveryState::Active::react(const RecoveryComplet return discard_event(); } +boost::statechart::result PG::RecoveryState::Active::react(const QueryState& q) +{ + q.ss << state_name << ":\n"; + return forward_event(); +} + void PG::RecoveryState::Active::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -4141,6 +4175,12 @@ boost::statechart::result PG::RecoveryState::ReplicaActive::react(const MQuery& return discard_event(); } +boost::statechart::result PG::RecoveryState::ReplicaActive::react(const QueryState& q) +{ + q.ss << state_name << ":\n"; + return forward_event(); +} + void PG::RecoveryState::ReplicaActive::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -4748,6 +4788,14 @@ void PG::RecoveryState::handle_create(RecoveryCtx *rctx) end_handle(); } +void PG::RecoveryState::handle_query_state(stringstream &ss) +{ + dout(10) << "handle_query_state" << dendl; + QueryState q(ss); + machine.process_event(q); +} + + /*---------------------------------------------------*/ #undef dout_prefix #define dout_prefix (*_dout << (debug_pg ? debug_pg->gen_prefix() : string()) << " PriorSet: ") diff --git a/src/osd/PG.h b/src/osd/PG.h index d75b1ecf239..46096245cf4 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -831,6 +831,11 @@ public: rctx = 0; } + struct QueryState : boost::statechart::event< QueryState > { + stringstream& ss; + QueryState(stringstream& s) : ss(s) {} + }; + struct MInfoRec : boost::statechart::event< MInfoRec > { int from; pg_info_t &info; @@ -983,10 +988,12 @@ public: void exit(); typedef boost::mpl::list < + boost::statechart::custom_reaction< QueryState >, boost::statechart::custom_reaction< AdvMap >, boost::statechart::custom_reaction< ActMap >, boost::statechart::transition< boost::statechart::event_base, Crashed > > reactions; + boost::statechart::result react(const QueryState& q); boost::statechart::result react(const AdvMap&); boost::statechart::result react(const ActMap&); }; @@ -998,9 +1005,11 @@ public: void exit(); typedef boost::mpl::list < + boost::statechart::custom_reaction< QueryState >, boost::statechart::custom_reaction< AdvMap >, boost::statechart::transition< boost::statechart::event_base, Crashed > > reactions; + boost::statechart::result react(const QueryState& q); boost::statechart::result react(const AdvMap&); }; @@ -1081,9 +1090,11 @@ public: void exit(); typedef boost::mpl::list < + boost::statechart::custom_reaction< QueryState >, boost::statechart::transition< Activate, Active >, boost::statechart::custom_reaction< AdvMap > > reactions; + boost::statechart::result react(const QueryState& q); boost::statechart::result react(const AdvMap &advmap); }; @@ -1092,6 +1103,7 @@ public: void exit(); typedef boost::mpl::list < + boost::statechart::custom_reaction< QueryState >, boost::statechart::custom_reaction< ActMap >, boost::statechart::custom_reaction< AdvMap >, boost::statechart::custom_reaction< MInfoRec >, @@ -1099,6 +1111,7 @@ public: boost::statechart::custom_reaction< MLogRec >, boost::statechart::custom_reaction< RecoveryComplete > > reactions; + boost::statechart::result react(const QueryState& q); boost::statechart::result react(const ActMap&); boost::statechart::result react(const AdvMap&); boost::statechart::result react(const MInfoRec& infoevt); @@ -1112,11 +1125,13 @@ public: void exit(); typedef boost::mpl::list < + boost::statechart::custom_reaction< QueryState >, boost::statechart::custom_reaction< ActMap >, boost::statechart::custom_reaction< MQuery >, boost::statechart::custom_reaction< MInfoRec >, boost::statechart::custom_reaction< MLogRec > > reactions; + boost::statechart::result react(const QueryState& q); boost::statechart::result react(const MInfoRec& infoevt); boost::statechart::result react(const MLogRec& logevt); boost::statechart::result react(const ActMap&); @@ -1231,6 +1246,7 @@ public: void handle_recovery_complete(RecoveryCtx *ctx); void handle_create(RecoveryCtx *ctx); void handle_loaded(RecoveryCtx *ctx); + void handle_query_state(stringstream& ss); } recovery_state; diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index b6d721defdd..1e9d9f4f574 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -272,6 +272,11 @@ int ReplicatedPG::do_command(vector<string>& cmd, ostream& ss, bufferlist& data) stringstream dss; jsf.flush(dss); data.append(dss); + + // query recovery state machine, too. + dss.clear(); + recovery_state.handle_query_state(dss); + data.append(dss); return 0; } else if (cmd.size() > 1 && |