From 4c5e364c36baa92374eb0eac60dafb8da3786286 Mon Sep 17 00:00:00 2001 From: shishir gowda Date: Wed, 1 Sep 2010 23:44:54 +0000 Subject: 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 Signed-off-by: Vijay Bellur BUG: 1486 () URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1486 --- cli/src/cli-cmd-parser.c | 43 ++++++++++++++++++++++++++++++++++++++++++- cli/src/cli3_1-cops.c | 2 ++ 2 files changed, 44 insertions(+), 1 deletion(-) (limited to 'cli') diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index 48c4a4fd9ef..f43349416be 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 6971a242d91..e4b41c4db3a 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; -- cgit