summaryrefslogtreecommitdiffstats
path: root/xlators
diff options
context:
space:
mode:
Diffstat (limited to 'xlators')
-rw-r--r--xlators/cluster/dht/src/tier.c39
-rw-r--r--xlators/cluster/dht/src/tier.h1
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-brick-ops.c7
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volgen.c49
4 files changed, 75 insertions, 21 deletions
diff --git a/xlators/cluster/dht/src/tier.c b/xlators/cluster/dht/src/tier.c
index f8b32f1619f..fe18d7b91a9 100644
--- a/xlators/cluster/dht/src/tier.c
+++ b/xlators/cluster/dht/src/tier.c
@@ -142,12 +142,17 @@ tier_migrate_using_query_file (void *_args)
int total_status = 0;
FILE *queryFILE = NULL;
char *link_str = NULL;
+ xlator_t *src_subvol = NULL;
+ dht_conf_t *conf = NULL;
GF_VALIDATE_OR_GOTO ("tier", query_cbk_args, out);
GF_VALIDATE_OR_GOTO ("tier", query_cbk_args->this, out);
this = query_cbk_args->this;
GF_VALIDATE_OR_GOTO (this->name, query_cbk_args->defrag, out);
GF_VALIDATE_OR_GOTO (this->name, query_cbk_args->queryFILE, out);
+ GF_VALIDATE_OR_GOTO (this->name, this->private, out);
+
+ conf = this->private;
defrag = query_cbk_args->defrag;
@@ -300,8 +305,29 @@ tier_migrate_using_query_file (void *_args)
inode_unref (loc.inode);
loc.inode = linked_inode;
+ /*
+ * Do not promote/demote if file already is where it
+ * should be. This shall become a skipped count.
+ */
+ src_subvol = dht_subvol_get_cached(this, loc.inode);
+
+ if (query_cbk_args->is_promotion &&
+ src_subvol == conf->subvolumes[1]) {
+ per_link_status = -1;
+ goto error;
+ }
+
+ if (!query_cbk_args->is_promotion &&
+ src_subvol == conf->subvolumes[0]) {
+ per_link_status = -1;
+ goto error;
+ }
+
gf_msg (this->name, GF_LOG_INFO, 0,
- DHT_MSG_LOG_TIER_STATUS, "Tier migrate file %s",
+ DHT_MSG_LOG_TIER_STATUS, "Tier %d"
+ " src_subvol %s file %s",
+ query_cbk_args->is_promotion,
+ src_subvol->name,
loc.name);
if (tier_check_same_node (this, &loc, defrag)) {
@@ -587,6 +613,7 @@ tier_demote (void *args)
query_cbk_args.this = demotion_args->this;
query_cbk_args.defrag = demotion_args->defrag;
+ query_cbk_args.is_promotion = 0;
/*Build the query file using bricklist*/
ret = tier_build_migration_qfile(demotion_args, &query_cbk_args,
@@ -622,6 +649,7 @@ static void
query_cbk_args.this = promotion_args->this;
query_cbk_args.defrag = promotion_args->defrag;
+ query_cbk_args.is_promotion = 1;
/*Build the query file using bricklist*/
ret = tier_build_migration_qfile(promotion_args, &query_cbk_args,
@@ -641,7 +669,7 @@ out:
return NULL;
}
-static void
+static int
tier_get_bricklist (xlator_t *xl, dict_t *bricklist)
{
xlator_list_t *child = NULL;
@@ -690,14 +718,17 @@ tier_get_bricklist (xlator_t *xl, dict_t *bricklist)
if (dict_add_dynstr_with_alloc(bricklist, "brick",
db_path))
goto out;
+
+ ret = 0;
+ goto out;
}
}
for (child = xl->children; child; child = child->next) {
- tier_get_bricklist(child->xlator, bricklist);
+ ret = tier_get_bricklist(child->xlator, bricklist);
}
out:
- return;
+ return ret;
}
int
diff --git a/xlators/cluster/dht/src/tier.h b/xlators/cluster/dht/src/tier.h
index 6dc830dabfa..7d4ea6b7ebe 100644
--- a/xlators/cluster/dht/src/tier.h
+++ b/xlators/cluster/dht/src/tier.h
@@ -50,6 +50,7 @@ typedef struct _query_cbk_args {
xlator_t *this;
gf_defrag_info_t *defrag;
FILE *queryFILE;
+ int is_promotion;
} query_cbk_args_t;
int
diff --git a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
index b32dbb89134..165622f87ef 100644
--- a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
+++ b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c
@@ -465,6 +465,9 @@ __glusterd_handle_add_brick (rpcsvc_request_t *req)
ret = -1;
goto out;
}
+
+ ret = dict_get_int32 (dict, "type", &type);
+
goto brick_val;
}
@@ -1835,6 +1838,7 @@ glusterd_op_perform_attach_tier (dict_t *dict,
{
int ret = 0;
int replica_count = 0;
+ int type = 0;
/*
* Store the new (cold) tier's structure until the graph is generated.
@@ -1853,6 +1857,9 @@ glusterd_op_perform_attach_tier (dict_t *dict,
else
volinfo->tier_info.hot_replica_count = 1;
volinfo->tier_info.hot_brick_count = count;
+ ret = dict_get_int32 (dict, "type", &type);
+ volinfo->tier_info.hot_type = type;
+ ret = dict_set_int32 (dict, "type", GF_CLUSTER_TYPE_TIER);
return ret;
}
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c
index 8a61da2e8ec..bbac2a2283b 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c
@@ -3107,11 +3107,13 @@ volume_volgen_graph_build_clusters (volgen_graph_t *graph,
/* All other cases, it will have one or the other cluster type */
switch (volinfo->type) {
case GF_CLUSTER_TYPE_REPLICATE:
- clusters = volgen_link_bricks_from_list_tail (graph, volinfo,
- replicate_args[0],
- replicate_args[1],
- volinfo->brick_count,
- volinfo->replica_count);
+ 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;
break;
@@ -3284,12 +3286,12 @@ volume_volgen_graph_build_clusters_tier (volgen_graph_t *graph,
volinfo->type = volinfo->tier_info.cold_type;
sprintf (volinfo->volname, "%s-cold", st_volname);
- ret = volume_volgen_graph_build_clusters (graph, volinfo, _gf_false);
+ ret = volume_volgen_graph_build_clusters (graph, volinfo, is_quotad);
if (ret)
goto out;
cxl = first_of(graph);
- volinfo->type = GF_CLUSTER_TYPE_TIER;
+ volinfo->type = volinfo->tier_info.hot_type;
volinfo->brick_count = volinfo->tier_info.hot_brick_count;
volinfo->replica_count = volinfo->tier_info.hot_replica_count;
volinfo->dist_leaf_count = glusterd_get_dist_leaf_count(volinfo);
@@ -3297,21 +3299,34 @@ volume_volgen_graph_build_clusters_tier (volgen_graph_t *graph,
sprintf (volinfo->volname, "%s-hot", st_volname);
- if (volinfo->dist_leaf_count == 1) {
- dist_count = volinfo->brick_count / volinfo->dist_leaf_count;
- ret = volgen_link_bricks_from_list_head (graph, volinfo,
- "cluster/distribute",
- "%s-dht",
- dist_count,
- dist_count);
+ dist_count = volinfo->brick_count / volinfo->dist_leaf_count;
+
+ if (volinfo->dist_leaf_count != 1) {
+ ret = volgen_link_bricks_from_list_head
+ (graph, volinfo,
+ "cluster/replicate",
+ "%s-replicate-%d",
+ volinfo->brick_count,
+ volinfo->replica_count);
+ if (ret != -1)
+ volgen_link_bricks_from_list_tail (graph, volinfo,
+ "cluster/distribute",
+ "%s-dht",
+ dist_count,
+ dist_count);
} else {
- ret = volume_volgen_graph_build_clusters (graph,
- volinfo,
- _gf_false);
+ ret = volgen_link_bricks_from_list_head (graph, volinfo,
+ "cluster/distribute",
+ "%s-dht",
+ dist_count,
+ dist_count);
}
+ if (ret == -1)
+ goto out;
hxl = first_of(graph);
+ volinfo->type = GF_CLUSTER_TYPE_TIER;
xl = volgen_graph_add_nolink (graph, "cluster/tier", "%s",
"tier-dht", 0);
gf_asprintf(&rule, "%s-hot-dht", st_volname);