From: Samuel Just Date: Wed, 26 Mar 2014 23:58:07 +0000 (-0700) Subject: osd/: track num_objects_omap in pg stats X-Git-Tag: v0.80-rc1~95^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a130a4452e4fb159dc62fb417077d98dc9ebd621;p=ceph.git osd/: track num_objects_omap in pg stats Fixes: #7831 Signed-off-by: Samuel Just --- diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index b7466239699..e3786ce3db9 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -2290,6 +2290,8 @@ ReplicatedPG::RepGather *ReplicatedPG::trim_object(const hobject_t &coid) 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--; @@ -4691,6 +4693,19 @@ void ReplicatedPG::make_writeable(OpContext *ctx) } } + 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; @@ -4748,6 +4763,8 @@ void ReplicatedPG::make_writeable(OpContext *ctx) 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; @@ -5758,6 +5775,7 @@ void ReplicatedPG::finish_promote(int r, OpRequestRef op, 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); @@ -7056,6 +7074,8 @@ void ReplicatedPG::add_object_context_to_pg_stat(ObjectContextRef obc, pg_stat_t 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++; @@ -11161,6 +11181,8 @@ void ReplicatedPG::_scrub(ScrubMap& scrubmap) ++stat.num_objects_dirty; if (oi.is_whiteout()) ++stat.num_whiteouts; + if (oi.is_omap()) + ++stat.num_objects_omap; } //bufferlist data; @@ -11286,6 +11308,7 @@ void ReplicatedPG::_scrub_finish() << 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; @@ -11293,6 +11316,8 @@ void ReplicatedPG::_scrub_finish() 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 @@ -11300,6 +11325,7 @@ void ReplicatedPG::_scrub_finish() << 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; @@ -11308,6 +11334,7 @@ void ReplicatedPG::_scrub_finish() ++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(); } diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index c183dca8e3b..7fb228c9a75 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -1306,11 +1306,12 @@ void object_stat_sum_t::dump(Formatter *f) const 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); @@ -1330,6 +1331,7 @@ void object_stat_sum_t::encode(bufferlist& bl) const ::encode(num_deep_scrub_errors, bl); ::encode(num_objects_dirty, bl); ::encode(num_whiteouts, bl); + ::encode(num_objects_omap, bl); ENCODE_FINISH(bl); } @@ -1379,6 +1381,11 @@ void object_stat_sum_t::decode(bufferlist::iterator& 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); } @@ -1592,12 +1599,13 @@ void pg_stat_t::encode(bufferlist &bl) const ::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); @@ -1691,6 +1699,13 @@ void pg_stat_t::decode(bufferlist::iterator &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); } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index e055281ccea..a59101eedd6 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1124,6 +1124,7 @@ struct object_stat_sum_t { 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), @@ -1136,7 +1137,8 @@ struct object_stat_sum_t { 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) { @@ -1290,6 +1292,7 @@ struct pg_stat_t { /// 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; @@ -1305,6 +1308,7 @@ struct pg_stat_t { log_size(0), ondisk_log_size(0), mapping_epoch(0), dirty_stats_invalid(false), + omap_stats_invalid(false), up_primary(-1), acting_primary(-1) { } @@ -2553,6 +2557,9 @@ struct object_info_t { 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);