]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: include mon quorum age in status
authorSage Weil <sage@redhat.com>
Mon, 6 Aug 2018 16:43:02 +0000 (11:43 -0500)
committerSage Weil <sage@redhat.com>
Thu, 6 Sep 2018 15:28:45 +0000 (10:28 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/mon/Monitor.cc
src/mon/Monitor.h

index 9b09d8101125ea8b97a671accdc9eaef4834f0f0..a4f564ad790e3893a8c2115a63dd7deb4410ef69 100644 (file)
@@ -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<int>& 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<int> &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<int>::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<int>::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<std::string> out_of_q;
        for (size_t i = 0; i < monmap->ranks.size(); ++i) {
index 6f8e3ca451bcd052e365a1e78c64689a12acb082..2dffb7d002b470022a078bcb0da30a88fd918fd3 100644 (file)
@@ -230,6 +230,7 @@ private:
   
   int leader;            // current leader (to best of knowledge)
   set<int> 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