]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/PGMap and PGMonitor: update last_epoch_clean cache from new osd keys 3186/head
authorSage Weil <sage@redhat.com>
Sun, 2 Nov 2014 16:50:59 +0000 (08:50 -0800)
committerJoao Eduardo Luis <joao@redhat.com>
Mon, 15 Dec 2014 16:18:56 +0000 (16:18 +0000)
We were only invalidating the cached value from apply_incremental, which
is no longer called on modern clusters.

Fix this by storing the update epoch in the key as well (it is not part
of osd_stat_t).

Backport: giant, firefly, dumpling(?)
Fixes: #9987
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 093c5f0cabeb552b90d944da2c50de48fcf6f564)

src/mon/PGMap.cc
src/mon/PGMonitor.cc

index b7acb86bf2e1258ee7d2d9cfc62a0d3233560b24..74347f24daefb10eebff187e4c0cdba1cbbac299 100644 (file)
@@ -413,14 +413,33 @@ void PGMap::update_osd(int osd, bufferlist& bl)
 {
   bufferlist::iterator p = bl.begin();
   ceph::unordered_map<int32_t,osd_stat_t>::iterator o = osd_stat.find(osd);
-  if (o != osd_stat.end())
+  epoch_t old_lec = 0;
+  if (o != osd_stat.end()) {
+    ceph::unordered_map<int32_t,epoch_t>::iterator i = osd_epochs.find(osd);
+    if (i != osd_epochs.end())
+      old_lec = i->second;
     stat_osd_sub(o->second);
+  }
   osd_stat_t& r = osd_stat[osd];
   ::decode(r, p);
   stat_osd_add(r);
 
   // adjust [near]full status
   register_nearfull_status(osd, r);
+
+  // epoch?
+  if (!p.end()) {
+    epoch_t e;
+    ::decode(e, p);
+
+    if (e < min_last_epoch_clean ||
+       (e > min_last_epoch_clean &&
+        old_lec == min_last_epoch_clean))
+      min_last_epoch_clean = 0;
+  } else {
+    // WARNING: we are not refreshing min_last_epoch_clean!  must be old store
+    // or old mon running.
+  }
 }
 
 void PGMap::remove_osd(int osd)
index d95288cbb30a1ba1606f9f8a3dd722c0b5034297..f197b3a52c0608bd8a76f3821e45c8543215cc28 100644 (file)
@@ -548,6 +548,7 @@ void PGMonitor::encode_pending(MonitorDBStore::TransactionRef t)
       ::encode(p->first, dirty);
       bufferlist bl;
       ::encode(p->second, bl, features);
+      ::encode(pending_inc.get_osd_epochs().find(p->first)->second, bl);
       t->put(prefix, stringify(p->first), bl);
     }
     for (set<int32_t>::const_iterator p =