summaryrefslogtreecommitdiffstats
path: root/cli
diff options
context:
space:
mode:
Diffstat (limited to 'cli')
-rw-r--r--cli/src/cli-cmd-parser.c118
1 files changed, 96 insertions, 22 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c
index 3e331848d1b..2c1897550ec 100644
--- a/cli/src/cli-cmd-parser.c
+++ b/cli/src/cli-cmd-parser.c
@@ -158,6 +158,7 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
int ret = -1;
gf1_cluster_type type = GF_CLUSTER_TYPE_NONE;
int count = 1;
+ int sub_count = 1;
int brick_index = 0;
int i = 0;
char *trans_type = NULL;
@@ -204,19 +205,23 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
goto out;
}
-
- ret = dict_set_str (dict, "volname", volname);
- if (ret)
- goto out;
-
if (wordcount < 4) {
ret = -1;
goto out;
}
+
+ if (wordcount < 6) {
+ /* seems no options are given, go directly to the parse_brick */
+ brick_index = 3;
+ type = GF_CLUSTER_TYPE_NONE;
+ trans_type = gf_strdup ("tcp");
+ goto parse_bricks;
+ }
+
w = str_getunamb (words[3], opwords_cl);
if (!w) {
type = GF_CLUSTER_TYPE_NONE;
- brick_index = 3;
+ index = 3;
} else if ((strcmp (w, "replica")) == 0) {
type = GF_CLUSTER_TYPE_REPLICATE;
if (wordcount < 5) {
@@ -232,7 +237,7 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
ret = dict_set_int32 (dict, "replica-count", count);
if (ret)
goto out;
- brick_index = 5;
+ index = 5;
} else if ((strcmp (w, "stripe")) == 0) {
type = GF_CLUSTER_TYPE_STRIPE;
if (wordcount < 5) {
@@ -248,24 +253,78 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
ret = dict_set_int32 (dict, "stripe-count", count);
if (ret)
goto out;
- brick_index = 5;
- } else
+ index = 5;
+ } else {
GF_ASSERT (!"opword mismatch");
-
- ret = dict_set_int32 (dict, "type", type);
- if (ret)
+ ret = -1;
goto out;
+ }
- if (type)
- index = 5;
- else
- index = 3;
+ /* Ie, how many bricks together forms a subvolume of distribute */
+ sub_count = count;
+ /* reset the count value now */
+ count = 1;
+
+ /* It can be a 'stripe x replicate' (ie, RAID01) type of volume */
+ w = str_getunamb (words[5], opwords_cl);
+ if (w && ((strcmp (w, "replica")) == 0)) {
+ if (type == GF_CLUSTER_TYPE_REPLICATE) {
+ cli_out ("'replica' option is already given");
+ ret = -1;
+ goto out;
+ }
+ /* The previous one should have been 'stripe' option */
+ type = GF_CLUSTER_TYPE_STRIPE_REPLICATE;
- if (wordcount < (index + 1)) {
+ if (wordcount < 7) {
+ ret = -1;
+ goto out;
+ }
+ count = strtol (words[6], NULL, 0);
+ if (!count || (count < 2)) {
+ cli_out ("replica count should be greater than 1");
+ ret = -1;
+ goto out;
+ }
+
+ ret = dict_set_int32 (dict, "replica-count", count);
+ if (ret)
+ goto out;
+ index = 7;
+ } else if (w && ((strcmp (w, "stripe")) == 0)) {
+ if (type == GF_CLUSTER_TYPE_STRIPE) {
+ cli_out ("'stripe' option is already given");
+ ret = -1;
+ goto out;
+ }
+
+ /* The previous one should have been 'replica' option */
+ type = GF_CLUSTER_TYPE_STRIPE_REPLICATE;
+
+ if (wordcount < 7) {
+ ret = -1;
+ goto out;
+ }
+ count = strtol (words[6], NULL, 0);
+ if (!count || (count < 2)) {
+ cli_out ("stripe count should be greater than 1");
+ ret = -1;
+ goto out;
+ }
+ ret = dict_set_int32 (dict, "stripe-count", count);
+ if (ret)
+ goto out;
+ index = 7;
+ } else if (w) {
+ GF_ASSERT (!"opword mismatch");
ret = -1;
goto out;
}
+ sub_count *= count;
+
+ brick_index = index;
+
if (str_getunamb (words[index], opwords_tr)) {
brick_index = index+2;
if (wordcount < (index + 2)) {
@@ -290,10 +349,7 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
trans_type = gf_strdup ("tcp");
}
- ret = dict_set_dynstr (dict, "transport", trans_type);
- if (ret)
- goto out;
-
+parse_bricks:
ret = cli_cmd_bricks_parse (words, wordcount, brick_index, &bricks,
&brick_count);
if (ret)
@@ -307,17 +363,35 @@ cli_cmd_volume_create_parse (const char **words, int wordcount, dict_t **options
goto out;
}
- if (brick_count % count) {
+ if (brick_count % sub_count) {
if (type == GF_CLUSTER_TYPE_STRIPE)
cli_out ("number of bricks is not a multiple of "
"stripe count");
else if (type == GF_CLUSTER_TYPE_REPLICATE)
cli_out ("number of bricks is not a multiple of "
"replica count");
+ else
+ cli_out ("number of bricks given doesn't match "
+ "required count");
+
ret = -1;
goto out;
}
+ /* Everything if parsed fine. start setting info in dict */
+ ret = dict_set_str (dict, "volname", volname);
+ if (ret)
+ goto out;
+
+ ret = dict_set_int32 (dict, "type", type);
+ if (ret)
+ goto out;
+
+ ret = dict_set_dynstr (dict, "transport", trans_type);
+ if (ret)
+ goto out;
+
+
ret = dict_set_dynstr (dict, "bricks", bricks);
if (ret)
goto out;