1
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2
// vim: ts=8 sw=2 smarttab
4
6
#define DOUT_SUBSYS mon
5
7
#include "common/debug.h"
9
#include "common/Formatter.h"
13
void PGMap::Incremental::encode(bufferlist &bl) const
17
::encode(version, bl);
18
::encode(pg_stat_updates, bl);
19
::encode(osd_stat_updates, bl);
20
::encode(osd_stat_rm, bl);
21
::encode(osdmap_epoch, bl);
22
::encode(pg_scan, bl);
23
::encode(full_ratio, bl);
24
::encode(nearfull_ratio, bl);
25
::encode(pg_remove, bl);
28
void PGMap::Incremental::decode(bufferlist::iterator &bl)
32
::decode(version, bl);
34
pg_stat_updates.clear();
41
::decode(pg_stat_updates[pgid], bl);
44
::decode(pg_stat_updates, bl);
46
::decode(osd_stat_updates, bl);
47
::decode(osd_stat_rm, bl);
48
::decode(osdmap_epoch, bl);
49
::decode(pg_scan, bl);
51
::decode(full_ratio, bl);
52
::decode(nearfull_ratio, bl);
61
pg_remove.insert(pg_t(opgid));
64
::decode(pg_remove, bl);
68
void PGMap::Incremental::dump(Formatter *f) const
70
f->dump_unsigned("version", version);
71
f->dump_unsigned("osdmap_epoch", osdmap_epoch);
72
f->dump_unsigned("pg_scan_epoch", pg_scan);
73
f->dump_float("full_ratio", full_ratio);
74
f->dump_float("nearfull_ratio", nearfull_ratio);
76
f->open_array_section("pg_stat_updates");
77
for (map<pg_t,pg_stat_t>::const_iterator p = pg_stat_updates.begin(); p != pg_stat_updates.end(); ++p) {
78
f->open_object_section("pg_stat");
79
f->dump_stream("pgid") << p->first;
85
f->open_array_section("osd_stat_updates");
86
for (map<int,osd_stat_t>::const_iterator p = osd_stat_updates.begin(); p != osd_stat_updates.end(); ++p) {
87
f->open_object_section("osd_stat");
88
f->dump_int("osd", p->first);
94
f->open_array_section("osd_stat_removals");
95
for (set<int>::const_iterator p = osd_stat_rm.begin(); p != osd_stat_rm.end(); ++p)
96
f->dump_int("osd", *p);
99
f->open_array_section("pg_removals");
100
for (set<pg_t>::const_iterator p = pg_remove.begin(); p != pg_remove.end(); ++p)
101
f->dump_stream("pgid") << *p;
105
void PGMap::Incremental::generate_test_instances(list<PGMap::Incremental*>& o)
107
o.push_back(new Incremental);
108
o.push_back(new Incremental);
109
o.back()->version = 1;
110
o.push_back(new Incremental);
111
o.back()->version = 2;
112
o.back()->pg_stat_updates[pg_t(1,2,3)] = pg_stat_t();
113
o.back()->osd_stat_updates[5] = osd_stat_t();
114
o.push_back(new Incremental);
115
o.back()->version = 3;
116
o.back()->osdmap_epoch = 1;
117
o.back()->pg_scan = 2;
118
o.back()->full_ratio = .2;
119
o.back()->nearfull_ratio = .3;
120
o.back()->pg_stat_updates[pg_t(4,5,6)] = pg_stat_t();
121
o.back()->osd_stat_updates[6] = osd_stat_t();
122
o.back()->pg_remove.insert(pg_t(1,2,3));
123
o.back()->osd_stat_rm.insert(5);
7
129
void PGMap::apply_incremental(const Incremental& inc)
9
131
assert(inc.version == version+1);
286
415
f->close_section();
290
void PGMap::dump(ostream& ss) const
418
void PGMap::dump_pg_stats_plain(ostream& ss,
419
const hash_map<pg_t, pg_stat_t>& pg_stats) const
292
ss << "version " << version << std::endl;
293
ss << "last_osdmap_epoch " << last_osdmap_epoch << std::endl;
294
ss << "last_pg_scan " << last_pg_scan << std::endl;
295
ss << "full_ratio " << full_ratio << std::endl;
296
ss << "nearfull_ratio " << nearfull_ratio << std::endl;
297
ss << "pg_stat\tobjects\tmip\tdegr\tunf\tkb\tbytes\tlog\tdisklog\tstate\tv\treported\tup\tacting\tlast_scrub" << std::endl;
298
for (hash_map<pg_t,pg_stat_t>::const_iterator i = pg_stat.begin();
299
i != pg_stat.end(); ++i) {
421
ss << "pg_stat\tobjects\tmip\tdegr\tunf\tbytes\tlog\tdisklog\tstate\tstate_stamp\tv\treported\tup\tacting\tlast_scrub\tscrub_stamp" << std::endl;
422
for (hash_map<pg_t, pg_stat_t>::const_iterator i = pg_stats.begin();
423
i != pg_stats.end(); ++i) {
300
424
const pg_stat_t &st(i->second);
302
426
<< "\t" << st.stats.sum.num_objects
315
440
<< "\t" << st.last_scrub << "\t" << st.last_scrub_stamp
445
void PGMap::dump(ostream& ss) const
447
ss << "version " << version << std::endl;
448
ss << "last_osdmap_epoch " << last_osdmap_epoch << std::endl;
449
ss << "last_pg_scan " << last_pg_scan << std::endl;
450
ss << "full_ratio " << full_ratio << std::endl;
451
ss << "nearfull_ratio " << nearfull_ratio << std::endl;
452
dump_pg_stats_plain(ss, pg_stat);
318
453
for (hash_map<int,pool_stat_t>::const_iterator p = pg_pool_sum.begin();
319
454
p != pg_pool_sum.end();
492
void PGMap::get_stuck_stats(PGMap::StuckPG type, utime_t cutoff,
493
hash_map<pg_t, pg_stat_t>& stuck_pgs) const
495
for (hash_map<pg_t, pg_stat_t>::const_iterator i = pg_stat.begin();
501
if (i->second.state & PG_STATE_ACTIVE)
503
val = i->second.last_active;
506
if (i->second.state & PG_STATE_CLEAN)
508
val = i->second.last_clean;
511
if ((i->second.state & PG_STATE_STALE) == 0)
513
val = i->second.last_unstale;
516
assert(0 == "invalid type");
520
stuck_pgs[i->first] = i->second;
525
void PGMap::dump_stuck(Formatter *f, PGMap::StuckPG type, utime_t cutoff) const
527
hash_map<pg_t, pg_stat_t> stuck_pg_stats;
528
get_stuck_stats(type, cutoff, stuck_pg_stats);
529
f->open_array_section("stuck_pg_stats");
530
for (hash_map<pg_t,pg_stat_t>::const_iterator i = stuck_pg_stats.begin();
531
i != stuck_pg_stats.end();
533
f->open_object_section("pg_stat");
534
f->dump_stream("pgid") << i->first;
541
void PGMap::dump_stuck_plain(ostream& ss, PGMap::StuckPG type, utime_t cutoff) const
543
hash_map<pg_t, pg_stat_t> stuck_pg_stats;
544
get_stuck_stats(type, cutoff, stuck_pg_stats);
545
dump_pg_stats_plain(ss, stuck_pg_stats);
357
548
void PGMap::state_summary(ostream& ss) const
359
550
for (hash_map<int,int>::const_iterator p = num_pg_by_state.begin();