diff options
| author | Mohammed Rafi KC <rkavunga@redhat.com> | 2015-08-20 12:19:51 +0530 |
|---|---|---|
| committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2015-10-11 22:10:42 -0700 |
| commit | fdff192b918ca9cd237f3f784c627102377e3661 (patch) | |
| tree | 37b0003cb3c58816d9a5398747a6487d37ce802c /xlators/mgmt/glusterd/src/glusterd-utils.c | |
| parent | f6618acd4f7642dab19445e35cf2c7fbc8244a5e (diff) | |
tier/shd: create shd volfile for tiering
Currently shd graph will only start if it is replicate
or disperse volume. But in case of tiering, volume type
will be tier. So we need to start shd if any of the cold
or hot is compatible with shd volume.
Change-Id: Ic689746ac7d2fc6a9eccdabd8518dc9139829de2
BUG: 1261276
Signed-off-by: Mohammed Rafi KC <rkavunga@redhat.com>
Reviewed-on: http://review.gluster.org/11962
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-utils.c')
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 98 |
1 files changed, 96 insertions, 2 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 3491cb10187..39518d1b534 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -626,6 +626,84 @@ glusterd_brickinfo_dup (glusterd_brickinfo_t *brickinfo, out: return ret; } +int32_t +glusterd_create_sub_tier_volinfo (glusterd_volinfo_t *volinfo, + glusterd_volinfo_t **dup_volinfo, + gf_boolean_t is_hot_tier, + const char *new_volname) +{ + glusterd_brickinfo_t *brickinfo = NULL; + glusterd_brickinfo_t *brickinfo_dup = NULL; + gd_tier_info_t *tier_info = NULL; + int i = 0; + int ret = -1; + + tier_info = &(volinfo->tier_info); + + ret = glusterd_volinfo_dup (volinfo, dup_volinfo, _gf_true); + if (ret) { + gf_msg ("glusterd", GF_LOG_ERROR, 0, GD_MSG_VOL_OP_FAILED, + "Failed to create volinfo"); + return ret; + } + + (*dup_volinfo)->is_snap_volume = volinfo->is_snap_volume; + (*dup_volinfo)->status = volinfo->status; + memcpy (&(*dup_volinfo)->tier_info, &volinfo->tier_info, + sizeof (volinfo->tier_info)); + + strcpy ((*dup_volinfo)->volname, new_volname); + + cds_list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) { + i++; + + if (is_hot_tier) { + if (i > volinfo->tier_info.hot_brick_count) + break; + } else { + if (i <= volinfo->tier_info.hot_brick_count) + continue; + } + + ret = glusterd_brickinfo_new (&brickinfo_dup); + if (ret) { + gf_msg ("glusterd", GF_LOG_ERROR, 0, + GD_MSG_BRICK_NEW_INFO_FAIL, "Failed to create " + "new brickinfo"); + goto out; + } + + + glusterd_brickinfo_dup (brickinfo, brickinfo_dup); + cds_list_add_tail (&brickinfo_dup->brick_list, + &((*dup_volinfo)->bricks)); + } + + if (is_hot_tier) { + (*dup_volinfo)->type = tier_info->hot_type; + (*dup_volinfo)->replica_count = tier_info->hot_replica_count; + (*dup_volinfo)->brick_count = tier_info->hot_brick_count; + (*dup_volinfo)->dist_leaf_count = + glusterd_get_dist_leaf_count(*dup_volinfo); + + } else { + (*dup_volinfo)->type = tier_info->cold_type; + (*dup_volinfo)->replica_count = tier_info->cold_replica_count; + (*dup_volinfo)->disperse_count = tier_info->cold_disperse_count; + (*dup_volinfo)->redundancy_count = tier_info->cold_redundancy_count; + (*dup_volinfo)->dist_leaf_count = tier_info->cold_dist_leaf_count; + (*dup_volinfo)->brick_count = tier_info->cold_brick_count; + } +out: + if (ret && *dup_volinfo) { + glusterd_volinfo_delete (*dup_volinfo); + *dup_volinfo = NULL; + } + + return ret; + +} + /* * gd_vol_is_geo_rep_active: * This function checks for any running geo-rep session for @@ -6301,9 +6379,9 @@ glusterd_is_volume_replicate (glusterd_volinfo_t *volinfo) } gf_boolean_t -glusterd_is_shd_compatible_volume (glusterd_volinfo_t *volinfo) +glusterd_is_shd_compatible_type (int type) { - switch (volinfo->type) { + switch (type) { case GF_CLUSTER_TYPE_REPLICATE: case GF_CLUSTER_TYPE_STRIPE_REPLICATE: case GF_CLUSTER_TYPE_DISPERSE: @@ -6313,6 +6391,22 @@ glusterd_is_shd_compatible_volume (glusterd_volinfo_t *volinfo) return _gf_false; } +gf_boolean_t +glusterd_is_shd_compatible_volume (glusterd_volinfo_t *volinfo) +{ + + int ret = 0; + + if (volinfo->type == GF_CLUSTER_TYPE_TIER) { + ret = glusterd_is_shd_compatible_type + (volinfo->tier_info.cold_type) | + glusterd_is_shd_compatible_type + (volinfo->tier_info.hot_type); + return ret; + } + return glusterd_is_shd_compatible_type (volinfo->type); +} + int glusterd_set_dump_options (char *dumpoptions_path, char *options, int option_cnt) |
