diff options
author | Ilya Dryomov <ilya.dryomov@inktank.com> | 2014-03-24 17:12:47 +0200 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2014-04-04 21:08:11 -0700 |
commit | 45966c3467e8291382a8970adbd78403a7818d45 (patch) | |
tree | 7abbb04336ddbb9f72c4cbace25c5c902cb5b9da /net/ceph | |
parent | 2bd93d4d7ec2dd461cfb87c6d8a9b1ef9b30de08 (diff) | |
download | linux-stable-45966c3467e8291382a8970adbd78403a7818d45.tar.gz linux-stable-45966c3467e8291382a8970adbd78403a7818d45.tar.bz2 linux-stable-45966c3467e8291382a8970adbd78403a7818d45.zip |
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>
Diffstat (limited to 'net/ceph')
-rw-r--r-- | net/ceph/osdmap.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c index b8bbef058019..bd40f56b53ed 100644 --- a/net/ceph/osdmap.c +++ b/net/ceph/osdmap.c @@ -1597,6 +1597,58 @@ static int raw_to_up_osds(struct ceph_osdmap *osdmap, } /* + * 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. */ int ceph_calc_pg_acting(struct ceph_osdmap *osdmap, struct ceph_pg pgid, |