]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
libceph: upmap semantic changes
authorIlya Dryomov <idryomov@gmail.com>
Thu, 27 Jul 2017 13:16:39 +0000 (15:16 +0200)
committerIlya Dryomov <idryomov@gmail.com>
Tue, 1 Aug 2017 14:46:45 +0000 (16:46 +0200)
- apply both pg_upmap and pg_upmap_items
- allow bidirectional swap of pg-upmap-items

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Reviewed-by: Sage Weil <sage@redhat.com>
net/ceph/osdmap.c

index 2586e55461438bd1cd7a1127bfc8179e6ba84cb0..0bec71fa712e68c556cf3b8d105980b513cb1cf9 100644 (file)
@@ -2437,40 +2437,23 @@ static void apply_upmap(struct ceph_osdmap *osdmap,
                for (i = 0; i < pg->pg_upmap.len; i++)
                        raw->osds[i] = pg->pg_upmap.osds[i];
                raw->size = pg->pg_upmap.len;
-               return;
+               /* check and apply pg_upmap_items, if any */
        }
 
        pg = lookup_pg_mapping(&osdmap->pg_upmap_items, pgid);
        if (pg) {
-               /*
-                * Note: this approach does not allow a bidirectional swap,
-                * e.g., [[1,2],[2,1]] applied to [0,1,2] -> [0,2,1].
-                */
-               for (i = 0; i < pg->pg_upmap_items.len; i++) {
-                       int from = pg->pg_upmap_items.from_to[i][0];
-                       int to = pg->pg_upmap_items.from_to[i][1];
-                       int pos = -1;
-                       bool exists = false;
-
-                       /* make sure replacement doesn't already appear */
-                       for (j = 0; j < raw->size; j++) {
-                               int osd = raw->osds[j];
-
-                               if (osd == to) {
-                                       exists = true;
+               for (i = 0; i < raw->size; i++) {
+                       for (j = 0; j < pg->pg_upmap_items.len; j++) {
+                               int from = pg->pg_upmap_items.from_to[j][0];
+                               int to = pg->pg_upmap_items.from_to[j][1];
+
+                               if (from == raw->osds[i]) {
+                                       if (!(to != CRUSH_ITEM_NONE &&
+                                             to < osdmap->max_osd &&
+                                             osdmap->osd_weight[to] == 0))
+                                               raw->osds[i] = to;
                                        break;
                                }
-                               /* ignore mapping if target is marked out */
-                               if (osd == from && pos < 0 &&
-                                   !(to != CRUSH_ITEM_NONE &&
-                                     to < osdmap->max_osd &&
-                                     osdmap->osd_weight[to] == 0)) {
-                                       pos = j;
-                               }
-                       }
-                       if (!exists && pos >= 0) {
-                               raw->osds[pos] = to;
-                               return;
                        }
                }
        }