summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2012-02-23 16:22:08 -0800
committerSage Weil <sage.weil@dreamhost.com>2012-02-24 11:33:57 -0800
commite22a45a18de83dfa4cc5ed23a17705d03389acb6 (patch)
tree1733d97b964d748ebea6a40da518b41776000547
parentc9416e6184905501159e96115f734bdf65a74d28 (diff)
downloadceph-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.cc48
-rw-r--r--src/osd/PG.h16
-rw-r--r--src/osd/ReplicatedPG.cc5
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 &&