From ddf1e986dc890720ced538978a798c7b4132f25d Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Mon, 21 Apr 2014 10:52:58 -0700 Subject: [PATCH] osd: track the number of hit_set archive objects in a pg Also, use this value in agent_choose_mode instead of the max number. Related: #8124 Signed-off-by: Samuel Just --- src/osd/ReplicatedPG.cc | 14 ++++++++++++-- src/osd/osd_types.cc | 25 +++++++++++++++++++++---- src/osd/osd_types.h | 8 +++++++- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 5ca31e4c6ee9b..cdb049a3d1e4c 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -10619,6 +10619,7 @@ void ReplicatedPG::hit_set_persist() 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; @@ -10693,6 +10694,7 @@ void ReplicatedPG::hit_set_trim(RepGather *repop, unsigned max) &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; } } @@ -11064,10 +11066,10 @@ void ReplicatedPG::agent_choose_mode() 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); @@ -11285,6 +11287,9 @@ void ReplicatedPG::_scrub(ScrubMap& scrubmap) 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) { @@ -11483,6 +11488,7 @@ void ReplicatedPG::_scrub_finish() << 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; @@ -11492,6 +11498,8 @@ void ReplicatedPG::_scrub_finish() !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 @@ -11500,6 +11508,7 @@ void ReplicatedPG::_scrub_finish() << 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; @@ -11509,6 +11518,7 @@ void ReplicatedPG::_scrub_finish() 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(); } diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 6649b114735b3..50124409c9b3b 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -1311,11 +1311,12 @@ void object_stat_sum_t::dump(Formatter *f) const 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); @@ -1336,12 +1337,13 @@ void object_stat_sum_t::encode(bufferlist& bl) const ::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; @@ -1390,6 +1392,11 @@ void object_stat_sum_t::decode(bufferlist::iterator& bl) } 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); } @@ -1440,6 +1447,7 @@ void object_stat_sum_t::add(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 object_stat_sum_t::sub(const object_stat_sum_t& o) @@ -1464,6 +1472,7 @@ 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; } @@ -1573,7 +1582,7 @@ void pg_stat_t::dump_brief(Formatter *f) const 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); @@ -1606,12 +1615,13 @@ void pg_stat_t::encode(bufferlist &bl) const ::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); @@ -1712,6 +1722,13 @@ void pg_stat_t::decode(bufferlist::iterator &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); } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 4154d42fcfba8..d55f63a4dd593 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1125,6 +1125,7 @@ struct object_stat_sum_t { 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), @@ -1138,7 +1139,8 @@ struct object_stat_sum_t { 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) { @@ -1163,6 +1165,7 @@ struct object_stat_sum_t { FLOOR(num_objects_dirty); FLOOR(num_whiteouts); FLOOR(num_objects_omap); + FLOOR(num_objects_hit_set_archive); #undef FLOOR } @@ -1195,6 +1198,7 @@ struct object_stat_sum_t { SPLIT(num_objects_dirty); SPLIT(num_whiteouts); SPLIT(num_objects_omap); + SPLIT(num_objects_hit_set_archive); #undef SPLIT } @@ -1326,6 +1330,7 @@ struct pg_stat_t { /// maintained starting from pool creation) bool dirty_stats_invalid; bool omap_stats_invalid; + bool hitset_stats_invalid; /// up, acting primaries int up_primary; @@ -1342,6 +1347,7 @@ struct pg_stat_t { mapping_epoch(0), dirty_stats_invalid(false), omap_stats_invalid(false), + hitset_stats_invalid(false), up_primary(-1), acting_primary(-1) { } -- 2.39.5