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";
}
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()));
}
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);
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();
// 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;
}
#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
// 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);