delta.num_objects--;
if (coi.is_dirty())
delta.num_objects_dirty--;
+ if (coi.is_omap())
+ delta.num_objects_omap--;
if (coi.is_whiteout()) {
dout(20) << __func__ << " trimming whiteout on " << coid << dendl;
delta.num_whiteouts--;
}
}
+ if ((ctx->new_obs.exists &&
+ ctx->new_obs.oi.is_omap()) &&
+ (!ctx->obc->obs.exists ||
+ !ctx->obc->obs.oi.is_omap())) {
+ ++ctx->delta_stats.num_objects_omap;
+ }
+ if ((!ctx->new_obs.exists ||
+ !ctx->new_obs.oi.is_omap()) &&
+ (ctx->obc->obs.exists &&
+ ctx->obc->obs.oi.is_omap())) {
+ --ctx->delta_stats.num_objects_omap;
+ }
+
// use newer snapc?
if (ctx->new_snapset.seq > snapc.seq) {
snapc.seq = ctx->new_snapset.seq;
dout(20) << __func__ << " cloning whiteout on " << soid << " to " << coid << dendl;
ctx->delta_stats.num_whiteouts++;
}
+ if (snap_oi->is_omap())
+ ctx->delta_stats.num_objects_omap++;
ctx->delta_stats.num_object_clones++;
ctx->new_snapset.clones.push_back(coid.snap);
ctx->new_snapset.clone_size[coid.snap] = ctx->obs->oi.size;
if (results->has_omap) {
dout(10) << __func__ << " setting omap flag on " << soid << dendl;
tctx->new_obs.oi.set_flag(object_info_t::FLAG_OMAP);
+ ++tctx->delta_stats.num_objects_omap;
}
tctx->op_t->append(results->final_tx);
stat.num_objects_dirty++;
if (oi.is_whiteout())
stat.num_whiteouts++;
+ if (oi.is_omap())
+ stat.num_objects_omap++;
if (oi.soid.snap && oi.soid.snap != CEPH_NOSNAP && oi.soid.snap != CEPH_SNAPDIR) {
stat.num_object_clones++;
++stat.num_objects_dirty;
if (oi.is_whiteout())
++stat.num_whiteouts;
+ if (oi.is_omap())
+ ++stat.num_objects_omap;
}
//bufferlist data;
<< 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_objects_omap << "/" << info.stats.stats.sum.num_objects_omap << " omap, "
<< scrub_cstat.sum.num_bytes << "/" << info.stats.stats.sum.num_bytes << " bytes."
<< dendl;
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 &&
!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_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_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_objects_omap << "/" << info.stats.stats.sum.num_objects_omap << " omap, "
<< 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;
++scrubber.fixed;
info.stats.stats = scrub_cstat;
info.stats.dirty_stats_invalid = false;
+ info.stats.omap_stats_invalid = false;
publish_stats_to_osd();
share_pg_info();
}
f->dump_int("num_objects_recovered", num_objects_recovered);
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);
}
void object_stat_sum_t::encode(bufferlist& bl) const
{
- ENCODE_START(7, 3, bl);
+ ENCODE_START(8, 3, bl);
::encode(num_bytes, bl);
::encode(num_objects, bl);
::encode(num_object_clones, bl);
::encode(num_deep_scrub_errors, bl);
::encode(num_objects_dirty, bl);
::encode(num_whiteouts, bl);
+ ::encode(num_objects_omap, bl);
ENCODE_FINISH(bl);
}
num_objects_dirty = 0;
num_whiteouts = 0;
}
+ if (struct_v >= 8) {
+ ::decode(num_objects_omap, bl);
+ } else {
+ num_objects_omap = 0;
+ }
DECODE_FINISH(bl);
}
::encode(dirty_stats_invalid, bl);
::encode(up_primary, bl);
::encode(acting_primary, bl);
+ ::encode(omap_stats_invalid, bl);
ENCODE_FINISH(bl);
}
void pg_stat_t::decode(bufferlist::iterator &bl)
{
- DECODE_START_LEGACY_COMPAT_LEN(15, 8, 8, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(16, 8, 8, bl);
::decode(version, bl);
::decode(reported_seq, bl);
::decode(reported_epoch, bl);
up_primary = up.size() ? up[0] : -1;
acting_primary = acting.size() ? acting[0] : -1;
}
+ if (struct_v >= 16) {
+ ::decode(omap_stats_invalid, bl);
+ } else {
+ // if we are decoding an old encoding of this object, then the
+ // encoder may not have supported num_objects_omap accounting.
+ omap_stats_invalid = true;
+ }
DECODE_FINISH(bl);
}
int64_t num_keys_recovered;
int64_t num_objects_dirty;
int64_t num_whiteouts;
+ int64_t num_objects_omap;
object_stat_sum_t()
: num_bytes(0),
num_bytes_recovered(0),
num_keys_recovered(0),
num_objects_dirty(0),
- num_whiteouts(0)
+ num_whiteouts(0),
+ num_objects_omap(0)
{}
void floor(int64_t f) {
/// true if num_objects_dirty is not accurate (because it was not
/// maintained starting from pool creation)
bool dirty_stats_invalid;
+ bool omap_stats_invalid;
/// up, acting primaries
int up_primary;
log_size(0), ondisk_log_size(0),
mapping_epoch(0),
dirty_stats_invalid(false),
+ omap_stats_invalid(false),
up_primary(-1),
acting_primary(-1)
{ }
bool is_dirty() const {
return test_flag(FLAG_DIRTY);
}
+ bool is_omap() const {
+ return test_flag(FLAG_OMAP);
+ }
void encode(bufferlist& bl) const;
void decode(bufferlist::iterator& bl);