]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: be smarter about calculating last_epoch_clean lower bound
authorSage Weil <sage@inktank.com>
Mon, 8 Jul 2013 22:57:48 +0000 (15:57 -0700)
committerSage Weil <sage@inktank.com>
Fri, 12 Jul 2013 22:44:51 +0000 (15:44 -0700)
We need to take PGs whose mapping has not changed in a long time into
account.  For them, the pg state will indicate it was clean at the time of
the report, in which case we can use that as a lower-bound on their actual
latest epoch clean.  If they are not currently clean (at report time), use
the last_epoch_clean value.

Fixes: #5519
Signed-off-by: Sage Weil <sage@inktank.com>
(cherry picked from commit cc0006deee3153e06ddd220bf8a40358ba830135)

src/mon/PGMap.cc
src/osd/osd_types.h

index 36a35424a2071affd26731c9caafecb54b58a565..0feee739fcb62f5c4218a4b430c440f77f927112 100644 (file)
@@ -360,10 +360,11 @@ epoch_t PGMap::calc_min_last_epoch_clean() const
   if (pg_stat.empty())
     return 0;
   hash_map<pg_t,pg_stat_t>::const_iterator p = pg_stat.begin();
-  epoch_t min = p->second.last_epoch_clean;
+  epoch_t min = p->second.get_effective_last_epoch_clean();
   for (++p; p != pg_stat.end(); ++p) {
-    if (p->second.last_epoch_clean < min)
-      min = p->second.last_epoch_clean;
+    epoch_t lec = p->second.get_effective_last_epoch_clean();
+    if (lec < min)
+      min = lec;
   }
   return min;
 }
index 6a6b16f3188563766afaa5488183addd2d226edd..a7a10307d1fefe5337126912830f197b6cf7b0ba 100644 (file)
@@ -945,6 +945,16 @@ struct pg_stat_t {
       mapping_epoch(0)
   { }
 
+  epoch_t get_effective_last_epoch_clean() const {
+    if (state & PG_STATE_CLEAN) {
+      // we are clean as of this report, and should thus take the
+      // reported epoch
+      return reported.epoch;
+    } else {
+      return last_epoch_clean;
+    }
+  }
+
   void add(const pg_stat_t& o) {
     stats.add(o.stats);
     log_size += o.log_size;