From 31c3cbe88febeb51084e621b091ef2ba21e6fd5f Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Tue, 29 Dec 2015 15:49:08 +0800 Subject: [PATCH] mds: expose state of recovery to status ASOK command Fixes: #14146 Signed-off-by: Yan, Zheng --- src/mds/MDCache.cc | 16 +++++++++++++ src/mds/MDCache.h | 3 +++ src/mds/MDLog.cc | 11 +++++++++ src/mds/MDLog.h | 2 ++ src/mds/MDSDaemon.cc | 55 ++++++++++++++++++++++++++------------------ src/mds/MDSDaemon.h | 6 +++-- src/mds/MDSRank.cc | 24 +++++++++++++++++++ src/mds/MDSRank.h | 4 +++- src/mds/Server.cc | 7 ++++++ src/mds/Server.h | 1 + 10 files changed, 104 insertions(+), 25 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index ade86c9e06341..d7bf95ffd8b59 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -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; diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index 921b03ad4ec34..c7a771c237dda 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -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(); diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 43cdc48503548..9bf095e747e4f 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -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(); +} diff --git a/src/mds/MDLog.h b/src/mds/MDLog.h index c8f9e70f4c282..db6a0223b0400 100644 --- a/src/mds/MDLog.h +++ b/src/mds/MDLog.h @@ -315,6 +315,8 @@ public: void replay(MDSInternalContextBase *onfinish); void standby_trim_segments(); + + void dump_replay_status(Formatter *f) const; }; #endif diff --git a/src/mds/MDSDaemon.cc b/src/mds/MDSDaemon.cc index 15867c55e47c5..8f04680cac76d 100644 --- a/src/mds/MDSDaemon.cc +++ b/src/mds/MDSDaemon.cc @@ -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; diff --git a/src/mds/MDSDaemon.h b/src/mds/MDSDaemon.h index ba3f456e9c072..8c61ea9ca4ba9 100644 --- a/src/mds/MDSDaemon.h +++ b/src/mds/MDSDaemon.h @@ -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. diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index fcb8efdda4bd7..c576000f78286 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -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 log_to_monitors; diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index 8d2667b15bae0..5cb8d2eec0cc6 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -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; diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 3887faac50676..ba4fe1540bda4 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -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(); +} diff --git a/src/mds/Server.h b/src/mds/Server.h index 803dd3276d934..44ee5b782ea66 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -81,6 +81,7 @@ public: utime_t reconnect_start; set 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); -- 2.39.5