diff options
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/cluster/dht/src/tier.c | 39 | ||||
-rw-r--r-- | xlators/cluster/dht/src/tier.h | 1 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-brick-ops.c | 7 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volgen.c | 49 |
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); |