summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
Diffstat (limited to 'xlators')
-rw-r--r--xlators/cluster/afr/src/afr.c32
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volgen.c104
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;
}