From: Kefu Chai Date: Thu, 9 May 2019 07:07:48 +0000 (+0800) Subject: Merge pull request #27962 from xiexingguo/wip-jira-3756 X-Git-Tag: v15.1.0~2716 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3a0013f654070d2432ea2c44e90aec3b9e4a1b43;p=ceph.git Merge pull request #27962 from xiexingguo/wip-jira-3756 mgr/DaemonServer: safe-to-destroy - do not consider irrelevant pgs Reviewed-by: Yan Jun Reviewed-by: Sage Weil --- 3a0013f654070d2432ea2c44e90aec3b9e4a1b43 diff --cc src/mgr/DaemonServer.cc index e2dc616ab53,102937bc119..9a773c8492c --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@@ -1349,12 -1349,38 +1349,39 @@@ bool DaemonServer::_handle_command safe_to_destroy.insert(osd); continue; // clearly safe to destroy } + set pools; + osdmap.get_pool_ids_by_osd(g_ceph_context, osd, &pools); + if (pools.empty()) { + // osd does not belong to any pools yet + safe_to_destroy.insert(osd); + continue; + } + if (osdmap.is_down(osd) && osdmap.is_out(osd)) { + // if osd is down&out and all relevant pools are active+clean, + // then should be safe to destroy + bool all_osd_pools_active_clean = true; + for (auto &ps: pg_map.pg_stat) { + auto& pg = ps.first; + auto state = ps.second.state; + if (!pools.count(pg.pool())) + continue; + if ((state & (PG_STATE_ACTIVE | PG_STATE_CLEAN)) != + (PG_STATE_ACTIVE | PG_STATE_CLEAN)) { + all_osd_pools_active_clean = false; + break; + } + } + if (all_osd_pools_active_clean) { + safe_to_destroy.insert(osd); + continue; + } + } auto q = pg_map.num_pg_by_osd.find(osd); if (q != pg_map.num_pg_by_osd.end()) { - if (q->second.acting > 0 || q->second.up > 0) { + if (q->second.acting > 0 || q->second.up_not_acting > 0) { active_osds.insert(osd); - affected_pgs += q->second.acting + q->second.up; + // XXX: For overlapping PGs, this counts them again + affected_pgs += q->second.acting + q->second.up_not_acting; continue; } }