diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-volgen.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 91 |
1 files changed, 78 insertions, 13 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index d531ad34752..bf55d52f440 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -24,6 +24,7 @@ #include "logging.h" #include "dict.h" #include "graph-utils.h" +#include "common-utils.h" #include "glusterd-store.h" #include "glusterd-hooks.h" #include "trie.h" @@ -3295,6 +3296,7 @@ volgen_graph_build_afr_clusters (volgen_graph_t *graph, 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->tier_info.cur_tier_hot) clusters = volgen_link_bricks_from_list_head_start (graph, volinfo, @@ -3572,6 +3574,7 @@ volume_volgen_graph_build_clusters_tier (volgen_graph_t *graph, 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, @@ -4227,11 +4230,11 @@ nfs_option_handler (volgen_graph_t *graph, } char* -volgen_get_shd_key (glusterd_volinfo_t *volinfo) +volgen_get_shd_key (int type) { char *key = NULL; - switch (volinfo->type) { + switch (type) { case GF_CLUSTER_TYPE_REPLICATE: case GF_CLUSTER_TYPE_STRIPE_REPLICATE: key = "cluster.self-heal-daemon"; @@ -4239,9 +4242,6 @@ 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; @@ -4279,22 +4279,51 @@ volgen_graph_set_iam_shd (volgen_graph_t *graph) } static int +prepare_shd_volume_options_for_tier (glusterd_volinfo_t *volinfo, + dict_t *set_dict) +{ + int ret = -1; + char *key = NULL; + + key = volgen_get_shd_key (volinfo->tier_info.cold_type); + if (key) { + ret = dict_set_str (set_dict, key, "enable"); + if (ret) + goto out; + } + + key = volgen_get_shd_key (volinfo->tier_info.hot_type); + if (key) { + ret = dict_set_str (set_dict, key, "enable"); + if (ret) + goto out; + } +out: + return ret; +} + +static int prepare_shd_volume_options (glusterd_volinfo_t *volinfo, dict_t *mod_dict, dict_t *set_dict) { char *key = NULL; int ret = 0; - key = volgen_get_shd_key (volinfo); - if (!key) { - ret = -1; - goto out; + if (volinfo->type == GF_CLUSTER_TYPE_TIER) { + ret = prepare_shd_volume_options_for_tier (volinfo, set_dict); + if (ret) + goto out; + } else { + key = volgen_get_shd_key (volinfo->type); + if (!key) { + ret = -1; + goto out; + } + ret = dict_set_str (set_dict, key, "enable"); + if (ret) + goto out; } - ret = dict_set_str (set_dict, key, "enable"); - if (ret) - goto out; - ret = dict_set_uint32 (set_dict, "trusted-client", GF_CLIENT_TRUSTED); if (ret) goto out; @@ -4405,6 +4434,42 @@ out: return clusters; } +gf_boolean_t +is_self_heal_enabled (glusterd_volinfo_t *volinfo, dict_t *dict) +{ + + char *shd_key = NULL; + gf_boolean_t shd_enabled = _gf_false; + + GF_VALIDATE_OR_GOTO ("glusterd", volinfo, out); + + switch (volinfo->type) { + case GF_CLUSTER_TYPE_REPLICATE: + case GF_CLUSTER_TYPE_STRIPE_REPLICATE: + case GF_CLUSTER_TYPE_DISPERSE: + shd_key = volgen_get_shd_key (volinfo->type); + shd_enabled = dict_get_str_boolean (dict, shd_key, + _gf_true); + break; + case GF_CLUSTER_TYPE_TIER: + shd_key = volgen_get_shd_key (volinfo->tier_info.cold_type); + if (shd_key) + shd_enabled = dict_get_str_boolean (dict, shd_key, + _gf_true); + + shd_key = volgen_get_shd_key (volinfo->tier_info.hot_type); + if (shd_key) + shd_enabled |= dict_get_str_boolean (dict, shd_key, + _gf_true); + + break; + default: + break; + } +out: + return shd_enabled; +} + static int build_rebalance_volfile (glusterd_volinfo_t *volinfo, char *filepath, dict_t *mod_dict) |