From: Sage Weil Date: Wed, 21 Jan 2015 01:19:15 +0000 (-0800) Subject: mon/PGMap: keep osd -> pg mapping in memory X-Git-Tag: v9.0.1~34^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7a04762fe09661cc2ac98a034626912ec0583116;p=ceph.git mon/PGMap: keep osd -> pg mapping in memory Optimize for the case where the mapping does not change so that we are not thrashing the in-memory structure. Signed-off-by: Sage Weil --- diff --git a/src/mon/PGMap.cc b/src/mon/PGMap.cc index edb5872800fb..18ab33da544a 100644 --- a/src/mon/PGMap.cc +++ b/src/mon/PGMap.cc @@ -359,6 +359,7 @@ void PGMap::calc_stats() pg_pool_sum.clear(); pg_sum = pool_stat_t(); osd_sum = osd_stat_t(); + pg_by_osd.clear(); for (ceph::unordered_map::iterator p = pg_stat.begin(); p != pg_stat.end(); @@ -379,16 +380,18 @@ void PGMap::update_pg(pg_t pgid, bufferlist& bl) { bufferlist::iterator p = bl.begin(); ceph::unordered_map::iterator s = pg_stat.find(pgid); - epoch_t old_lec = 0; + epoch_t old_lec = 0, lec; if (s != pg_stat.end()) { old_lec = s->second.get_effective_last_epoch_clean(); - stat_pg_sub(pgid, s->second); + stat_pg_update(pgid, s->second, p); + lec = s->second.get_effective_last_epoch_clean(); + } else { + pg_stat_t& r = pg_stat[pgid]; + ::decode(r, p); + stat_pg_add(pgid, r); + lec = r.get_effective_last_epoch_clean(); } - 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 @@ -455,7 +458,8 @@ void PGMap::remove_osd(int osd) } } -void PGMap::stat_pg_add(const pg_t &pgid, const pg_stat_t &s, bool sumonly) +void PGMap::stat_pg_add(const pg_t &pgid, const pg_stat_t &s, bool sumonly, + bool sameosds) { pg_pool_sum[pgid.pool()].add(s); pg_sum.add(s); @@ -471,14 +475,32 @@ void PGMap::stat_pg_add(const pg_t &pgid, const pg_stat_t &s, bool sumonly) if (s.acting_primary >= 0) creating_pgs_by_osd[s.acting_primary].insert(pgid); } + + if (sameosds) + return; + for (vector::const_iterator p = s.blocked_by.begin(); p != s.blocked_by.end(); ++p) { ++blocked_by_sum[*p]; } + + for (vector::const_iterator p = s.acting.begin(); p != s.acting.end(); ++p) { + set& oset = pg_by_osd[*p]; + oset.erase(pgid); + if (oset.empty()) + pg_by_osd.erase(*p); + } + for (vector::const_iterator p = s.up.begin(); p != s.up.end(); ++p) { + set& oset = pg_by_osd[*p]; + oset.erase(pgid); + if (oset.empty()) + pg_by_osd.erase(*p); + } } -void PGMap::stat_pg_sub(const pg_t &pgid, const pg_stat_t &s, bool sumonly) +void PGMap::stat_pg_sub(const pg_t &pgid, const pg_stat_t &s, bool sumonly, + bool sameosds) { pool_stat_t& ps = pg_pool_sum[pgid.pool()]; ps.sub(s); @@ -502,6 +524,9 @@ void PGMap::stat_pg_sub(const pg_t &pgid, const pg_stat_t &s, bool sumonly) } } + if (sameosds) + return; + for (vector::const_iterator p = s.blocked_by.begin(); p != s.blocked_by.end(); ++p) { @@ -511,6 +536,27 @@ void PGMap::stat_pg_sub(const pg_t &pgid, const pg_stat_t &s, bool sumonly) if (q->second == 0) blocked_by_sum.erase(q); } + + for (vector::const_iterator p = s.acting.begin(); p != s.acting.end(); ++p) + pg_by_osd[*p].insert(pgid); + for (vector::const_iterator p = s.up.begin(); p != s.up.end(); ++p) + pg_by_osd[*p].insert(pgid); +} + +void PGMap::stat_pg_update(const pg_t pgid, pg_stat_t& s, + bufferlist::iterator& blp) +{ + pg_stat_t n; + ::decode(n, blp); + + bool sameosds = + s.acting == n.acting && + s.up == n.up && + s.blocked_by == n.blocked_by; + + stat_pg_sub(pgid, s, false, sameosds); + s = n; + stat_pg_add(pgid, n, false, sameosds); } void PGMap::stat_osd_add(const osd_stat_t &s) diff --git a/src/mon/PGMap.h b/src/mon/PGMap.h index f16a7cde2111..d5cf610db2c8 100644 --- a/src/mon/PGMap.h +++ b/src/mon/PGMap.h @@ -121,6 +121,7 @@ public: osd_stat_t osd_sum; mutable epoch_t min_last_epoch_clean; ceph::unordered_map blocked_by_sum; + ceph::unordered_map > pg_by_osd; utime_t stamp; @@ -251,8 +252,11 @@ public: void redo_full_sets(); void register_nearfull_status(int osd, const osd_stat_t& s); void calc_stats(); - void stat_pg_add(const pg_t &pgid, const pg_stat_t &s, bool sumonly=false); - void stat_pg_sub(const pg_t &pgid, const pg_stat_t &s, bool sumonly=false); + void stat_pg_add(const pg_t &pgid, const pg_stat_t &s, bool sumonly=false, + bool sameosds=false); + void stat_pg_sub(const pg_t &pgid, const pg_stat_t &s, bool sumonly=false, + bool sameosds=false); + void stat_pg_update(const pg_t pgid, pg_stat_t &prev, bufferlist::iterator& blp); void stat_osd_add(const osd_stat_t &s); void stat_osd_sub(const osd_stat_t &s);