diff options
Diffstat (limited to 'xlators/mgmt/glusterd')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-brick-ops.c | 25 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-rebalance.c | 9 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-replace-brick.c | 8 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 65 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 4 |
5 files changed, 111 insertions, 0 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c index f80b5a8078b..19ba5e5219e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c @@ -511,6 +511,14 @@ __glusterd_handle_add_brick (rpcsvc_request_t *req) goto brick_val; } + ret = glusterd_disallow_op_for_tier (volinfo, GD_OP_ADD_BRICK, -1); + if (ret) { + snprintf (err_str, sizeof (err_str), "Add-brick operation is " + "not supported on a tiered volume %s", volname); + gf_log (this->name, GF_LOG_ERROR, "%s", err_str); + goto out; + } + if (!stripe_count && !replica_count) { if (volinfo->type == GF_CLUSTER_TYPE_NONE) goto brick_val; @@ -753,6 +761,7 @@ __glusterd_handle_remove_brick (rpcsvc_request_t *req) int32_t replica_count = 0; char *volname = 0; xlator_t *this = NULL; + int cmd = -1; GF_ASSERT (req); this = THIS; @@ -818,6 +827,22 @@ __glusterd_handle_remove_brick (rpcsvc_request_t *req) goto out; } + ret = dict_get_int32 (dict, "command", &cmd); + if (ret) { + snprintf (err_str, sizeof (err_str), "Unable to get cmd " + "ccommand"); + gf_log (this->name, GF_LOG_ERROR, "%s", err_str); + goto out; + } + + ret = glusterd_disallow_op_for_tier (volinfo, GD_OP_REMOVE_BRICK, cmd); + if (ret) { + snprintf (err_str, sizeof (err_str), + "Removing brick from a Tier volume is not allowed"); + gf_log (this->name, GF_LOG_ERROR, "%s", err_str); + goto out; + } + ret = dict_get_int32 (dict, "replica-count", &replica_count); if (!ret) { gf_log (this->name, GF_LOG_INFO, diff --git a/xlators/mgmt/glusterd/src/glusterd-rebalance.c b/xlators/mgmt/glusterd/src/glusterd-rebalance.c index 84d9210a105..c14bcd156b4 100644 --- a/xlators/mgmt/glusterd/src/glusterd-rebalance.c +++ b/xlators/mgmt/glusterd/src/glusterd-rebalance.c @@ -421,6 +421,15 @@ glusterd_rebalance_cmd_validate (int cmd, char *volname, goto out; } + ret = glusterd_disallow_op_for_tier (*volinfo, GD_OP_REBALANCE, cmd); + if (ret) { + gf_log ("glusterd", GF_LOG_ERROR, "Received rebalance command " + "on Tier volume %s", volname); + snprintf (op_errstr, len, "Rebalance operations are not " + "supported on a tiered volume"); + goto out; + } + ret = 0; out: diff --git a/xlators/mgmt/glusterd/src/glusterd-replace-brick.c b/xlators/mgmt/glusterd/src/glusterd-replace-brick.c index 818b58a724f..cb9c67cc7dc 100644 --- a/xlators/mgmt/glusterd/src/glusterd-replace-brick.c +++ b/xlators/mgmt/glusterd/src/glusterd-replace-brick.c @@ -243,6 +243,14 @@ glusterd_op_stage_replace_brick (dict_t *dict, char **op_errstr, goto out; } + ret = glusterd_disallow_op_for_tier (volinfo, GD_OP_REPLACE_BRICK, -1); + if (ret) { + snprintf (msg, sizeof (msg), "Replace brick commands are not " + "supported on tiered volume %s", volname); + *op_errstr = gf_strdup (msg); + goto out; + } + if (!glusterd_store_is_valid_brickpath (volname, dst_brick) || !glusterd_is_valid_volfpath (volname, dst_brick)) { snprintf (msg, sizeof (msg), "brick path %s is too " diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 8209e779c52..431db7d8785 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -9404,3 +9404,68 @@ glusterd_list_add_order (struct cds_list_head *new, struct cds_list_head *head, cds_list_add_rcu (new, rcu_dereference (pos->prev)); } + + +int +glusterd_disallow_op_for_tier (glusterd_volinfo_t *volinfo, glusterd_op_t op, + int cmd) +{ + + xlator_t *this = NULL; + int ret = 0; + + this = THIS; + GF_VALIDATE_OR_GOTO (this->name, volinfo, out); + + if (volinfo->type != GF_CLUSTER_TYPE_TIER) + goto out; + + switch (op) { + case GD_OP_ADD_BRICK: + case GD_OP_REPLACE_BRICK: + ret = -1; + gf_log (this->name, GF_LOG_DEBUG, "Operation not " + "permitted on tiered volume %s", + volinfo->volname); + break; + case GD_OP_REBALANCE: + switch (cmd) { + case GF_DEFRAG_CMD_START_TIER: + case GF_DEFRAG_CMD_STATUS_TIER: + case GF_DEFRAG_CMD_START_DETACH_TIER: + case GF_DEFRAG_CMD_STOP_DETACH_TIER: + case GF_DEFRAG_CMD_STATUS: + ret = 0; + break; + default: + gf_log (this->name, GF_LOG_DEBUG, + "Rebalance Operation not permitted" + " on tiered volume %s", + volinfo->volname); + ret = -1; + break; + } + break; + case GD_OP_REMOVE_BRICK: + switch (cmd) { + case GF_OP_CMD_DETACH_COMMIT_FORCE: + case GF_OP_CMD_DETACH_COMMIT: + case GF_OP_CMD_DETACH_START: + case GF_DEFRAG_CMD_STOP_DETACH_TIER: + ret = 0; + break; + default: + gf_log (this->name, GF_LOG_DEBUG, + "Remove brick operation not " + "permitted on tiered volume %s", + volinfo->volname); + ret = -1; + break; + } + break; + default: + break; + } +out: + return ret; +} diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index fcfddd5bffa..8975e53f91b 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -650,4 +650,8 @@ void glusterd_list_add_order (struct cds_list_head *new, struct cds_list_head *head, int (*compare)(struct cds_list_head *, struct cds_list_head *)); +int +glusterd_disallow_op_for_tier (glusterd_volinfo_t *volinfo, glusterd_op_t op, + int cmd); + #endif |