]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: DataHealthService: use get_fs_stats() instead
authorJoao Eduardo Luis <joao@redhat.com>
Thu, 18 Sep 2014 15:52:34 +0000 (16:52 +0100)
committerSage Weil <sage@redhat.com>
Thu, 16 Oct 2014 00:18:41 +0000 (17:18 -0700)
and relieve the DataStats struct from clutter by using
ceph_data_stats_t instead of multiple fields.

Signed-off-by: Joao Eduardo Luis <joao@redhat.com>
(cherry picked from commit 9996d446988768658db751a7843b13cf3d194213)

Conflicts:
src/mon/DataHealthService.cc

src/mon/DataHealthService.cc
src/mon/mon_types.h

index 6c6ed2904c010b01d8b186cb91dbd8ef58745702..a2bbb1f5ca2b07861c0a522cfb1e859d38e0c370 100644 (file)
@@ -86,10 +86,10 @@ void DataHealthService::get_health(
 
     health_status_t health_status = HEALTH_OK;
     string health_detail;
-    if (stats.latest_avail_percent <= g_conf->mon_data_avail_crit) {
+    if (stats.fs_stats.avail_percent <= g_conf->mon_data_avail_crit) {
       health_status = HEALTH_ERR;
       health_detail = "low disk space, shutdown imminent";
-    } else if (stats.latest_avail_percent <= g_conf->mon_data_avail_warn) {
+    } else if (stats.fs_stats.avail_percent <= g_conf->mon_data_avail_warn) {
       health_status = HEALTH_WARN;
       health_detail = "low disk space";
     }
@@ -110,7 +110,7 @@ void DataHealthService::get_health(
       stringstream ss;
       ss << "mon." << mon_name << " " << health_detail;
       summary.push_back(make_pair(health_status, ss.str()));
-      ss << " -- " <<  stats.latest_avail_percent << "% avail";
+      ss << " -- " <<  stats.fs_stats.avail_percent << "% avail";
       if (detail)
        detail->push_back(make_pair(health_status, ss.str()));
     }
@@ -151,23 +151,18 @@ int DataHealthService::update_store_stats(DataStats &ours)
 
 int DataHealthService::update_stats()
 {
-  struct statfs stbuf;
-  int err = ::statfs(g_conf->mon_data.c_str(), &stbuf);
-  if (err < 0) {
-    derr << __func__ << " statfs error: " << cpp_strerror(errno) << dendl;
-    return -errno;
-  }
-
   entity_inst_t our_inst = mon->messenger->get_myinst();
   DataStats& ours = stats[our_inst];
 
-  ours.kb_total = stbuf.f_blocks * stbuf.f_bsize / 1024;
-  ours.kb_used = (stbuf.f_blocks - stbuf.f_bfree) * stbuf.f_bsize / 1024;
-  ours.kb_avail = stbuf.f_bavail * stbuf.f_bsize / 1024;
-  ours.latest_avail_percent = (((float)ours.kb_avail/ours.kb_total)*100);
-  dout(0) << __func__ << " avail " << ours.latest_avail_percent << "%"
-          << " total " << ours.kb_total << " used " << ours.kb_used << " avail " << ours.kb_avail
-          << dendl;
+  int err = get_fs_stats(ours.fs_stats, g_conf->mon_data.c_str());
+  if (err < 0) {
+    derr << __func__ << " get_fs_stats error: " << cpp_strerror(err) << dendl;
+    return err;
+  }
+  dout(0) << __func__ << " avail " << ours.fs_stats.avail_percent << "%"
+          << " total " << prettybyte_t(ours.fs_stats.byte_total)
+          << ", used " << prettybyte_t(ours.fs_stats.byte_used)
+          << ", avail " << prettybyte_t(ours.fs_stats.byte_avail) << dendl;
   ours.last_update = ceph_clock_now(g_ceph_context);
 
   return update_store_stats(ours);
@@ -213,7 +208,7 @@ void DataHealthService::service_tick()
 
   DataStats &ours = stats[mon->messenger->get_myinst()];
 
-  if (ours.latest_avail_percent <= g_conf->mon_data_avail_crit) {
+  if (ours.fs_stats.avail_percent <= g_conf->mon_data_avail_crit) {
     derr << "reached critical levels of available space on local monitor storage"
          << " -- shutdown!" << dendl;
     force_shutdown();
@@ -224,12 +219,12 @@ void DataHealthService::service_tick()
   // consumed in-between reports to assess if it's worth to log this info,
   // otherwise we may very well contribute to the consumption of the
   // already low available disk space.
-  if (ours.latest_avail_percent <= g_conf->mon_data_avail_warn) {
-    if (ours.latest_avail_percent != last_warned_percent)
+  if (ours.fs_stats.avail_percent <= g_conf->mon_data_avail_warn) {
+    if (ours.fs_stats.avail_percent != last_warned_percent)
       mon->clog.warn()
        << "reached concerning levels of available space on local monitor storage"
-       << " (" << ours.latest_avail_percent << "% free)\n";
-    last_warned_percent = ours.latest_avail_percent;
+       << " (" << ours.fs_stats.avail_percent << "% free)\n";
+    last_warned_percent = ours.fs_stats.avail_percent;
   } else {
     last_warned_percent = 0;
   }
index 0ae1aaf8d5e0f887c6c4b929ce10d8c3daf1a6d7..cc68ffba9e03478d9f68e12b20b340977b04a0c1 100644 (file)
@@ -16,6 +16,7 @@
 #define CEPH_MON_TYPES_H
 
 #include "include/utime.h"
+#include "include/util.h"
 #include "common/Formatter.h"
 
 #define PAXOS_PGMAP      0  // before osd, for pg kick to behave
@@ -89,44 +90,50 @@ WRITE_CLASS_ENCODER(LevelDBStoreStats);
 // data stats
 
 struct DataStats {
+  ceph_data_stats_t fs_stats;
   // data dir
-  uint64_t kb_total;
-  uint64_t kb_used;
-  uint64_t kb_avail;
-  int latest_avail_percent;
   utime_t last_update;
-
   LevelDBStoreStats store_stats;
 
   void dump(Formatter *f) const {
     assert(f != NULL);
-    f->dump_int("kb_total", kb_total);
-    f->dump_int("kb_used", kb_used);
-    f->dump_int("kb_avail", kb_avail);
-    f->dump_int("avail_percent", latest_avail_percent);
+    f->dump_int("kb_total", (fs_stats.byte_total/1024));
+    f->dump_int("kb_used", (fs_stats.byte_used/1024));
+    f->dump_int("kb_avail", (fs_stats.byte_avail/1024));
+    f->dump_int("avail_percent", fs_stats.avail_percent);
     f->dump_stream("last_updated") << last_update;
-
     f->open_object_section("store_stats");
     store_stats.dump(f);
     f->close_section();
   }
 
   void encode(bufferlist &bl) const {
-    ENCODE_START(2, 1, bl);
-    ::encode(kb_total, bl);
-    ::encode(kb_used, bl);
-    ::encode(kb_avail, bl);
-    ::encode(latest_avail_percent, bl);
+    ENCODE_START(3, 1, bl);
+    ::encode(fs_stats.byte_total, bl);
+    ::encode(fs_stats.byte_used, bl);
+    ::encode(fs_stats.byte_avail, bl);
+    ::encode(fs_stats.avail_percent, bl);
     ::encode(last_update, bl);
     ::encode(store_stats, bl);
     ENCODE_FINISH(bl);
   }
   void decode(bufferlist::iterator &p) {
     DECODE_START(1, p);
-    ::decode(kb_total, p);
-    ::decode(kb_used, p);
-    ::decode(kb_avail, p);
-    ::decode(latest_avail_percent, p);
+    // we moved from having fields in kb to fields in byte
+    if (struct_v > 2) {
+      ::decode(fs_stats.byte_total, p);
+      ::decode(fs_stats.byte_used, p);
+      ::decode(fs_stats.byte_avail, p);
+    } else {
+      uint64_t t;
+      ::decode(t, p);
+      fs_stats.byte_total = t*1024;
+      ::decode(t, p);
+      fs_stats.byte_used = t*1024;
+      ::decode(t, p);
+      fs_stats.byte_avail = t*1024;
+    }
+    ::decode(fs_stats.avail_percent, p);
     ::decode(last_update, p);
     if (struct_v > 1)
       ::decode(store_stats, p);