tab.define_column("SCRUB_STAMP", TextTable::LEFT, TextTable::RIGHT);
tab.define_column("LAST_DEEP_SCRUB", TextTable::LEFT, TextTable::RIGHT);
tab.define_column("DEEP_SCRUB_STAMP", TextTable::LEFT, TextTable::RIGHT);
+ tab.define_column("SNAPTRIMQ_LEN", TextTable::LEFT, TextTable::RIGHT);
}
for (auto i = pg_stats.begin();
<< st.last_scrub_stamp
<< st.last_deep_scrub
<< st.last_deep_scrub_stamp
+ << st.snaptrimq_len
<< TextTable::endrow;
}
}
info.stats.ondisk_log_size = info.stats.log_size;
info.stats.log_start = pg_log.get_tail();
info.stats.ondisk_log_start = pg_log.get_tail();
+ info.stats.snaptrimq_len = snap_trimq.size();
// If actingset is larger then upset we will have misplaced,
// so we will report based on actingset size.
f->dump_bool("hitset_stats_invalid", hitset_stats_invalid);
f->dump_bool("hitset_bytes_stats_invalid", hitset_bytes_stats_invalid);
f->dump_bool("pin_stats_invalid", pin_stats_invalid);
+ f->dump_unsigned("snaptrimq_len", snaptrimq_len);
stats.dump(f);
f->open_array_section("up");
for (vector<int32_t>::const_iterator p = up.begin(); p != up.end(); ++p)
void pg_stat_t::encode(bufferlist &bl) const
{
- ENCODE_START(24, 22, bl);
+ ENCODE_START(25, 22, bl);
::encode(version, bl);
::encode(reported_seq, bl);
::encode(reported_epoch, bl);
::encode(pin_stats_invalid, bl);
::encode(state, bl);
::encode(purged_snaps, bl);
+ ::encode(snaptrimq_len, bl);
ENCODE_FINISH(bl);
}
}
if (struct_v >= 24) {
::decode(purged_snaps, bl);
+ if (struct_v >= 25) {
+ ::decode(snaptrimq_len, bl);
+ }
}
DECODE_FINISH(bl);
}
a.last_deep_scrub = eversion_t(13, 14);
a.last_deep_scrub_stamp = utime_t(15, 16);
a.last_clean_scrub_stamp = utime_t(17, 18);
+ a.snaptrimq_len = 1048576;
list<object_stat_collection_t*> l;
object_stat_collection_t::generate_test_instances(l);
a.stats = *l.back();
l.up_primary == r.up_primary &&
l.acting_primary == r.acting_primary &&
l.pin_stats_invalid == r.pin_stats_invalid &&
- l.purged_snaps == r.purged_snaps;
+ l.purged_snaps == r.purged_snaps &&
+ l.snaptrimq_len == r.snaptrimq_len;
}
// -- pool_stat_t --
int32_t up_primary;
int32_t acting_primary;
+ // snaptrimq.size() is 64bit, but let's be serious - anything over 50k is
+ // absurd already, so cap it to 2^32 and save 4 bytes at the same time
+ uint32_t snaptrimq_len;
+
bool stats_invalid:1;
/// true if num_objects_dirty is not accurate (because it was not
/// maintained starting from pool creation)
mapping_epoch(0),
up_primary(-1),
acting_primary(-1),
+ snaptrimq_len(0),
stats_invalid(false),
dirty_stats_invalid(false),
omap_stats_invalid(false),
log_size = f;
if (ondisk_log_size < f)
ondisk_log_size = f;
+ if (snaptrimq_len < f)
+ snaptrimq_len = f;
}
void add(const pg_stat_t& o) {
stats.add(o.stats);
log_size += o.log_size;
ondisk_log_size += o.ondisk_log_size;
+ if (((uint64_t)snaptrimq_len + (uint64_t)o.snaptrimq_len) > (uint64_t)(1 << 31)) {
+ snaptrimq_len = 1 << 31;
+ } else {
+ snaptrimq_len += o.snaptrimq_len;
+ }
}
void sub(const pg_stat_t& o) {
stats.sub(o.stats);
log_size -= o.log_size;
ondisk_log_size -= o.ondisk_log_size;
+ if (o.snaptrimq_len < snaptrimq_len) {
+ snaptrimq_len -= o.snaptrimq_len;
+ } else {
+ snaptrimq_len = 0;
+ }
}
bool is_acting_osd(int32_t osd, bool primary) const;