From: xie xingguo Date: Wed, 21 Nov 2018 01:36:21 +0000 (+0800) Subject: osd/OSDMap: add pg-existence sanity check X-Git-Tag: v12.2.11~109^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=39ef23cc352acf06fbe9e9a669395b42b14d3def;p=ceph.git osd/OSDMap: add pg-existence sanity check The reason why __get_pg_pool_size(pg)__ or __get_pg_pool_crush_rule(pg)__ fails is that the pg does not exist anymore. So it generally makes sense to check __pg_exists(pg)__ before moving further. Signed-off-by: xie xingguo (cherry picked from commit 79ef3bea7550559b7ea4e2b68dc407c7eb25defa) Conflicts: - *nextmap* has been renamed to *tmpmap* --- diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 7d55c98ba5b6..3c93f1b31593 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1637,12 +1637,12 @@ void OSDMap::maybe_remove_pg_upmaps(CephContext *cct, to_check.insert(p.first); } for (auto& pg : to_check) { - auto crush_rule = tmpmap.get_pg_pool_crush_rule(pg); - if (crush_rule < 0) { - lderr(cct) << __func__ << " unable to load crush-rule of pg " - << pg << dendl; + if (!tmpmap.pg_exists(pg)) { + ldout(cct, 0) << __func__ << " pg " << pg << " is gone" << dendl; + to_cancel.insert(pg); continue; } + auto crush_rule = tmpmap.get_pg_pool_crush_rule(pg); map weight_map; auto it = rule_weight_map.find(crush_rule); if (it == rule_weight_map.end()) {