diff options
author | shishir gowda <shishirng@gluster.com> | 2010-09-01 23:44:54 +0000 |
---|---|---|
committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-09-02 03:12:25 -0700 |
commit | 4c5e364c36baa92374eb0eac60dafb8da3786286 (patch) | |
tree | 6712d972370fc7c8b375628cc8b37defb0be4730 /cli | |
parent | 1d6e57d4a8bf4d69f724774d019f3cb7b4c0e1c3 (diff) |
Remove brick validation
Added checks for duplicate bricks in cli arguments, valid bricks
for the volume, valid volume name, and prevent removing of incorrect
pairs for replica.
Signed-off-by: shishir gowda <shishirng@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 1486 ()
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1486
Diffstat (limited to 'cli')
-rw-r--r-- | cli/src/cli-cmd-parser.c | 43 | ||||
-rw-r--r-- | cli/src/cli3_1-cops.c | 2 |
2 files changed, 44 insertions, 1 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index 48c4a4fd9..f43349416 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -439,6 +439,10 @@ cli_cmd_volume_remove_brick_parse (const char **words, int wordcount, int count = 0; char key[50]; int brick_count = 0, brick_index = 0; + int32_t tmp_index = 0; + int32_t j = 0; + char *tmp_brick = NULL; + char *tmp_brick1 = NULL; GF_ASSERT (words); GF_ASSERT (options); @@ -495,6 +499,25 @@ cli_cmd_volume_remove_brick_parse (const char **words, int wordcount, if (ret) goto out; + tmp_index = brick_index; + tmp_brick = GF_MALLOC(2048 * sizeof(*tmp_brick), gf_common_mt_char); + + if (!tmp_brick) { + gf_log ("",GF_LOG_ERROR,"cli_cmd_volume_remove_brick_parse: " + "Unable to get memory"); + ret = -1; + goto out; + } + + tmp_brick1 = GF_MALLOC(2048 * sizeof(*tmp_brick1), gf_common_mt_char); + + if (!tmp_brick1) { + gf_log ("",GF_LOG_ERROR,"cli_cmd_volume_remove_brick_parse: " + "Unable to get memory"); + ret = -1; + goto out; + } + while (brick_index < wordcount) { delimiter = strchr(words[brick_index], ':'); if (!delimiter || delimiter == words[brick_index] @@ -504,7 +527,20 @@ cli_cmd_volume_remove_brick_parse (const char **words, int wordcount, ret = -1; goto out; } - + j = tmp_index; + strcpy(tmp_brick, words[brick_index]); + while ( j < brick_index) { + strcpy(tmp_brick1, words[j]); + if (!(strcmp (tmp_brick, tmp_brick1))) { + gf_log("",GF_LOG_ERROR, "Duplicate bricks" + " found %s", words[brick_index]); + cli_out("Duplicate bricks found %s", + words[brick_index]); + ret = -1; + goto out; + } + j++; + } snprintf (key, 50, "brick%d", ++brick_count); ret = dict_set_str (dict, key, (char *)words[brick_index++]); @@ -526,6 +562,11 @@ out: dict_destroy (dict); } + if (tmp_brick) + GF_FREE (tmp_brick); + if (tmp_brick1) + GF_FREE (tmp_brick1); + return ret; } diff --git a/cli/src/cli3_1-cops.c b/cli/src/cli3_1-cops.c index 6971a242d..e4b41c4db 100644 --- a/cli/src/cli3_1-cops.c +++ b/cli/src/cli3_1-cops.c @@ -704,6 +704,8 @@ gf_cli3_1_remove_brick_cbk (struct rpc_req *req, struct iovec *iov, gf_log ("cli", GF_LOG_NORMAL, "Received resp to remove brick"); cli_out ("Remove Brick %s", (rsp.op_ret) ? "unsuccessful": "successful"); + if (rsp.op_ret && rsp.op_errstr) + cli_out ("%s", rsp.op_errstr); ret = rsp.op_ret; |