Skip to content

Commit

Permalink
osd/OSDMap: clean out pg_temp mappings that exceed pool size
Browse files Browse the repository at this point in the history
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 <sage@redhat.com>
(cherry picked from commit daf53f4)

Conflicts:
	src/osd/OSDMap.cc
  • Loading branch information
liewegas authored and smithfarm committed Oct 4, 2018
1 parent 853b947 commit 6b8d23d
Showing 1 changed file with 10 additions and 0 deletions.
10 changes: 10 additions & 0 deletions src/osd/OSDMap.cc
Expand Up @@ -1592,9 +1592,19 @@ void OSDMap::clean_temps(CephContext *cct,
vector<int> raw_up;
int primary;
tmpmap.pg_to_raw_up(pg.first, &raw_up, &primary);
bool remove = false;
if (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
Expand Down

0 comments on commit 6b8d23d

Please sign in to comment.