Commit 45966c34 authored by Ilya Dryomov's avatar Ilya Dryomov Committed by Sage Weil

libceph: introduce apply_temps() helper

apply_temp() helper for applying various temporary mappings (at this
point only pg_temp mappings) to the up set, therefore transforming it
into an acting set.
Signed-off-by: default avatarIlya Dryomov <ilya.dryomov@inktank.com>
Reviewed-by: default avatarAlex Elder <elder@linaro.org>
parent 2bd93d4d
......@@ -1596,6 +1596,58 @@ static int raw_to_up_osds(struct ceph_osdmap *osdmap,
return len;
}
/*
* Given up set, apply pg_temp mapping.
*
* Return acting set length. *primary is set to acting primary osd id,
* or -1 if acting set is empty.
*/
static int apply_temps(struct ceph_osdmap *osdmap,
struct ceph_pg_pool_info *pool, struct ceph_pg pgid,
int *osds, int len, int *primary)
{
struct ceph_pg_mapping *pg;
int temp_len;
int temp_primary;
int i;
/* raw_pg -> pg */
pgid.seed = ceph_stable_mod(pgid.seed, pool->pg_num,
pool->pg_num_mask);
/* pg_temp? */
pg = __lookup_pg_mapping(&osdmap->pg_temp, pgid);
if (pg) {
temp_len = 0;
temp_primary = -1;
for (i = 0; i < pg->pg_temp.len; i++) {
if (ceph_osd_is_down(osdmap, pg->pg_temp.osds[i])) {
if (ceph_can_shift_osds(pool))
continue;
else
osds[temp_len++] = CRUSH_ITEM_NONE;
} else {
osds[temp_len++] = pg->pg_temp.osds[i];
}
}
/* apply pg_temp's primary */
for (i = 0; i < temp_len; i++) {
if (osds[i] != CRUSH_ITEM_NONE) {
temp_primary = osds[i];
break;
}
}
} else {
temp_len = len;
temp_primary = *primary;
}
*primary = temp_primary;
return temp_len;
}
/*
* Return acting set for given pgid.
*/
......
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