Commit f53b7665 authored by Ilya Dryomov's avatar Ilya Dryomov

libceph: upmap semantic changes

- apply both pg_upmap and pg_upmap_items
- allow bidirectional swap of pg-upmap-items
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
Reviewed-by: default avatarSage Weil <sage@redhat.com>
parent c7ed1a4b
...@@ -2437,40 +2437,23 @@ static void apply_upmap(struct ceph_osdmap *osdmap, ...@@ -2437,40 +2437,23 @@ static void apply_upmap(struct ceph_osdmap *osdmap,
for (i = 0; i < pg->pg_upmap.len; i++) for (i = 0; i < pg->pg_upmap.len; i++)
raw->osds[i] = pg->pg_upmap.osds[i]; raw->osds[i] = pg->pg_upmap.osds[i];
raw->size = pg->pg_upmap.len; raw->size = pg->pg_upmap.len;
return; /* check and apply pg_upmap_items, if any */
} }
pg = lookup_pg_mapping(&osdmap->pg_upmap_items, pgid); pg = lookup_pg_mapping(&osdmap->pg_upmap_items, pgid);
if (pg) { if (pg) {
/* for (i = 0; i < raw->size; i++) {
* Note: this approach does not allow a bidirectional swap, for (j = 0; j < pg->pg_upmap_items.len; j++) {
* e.g., [[1,2],[2,1]] applied to [0,1,2] -> [0,2,1]. int from = pg->pg_upmap_items.from_to[j][0];
*/ int to = pg->pg_upmap_items.from_to[j][1];
for (i = 0; i < pg->pg_upmap_items.len; i++) {
int from = pg->pg_upmap_items.from_to[i][0]; if (from == raw->osds[i]) {
int to = pg->pg_upmap_items.from_to[i][1]; if (!(to != CRUSH_ITEM_NONE &&
int pos = -1; to < osdmap->max_osd &&
bool exists = false; osdmap->osd_weight[to] == 0))
raw->osds[i] = to;
/* make sure replacement doesn't already appear */
for (j = 0; j < raw->size; j++) {
int osd = raw->osds[j];
if (osd == to) {
exists = true;
break; 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;
} }
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment