]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/: mark info.stats as invalid after split, fix in scrub
authorSamuel Just <sam.just@inktank.com>
Thu, 20 Sep 2012 01:41:34 +0000 (18:41 -0700)
committerSamuel Just <sam.just@inktank.com>
Fri, 7 Dec 2012 06:51:56 +0000 (22:51 -0800)
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/PG.cc
src/osd/ReplicatedPG.cc
src/osd/osd_types.cc
src/osd/osd_types.h

index 36deae95fa455ceadc5f54b585f92c2d38f8f32b..800236f1e0cd2dfa89395fd1968f02ea1a533db6 100644 (file)
@@ -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;
 
index d3ea2a51935d99af44efad33fd0cab2b1cee91ea..cf1b1f14683c310b9b80f64d8a73f499c03a3ba0 100644 (file)
@@ -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, "
index c52cf20e28d731f1acc983641a69f4bf31045123..de7d83bbdd7ca35e0cfbc473d850378e94e061d7 100644 (file)
@@ -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);
 }
 
index a1aa20226a66af7918b64a54c9ce0869b564f274..cef96d8b8873867acc9c7dd689c1a70685f6a3fd 100644 (file)
@@ -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)
   { }