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: Ilya Dryomov <ilya.dryomov@inktank.com> Reviewed-by: Alex Elder <elder@linaro.org>
This commit is contained in:
parent
2bd93d4d7e
commit
45966c3467
|
@ -1596,6 +1596,58 @@ static int raw_to_up_osds(struct ceph_osdmap *osdmap,
|
||||||
return len;
|
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.
|
* Return acting set for given pgid.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue