summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage.weil@dreamhost.com>2012-02-24 13:43:43 -0800
committerSage Weil <sage.weil@dreamhost.com>2012-02-24 13:43:43 -0800
commit5c6e8b3795d0cf58814619bfc15cb0841e9a4f17 (patch)
tree6baaa1f52044e2cec631029eb639ddcb1478a7a8
parent008ce6b2d471dbef27cb24fad90d512cbf35bc1b (diff)
parent7ad35ce489cc5f9169eb838e1196fa2ca4d6e985 (diff)
downloadceph-5c6e8b3795d0cf58814619bfc15cb0841e9a4f17.tar.gz
Merge branch 'wip-pg-query'
Reviewed-by: Samuel Just <samuel.just@dreamhost.com>
-rw-r--r--src/osd/PG.cc157
-rw-r--r--src/osd/PG.h26
-rw-r--r--src/osd/ReplicatedPG.cc5
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);