From 9996d446988768658db751a7843b13cf3d194213 Mon Sep 17 00:00:00 2001 From: Joao Eduardo Luis Date: Thu, 18 Sep 2014 16:52:34 +0100 Subject: [PATCH] mon: DataHealthService: use get_fs_stats() instead and relieve the DataStats struct from clutter by using ceph_data_stats_t instead of multiple fields. Signed-off-by: Joao Eduardo Luis --- src/mon/DataHealthService.cc | 39 ++++++++++++++----------------- src/mon/mon_types.h | 45 +++++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 41 deletions(-) diff --git a/src/mon/DataHealthService.cc b/src/mon/DataHealthService.cc index 780a71d09f390..ef1e0e5babf28 100644 --- a/src/mon/DataHealthService.cc +++ b/src/mon/DataHealthService.cc @@ -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; } diff --git a/src/mon/mon_types.h b/src/mon/mon_types.h index 3967481fbf767..c3a39979268ef 100644 --- a/src/mon/mon_types.h +++ b/src/mon/mon_types.h @@ -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); -- 2.39.5