]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/OSDMap: ignore pg_remap[_items] mappings when target osd isout
authorSage Weil <sage@redhat.com>
Wed, 22 Mar 2017 14:19:10 +0000 (09:19 -0500)
committerSage Weil <sage@redhat.com>
Sat, 25 Mar 2017 18:53:14 +0000 (14:53 -0400)
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 <sage@redhat.com>
src/osd/OSDMap.cc

index 1032e6d0c243e5a6c62cd109bed4b8e6ca631da8..3c4e90a712da1335472dea40a2d3b5fbf847c98d 100644 (file)
@@ -1699,6 +1699,13 @@ void OSDMap::_apply_remap(const pg_pool_t& pi, pg_t raw_pg, vector<int> *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<int> *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;
        }
       }