diff options
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/cluster/afr/src/afr.c | 32 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 104 |
2 files changed, 120 insertions, 16 deletions
diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index 5ef920a13d1..4c072b6c69f 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -248,6 +248,8 @@ init (xlator_t *this) int read_subvol_index = -1; xlator_t *fav_child = NULL; char *qtype = NULL; + char *xattrs_list = NULL; + char *ptr = NULL; if (!this->children) { gf_msg (this->name, GF_LOG_ERROR, 0, @@ -401,6 +403,7 @@ init (xlator_t *this) goto out; } + GF_OPTION_INIT ("afr-pending-xattr", xattrs_list, str, out); priv->pending_key = GF_CALLOC (sizeof (*priv->pending_key), child_count, gf_afr_mt_char); @@ -408,20 +411,25 @@ init (xlator_t *this) ret = -ENOMEM; goto out; } - - trav = this->children; - i = 0; - while (i < child_count) { - priv->children[i] = trav->xlator; - + ptr = gf_strdup (xattrs_list); + if (!ptr) { + ret = -ENOMEM; + goto out; + } + for (i = 0, ptr = strtok (ptr, ","); ptr; ptr = strtok (NULL, ",")) { ret = gf_asprintf (&priv->pending_key[i], "%s.%s", - AFR_XATTR_PREFIX, - trav->xlator->name); - if (-1 == ret) { + AFR_XATTR_PREFIX, ptr); + if (ret == -1) { ret = -ENOMEM; goto out; } + i++; + } + trav = this->children; + i = 0; + while (i < child_count) { + priv->children[i] = trav->xlator; trav = trav->next; i++; } @@ -457,6 +465,7 @@ init (xlator_t *this) ret = 0; out: + GF_FREE (ptr); return ret; } @@ -780,6 +789,11 @@ struct volume_options options[] = { .type = GF_OPTION_TYPE_STR, .default_value = AFR_DIRTY_DEFAULT, }, + { .key = {"afr-pending-xattr"}, + .type = GF_OPTION_TYPE_STR, + .description = "Comma seperated list of xattrs that are used to " + "capture information on pending heals." + }, { .key = {"metadata-splitbrain-forced-heal"}, .type = GF_OPTION_TYPE_BOOL, .default_value = "off", diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index 988c6053d41..29e5fe9b3f9 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -3286,6 +3286,80 @@ out: } static int +set_afr_pending_xattrs_option (volgen_graph_t *graph, + glusterd_volinfo_t *volinfo, + int clusters) +{ + xlator_t *xlator = NULL; + xlator_t **afr_xlators_list = NULL; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + glusterd_brickinfo_t *brick = NULL; + char *ptr = NULL; + int i = 0; + int index = -1; + int ret = 0; + char *afr_xattrs_list = NULL; + int list_size = -1; + + this = THIS; + GF_VALIDATE_OR_GOTO ("glusterd", this, out); + conf = this->private; + GF_VALIDATE_OR_GOTO (this->name, conf, out); + + if (conf->op_version < GD_OP_VERSION_3_7_7) + return ret; + + /* (brick_id x rep.count) + (rep.count-1 commas) + NULL*/ + list_size = (1024 * volinfo->replica_count) + + (volinfo->replica_count - 1) + 1; + afr_xattrs_list = GF_CALLOC (1, list_size, gf_common_mt_char); + if (!afr_xattrs_list) + goto out; + + ptr = afr_xattrs_list; + afr_xlators_list = GF_CALLOC (clusters, sizeof (xlator_t *), + gf_common_mt_xlator_t); + if (!afr_xlators_list) + goto out; + + xlator = first_of (graph); + + for (i = 0, index = clusters - 1; i < clusters; i++) { + afr_xlators_list[index--] = xlator; + xlator = xlator->next; + } + + i = 1; + index = 0; + + cds_list_for_each_entry (brick, &volinfo->bricks, brick_list) { + if (index == clusters) + break; + strncat (ptr, brick->brick_id, strlen(brick->brick_id)); + if (i == volinfo->replica_count) { + ret = xlator_set_option (afr_xlators_list[index++], + "afr-pending-xattr", + afr_xattrs_list); + if (ret) + return ret; + memset (afr_xattrs_list, 0, list_size); + ptr = afr_xattrs_list; + i = 1; + continue; + } + ptr[strlen(brick->brick_id)] = ','; + ptr += strlen (brick->brick_id) + 1; + i++; + } + +out: + GF_FREE (afr_xattrs_list); + GF_FREE (afr_xlators_list); + return ret; +} + +static int volgen_graph_build_afr_clusters (volgen_graph_t *graph, glusterd_volinfo_t *volinfo) { @@ -3296,7 +3370,7 @@ volgen_graph_build_afr_clusters (volgen_graph_t *graph, "%s-replicate-%d"}; xlator_t *afr = NULL; char option[32] = {0}; - int start_count = 0; + int start_count = 0; if (volinfo->tier_info.cold_type == GF_CLUSTER_TYPE_REPLICATE) start_count = volinfo->tier_info.cold_brick_count / @@ -3321,6 +3395,11 @@ volgen_graph_build_afr_clusters (volgen_graph_t *graph, if (clusters < 0) goto out; + ret = set_afr_pending_xattrs_option (graph, volinfo, clusters); + if (ret) { + clusters = -1; + goto out; + } if (!volinfo->arbiter_count) goto out; @@ -3343,8 +3422,6 @@ volume_volgen_graph_build_clusters (volgen_graph_t *graph, glusterd_volinfo_t *volinfo, gf_boolean_t is_quotad) { - char *replicate_args[] = {"cluster/replicate", - "%s-replicate-%d"}; char *tier_args[] = {"cluster/tier", "%s-tier-%d"}; char *stripe_args[] = {"cluster/stripe", @@ -3536,7 +3613,6 @@ volume_volgen_graph_build_clusters_tier (volgen_graph_t *graph, int ret = -1; xlator_t *root = NULL; xlator_t *xl, *hxl, *cxl; - glusterd_brickinfo_t *brick = NULL; char *rule = NULL; int st_brick_count = 0; int st_replica_count = 0; @@ -3546,6 +3622,8 @@ volume_volgen_graph_build_clusters_tier (volgen_graph_t *graph, int dist_count = 0; int start_count = 0; char *decommissioned_children = NULL; + glusterd_volinfo_t *dup_volinfo = NULL; + gf_boolean_t is_hot_tier = _gf_false; st_brick_count = volinfo->brick_count; st_replica_count = volinfo->replica_count; @@ -3560,8 +3638,13 @@ volume_volgen_graph_build_clusters_tier (volgen_graph_t *graph, volinfo->redundancy_count = volinfo->tier_info.cold_redundancy_count; volinfo->type = volinfo->tier_info.cold_type; volinfo->tier_info.cur_tier_hot = 0; + ret = glusterd_create_sub_tier_volinfo (volinfo, &dup_volinfo, + is_hot_tier, volinfo->volname); + if (ret) + goto out; - ret = volume_volgen_graph_build_clusters (graph, volinfo, is_quotad); + ret = volume_volgen_graph_build_clusters (graph, dup_volinfo, + is_quotad); if (ret) goto out; cxl = first_of(graph); @@ -3588,12 +3671,17 @@ volume_volgen_graph_build_clusters_tier (volgen_graph_t *graph, volinfo->brick_count, volinfo->replica_count, start_count); - if (ret != -1) - volgen_link_bricks_from_list_tail (graph, volinfo, + if (ret != -1) { + ret = set_afr_pending_xattrs_option (graph, volinfo, + ret); + if (ret) + goto out; + volgen_link_bricks_from_list_tail (graph, volinfo, "cluster/distribute", "%s-hot-dht", dist_count, dist_count); + } } else { ret = volgen_link_bricks_from_list_head (graph, volinfo, "cluster/distribute", @@ -3653,6 +3741,8 @@ volume_volgen_graph_build_clusters_tier (volgen_graph_t *graph, volinfo->dist_leaf_count = st_dist_leaf_count; volinfo->tier_info.cur_tier_hot = 0; + if (dup_volinfo) + glusterd_volinfo_delete (dup_volinfo); GF_FREE (rule); return ret; } |