dout(10) << mode << " got "
<< scrub_cstat.sum.num_objects << "/" << info.stats.stats.sum.num_objects << " objects, "
<< scrub_cstat.sum.num_object_clones << "/" << info.stats.stats.sum.num_object_clones << " clones, "
+ << scrub_cstat.sum.num_objects_dirty << "/" << info.stats.stats.sum.num_objects_dirty << " dirty, "
<< scrub_cstat.sum.num_bytes << "/" << info.stats.stats.sum.num_bytes << " bytes."
<< dendl;
if (scrub_cstat.sum.num_objects != info.stats.stats.sum.num_objects ||
scrub_cstat.sum.num_object_clones != info.stats.stats.sum.num_object_clones ||
- scrub_cstat.sum.num_objects_dirty != info.stats.stats.sum.num_objects_dirty ||
+ (scrub_cstat.sum.num_objects_dirty != info.stats.stats.sum.num_objects_dirty &&
+ !info.stats.dirty_stats_invalid) ||
scrub_cstat.sum.num_whiteouts != info.stats.stats.sum.num_whiteouts ||
scrub_cstat.sum.num_bytes != info.stats.stats.sum.num_bytes) {
osd->clog.error() << info.pgid << " " << mode
if (repair) {
++scrubber.fixed;
info.stats.stats = scrub_cstat;
+ info.stats.dirty_stats_invalid = false;
publish_stats_to_osd();
share_pg_info();
}
void pg_stat_t::encode(bufferlist &bl) const
{
- ENCODE_START(13, 8, bl);
+ ENCODE_START(14, 8, bl);
::encode(version, bl);
::encode(reported_seq, bl);
::encode(reported_epoch, bl);
::encode(stats_invalid, bl);
::encode(last_clean_scrub_stamp, bl);
::encode(last_became_active, bl);
+ ::encode(dirty_stats_invalid, bl);
ENCODE_FINISH(bl);
}
void pg_stat_t::decode(bufferlist::iterator &bl)
{
- DECODE_START_LEGACY_COMPAT_LEN(13, 8, 8, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(14, 8, 8, bl);
::decode(version, bl);
::decode(reported_seq, bl);
::decode(reported_epoch, bl);
} else {
last_became_active = last_active;
}
+ if (struct_v >= 14) {
+ ::decode(dirty_stats_invalid, bl);
+ } else {
+ // if we are decoding an old encoding of this object, then the
+ // encoder may not have supported num_objects_dirty accounting.
+ dirty_stats_invalid = true;
+ }
DECODE_FINISH(bl);
}
utime_t last_became_active;
+ /// true if num_objects_dirty is not accurate (because it was not
+ /// maintained starting from pool creation)
+ bool dirty_stats_invalid;
+
pg_stat_t()
: reported_seq(0),
reported_epoch(0),
parent_split_bits(0),
stats_invalid(false),
log_size(0), ondisk_log_size(0),
- mapping_epoch(0)
+ mapping_epoch(0),
+ dirty_stats_invalid(false)
{ }
epoch_t get_effective_last_epoch_clean() const {