Skip to content

Commit

Permalink
libceph: upmap semantic changes
Browse files Browse the repository at this point in the history
- apply both pg_upmap and pg_upmap_items
- allow bidirectional swap of pg-upmap-items

Signed-off-by: Ilya Dryomov <[email protected]>
Reviewed-by: Sage Weil <[email protected]>
  • Loading branch information
idryomov committed Aug 1, 2017
1 parent c7ed1a4 commit f53b766
Showing 1 changed file with 11 additions and 28 deletions.
39 changes: 11 additions & 28 deletions net/ceph/osdmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}
Expand Down

0 comments on commit f53b766

Please sign in to comment.