From: Sage Weil Date: Sun, 2 Nov 2014 16:49:48 +0000 (-0800) Subject: mon/PGMap: invalidate cached min_last_epoch_clean from new-style pg keys X-Git-Tag: v0.80.8~8^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1d314e7a9ab7af5b693583cf2faa5db54f6beb69;p=ceph.git mon/PGMap: invalidate cached min_last_epoch_clean from new-style pg keys We were only invalidating the cache from the legacy apply_incremental(), which is no longer called on modern clusters. Fixes: #9987 Signed-off-by: Sage Weil (cherry picked from commit 3fb731b722c50672a5a9de0c86a621f5f50f2d06) --- diff --git a/src/mon/PGMap.cc b/src/mon/PGMap.cc index 5ec8ee2a97be..d66c92be1535 100644 --- a/src/mon/PGMap.cc +++ b/src/mon/PGMap.cc @@ -379,17 +379,31 @@ void PGMap::update_pg(pg_t pgid, bufferlist& bl) { bufferlist::iterator p = bl.begin(); ceph::unordered_map::iterator s = pg_stat.find(pgid); - if (s != pg_stat.end()) + epoch_t old_lec = 0; + if (s != pg_stat.end()) { + old_lec = s->second.get_effective_last_epoch_clean(); stat_pg_sub(pgid, s->second); + } pg_stat_t& r = pg_stat[pgid]; ::decode(r, p); stat_pg_add(pgid, r); + + epoch_t lec = r.get_effective_last_epoch_clean(); + if (min_last_epoch_clean && + (lec < min_last_epoch_clean || // we did + (lec > min_last_epoch_clean && // we might + old_lec == min_last_epoch_clean) + )) + min_last_epoch_clean = 0; } void PGMap::remove_pg(pg_t pgid) { ceph::unordered_map::iterator s = pg_stat.find(pgid); if (s != pg_stat.end()) { + if (min_last_epoch_clean && + s->second.get_effective_last_epoch_clean() == min_last_epoch_clean) + min_last_epoch_clean = 0; stat_pg_sub(pgid, s->second); pg_stat.erase(s); }