diff options
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 98 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 7 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 177 |
3 files changed, 262 insertions, 20 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) diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index 4df04f7f321..d70eeff3026 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -361,6 +361,11 @@ glusterd_get_trusted_client_filepath (char *filepath, int glusterd_restart_rebalance (glusterd_conf_t *conf); +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_name); void glusterd_restart_rebalance_for_volume (glusterd_volinfo_t *volinfo); @@ -638,6 +643,8 @@ glusterd_import_quota_conf (dict_t *peer_data, int vol_idx, gf_boolean_t glusterd_is_shd_compatible_volume (glusterd_volinfo_t *volinfo); +inline gf_boolean_t +glusterd_is_shd_compatible_type (int type); gf_boolean_t glusterd_are_all_volumes_stopped (); diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index ad63e533243..09bc94621f4 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -2824,6 +2824,57 @@ out: } static int +volgen_graph_build_clients_for_tier_shd (volgen_graph_t *graph, + glusterd_volinfo_t *volinfo, + dict_t *set_dict) +{ + int ret = 0; + glusterd_volinfo_t *dup_volinfo = NULL; + gf_boolean_t is_hot_tier = _gf_false; + gf_boolean_t is_hot_shd = _gf_false; + gf_boolean_t is_cold_shd = _gf_false; + + is_cold_shd = glusterd_is_shd_compatible_type + (volinfo->tier_info.cold_type); + is_hot_shd = glusterd_is_shd_compatible_type + (volinfo->tier_info.hot_type); + + if (is_cold_shd && is_hot_shd) { + ret = volgen_graph_build_clients (graph, volinfo, + set_dict, NULL); + return ret; + } + + if (is_cold_shd) { + ret = glusterd_create_sub_tier_volinfo (volinfo, &dup_volinfo, + is_hot_tier, + volinfo->volname); + if (ret) + goto out; + ret = volgen_graph_build_clients (graph, dup_volinfo, + set_dict, NULL); + if (ret) + goto out; + } + if (is_hot_shd) { + is_hot_tier = _gf_true; + ret = glusterd_create_sub_tier_volinfo (volinfo, &dup_volinfo, + is_hot_tier, + volinfo->volname); + if (ret) + goto out; + ret = volgen_graph_build_clients (graph, dup_volinfo, + set_dict, NULL); + if (ret) + goto out; + } +out: + if (dup_volinfo) + glusterd_volinfo_delete (dup_volinfo); + return ret; +} + +static int volgen_link_bricks (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, char *xl_type, char *xl_namefmt, size_t child_count, @@ -2860,7 +2911,7 @@ volgen_link_bricks (volgen_graph_t *graph, break; } - ret = j; + ret = j - start_count; out: return ret; } @@ -3236,16 +3287,25 @@ volgen_graph_build_afr_clusters (volgen_graph_t *graph, char option[32] = {0}; int start_count = 0; - if (volinfo->tier_info.cur_tier_hot && - volinfo->tier_info.cold_type == GF_CLUSTER_TYPE_REPLICATE) + if (volinfo->tier_info.cold_type == GF_CLUSTER_TYPE_REPLICATE) start_count = volinfo->tier_info.cold_brick_count / volinfo->tier_info.cold_replica_count; - clusters = volgen_link_bricks_from_list_tail_start (graph, volinfo, + if (volinfo->tier_info.cur_tier_hot) + clusters = volgen_link_bricks_from_list_head_start (graph, + volinfo, replicate_args[0], replicate_args[1], volinfo->brick_count, volinfo->replica_count, start_count); + else + clusters = volgen_link_bricks_from_list_tail (graph, + volinfo, + replicate_args[0], + replicate_args[1], + volinfo->brick_count, + volinfo->replica_count); + if (clusters < 0) goto out; @@ -3472,6 +3532,7 @@ volume_volgen_graph_build_clusters_tier (volgen_graph_t *graph, int st_dist_leaf_count = 0; int st_type = 0; int dist_count = 0; + int start_count = 0; char *decommissioned_children = NULL; st_brick_count = volinfo->brick_count; @@ -3502,6 +3563,10 @@ volume_volgen_graph_build_clusters_tier (volgen_graph_t *graph, dist_count = volinfo->brick_count / volinfo->dist_leaf_count; + if (volinfo->tier_info.cold_type == GF_CLUSTER_TYPE_REPLICATE) { + start_count = volinfo->tier_info.cold_brick_count / + volinfo->tier_info.cold_replica_count; + } if (volinfo->dist_leaf_count != 1) { ret = volgen_link_bricks_from_list_head_start (graph, volinfo, @@ -3509,8 +3574,7 @@ volume_volgen_graph_build_clusters_tier (volgen_graph_t *graph, "%s-replicate-%d", volinfo->brick_count, volinfo->replica_count, - volinfo->tier_info.cold_brick_count/ - volinfo->tier_info.cold_replica_count); + start_count); if (ret != -1) volgen_link_bricks_from_list_tail (graph, volinfo, "cluster/distribute", @@ -4170,6 +4234,9 @@ volgen_get_shd_key (glusterd_volinfo_t *volinfo) case GF_CLUSTER_TYPE_DISPERSE: key = "cluster.disperse-self-heal-daemon"; break; + case GF_CLUSTER_TYPE_TIER: + key = "cluster.tier-self-heal-daemon"; + break; default: key = NULL; break; @@ -4235,16 +4302,10 @@ out: } static int -build_shd_clusters (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, - dict_t *set_dict) +build_afr_ec_clusters (volgen_graph_t *graph, glusterd_volinfo_t *volinfo) { - int ret = 0; - int clusters = -1; - - ret = volgen_graph_build_clients (graph, volinfo, set_dict, NULL); - if (ret) - goto out; + int clusters = -1; switch (volinfo->type) { case GF_CLUSTER_TYPE_REPLICATE: case GF_CLUSTER_TYPE_STRIPE_REPLICATE: @@ -4255,6 +4316,86 @@ build_shd_clusters (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, clusters = volgen_graph_build_ec_clusters (graph, volinfo); break; } + return clusters; +} + +static int +build_afr_ec_clusters_for_tier (volgen_graph_t *graph, + glusterd_volinfo_t *volinfo, + dict_t *set_dict) +{ + int ret = 0; + glusterd_volinfo_t *dup_volinfo[2] = {NULL, NULL}; + int clusters = 0; + int i = 0; + volgen_graph_t hot_graph = {0}; + volgen_graph_t cold_cgraph = {0}; + gf_boolean_t is_hot_tier = _gf_false; + + if (glusterd_is_shd_compatible_type (volinfo->tier_info.cold_type)) { + ret = glusterd_create_sub_tier_volinfo (volinfo, + &dup_volinfo[0], + is_hot_tier, + volinfo->volname); + if (ret) + goto out; + } + if (glusterd_is_shd_compatible_type (volinfo->tier_info.hot_type)) { + is_hot_tier = _gf_true; + ret = glusterd_create_sub_tier_volinfo (volinfo, + &dup_volinfo[1], + is_hot_tier, + volinfo->volname); + if (ret) + goto out; + dup_volinfo[1]->tier_info.cur_tier_hot = 1; + } + + for (i = 0; i < 2; i++) { + if (!dup_volinfo[i]) + continue; + ret = build_afr_ec_clusters (graph, dup_volinfo[i]); + if (ret < 0) + goto out; + clusters += ret; + } + ret = 0; +out: + for (i = 0; i < 2; i++) { + if (dup_volinfo[i]) + glusterd_volinfo_delete (dup_volinfo[i]); + } + + if (ret) + clusters = -1; + + return clusters; +} + + + +static int +build_shd_clusters (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, + dict_t *set_dict) +{ + int ret = 0; + int clusters = -1; + + if (volinfo->type == GF_CLUSTER_TYPE_TIER) { + ret = volgen_graph_build_clients_for_tier_shd (graph, volinfo, + set_dict); + if (ret) + goto out; + + clusters = build_afr_ec_clusters_for_tier (graph, volinfo, + set_dict); + } else { + ret = volgen_graph_build_clients (graph, volinfo, + set_dict, NULL); + if (ret) + goto out; + clusters = build_afr_ec_clusters (graph, volinfo); + } out: return clusters; } @@ -4408,14 +4549,14 @@ build_shd_graph (volgen_graph_t *graph, dict_t *mod_dict) } cds_list_for_each_entry (voliter, &priv->volumes, vol_list) { - ret = build_shd_volume_graph (this, graph, voliter, mod_dict, - set_dict, graph_check, - &valid_config); - + ret = build_shd_volume_graph (this, graph, voliter, + mod_dict, set_dict, + graph_check, &valid_config); ret = dict_reset (set_dict); if (ret) goto out; } + out: if (set_dict) dict_unref (set_dict); |