diff options
author | Sage Weil <sage.weil@dreamhost.com> | 2012-02-24 13:43:43 -0800 |
---|---|---|
committer | Sage Weil <sage.weil@dreamhost.com> | 2012-02-24 13:43:43 -0800 |
commit | 5c6e8b3795d0cf58814619bfc15cb0841e9a4f17 (patch) | |
tree | 6baaa1f52044e2cec631029eb639ddcb1478a7a8 | |
parent | 008ce6b2d471dbef27cb24fad90d512cbf35bc1b (diff) | |
parent | 7ad35ce489cc5f9169eb838e1196fa2ca4d6e985 (diff) | |
download | ceph-5c6e8b3795d0cf58814619bfc15cb0841e9a4f17.tar.gz |
Merge branch 'wip-pg-query'
Reviewed-by: Samuel Just <samuel.just@dreamhost.com>
-rw-r--r-- | src/osd/PG.cc | 157 | ||||
-rw-r--r-- | src/osd/PG.h | 26 | ||||
-rw-r--r-- | src/osd/ReplicatedPG.cc | 5 |
3 files changed, 188 insertions, 0 deletions
diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 0558f181cf3..42948f04718 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -3787,6 +3787,15 @@ boost::statechart::result PG::RecoveryState::Started::react(const AdvMap& advmap return discard_event(); } +boost::statechart::result PG::RecoveryState::Started::react(const QueryState& q) +{ + q.f->open_object_section("state"); + q.f->dump_string("name", state_name); + q.f->dump_stream("enter_time") << enter_time; + q.f->close_section(); + return discard_event(); +} + void PG::RecoveryState::Started::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -3827,6 +3836,15 @@ boost::statechart::result PG::RecoveryState::Reset::react(const ActMap&) return transit< Started >(); } +boost::statechart::result PG::RecoveryState::Reset::react(const QueryState& q) +{ + q.f->open_object_section("state"); + q.f->dump_string("name", state_name); + q.f->dump_stream("enter_time") << enter_time; + q.f->close_section(); + return discard_event(); +} + void PG::RecoveryState::Reset::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -3925,6 +3943,41 @@ boost::statechart::result PG::RecoveryState::Peering::react(const AdvMap& advmap return forward_event(); } +boost::statechart::result PG::RecoveryState::Peering::react(const QueryState& q) +{ + q.f->open_object_section("state"); + q.f->dump_string("name", state_name); + q.f->dump_stream("enter_time") << enter_time; + + q.f->open_array_section("probing_osds"); + for (set<int>::iterator p = prior_set->probe.begin(); p != prior_set->probe.end(); ++p) + q.f->dump_int("osd", *p); + q.f->close_section(); + + if (prior_set->pg_down) + q.f->dump_string("blocked", "peering is blocked due to down osds"); + + q.f->open_array_section("down_osds_we_would_probe"); + for (set<int>::iterator p = prior_set->down.begin(); p != prior_set->down.end(); ++p) + q.f->dump_int("osd", *p); + q.f->close_section(); + + q.f->open_array_section("peering_blocked_by"); + for (map<int,epoch_t>::iterator p = prior_set->blocked_by.begin(); + p != prior_set->blocked_by.end(); + p++) { + q.f->open_object_section("osd"); + q.f->dump_int("osd", p->first); + q.f->dump_int("current_lost_at", p->second); + q.f->dump_string("comment", "starting or marking this osd lost may let us proceed"); + q.f->close_section(); + } + q.f->close_section(); + + q.f->close_section(); + return forward_event(); +} + void PG::RecoveryState::Peering::exit() { dout(10) << "Leaving Peering" << dendl; @@ -4075,6 +4128,15 @@ boost::statechart::result PG::RecoveryState::Active::react(const RecoveryComplet return discard_event(); } +boost::statechart::result PG::RecoveryState::Active::react(const QueryState& q) +{ + q.f->open_object_section("state"); + q.f->dump_string("name", state_name); + q.f->dump_stream("enter_time") << enter_time; + q.f->close_section(); + return forward_event(); +} + void PG::RecoveryState::Active::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -4141,6 +4203,15 @@ boost::statechart::result PG::RecoveryState::ReplicaActive::react(const MQuery& return discard_event(); } +boost::statechart::result PG::RecoveryState::ReplicaActive::react(const QueryState& q) +{ + q.f->open_object_section("state"); + q.f->dump_string("name", state_name); + q.f->dump_stream("enter_time") << enter_time; + q.f->close_section(); + return forward_event(); +} + void PG::RecoveryState::ReplicaActive::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -4359,6 +4430,30 @@ boost::statechart::result PG::RecoveryState::GetInfo::react(const MNotifyRec& in return discard_event(); } +boost::statechart::result PG::RecoveryState::GetInfo::react(const QueryState& q) +{ + PG *pg = context< RecoveryMachine >().pg; + q.f->open_object_section("state"); + q.f->dump_string("name", state_name); + q.f->dump_stream("enter_time") << enter_time; + + q.f->open_array_section("requested_pf_info_from"); + for (set<int>::iterator p = peer_info_requested.begin(); p != peer_info_requested.end(); ++p) { + q.f->open_object_section("osd"); + q.f->dump_int("osd", *p); + if (pg->peer_info.count(*p)) { + q.f->open_object_section("got_info"); + pg->peer_info[*p].dump(q.f); + q.f->close_section(); + } + q.f->close_section(); + } + q.f->close_section(); + + q.f->close_section(); + return forward_event(); +} + void PG::RecoveryState::GetInfo::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -4437,6 +4532,16 @@ boost::statechart::result PG::RecoveryState::GetLog::react(const GotLog&) return transit< GetMissing >(); } +boost::statechart::result PG::RecoveryState::GetLog::react(const QueryState& q) +{ + q.f->open_object_section("state"); + q.f->dump_string("name", state_name); + q.f->dump_stream("enter_time") << enter_time; + q.f->dump_int("newest_update_osd", newest_update_osd); + q.f->close_section(); + return forward_event(); +} + void PG::RecoveryState::GetLog::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -4492,6 +4597,16 @@ boost::statechart::result PG::RecoveryState::WaitActingChange::react(const MNoti return discard_event(); } +boost::statechart::result PG::RecoveryState::WaitActingChange::react(const QueryState& q) +{ + q.f->open_object_section("state"); + q.f->dump_string("name", state_name); + q.f->dump_stream("enter_time") << enter_time; + q.f->dump_string("comment", "waiting for pg acting set to change"); + q.f->close_section(); + return forward_event(); +} + void PG::RecoveryState::WaitActingChange::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -4599,6 +4714,30 @@ boost::statechart::result PG::RecoveryState::GetMissing::react(const MLogRec& lo return discard_event(); }; +boost::statechart::result PG::RecoveryState::GetMissing::react(const QueryState& q) +{ + PG *pg = context< RecoveryMachine >().pg; + q.f->open_object_section("state"); + q.f->dump_string("name", state_name); + q.f->dump_stream("enter_time") << enter_time; + + q.f->open_array_section("peer_missing_requested"); + for (set<int>::iterator p = peer_missing_requested.begin(); p != peer_missing_requested.end(); ++p) { + q.f->open_object_section("osd"); + q.f->dump_int("osd", *p); + if (pg->peer_missing.count(*p)) { + q.f->open_object_section("got_missing"); + pg->peer_missing[*p].dump(q.f); + q.f->close_section(); + } + q.f->close_section(); + } + q.f->close_section(); + + q.f->close_section(); + return forward_event(); +} + void PG::RecoveryState::GetMissing::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -4638,6 +4777,16 @@ boost::statechart::result PG::RecoveryState::WaitUpThru::react(const MLogRec& lo return discard_event(); } +boost::statechart::result PG::RecoveryState::WaitUpThru::react(const QueryState& q) +{ + q.f->open_object_section("state"); + q.f->dump_string("name", state_name); + q.f->dump_stream("enter_time") << enter_time; + q.f->dump_string("comment", "waiting for osdmap to reflect a new up_thru for this osd"); + q.f->close_section(); + return forward_event(); +} + void PG::RecoveryState::WaitUpThru::exit() { context< RecoveryMachine >().log_exit(state_name, enter_time); @@ -4748,6 +4897,14 @@ void PG::RecoveryState::handle_create(RecoveryCtx *rctx) end_handle(); } +void PG::RecoveryState::handle_query_state(Formatter *f) +{ + dout(10) << "handle_query_state" << dendl; + QueryState q(f); + 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 1476bf2b351..5581d2ddf0c 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -831,6 +831,11 @@ public: rctx = 0; } + struct QueryState : boost::statechart::event< QueryState > { + Formatter *f; + QueryState(Formatter *f) : f(f) {} + }; + 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&); }; @@ -1052,12 +1061,14 @@ public: struct WaitActingChange : boost::statechart::state< WaitActingChange, Primary>, NamedState { typedef boost::mpl::list < + boost::statechart::custom_reaction< QueryState >, boost::statechart::custom_reaction< AdvMap >, boost::statechart::custom_reaction< MLogRec >, boost::statechart::custom_reaction< MInfoRec >, boost::statechart::custom_reaction< MNotifyRec > > reactions; WaitActingChange(my_context ctx); + boost::statechart::result react(const QueryState& q); boost::statechart::result react(const AdvMap&); boost::statechart::result react(const MLogRec&); boost::statechart::result react(const MInfoRec&); @@ -1081,9 +1092,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 +1105,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 +1113,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 +1127,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&); @@ -1152,9 +1169,11 @@ public: void get_infos(); typedef boost::mpl::list < + boost::statechart::custom_reaction< QueryState >, boost::statechart::transition< GotInfo, GetLog >, boost::statechart::custom_reaction< MNotifyRec > > reactions; + boost::statechart::result react(const QueryState& q); boost::statechart::result react(const MNotifyRec& infoevt); }; @@ -1172,9 +1191,11 @@ public: void exit(); typedef boost::mpl::list < + boost::statechart::custom_reaction< QueryState >, boost::statechart::custom_reaction< MLogRec >, boost::statechart::custom_reaction< GotLog > > reactions; + boost::statechart::result react(const QueryState& q); boost::statechart::result react(const MLogRec& logevt); boost::statechart::result react(const GotLog&); }; @@ -1188,9 +1209,11 @@ public: void exit(); typedef boost::mpl::list < + boost::statechart::custom_reaction< QueryState >, boost::statechart::custom_reaction< MLogRec >, boost::statechart::transition< NeedUpThru, WaitUpThru > > reactions; + boost::statechart::result react(const QueryState& q); boost::statechart::result react(const MLogRec& logevt); }; @@ -1199,9 +1222,11 @@ public: void exit(); typedef boost::mpl::list < + boost::statechart::custom_reaction< QueryState >, boost::statechart::custom_reaction< ActMap >, boost::statechart::custom_reaction< MLogRec > > reactions; + boost::statechart::result react(const QueryState& q); boost::statechart::result react(const ActMap& am); boost::statechart::result react(const MLogRec& logrec); }; @@ -1231,6 +1256,7 @@ public: void handle_recovery_complete(RecoveryCtx *ctx); void handle_create(RecoveryCtx *ctx); void handle_loaded(RecoveryCtx *ctx); + void handle_query_state(Formatter *f); } recovery_state; diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index aa92df645f7..d675f57fa32 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -272,6 +272,11 @@ int ReplicatedPG::do_command(vector<string>& cmd, ostream& ss, jsf.open_object_section("info"); info.dump(&jsf); jsf.close_section(); + + jsf.open_array_section("recovery_state"); + recovery_state.handle_query_state(&jsf); + jsf.close_section(); + jsf.close_section(); stringstream dss; jsf.flush(dss); |