From: Sage Weil Date: Mon, 6 Aug 2018 16:43:02 +0000 (-0500) Subject: mon: include mon quorum age in status X-Git-Tag: v14.0.1~357^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4d5a641e4327eefb621dccbbb73e51a42a0e107a;p=ceph.git mon: include mon quorum age in status Signed-off-by: Sage Weil --- diff --git a/src/mon/Monitor.cc b/src/mon/Monitor.cc index 9b09d8101125..a4f564ad790e 100644 --- a/src/mon/Monitor.cc +++ b/src/mon/Monitor.cc @@ -1107,6 +1107,7 @@ void Monitor::_reset() scrub_event_cancel(); leader_since = utime_t(); + quorum_since = {}; if (!quorum.empty()) { exited_quorum = ceph_clock_now(); } @@ -1972,6 +1973,7 @@ void Monitor::win_election(epoch_t epoch, set& active, uint64_t features, ceph_assert(is_electing()); state = STATE_LEADER; leader_since = ceph_clock_now(); + quorum_since = mono_clock::now(); leader = rank; quorum = active; quorum_con_features = features; @@ -2050,6 +2052,7 @@ void Monitor::lose_election(epoch_t epoch, set &q, int l, { state = STATE_PEON; leader_since = utime_t(); + quorum_since = mono_clock::now(); leader = l; quorum = q; outside_quorum.clear(); @@ -2293,6 +2296,10 @@ void Monitor::_quorum_status(Formatter *f, ostream& ss) f->dump_string("quorum_leader_name", quorum.empty() ? string() : monmap->get_name(*quorum.begin())); + if (!quorum.empty()) { + f->dump_stream("quorum_age") << (mono_clock::now() - quorum_since); + } + f->open_object_section("monmap"); monmap->dump(f); f->close_section(); // monmap @@ -2323,9 +2330,12 @@ void Monitor::get_mon_status(Formatter *f, ostream& ss) for (set::iterator p = quorum.begin(); p != quorum.end(); ++p) { f->dump_int("mon", *p); } - f->close_section(); // quorum + if (!quorum.empty()) { + f->dump_stream("quorum_age") << (mono_clock::now() - quorum_since); + } + f->open_object_section("features"); f->dump_stream("required_con") << required_features; mon_feature_t req_mon_features = get_required_mon_features(); @@ -2729,6 +2739,7 @@ void Monitor::get_cluster_status(stringstream &ss, Formatter *f) if (f) f->open_object_section("status"); + mono_clock::time_point now = mono_clock::now(); if (f) { f->dump_stream("fsid") << monmap->get_fsid(); get_health_status(false, f, nullptr); @@ -2742,6 +2753,7 @@ void Monitor::get_cluster_status(stringstream &ss, Formatter *f) for (set::iterator p = quorum.begin(); p != quorum.end(); ++p) f->dump_string("id", monmap->get_name(*p)); f->close_section(); + f->dump_stream("quorum_age") << (now - quorum_since); } f->open_object_section("monmap"); monmap->dump(f); @@ -2781,7 +2793,7 @@ void Monitor::get_cluster_status(stringstream &ss, Formatter *f) const auto quorum_names = get_quorum_names(); const auto mon_count = monmap->mon_info.size(); ss << " mon: " << spacing << mon_count << " daemons, quorum " - << quorum_names; + << quorum_names << " (age " << timespan_str(now - quorum_since) << ")"; if (quorum_names.size() != mon_count) { std::list out_of_q; for (size_t i = 0; i < monmap->ranks.size(); ++i) { diff --git a/src/mon/Monitor.h b/src/mon/Monitor.h index 6f8e3ca451bc..2dffb7d002b4 100644 --- a/src/mon/Monitor.h +++ b/src/mon/Monitor.h @@ -230,6 +230,7 @@ private: int leader; // current leader (to best of knowledge) set quorum; // current active set of monitors (if !starting) + mono_clock::time_point quorum_since; // when quorum formed utime_t leader_since; // when this monitor became the leader, if it is the leader utime_t exited_quorum; // time detected as not in quorum; 0 if in