safe_to_destroy.insert(osd);
continue; // clearly safe to destroy
}
+ set<int64_t> 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) {