diff mbox

[27/33] libceph: introduce apply_temps() helper

Message ID 1395944299-21970-28-git-send-email-ilya.dryomov@inktank.com (mailing list archive)
State New, archived
Headers show

Commit Message

Ilya Dryomov March 27, 2014, 6:18 p.m. UTC
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>
---
 net/ceph/osdmap.c |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

Comments

Alex Elder March 27, 2014, 8:41 p.m. UTC | #1
On 03/27/2014 01:18 PM, Ilya Dryomov wrote:
> 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.

Looks good.

Reviewed-by: Alex Elder <elder@linaro.org>

> 
> Signed-off-by: Ilya Dryomov <ilya.dryomov@inktank.com>
> ---
>  net/ceph/osdmap.c |   52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 52 insertions(+)
> 
> diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
> index ee095e07cf98..6d418433d80d 100644
> --- a/net/ceph/osdmap.c
> +++ b/net/ceph/osdmap.c
> @@ -1590,6 +1590,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,
> 

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/net/ceph/osdmap.c b/net/ceph/osdmap.c
index ee095e07cf98..6d418433d80d 100644
--- a/net/ceph/osdmap.c
+++ b/net/ceph/osdmap.c
@@ -1590,6 +1590,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,