From: Sage Weil Date: Mon, 6 Aug 2018 18:12:33 +0000 (-0500) Subject: osd/OSDMap: clean out pg_temp mappings that exceed pool size X-Git-Tag: v12.2.10~19^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f4d8d16f40eef35cb6bcd248c03edf6a39748054;p=ceph.git osd/OSDMap: clean out pg_temp mappings that exceed pool size If the pool size is reduced, we can end up with pg_temp mappings that are too big. This can trigger bad behavior elsewhere (e.g., OSDMapMapping, which assumes that acting and up are always <= pool size). Fixes: http://tracker.ceph.com/issues/26866 Signed-off-by: Sage Weil (cherry picked from commit daf53f423d2c25e60c2039c0125041c7341fbe71) Conflicts: src/osd/OSDMap.cc --- diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 91e4f9c261b5..f6cf25fd9b27 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1566,9 +1566,19 @@ void OSDMap::clean_temps(CephContext *cct, vector raw_up; int primary; tmpmap.pg_to_raw_up(pg.first, &raw_up, &primary); + bool remove = false; if (vectors_equal(raw_up, pg.second)) { ldout(cct, 10) << __func__ << " removing pg_temp " << pg.first << " " << pg.second << " that matches raw_up mapping" << dendl; + remove = true; + } + // oversized pg_temp? + if (pg.second.size() > tmpmap.get_pg_pool(pg.first.pool())->get_size()) { + ldout(cct, 10) << __func__ << " removing pg_temp " << pg.first << " " + << pg.second << " exceeds pool size" << dendl; + remove = true; + } + if (remove) { if (osdmap.pg_temp->count(pg.first)) pending_inc->new_pg_temp[pg.first].clear(); else