]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: query recovery state machine
authorSage Weil <sage@newdream.net>
Fri, 24 Feb 2012 00:22:08 +0000 (16:22 -0800)
committerSage Weil <sage.weil@dreamhost.com>
Fri, 24 Feb 2012 19:33:57 +0000 (11:33 -0800)
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>
src/osd/PG.cc
src/osd/PG.h
src/osd/ReplicatedPG.cc

index 0558f181cf30b04f3dd088a2dd8de147bb86b741..689df3369cfb75550991ff1a156949618d4ecb3c 100644 (file)
@@ -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: ")
index d75b1ecf2397fcf06c27f8ffc99e7acba9d161e4..46096245cf4700fa980809f99c0189cd4eec2646 100644 (file)
@@ -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;
 
 
index b6d721defdd1f34f4ec609e3a862cf45bc2398f7..1e9d9f4f574028af619f2168eb376b6a7938ef60 100644 (file)
@@ -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 &&