From: Ruifeng Yang Date: Tue, 12 Jan 2016 14:08:41 +0000 (+0800) Subject: mon: add a column 'RAW USED' for ceph df detail X-Git-Tag: v0.94.8~21^2~2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=fed256e40f5465959384735be957dec88733aeb7;p=ceph.git mon: add a column 'RAW USED' for ceph df detail Signed-off-by: Ruifeng Yang (cherry picked from commit 2b597ae6d4d53974f28a2da090232577daf09979) Conflicts: qa/workunits/cephtool/test.sh (trivial) src/mon/PGMonitor.cc (trivial) src/mon/PGMonitor.h (trivial) --- diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index 08d4b04d73b66..9a7ef95f2b10d 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -1519,6 +1519,30 @@ EOF ceph osd setcrushmap -i $map } +function test_mon_cephdf_commands() +{ + # ceph df detail: + # pool section: + # RAW USED The near raw used per pool in raw total + + ceph osd pool create cephdf_for_test 32 32 replicated + ceph osd pool set cephdf_for_test size 2 + + dd if=/dev/zero of=./cephdf_for_test bs=4k count=1 + rados put cephdf_for_test cephdf_for_test -p cephdf_for_test + + #wait for update + sleep 10 + + cal_raw_used_size=`ceph df detail | grep cephdf_for_test | awk -F ' ' '{printf "%d\n", 2 * $4}'` + raw_used_size=`ceph df detail | grep cephdf_for_test | awk -F ' ' '{print $11}'` + + ceph osd pool delete cephdf_for_test cephdf_for_test --yes-i-really-really-mean-it + rm ./cephdf_for_test + + expect_false test $cal_raw_used_size != $raw_used_size +} + # # New tests should be added to the TESTS array below # @@ -1560,6 +1584,7 @@ OSD_TESTS+=" tiering_agent" MDS_TESTS+=" mds_tell" MDS_TESTS+=" mon_mds" +MDS_TESTS+=" mon_cephdf_commands" TESTS+=$MON_TESTS TESTS+=$OSD_TESTS diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index 3c2b756af1a00..b7779bf9ecf01 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -1252,8 +1252,12 @@ inline string percentify(const float& a) { //void PGMonitor::dump_object_stat_sum(stringstream& ss, Formatter *f, void PGMonitor::dump_object_stat_sum(TextTable &tbl, Formatter *f, object_stat_sum_t &sum, uint64_t avail, - bool verbose) + float raw_used_rate, bool verbose) { + float curr_object_copies_rate = 0.0; + if (sum.num_object_copies > 0) + curr_object_copies_rate = (float)(sum.num_object_copies - sum.num_objects_degraded) / sum.num_object_copies; + if (f) { f->dump_int("kb_used", SHIFT_ROUND_UP(sum.num_bytes, 10)); f->dump_int("bytes_used", sum.num_bytes); @@ -1265,6 +1269,7 @@ void PGMonitor::dump_object_stat_sum(TextTable &tbl, Formatter *f, f->dump_int("rd_bytes", sum.num_rd_kb * 1024ull); f->dump_int("wr", sum.num_wr); f->dump_int("wr_bytes", sum.num_wr_kb * 1024ull); + f->dump_int("raw_bytes_used", sum.num_bytes * raw_used_rate * curr_object_copies_rate); } } else { tbl << stringify(si_t(sum.num_bytes)); @@ -1277,8 +1282,9 @@ void PGMonitor::dump_object_stat_sum(TextTable &tbl, Formatter *f, tbl << sum.num_objects; if (verbose) { tbl << stringify(si_t(sum.num_objects_dirty)) - << stringify(si_t(sum.num_rd)) - << stringify(si_t(sum.num_wr)); + << stringify(si_t(sum.num_rd)) + << stringify(si_t(sum.num_wr)) + << stringify(si_t(sum.num_bytes * raw_used_rate * curr_object_copies_rate)); } } } @@ -1333,6 +1339,7 @@ void PGMonitor::dump_pool_stats(stringstream &ss, Formatter *f, bool verbose) tbl.define_column("DIRTY", TextTable::LEFT, TextTable::RIGHT); tbl.define_column("READ", TextTable::LEFT, TextTable::RIGHT); tbl.define_column("WRITE", TextTable::LEFT, TextTable::RIGHT); + tbl.define_column("RAW USED", TextTable::LEFT, TextTable::RIGHT); } } @@ -1351,6 +1358,7 @@ void PGMonitor::dump_pool_stats(stringstream &ss, Formatter *f, bool verbose) pool->get_type(), pool->get_size()); int64_t avail; + float raw_used_rate; if (avail_by_rule.count(ruleno) == 0) { avail = get_rule_avail(osdmap, ruleno); if (avail < 0) @@ -1362,20 +1370,24 @@ void PGMonitor::dump_pool_stats(stringstream &ss, Formatter *f, bool verbose) switch (pool->get_type()) { case pg_pool_t::TYPE_REPLICATED: avail /= pool->get_size(); + raw_used_rate = pool->get_size(); break; case pg_pool_t::TYPE_ERASURE: - { - const map& ecp = - osdmap.get_erasure_code_profile(pool->erasure_code_profile); - map::const_iterator pm = ecp.find("m"); - map::const_iterator pk = ecp.find("k"); - if (pm != ecp.end() && pk != ecp.end()) { - int k = atoi(pk->second.c_str()); - int m = atoi(pm->second.c_str()); - avail = avail * k / (m + k); - } + { + const map& ecp = + osdmap.get_erasure_code_profile(pool->erasure_code_profile); + map::const_iterator pm = ecp.find("m"); + map::const_iterator pk = ecp.find("k"); + if (pm != ecp.end() && pk != ecp.end()) { + int k = atoi(pk->second.c_str()); + int m = atoi(pm->second.c_str()); + avail = avail * k / (m + k); + raw_used_rate = (float)(m + k) / k; + } else { + raw_used_rate = 0.0; } break; + } default: assert(0 == "unrecognized pool type"); } @@ -1391,7 +1403,7 @@ void PGMonitor::dump_pool_stats(stringstream &ss, Formatter *f, bool verbose) if (verbose) tbl << "-"; } - dump_object_stat_sum(tbl, f, stat.stats.sum, avail, verbose); + dump_object_stat_sum(tbl, f, stat.stats.sum, avail, raw_used_rate, verbose); if (f) f->close_section(); // stats else diff --git a/src/mon/PGMonitor.h b/src/mon/PGMonitor.h index 97a9ac1194b95..4161a029fc9e0 100644 --- a/src/mon/PGMonitor.h +++ b/src/mon/PGMonitor.h @@ -146,8 +146,9 @@ private: vector& args) const; void dump_object_stat_sum(TextTable &tbl, Formatter *f, - object_stat_sum_t &sum, + object_stat_sum_t &sum, uint64_t avail, + float raw_used_rate, bool verbose); int64_t get_rule_avail(OSDMap& osdmap, int ruleno);