From ba8dd78236eec2c70b9bdc335d847c5762d4b6d4 Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Sun, 5 May 2019 13:17:32 +0800 Subject: [PATCH] mgr/DaemonServer: safe-to-destroy - do not consider irrelevant pgs otherwise ceph osd safe-to-destroy would say NO even if we want to destroy an down+out osd from an actually active+clean pool! Signed-off-by: xie xingguo --- src/mgr/DaemonServer.cc | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/mgr/DaemonServer.cc b/src/mgr/DaemonServer.cc index b7c5e35f59b..102937bc119 100644 --- a/src/mgr/DaemonServer.cc +++ b/src/mgr/DaemonServer.cc @@ -1349,6 +1349,33 @@ 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) { -- 2.39.5