From 9835e190152eb5979cca9c65d31510c0e1729bc1 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Wed, 19 Sep 2012 18:41:34 -0700 Subject: [PATCH] osd/: mark info.stats as invalid after split, fix in scrub Signed-off-by: Samuel Just --- src/osd/PG.cc | 2 ++ src/osd/ReplicatedPG.cc | 5 +++++ src/osd/osd_types.cc | 9 ++++++++- src/osd/osd_types.h | 2 ++ 4 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 36deae95fa455..800236f1e0cd2 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2028,6 +2028,8 @@ void PG::split_into(pg_t child_pgid, PG *child, unsigned split_bits) child->info.last_backfill = info.last_backfill; child->info.stats = info.stats; + info.stats.stats_invalid = true; + child->info.stats.stats_invalid = true; child->snap_trimq = snap_trimq; diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index d3ea2a51935d9..cf1b1f14683c3 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -7089,6 +7089,11 @@ void ReplicatedPG::_scrub_finish() bool deep_scrub = state_test(PG_STATE_DEEP_SCRUB); const char *mode = (repair ? "repair": (deep_scrub ? "deep-scrub" : "scrub")); + if (info.stats.stats_invalid) { + info.stats.stats = scrub_cstat; + info.stats.stats_invalid = false; + } + 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, " diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index c52cf20e28d73..de7d83bbdd7ca 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -1019,6 +1019,7 @@ void pg_stat_t::dump(Formatter *f) const f->dump_stream("last_deep_scrub_stamp") << last_deep_scrub_stamp; f->dump_unsigned("log_size", log_size); f->dump_unsigned("ondisk_log_size", ondisk_log_size); + f->dump_stream("stats_invalid") << stats_invalid; stats.dump(f); f->open_array_section("up"); for (vector::const_iterator p = up.begin(); p != up.end(); ++p) @@ -1032,7 +1033,7 @@ void pg_stat_t::dump(Formatter *f) const void pg_stat_t::encode(bufferlist &bl) const { - ENCODE_START(10, 8, bl); + ENCODE_START(11, 8, bl); ::encode(version, bl); ::encode(reported, bl); ::encode(state, bl); @@ -1057,6 +1058,7 @@ void pg_stat_t::encode(bufferlist &bl) const ::encode(mapping_epoch, bl); ::encode(last_deep_scrub, bl); ::encode(last_deep_scrub_stamp, bl); + ::encode(stats_invalid, bl); ENCODE_FINISH(bl); } @@ -1126,6 +1128,11 @@ void pg_stat_t::decode(bufferlist::iterator &bl) } } } + if (struct_v < 11) { + stats_invalid = false; + } else { + ::decode(stats_invalid, bl); + } DECODE_FINISH(bl); } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index a1aa20226a66a..cef96d8b88738 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -887,6 +887,7 @@ struct pg_stat_t { utime_t last_deep_scrub_stamp; object_stat_collection_t stats; + bool stats_invalid; int64_t log_size; int64_t ondisk_log_size; // >= active_log_size @@ -898,6 +899,7 @@ struct pg_stat_t { : state(0), created(0), last_epoch_clean(0), parent_split_bits(0), + stats_invalid(false), log_size(0), ondisk_log_size(0), mapping_epoch(0) { } -- 2.39.5