diff options
author | Samuel Just <sam.just@inktank.com> | 2012-09-19 18:41:34 -0700 |
---|---|---|
committer | Samuel Just <sam.just@inktank.com> | 2012-12-06 22:51:56 -0800 |
commit | 9835e190152eb5979cca9c65d31510c0e1729bc1 (patch) | |
tree | aca24c28cbfa440957f041a85cc25c4a236c01ef | |
parent | 5f8a3634c49d96e7d38039a294dc291948ce60f4 (diff) | |
download | ceph-9835e190152eb5979cca9c65d31510c0e1729bc1.tar.gz |
osd/: mark info.stats as invalid after split, fix in scrub
Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r-- | src/osd/PG.cc | 2 | ||||
-rw-r--r-- | src/osd/ReplicatedPG.cc | 5 | ||||
-rw-r--r-- | src/osd/osd_types.cc | 9 | ||||
-rw-r--r-- | src/osd/osd_types.h | 2 |
4 files changed, 17 insertions, 1 deletions
diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 36deae95fa4..800236f1e0c 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 d3ea2a51935..cf1b1f14683 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 c52cf20e28d..de7d83bbdd7 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<int>::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 a1aa20226a6..cef96d8b887 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) { } |