From eebd9a1bc260d0b23f25ea04f01d76eb6cb3f3c5 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 22 Mar 2017 09:19:10 -0500 Subject: [PATCH] osd/OSDMap: ignore pg_remap[_items] mappings when target osd isout If the remap target is fully out, ignore the mapping. Do not do a probabilistic 'osd_weight' rejection; pg-remap is intended to avoid probabilistic mappings. Signed-off-by: Sage Weil --- src/osd/OSDMap.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 1032e6d0c243e..3c4e90a712da1 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1699,6 +1699,13 @@ void OSDMap::_apply_remap(const pg_pool_t& pi, pg_t raw_pg, vector *raw) co pg_t pg = pi.raw_pg_to_pg(raw_pg); auto p = pg_remap.find(pg); if (p != pg_remap.end()) { + // make sure targets aren't marked out + for (auto osd : p->second) { + if (osd != CRUSH_ITEM_NONE && osd < max_osd && osd_weight[osd] == 0) { + // reject/ignore the explicit mapping + return; + } + } *raw = p->second; return; } @@ -1712,11 +1719,16 @@ void OSDMap::_apply_remap(const pg_pool_t& pi, pg_t raw_pg, vector *raw) co bool exists = false; ssize_t pos = -1; for (unsigned i = 0; i < raw->size(); ++i) { - if ((*raw)[i] == r.second) { + int osd = (*raw)[i]; + if (osd == r.second) { exists = true; break; } - if ((*raw)[i] == r.first && pos < 0) { + // ignore mapping if target is marked out (or invalid osd id) + if (osd == r.first && + pos < 0 && + !(r.second != CRUSH_ITEM_NONE && r.second < max_osd && + osd_weight[r.second] == 0)) { pos = i; } } -- 2.39.5