Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f53b7665 authored by Ilya Dryomov's avatar Ilya Dryomov
Browse files

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
Loading
Loading
Loading
Loading
+11 −28
Original line number Diff line number Diff line
@@ -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];
		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 (osd == to) {
					exists = true;
					break;
				}
				/* ignore mapping if target is marked out */
				if (osd == from && pos < 0 &&
				    !(to != CRUSH_ITEM_NONE &&
				if (from == raw->osds[i]) {
					if (!(to != CRUSH_ITEM_NONE &&
					      to < osdmap->max_osd &&
				      osdmap->osd_weight[to] == 0)) {
					pos = j;
				}
					      osdmap->osd_weight[to] == 0))
						raw->osds[i] = to;
					break;
				}
			if (!exists && pos >= 0) {
				raw->osds[pos] = to;
				return;
			}
		}
	}