]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: expose state of recovery to status ASOK command 7068/head
authorYan, Zheng <zyan@redhat.com>
Tue, 29 Dec 2015 07:49:08 +0000 (15:49 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 5 Jan 2016 03:27:33 +0000 (11:27 +0800)
Fixes: #14146
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/MDLog.cc
src/mds/MDLog.h
src/mds/MDSDaemon.cc
src/mds/MDSDaemon.h
src/mds/MDSRank.cc
src/mds/MDSRank.h
src/mds/Server.cc
src/mds/Server.h

index ade86c9e06341582e4622f5c052122bac0984bf1..d7bf95ffd8b59d5cfdc3471f867c732482338911 100644 (file)
@@ -2652,6 +2652,13 @@ ESubtreeMap *MDCache::create_subtree_map()
   return le;
 }
 
+void MDCache::dump_resolve_status(Formatter *f) const
+{
+  f->open_object_section("resolve_status");
+  f->dump_stream("resolve_gather") << resolve_gather;
+  f->dump_stream("resolve_ack_gather") << resolve_gather;
+  f->close_section();
+}
 
 void MDCache::resolve_start(MDSInternalContext *resolve_done_)
 {
@@ -3849,6 +3856,15 @@ void MDCache::recalc_auth_bits(bool replay)
  *   after recovery.
  */
 
+void MDCache::dump_rejoin_status(Formatter *f) const
+{
+  f->open_object_section("rejoin_status");
+  f->dump_stream("rejoin_gather") << rejoin_gather;
+  f->dump_stream("rejoin_ack_gather") << rejoin_ack_gather;
+  f->dump_unsigned("num_opening_inodes", cap_imports_num_opening);
+  f->close_section();
+}
+
 void MDCache::rejoin_start(MDSInternalContext *rejoin_done_)
 {
   dout(10) << "rejoin_start" << dendl;
index 921b03ad4ec3455251a6df91161e9b0dcb6105be..c7a771c237dda66e740a0d0cd58e8f202819bbad 100644 (file)
@@ -1105,6 +1105,9 @@ public:
   void dump_cache(const std::string &filename);
   void dump_cache(Formatter *f);
 
+  void dump_resolve_status(Formatter *f) const;
+  void dump_rejoin_status(Formatter *f) const;
+
   // == crap fns ==
  public:
   void show_cache();
index 43cdc48503548bb4b9a5250d04cea635cf5886f2..9bf095e747e4fe95106a16f2dd66ab1d0d5f5da9 100644 (file)
@@ -1386,3 +1386,14 @@ void MDLog::standby_trim_segments()
   } else
     dout(20) << " removed no segments!" << dendl;
 }
+
+void MDLog::dump_replay_status(Formatter *f) const
+{
+  f->open_object_section("replay_status");
+  f->dump_unsigned("journal_read_pos", journaler ? journaler->get_read_pos() : 0);
+  f->dump_unsigned("journal_write_pos", journaler ? journaler->get_write_pos() : 0);
+  f->dump_unsigned("journal_expire_pos", journaler ? journaler->get_expire_pos() : 0);
+  f->dump_unsigned("num_events", get_num_events());
+  f->dump_unsigned("num_segments", get_num_segments());
+  f->close_section();
+}
index c8f9e70f4c282c91922dbcb9e8a9137eb83ddb01..db6a0223b0400f4dea46e7685055f1ab6327d904 100644 (file)
@@ -315,6 +315,8 @@ public:
   void replay(MDSInternalContextBase *onfinish);
 
   void standby_trim_segments();
+
+  void dump_replay_status(Formatter *f) const;
 };
 
 #endif
index 15867c55e47c5f22d64de19faaf82bbaa7d939d4..8f04680cac76dde84dcd7e2914e585be8c8ca9e5 100644 (file)
@@ -171,28 +171,7 @@ bool MDSDaemon::asok_command(string command, cmdmap_t& cmdmap, string format,
   Formatter *f = Formatter::create(format, "json-pretty", "json-pretty");
   bool handled = false;
   if (command == "status") {
-    const OSDMap *osdmap = objecter->get_osdmap_read();
-    const epoch_t osd_epoch = osdmap->get_epoch();
-    objecter->put_osdmap_read();
-
-    f->open_object_section("status");
-    f->dump_stream("cluster_fsid") << monc->get_fsid();
-    if (mds_rank) {
-      f->dump_unsigned("whoami", mds_rank->get_nodeid());
-    } else {
-      f->dump_unsigned("whoami", MDS_RANK_NONE);
-    }
-
-    f->dump_string("state", ceph_mds_state_name(mdsmap->get_state_gid(mds_gid_t(
-        monc->get_global_id()))));
-    f->dump_unsigned("mdsmap_epoch", mdsmap->get_epoch());
-    f->dump_unsigned("osdmap_epoch", osd_epoch);
-    if (mds_rank) {
-      f->dump_unsigned("osdmap_epoch_barrier", mds_rank->get_osd_epoch_barrier());
-    } else {
-      f->dump_unsigned("osdmap_epoch_barrier", 0);
-    }
-    f->close_section(); // status
+    dump_status(f);
     handled = true;
   } else {
     if (mds_rank == NULL) {
@@ -211,6 +190,38 @@ bool MDSDaemon::asok_command(string command, cmdmap_t& cmdmap, string format,
   return handled;
 }
 
+void MDSDaemon::dump_status(Formatter *f)
+{
+  const OSDMap *osdmap = objecter->get_osdmap_read();
+  const epoch_t osd_epoch = osdmap->get_epoch();
+  objecter->put_osdmap_read();
+
+  f->open_object_section("status");
+  f->dump_stream("cluster_fsid") << monc->get_fsid();
+  if (mds_rank) {
+    f->dump_unsigned("whoami", mds_rank->get_nodeid());
+  } else {
+    f->dump_unsigned("whoami", MDS_RANK_NONE);
+  }
+
+  f->dump_string("want_state", ceph_mds_state_name(beacon.get_want_state()));
+  f->dump_string("state", ceph_mds_state_name(mdsmap->get_state_gid(mds_gid_t(
+           monc->get_global_id()))));
+  if (mds_rank) {
+    Mutex::Locker l(mds_lock);
+    mds_rank->dump_status(f);
+  }
+
+  f->dump_unsigned("mdsmap_epoch", mdsmap->get_epoch());
+  f->dump_unsigned("osdmap_epoch", osd_epoch);
+  if (mds_rank) {
+    f->dump_unsigned("osdmap_epoch_barrier", mds_rank->get_osd_epoch_barrier());
+  } else {
+    f->dump_unsigned("osdmap_epoch_barrier", 0);
+  }
+  f->close_section(); // status
+}
+
 void MDSDaemon::set_up_admin_socket()
 {
   int r;
index ba3f456e9c0720269808ee83e8a8f37e1c9a14ce..8c61ea9ca4ba9ae7b23cb2b918892e4158eafa6b 100644 (file)
@@ -161,11 +161,13 @@ class MDSDaemon : public Dispatcher, public md_config_obs_t {
   // admin socket handling
   friend class MDSSocketHook;
   class MDSSocketHook *asok_hook;
-  bool asok_command(string command, cmdmap_t& cmdmap, string format,
-                   ostream& ss);
   void set_up_admin_socket();
   void clean_up_admin_socket();
   void check_ops_in_flight(); // send off any slow ops to monitor
+  bool asok_command(string command, cmdmap_t& cmdmap, string format,
+                   ostream& ss);
+
+  void dump_status(Formatter *f);
 
   /**
    * Terminate this daemon process.
index fcb8efdda4bd765b01729f7510bfca972e44fe2a..c576000f782868489cad2c5f12a77ef0fd10212d 100644 (file)
@@ -2230,6 +2230,30 @@ bool MDSRank::command_dirfrag_ls(
   return true;
 }
 
+void MDSRank::dump_status(Formatter *f) const
+{
+  if (state == MDSMap::STATE_REPLAY ||
+      state == MDSMap::STATE_STANDBY_REPLAY) {
+    mdlog->dump_replay_status(f);
+  } else if (state == MDSMap::STATE_RESOLVE) {
+    mdcache->dump_resolve_status(f);
+  } else if (state == MDSMap::STATE_RECONNECT) {
+    server->dump_reconnect_status(f);
+  } else if (state == MDSMap::STATE_REJOIN) {
+    mdcache->dump_rejoin_status(f);
+  } else if (state == MDSMap::STATE_CLIENTREPLAY) {
+    dump_clientreplay_status(f);
+  }
+}
+
+void MDSRank::dump_clientreplay_status(Formatter *f) const
+{
+  f->open_object_section("clientreplay_status");
+  f->dump_unsigned("clientreplay_queue", replay_queue.size());
+  f->dump_unsigned("active_replay", mdcache->get_num_client_requests());
+  f->close_section();
+}
+
 void MDSRankDispatcher::update_log_config()
 {
   map<string,string> log_to_monitors;
index 8d2667b15bae022e62ba19848e3080da10710b42..5cb8d2eec0cc6c7f3c998f7cc2b198fa935ec21d 100644 (file)
@@ -366,7 +366,10 @@ class MDSRank {
 
     int get_req_rate() { return logger->get(l_mds_request); }
 
+    void dump_status(Formatter *f) const;
+
   protected:
+    void dump_clientreplay_status(Formatter *f) const;
     void command_scrub_path(Formatter *f, const string& path);
     void command_tag_path(Formatter *f, const string& path,
                           const string &tag);
@@ -390,7 +393,6 @@ class MDSRank {
     CDir *_command_dirfrag_get(
         const cmdmap_t &cmdmap,
         std::ostream &ss);
-    // <<<
 
   protected:
     Messenger    *messenger;
index 3887faac50676d2bce5b03d323a15cfd94c4b668..ba4fe1540bda439eaae299892c056a68862a903b 100644 (file)
@@ -8270,3 +8270,10 @@ bool Server::waiting_for_reconnect(client_t c) const
 {
   return client_reconnect_gather.count(c) > 0;
 }
+
+void Server::dump_reconnect_status(Formatter *f) const
+{
+  f->open_object_section("reconnect_status");
+  f->dump_stream("client_reconnect_gather") << client_reconnect_gather;
+  f->close_section();
+}
index 803dd3276d934b80f2acdd56bf364dcca0d7b166..44ee5b782ea663793b2f02d920f77218a7bbd01a 100644 (file)
@@ -81,6 +81,7 @@ public:
   utime_t  reconnect_start;
   set<client_t> client_reconnect_gather;  // clients i need a reconnect msg from.
   bool waiting_for_reconnect(client_t c) const;
+  void dump_reconnect_status(Formatter *f) const;
 
   Session *get_session(Message *m);
   void handle_client_session(class MClientSession *m);