ctx->new_snapset.head_exists = true;
ctx->delta_stats.num_objects++;
+ ctx->delta_stats.num_objects_hit_set_archive++;
ctx->delta_stats.num_bytes += bl.length();
bufferlist bss;
&st);
assert(r == 0);
--repop->ctx->delta_stats.num_objects;
+ --repop->ctx->delta_stats.num_objects_hit_set_archive;
repop->ctx->delta_stats.num_bytes -= st.st_size;
}
}
uint64_t num_user_objects = info.stats.stats.sum.num_objects;
- // adjust (effective) user objects down based on the (max) number
+ // adjust (effective) user objects down based on the number
// of HitSet objects, which should not count toward our total since
// they cannot be flushed.
- uint64_t unflushable = pool.info.hit_set_count;
+ uint64_t unflushable = info.stats.stats.sum.num_objects_hit_set_archive;
// also exclude omap objects if ec backing pool
const pg_pool_t *base_pool = get_osdmap()->get_pg_pool(pool.info.tier_of);
if (soid.snap != CEPH_SNAPDIR)
stat.num_objects++;
+ if (soid.nspace == cct->_conf->osd_hit_set_namespace)
+ stat.num_objects_hit_set_archive++;
+
// new snapset?
if (soid.snap == CEPH_SNAPDIR ||
soid.snap == CEPH_NOSNAP) {
<< 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_objects_omap << "/" << info.stats.stats.sum.num_objects_omap << " omap, "
+ << scrub_cstat.sum.num_objects_hit_set_archive << "/" << info.stats.stats.sum.num_objects_hit_set_archive << " hit_set_archive, "
<< scrub_cstat.sum.num_bytes << "/" << info.stats.stats.sum.num_bytes << " bytes."
<< dendl;
!info.stats.dirty_stats_invalid) ||
(scrub_cstat.sum.num_objects_omap != info.stats.stats.sum.num_objects_omap &&
!info.stats.omap_stats_invalid) ||
+ (scrub_cstat.sum.num_objects_hit_set_archive != info.stats.stats.sum.num_objects_hit_set_archive &&
+ !info.stats.hitset_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
<< 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_objects_omap << "/" << info.stats.stats.sum.num_objects_omap << " omap, "
+ << scrub_cstat.sum.num_objects_hit_set_archive << "/" << info.stats.stats.sum.num_objects_hit_set_archive << " hit_set_archive, "
<< scrub_cstat.sum.num_whiteouts << "/" << info.stats.stats.sum.num_whiteouts << " whiteouts, "
<< scrub_cstat.sum.num_bytes << "/" << info.stats.stats.sum.num_bytes << " bytes.\n";
++scrubber.shallow_errors;
info.stats.stats = scrub_cstat;
info.stats.dirty_stats_invalid = false;
info.stats.omap_stats_invalid = false;
+ info.stats.hitset_stats_invalid = false;
publish_stats_to_osd();
share_pg_info();
}
f->dump_int("num_bytes_recovered", num_bytes_recovered);
f->dump_int("num_keys_recovered", num_keys_recovered);
f->dump_int("num_objects_omap", num_objects_omap);
+ f->dump_int("num_objects_hit_set_archive", num_objects_hit_set_archive);
}
void object_stat_sum_t::encode(bufferlist& bl) const
{
- ENCODE_START(8, 3, bl);
+ ENCODE_START(9, 3, bl);
::encode(num_bytes, bl);
::encode(num_objects, bl);
::encode(num_object_clones, bl);
::encode(num_objects_dirty, bl);
::encode(num_whiteouts, bl);
::encode(num_objects_omap, bl);
+ ::encode(num_objects_hit_set_archive, bl);
ENCODE_FINISH(bl);
}
void object_stat_sum_t::decode(bufferlist::iterator& bl)
{
- DECODE_START_LEGACY_COMPAT_LEN(8, 3, 3, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(9, 3, 3, bl);
::decode(num_bytes, bl);
if (struct_v < 3) {
uint64_t num_kb;
} else {
num_objects_omap = 0;
}
+ if (struct_v >= 9) {
+ ::decode(num_objects_hit_set_archive, bl);
+ } else {
+ num_objects_hit_set_archive = 0;
+ }
DECODE_FINISH(bl);
}
num_objects_dirty += o.num_objects_dirty;
num_whiteouts += o.num_whiteouts;
num_objects_omap += o.num_objects_omap;
+ num_objects_hit_set_archive += o.num_objects_hit_set_archive;
}
void object_stat_sum_t::sub(const object_stat_sum_t& o)
num_objects_dirty -= o.num_objects_dirty;
num_whiteouts -= o.num_whiteouts;
num_objects_omap -= o.num_objects_omap;
+ num_objects_hit_set_archive -= o.num_objects_hit_set_archive;
}
void pg_stat_t::encode(bufferlist &bl) const
{
- ENCODE_START(16, 8, bl);
+ ENCODE_START(17, 8, bl);
::encode(version, bl);
::encode(reported_seq, bl);
::encode(reported_epoch, bl);
::encode(up_primary, bl);
::encode(acting_primary, bl);
::encode(omap_stats_invalid, bl);
+ ::encode(hitset_stats_invalid, bl);
ENCODE_FINISH(bl);
}
void pg_stat_t::decode(bufferlist::iterator &bl)
{
- DECODE_START_LEGACY_COMPAT_LEN(16, 8, 8, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(17, 8, 8, bl);
::decode(version, bl);
::decode(reported_seq, bl);
::decode(reported_epoch, bl);
// encoder may not have supported num_objects_omap accounting.
omap_stats_invalid = true;
}
+ if (struct_v >= 17) {
+ ::decode(hitset_stats_invalid, bl);
+ } else {
+ // if we are decoding an old encoding of this object, then the
+ // encoder may not have supported num_objects_hit_set_archive accounting.
+ hitset_stats_invalid = true;
+ }
DECODE_FINISH(bl);
}
int64_t num_objects_dirty;
int64_t num_whiteouts;
int64_t num_objects_omap;
+ int64_t num_objects_hit_set_archive;
object_stat_sum_t()
: num_bytes(0),
num_keys_recovered(0),
num_objects_dirty(0),
num_whiteouts(0),
- num_objects_omap(0)
+ num_objects_omap(0),
+ num_objects_hit_set_archive(0)
{}
void floor(int64_t f) {
FLOOR(num_objects_dirty);
FLOOR(num_whiteouts);
FLOOR(num_objects_omap);
+ FLOOR(num_objects_hit_set_archive);
#undef FLOOR
}
SPLIT(num_objects_dirty);
SPLIT(num_whiteouts);
SPLIT(num_objects_omap);
+ SPLIT(num_objects_hit_set_archive);
#undef SPLIT
}
/// maintained starting from pool creation)
bool dirty_stats_invalid;
bool omap_stats_invalid;
+ bool hitset_stats_invalid;
/// up, acting primaries
int up_primary;
mapping_epoch(0),
dirty_stats_invalid(false),
omap_stats_invalid(false),
+ hitset_stats_invalid(false),
up_primary(-1),
acting_primary(-1)
{ }