From: xie xingguo Date: Wed, 21 Nov 2018 01:36:21 +0000 (+0800) Subject: osd/OSDMap: add pg-existence sanity check X-Git-Tag: v13.2.3~1^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=03f097d46c2357fe032cba04bc3a9504240466d0;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 ea2f6dc61bf1..d71b0e191614 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1663,12 +1663,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()) {