summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPranith K <pranithk@gluster.com>2010-12-16 01:24:33 +0000
committerAnand V. Avati <avati@dev.gluster.com>2010-12-27 20:50:55 -0800
commit953f89d82f2c444719ba3150c9890c072a2e7fb3 (patch)
treeb5756f8638ae9b93cf77a141d08184ecb94928a5
parente7512cbb171856a925b7db938da423b493339b00 (diff)
glusterd,cli: print single error message on failure
Signed-off-by: Pranith Kumar K <pranithk@gluster.com> Signed-off-by: Anand V. Avati <avati@dev.gluster.com> BUG: 1922 (Volume not present wrong message displayed on command line) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1922
-rw-r--r--cli/src/cli-cmd-peer.c36
-rw-r--r--cli/src/cli-cmd-volume.c211
-rw-r--r--cli/src/cli-cmd.c35
-rw-r--r--cli/src/cli-cmd.h1
-rw-r--r--cli/src/cli3_1-cops.c104
-rw-r--r--libglusterfs/src/xlator.c12
-rw-r--r--rpc/xdr/src/cli1-xdr.c4
-rw-r--r--rpc/xdr/src/cli1-xdr.h1
-rw-r--r--rpc/xdr/src/cli1.x1
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-handler.c13
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-op-sm.c289
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-volgen.c8
-rw-r--r--xlators/mgmt/glusterd/src/glusterd.h1
-rw-r--r--xlators/protocol/server/src/server.c14
14 files changed, 505 insertions, 225 deletions
diff --git a/cli/src/cli-cmd-peer.c b/cli/src/cli-cmd-peer.c
index dc361f539b6..ca89592d613 100644
--- a/cli/src/cli-cmd-peer.c
+++ b/cli/src/cli-cmd-peer.c
@@ -48,9 +48,12 @@ cli_cmd_peer_probe_cbk (struct cli_state *state, struct cli_cmd_word *word,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
dict_t *dict = NULL;
+ int sent = 0;
+ int parse_error = 0;
if (!(wordcount == 3)) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -79,8 +82,11 @@ cli_cmd_peer_probe_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (ret)
- cli_out ("Probe failed");
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Peer probe failed");
+ }
return ret;
}
@@ -93,9 +99,12 @@ cli_cmd_peer_deprobe_cbk (struct cli_state *state, struct cli_cmd_word *word,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
dict_t *dict = NULL;
+ int sent = 0;
+ int parse_error = 0;
if (!(wordcount == 3) ) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -122,6 +131,12 @@ cli_cmd_peer_deprobe_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Peer detach failed");
+ }
+
return ret;
}
@@ -132,9 +147,12 @@ cli_cmd_peer_status_cbk (struct cli_state *state, struct cli_cmd_word *word,
int ret = -1;
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
+ int sent = 0;
+ int parse_error = 0;
if (wordcount != 2) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -149,8 +167,11 @@ cli_cmd_peer_status_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (ret)
- cli_out ("Command Execution failed");
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Peer status failed");
+ }
return ret;
}
@@ -166,11 +187,10 @@ struct cli_cmd cli_probe_cmds[] = {
{ "peer status",
cli_cmd_peer_status_cbk,
"list status of peers"},
-
- { "peer help",
- cli_cmd_peer_help_cbk,
- "Help command for peer "},
+ { "peer help",
+ cli_cmd_peer_help_cbk,
+ "Help command for peer "},
{ NULL, NULL, NULL }
};
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c
index 3f671a63a62..0b6e2dd3680 100644
--- a/cli/src/cli-cmd-volume.c
+++ b/cli/src/cli-cmd-volume.c
@@ -50,6 +50,8 @@ cli_cmd_volume_info_cbk (struct cli_state *state, struct cli_cmd_word *word,
call_frame_t *frame = NULL;
cli_cmd_volume_get_ctx_t ctx = {0,};
cli_local_t *local = NULL;
+ int sent = 0;
+ int parse_error = 0;
proc = &cli_rpc_prog->proctable[GF1_CLI_GET_VOLUME];
@@ -71,6 +73,7 @@ cli_cmd_volume_info_cbk (struct cli_state *state, struct cli_cmd_word *word,
proc = &cli_rpc_prog->proctable[GF1_CLI_GET_VOLUME];
} else {
cli_usage_out (word->pattern);
+ parse_error = 1;
return -1;
}
@@ -90,8 +93,12 @@ cli_cmd_volume_info_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (ret)
- cli_out ("Getting Volume information failed!");
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Getting Volume information failed!");
+ }
+
return ret;
}
@@ -104,10 +111,13 @@ cli_cmd_sync_volume_cbk (struct cli_state *state, struct cli_cmd_word *word,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
gf1_cli_sync_volume_req req = {0,};
+ int sent = 0;
+ int parse_error = 0;
if ((wordcount < 3) || (wordcount > 4)) {
- cli_usage_out (word->pattern);
- goto out;
+ cli_usage_out (word->pattern);
+ parse_error = 1;
+ goto out;
}
if ((wordcount == 3) || !strcmp(words[3], "all")) {
@@ -130,8 +140,11 @@ cli_cmd_sync_volume_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (ret)
- cli_out ("Volume sync failed");
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume sync failed");
+ }
return ret;
}
@@ -144,6 +157,8 @@ cli_cmd_volume_create_cbk (struct cli_state *state, struct cli_cmd_word *word,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
dict_t *options = NULL;
+ int sent = 0;
+ int parse_error = 0;
proc = &cli_rpc_prog->proctable[GF1_CLI_CREATE_VOLUME];
@@ -155,6 +170,7 @@ cli_cmd_volume_create_cbk (struct cli_state *state, struct cli_cmd_word *word,
if (ret) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -165,6 +181,11 @@ cli_cmd_volume_create_cbk (struct cli_state *state, struct cli_cmd_word *word,
out:
if (options)
dict_unref (options);
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume create failed");
+ }
return ret;
}
@@ -179,9 +200,12 @@ cli_cmd_volume_delete_cbk (struct cli_state *state, struct cli_cmd_word *word,
call_frame_t *frame = NULL;
char *volname = NULL;
gf_answer_t answer = GF_ANSWER_NO;
- const char *question = "Deleting volume will erase all information about the volume."
- "Do you want to continue?";
+ const char *question = NULL;
+ int sent = 0;
+ int parse_error = 0;
+ question = "Deleting volume will erase all information about the volume."
+ "Do you want to continue?";
proc = &cli_rpc_prog->proctable[GF1_CLI_DELETE_VOLUME];
frame = create_frame (THIS, THIS->ctx->pool);
@@ -190,6 +214,7 @@ cli_cmd_volume_delete_cbk (struct cli_state *state, struct cli_cmd_word *word,
if (wordcount != 3) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -207,8 +232,11 @@ cli_cmd_volume_delete_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (ret && volname)
- cli_out ("Deleting Volume %s failed", volname);
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume delete failed");
+ }
return ret;
}
@@ -221,6 +249,8 @@ cli_cmd_volume_start_cbk (struct cli_state *state, struct cli_cmd_word *word,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
gf1_cli_start_vol_req req = {0,};
+ int sent = 0;
+ int parse_error = 0;
frame = create_frame (THIS, THIS->ctx->pool);
if (!frame)
@@ -228,6 +258,7 @@ cli_cmd_volume_start_cbk (struct cli_state *state, struct cli_cmd_word *word,
if (wordcount < 3 || wordcount > 4) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -241,6 +272,7 @@ cli_cmd_volume_start_cbk (struct cli_state *state, struct cli_cmd_word *word,
} else {
ret = -1;
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
}
@@ -252,8 +284,11 @@ cli_cmd_volume_start_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (!proc && ret && req.volname)
- cli_out ("Starting Volume %s failed", req.volname);
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume start failed");
+ }
return ret;
}
@@ -307,6 +342,8 @@ cli_cmd_volume_stop_cbk (struct cli_state *state, struct cli_cmd_word *word,
int flags = 0;
gf1_cli_stop_vol_req req = {0,};
gf_answer_t answer = GF_ANSWER_NO;
+ int sent = 0;
+ int parse_error = 0;
const char *question = "Stopping volume will make its data inaccessible. "
"Do you want to Continue?";
@@ -316,8 +353,9 @@ cli_cmd_volume_stop_cbk (struct cli_state *state, struct cli_cmd_word *word,
goto out;
if (wordcount < 3 || wordcount > 4) {
- cli_usage_out (word->pattern);
- goto out;
+ cli_usage_out (word->pattern);
+ parse_error = 1;
+ goto out;
}
req.volname = (char *)words[2];
@@ -330,6 +368,7 @@ cli_cmd_volume_stop_cbk (struct cli_state *state, struct cli_cmd_word *word,
} else {
ret = -1;
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
}
@@ -349,8 +388,11 @@ cli_cmd_volume_stop_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (!proc && ret && req.volname)
- cli_out ("Stopping Volume %s failed", req.volname);
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume stop failed", req.volname);
+ }
return ret;
}
@@ -364,6 +406,8 @@ cli_cmd_volume_rename_cbk (struct cli_state *state, struct cli_cmd_word *word,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
dict_t *dict = NULL;
+ int sent = 0;
+ int parse_error = 0;
frame = create_frame (THIS, THIS->ctx->pool);
@@ -376,6 +420,7 @@ cli_cmd_volume_rename_cbk (struct cli_state *state, struct cli_cmd_word *word,
if (wordcount != 4) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -396,11 +441,13 @@ cli_cmd_volume_rename_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (!proc && ret) {
- if (dict)
- dict_destroy (dict);
- if (wordcount > 2)
- cli_out ("Renaming Volume %s failed", (char *)words[2]);
+ if (dict)
+ dict_destroy (dict);
+
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume rename failed", (char *)words[2]);
}
return ret;
@@ -414,6 +461,8 @@ cli_cmd_volume_defrag_cbk (struct cli_state *state, struct cli_cmd_word *word,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
dict_t *dict = NULL;
+ int sent = 0;
+ int parse_error = 0;
frame = create_frame (THIS, THIS->ctx->pool);
if (!frame)
@@ -425,6 +474,7 @@ cli_cmd_volume_defrag_cbk (struct cli_state *state, struct cli_cmd_word *word,
if (wordcount != 4) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -443,22 +493,24 @@ cli_cmd_volume_defrag_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (!proc && ret) {
- if (dict)
- dict_destroy (dict);
+ if (dict)
+ dict_destroy (dict);
- if (wordcount > 2)
- cli_out ("Rebalance of Volume %s failed",
- (char *)words[2]);
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume rebalance failed");
}
- return 0;
+ return ret;
}
int
-cli_cmd_volume_reset_cbk (struct cli_state *state, struct cli_cmd_word *word,
+cli_cmd_volume_reset_cbk (struct cli_state *state, struct cli_cmd_word *word,
const char **words, int wordcount)
{
+ int sent = 0;
+ int parse_error = 0;
int ret = -1;
rpc_clnt_procedure_t *proc = NULL;
@@ -475,6 +527,7 @@ cli_cmd_volume_reset_cbk (struct cli_state *state, struct cli_cmd_word *word,
if (ret) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -483,9 +536,15 @@ cli_cmd_volume_reset_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (options)
+ if (options)
dict_unref (options);
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume reset failed");
+ }
+
return ret;
}
@@ -495,6 +554,8 @@ int
cli_cmd_volume_set_cbk (struct cli_state *state, struct cli_cmd_word *word,
const char **words, int wordcount)
{
+ int sent = 0;
+ int parse_error = 0;
int ret = -1;
rpc_clnt_procedure_t *proc = NULL;
@@ -511,6 +572,7 @@ cli_cmd_volume_set_cbk (struct cli_state *state, struct cli_cmd_word *word,
if (ret) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -522,6 +584,12 @@ out:
if (options)
dict_unref (options);
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume set failed");
+ }
+
return ret;
}
@@ -535,6 +603,8 @@ cli_cmd_volume_add_brick_cbk (struct cli_state *state,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
dict_t *options = NULL;
+ int sent = 0;
+ int parse_error = 0;
frame = create_frame (THIS, THIS->ctx->pool);
if (!frame)
@@ -544,6 +614,7 @@ cli_cmd_volume_add_brick_cbk (struct cli_state *state,
if (ret) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -554,14 +625,15 @@ cli_cmd_volume_add_brick_cbk (struct cli_state *state,
}
out:
- if (!proc && ret) {
- if (wordcount > 2) {
- char *volname = (char *) words[2];
- cli_out ("Adding brick to Volume %s failed",volname );
- }
- }
if (options)
dict_unref (options);
+
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume add-brick failed");
+ }
+
return ret;
}
@@ -576,6 +648,8 @@ cli_cmd_volume_remove_brick_cbk (struct cli_state *state,
call_frame_t *frame = NULL;
dict_t *options = NULL;
gf_answer_t answer = GF_ANSWER_NO;
+ int sent = 0;
+ int parse_error = 0;
const char *question = "Removing brick(s) can result in data loss. "
"Do you want to Continue?";
@@ -588,6 +662,7 @@ cli_cmd_volume_remove_brick_cbk (struct cli_state *state,
if (ret) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -605,12 +680,12 @@ cli_cmd_volume_remove_brick_cbk (struct cli_state *state,
}
out:
- if (!proc && ret) {
- if (wordcount > 2) {
- char *volname = (char *) words[2];
- cli_out ("Removing brick from Volume %s failed",volname );
- }
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume remove-brick failed");
}
+
if (options)
dict_unref (options);
return ret;
@@ -627,6 +702,8 @@ cli_cmd_volume_replace_brick_cbk (struct cli_state *state,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
dict_t *options = NULL;
+ int sent = 0;
+ int parse_error = 0;
proc = &cli_rpc_prog->proctable[GF1_CLI_REPLACE_BRICK];
@@ -638,6 +715,7 @@ cli_cmd_volume_replace_brick_cbk (struct cli_state *state,
if (ret) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -646,14 +724,16 @@ cli_cmd_volume_replace_brick_cbk (struct cli_state *state,
}
out:
+ if (options)
+ dict_unref (options);
+
if (ret) {
- if (wordcount > 2) {
- char *volname = (char *) words[2];
- cli_out ("Replacing brick from Volume %s failed",volname );
- }
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume replace-brick failed");
}
- return ret;
+ return ret;
}
@@ -674,9 +754,12 @@ cli_cmd_log_filename_cbk (struct cli_state *state, struct cli_cmd_word *word,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
dict_t *options = NULL;
+ int sent = 0;
+ int parse_error = 0;
if (!((wordcount == 5) || (wordcount == 6))) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -695,12 +778,15 @@ cli_cmd_log_filename_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (ret)
- cli_out ("setting log filename failed");
-
if (options)
dict_destroy (options);
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume log filename failed");
+ }
+
return ret;
}
@@ -713,9 +799,12 @@ cli_cmd_log_locate_cbk (struct cli_state *state, struct cli_cmd_word *word,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
dict_t *options = NULL;
+ int sent = 0;
+ int parse_error = 0;
if (!((wordcount == 4) || (wordcount == 5))) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -734,12 +823,14 @@ cli_cmd_log_locate_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (ret)
- cli_out ("getting log file location information failed");
-
if (options)
dict_destroy (options);
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("getting log file location information failed");
+ }
return ret;
}
@@ -752,9 +843,12 @@ cli_cmd_log_rotate_cbk (struct cli_state *state, struct cli_cmd_word *word,
rpc_clnt_procedure_t *proc = NULL;
call_frame_t *frame = NULL;
dict_t *options = NULL;
+ int sent = 0;
+ int parse_error = 0;
if (!((wordcount == 4) || (wordcount == 5))) {
cli_usage_out (word->pattern);
+ parse_error = 1;
goto out;
}
@@ -773,12 +867,15 @@ cli_cmd_log_rotate_cbk (struct cli_state *state, struct cli_cmd_word *word,
}
out:
- if (ret)
- cli_out ("log rotate failed");
-
if (options)
dict_destroy (options);
+ if (ret) {
+ cli_cmd_sent_status_get (&sent);
+ if ((sent == 0) && (parse_error == 0))
+ cli_out ("Volume log rotate failed");
+ }
+
return ret;
}
@@ -851,10 +948,10 @@ struct cli_cmd volume_cmds[] = {
{ "volume sync <HOSTNAME> [all|<VOLNAME>]",
cli_cmd_sync_volume_cbk,
"sync the volume information from a peer"},
-
+
{ "volume reset <VOLNAME> ",
cli_cmd_volume_reset_cbk,
- "reset all the reconfigured options"},
+ "reset all the reconfigured options"},
{ NULL, NULL, NULL }
};
diff --git a/cli/src/cli-cmd.c b/cli/src/cli-cmd.c
index f09c6210634..2b9aea191df 100644
--- a/cli/src/cli-cmd.c
+++ b/cli/src/cli-cmd.c
@@ -60,6 +60,38 @@ cli_cmd_needs_connection (struct cli_cmd_word *word)
}
int
+cli_cmd_status_reset (void)
+{
+ int ret = 0;
+
+ ret = cli_cmd_lock ();
+ {
+ if (ret == 0) {
+ cmd_sent = 0;
+ cmd_done = 0;
+ }
+ }
+ ret = cli_cmd_unlock ();
+ return ret;
+
+}
+
+int
+cli_cmd_sent_status_get (int *status)
+{
+ int ret = 0;
+ GF_ASSERT (status);
+
+ ret = cli_cmd_lock ();
+ {
+ if (ret == 0)
+ *status = cmd_sent;
+ }
+ ret = cli_cmd_unlock ();
+ return ret;
+}
+
+int
cli_cmd_process (struct cli_state *state, int argc, char **argv)
{
int ret = 0;
@@ -112,11 +144,10 @@ cli_cmd_process (struct cli_state *state, int argc, char **argv)
callback:
ret = word->cbkfn (state, word, (const char **)argv, argc);
-
+ (void) cli_cmd_status_reset ();
return ret;
}
-
int
cli_cmd_input_token_count (const char *text)
{
diff --git a/cli/src/cli-cmd.h b/cli/src/cli-cmd.h
index 1655c3a3135..4daf7fae39f 100644
--- a/cli/src/cli-cmd.h
+++ b/cli/src/cli-cmd.h
@@ -76,4 +76,5 @@ cli_cmd_submit (void *req, call_frame_t *frame,
gf_answer_t
cli_cmd_get_confirmation (struct cli_state *state, const char *question);
+int cli_cmd_sent_status_get (int *status);
#endif /* __CLI_CMD_H__ */
diff --git a/cli/src/cli3_1-cops.c b/cli/src/cli3_1-cops.c
index ba780e993d0..3003469cb8e 100644
--- a/cli/src/cli3_1-cops.c
+++ b/cli/src/cli3_1-cops.c
@@ -133,11 +133,10 @@ gf_cli3_1_probe_cbk (struct rpc_req *req, struct iovec *iov,
break;
default:
- cli_out ("Probe returned with unknown errno %d",
- rsp.op_errno);
+ cli_out ("Probe unsuccessful\nProbe returned "
+ "with unknown errno %d", rsp.op_errno);
break;
}
- cli_out ("Probe unsuccessful");
gf_log ("glusterd",GF_LOG_ERROR,"Probe failed with op_ret %d"
" and op_errno %d", rsp.op_ret, rsp.op_errno);
}
@@ -183,11 +182,11 @@ gf_cli3_1_deprobe_cbk (struct rpc_req *req, struct iovec *iov,
"cluster", rsp.hostname);
break;
default:
- cli_out ("Detach returned with unknown errno %d",
+ cli_out ("Detach unsuccessful\nDetach returned "
+ "with unknown errno %d",
rsp.op_errno);
break;
}
- cli_out ("Detach unsuccessful");
gf_log ("glusterd",GF_LOG_ERROR,"Detach failed with op_ret %d"
" and op_errno %d", rsp.op_ret, rsp.op_errno);
} else {
@@ -606,13 +605,13 @@ gf_cli3_1_create_volume_cbk (struct rpc_req *req, struct iovec *iov,
ret = dict_get_str (dict, "volname", &volname);
gf_log ("cli", GF_LOG_NORMAL, "Received resp to create volume");
- cli_out ("Creation of volume %s has been %s", volname,
- (rsp.op_ret) ? "unsuccessful":
- "successful. Please start the volume to "
- "access data.");
- if (rsp.op_ret && rsp.op_errstr)
- cli_out ("%s", rsp.op_errstr);
-
+ if (rsp.op_ret && strcmp (rsp.op_errstr, ""))
+ cli_out ("%s", rsp.op_errstr);
+ else
+ cli_out ("Creation of volume %s has been %s", volname,
+ (rsp.op_ret) ? "unsuccessful":
+ "successful. Please start the volume to "
+ "access data.");
ret = rsp.op_ret;
out:
@@ -657,9 +656,12 @@ gf_cli3_1_delete_volume_cbk (struct rpc_req *req, struct iovec *iov,
gf_log ("cli", GF_LOG_NORMAL, "Received resp to delete volume");
- cli_out ("Deleting volume %s has been %s", volname,
- (rsp.op_ret) ? "unsuccessful": "successful");
+ if (rsp.op_ret && strcmp (rsp.op_errstr, ""))
+ cli_out (rsp.op_errstr);
+ else
+ cli_out ("Deleting volume %s has been %s", volname,
+ (rsp.op_ret) ? "unsuccessful": "successful");
ret = rsp.op_ret;
out:
@@ -702,11 +704,12 @@ gf_cli3_1_start_volume_cbk (struct rpc_req *req, struct iovec *iov,
volname = local->u.start_vol.volname;
gf_log ("cli", GF_LOG_NORMAL, "Received resp to start volume");
- cli_out ("Starting volume %s has been %s", volname,
- (rsp.op_ret) ? "unsuccessful": "successful");
- if (rsp.op_ret && rsp.op_errstr)
+ if (rsp.op_ret && strcmp (rsp.op_errstr, ""))
cli_out ("%s", rsp.op_errstr);
+ else
+ cli_out ("Starting volume %s has been %s", volname,
+ (rsp.op_ret) ? "unsuccessful": "successful");
ret = rsp.op_ret;
@@ -750,12 +753,12 @@ gf_cli3_1_stop_volume_cbk (struct rpc_req *req, struct iovec *iov,
volname = local->u.start_vol.volname;
gf_log ("cli", GF_LOG_NORMAL, "Received resp to stop volume");
- cli_out ("Stopping volume %s has been %s", volname,
- (rsp.op_ret) ? "unsuccessful": "successful");
-
- if (rsp.op_ret && rsp.op_errstr)
- cli_out ("%s", rsp.op_errstr);
+ if (rsp.op_ret && strcmp (rsp.op_errstr, ""))
+ cli_out (rsp.op_errstr);
+ else
+ cli_out ("Stopping volume %s has been %s", volname,
+ (rsp.op_ret) ? "unsuccessful": "successful");
ret = rsp.op_ret;
out:
@@ -901,11 +904,12 @@ gf_cli3_1_reset_volume_cbk (struct rpc_req *req, struct iovec *iov,
}
gf_log ("cli", GF_LOG_NORMAL, "Received resp to reset");
- cli_out ("reset volume %s", (rsp.op_ret) ? "unsuccessful":
- "successful");
- if (rsp.op_ret && rsp.op_errstr)
+ if (rsp.op_ret && strcmp (rsp.op_errstr, ""))
cli_out ("%s", rsp.op_errstr);
+ else
+ cli_out ("reset volume %s", (rsp.op_ret) ? "unsuccessful":
+ "successful");
ret = rsp.op_ret;
@@ -917,7 +921,7 @@ out:
void
_cli_out_options (dict_t *this, char *key, data_t *value, void *count)
{
-
+
(*((int *) count))++;
cli_out ("%s - %s", key, value->data);
}
@@ -940,7 +944,7 @@ gf_cli3_1_set_volume_cbk (struct rpc_req *req, struct iovec *iov,
gf_log ("", GF_LOG_ERROR, "error");
goto out;
}
-
+
if (rsp.op_ret == 1) { // if the command was volume set <vol> history
if (!rsp.dict.dict_len) {
@@ -975,11 +979,12 @@ gf_cli3_1_set_volume_cbk (struct rpc_req *req, struct iovec *iov,
gf_log ("cli", GF_LOG_NORMAL, "Received resp to set");
- cli_out ("Set volume %s", (rsp.op_ret) ? "unsuccessful":
- "successful");
-
- if (rsp.op_ret && rsp.op_errstr)
+
+ if (rsp.op_ret && strcmp (rsp.op_errstr, ""))
cli_out ("%s", rsp.op_errstr);
+ else
+ cli_out ("Set volume %s", (rsp.op_ret) ? "unsuccessful":
+ "successful");
ret = rsp.op_ret;
@@ -1007,11 +1012,12 @@ gf_cli3_1_add_brick_cbk (struct rpc_req *req, struct iovec *iov,
gf_log ("cli", GF_LOG_NORMAL, "Received resp to add brick");
- cli_out ("Add Brick %s", (rsp.op_ret) ? "unsuccessful":
- "successful");
- if (rsp.op_ret && rsp.op_errstr)
+ if (rsp.op_ret && strcmp (rsp.op_errstr, ""))
cli_out ("%s", rsp.op_errstr);
+ else
+ cli_out ("Add Brick %s", (rsp.op_ret) ? "unsuccessful":
+ "successful");
ret = rsp.op_ret;
out:
@@ -1042,10 +1048,12 @@ 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)
+
+ if (rsp.op_ret && strcmp (rsp.op_errstr, ""))
cli_out ("%s", rsp.op_errstr);
+ else
+ cli_out ("Remove Brick %s", (rsp.op_ret) ? "unsuccessful":
+ "successful");
ret = rsp.op_ret;
@@ -1199,8 +1207,12 @@ gf_cli3_1_log_filename_cbk (struct rpc_req *req, struct iovec *iov,
}
gf_log ("cli", GF_LOG_DEBUG, "Received resp to log filename");
- cli_out ("log filename : %s",
- (rsp.op_ret) ? "unsuccessful": "successful");
+
+ if (rsp.op_ret && strcmp (rsp.errstr, ""))
+ cli_out (rsp.errstr);
+ else
+ cli_out ("log filename : %s",
+ (rsp.op_ret) ? "unsuccessful": "successful");
ret = rsp.op_ret;
@@ -1254,7 +1266,12 @@ gf_cli3_1_log_rotate_cbk (struct rpc_req *req, struct iovec *iov,
}
gf_log ("cli", GF_LOG_DEBUG, "Received resp to log rotate");
- cli_out ("log rotate %s", (rsp.op_ret) ? "unsuccessful": "successful");
+
+ if (rsp.op_ret && strcmp (rsp.errstr, ""))
+ cli_out (rsp.errstr);
+ else
+ cli_out ("log rotate %s", (rsp.op_ret) ? "unsuccessful":
+ "successful");
ret = rsp.op_ret;
@@ -1281,11 +1298,12 @@ gf_cli3_1_sync_volume_cbk (struct rpc_req *req, struct iovec *iov,
}
gf_log ("cli", GF_LOG_DEBUG, "Received resp to sync");
- cli_out ("volume sync: %s",
- (rsp.op_ret) ? "unsuccessful": "successful");
- if (rsp.op_ret && rsp.op_errstr)
+ if (rsp.op_ret && strcmp (rsp.op_errstr, ""))
cli_out (rsp.op_errstr);
+ else
+ cli_out ("volume sync: %s",
+ (rsp.op_ret) ? "unsuccessful": "successful");
ret = rsp.op_ret;
out:
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c
index dcdf40f7120..67ee3287402 100644
--- a/libglusterfs/src/xlator.c
+++ b/libglusterfs/src/xlator.c
@@ -993,7 +993,7 @@ int
xlator_validate_rec (xlator_t *xlator, char **op_errstr)
{
xlator_list_t *trav = NULL;
-
+
if (xlator == NULL ) {
gf_log ("xlator", GF_LOG_DEBUG, "invalid argument");
return -1;
@@ -1007,27 +1007,27 @@ xlator_validate_rec (xlator_t *xlator, char **op_errstr)
trav = trav->next;
}
-
+
if (xlator_dynload (xlator))
gf_log ("", GF_LOG_DEBUG, "Did not load the symbols");
if (xlator->validate_options) {
- if (xlator->validate_options (xlator, xlator->options,
+ if (xlator->validate_options (xlator, xlator->options,
op_errstr)) {
gf_log ("", GF_LOG_DEBUG, *op_errstr);
return -1;
}
gf_log (xlator->name, GF_LOG_DEBUG, "Validated option");
-
+
}
-
+
gf_log (xlator->name, GF_LOG_DEBUG, "No validate_options() found");
return 0;
}
int
-graph_reconf_validateopt (glusterfs_graph_t *graph,
+graph_reconf_validateopt (glusterfs_graph_t *graph,
char **op_errstr)
{
xlator_t *xlator = NULL;
diff --git a/rpc/xdr/src/cli1-xdr.c b/rpc/xdr/src/cli1-xdr.c
index aff0edc3555..084aa8b7b21 100644
--- a/rpc/xdr/src/cli1-xdr.c
+++ b/rpc/xdr/src/cli1-xdr.c
@@ -94,7 +94,7 @@ xdr_gf1_cli_probe_req (XDR *xdrs, gf1_cli_probe_req *objp)
bool_t
xdr_gf1_cli_probe_rsp (XDR *xdrs, gf1_cli_probe_rsp *objp)
{
- register int32_t *buf;
+ register int32_t *buf;
if (xdrs->x_op == XDR_ENCODE) {
@@ -267,6 +267,8 @@ xdr_gf1_cli_delete_vol_rsp (XDR *xdrs, gf1_cli_delete_vol_rsp *objp)
return FALSE;
if (!xdr_string (xdrs, &objp->volname, ~0))
return FALSE;
+ if (!xdr_string (xdrs, &objp->op_errstr, ~0))
+ return FALSE;
return TRUE;
}
diff --git a/rpc/xdr/src/cli1-xdr.h b/rpc/xdr/src/cli1-xdr.h
index 5611f283d2d..c2ccb3237f2 100644
--- a/rpc/xdr/src/cli1-xdr.h
+++ b/rpc/xdr/src/cli1-xdr.h
@@ -167,6 +167,7 @@ struct gf1_cli_delete_vol_rsp {
int op_ret;
int op_errno;
char *volname;
+ char *op_errstr;
};
typedef struct gf1_cli_delete_vol_rsp gf1_cli_delete_vol_rsp;
diff --git a/rpc/xdr/src/cli1.x b/rpc/xdr/src/cli1.x
index 6c9f70dffbc..4a0bd7163ae 100644
--- a/rpc/xdr/src/cli1.x
+++ b/rpc/xdr/src/cli1.x
@@ -99,6 +99,7 @@ struct gf1_cli_get_vol_rsp {
int op_ret;
int op_errno;
string volname<>;
+ string op_errstr<>;
} ;
struct gf1_cli_start_vol_req {
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c
index ab0a6831f5f..42b0efcd539 100644
--- a/xlators/mgmt/glusterd/src/glusterd-handler.c
+++ b/xlators/mgmt/glusterd/src/glusterd-handler.c
@@ -133,7 +133,6 @@ glusterd_handle_friend_req (rpcsvc_request_t *req, uuid_t uuid,
event->ctx = ctx;
ret = glusterd_friend_sm_inject_event (event);
-
if (ret) {
gf_log ("glusterd", GF_LOG_ERROR, "Unable to inject event %d, "
"ret = %d", event->event, ret);
@@ -810,8 +809,7 @@ glusterd_handle_create_volume (rpcsvc_request_t *req)
gf_cmd_log ("Volume create", "on volname: %s attempted", volname);
if ((ret = glusterd_check_volume_exists (volname))) {
- snprintf(err_str, 2048, "Volname %s already exists",
- volname);
+ snprintf(err_str, 2048, "Volume %s already exists", volname);
gf_log ("glusterd", GF_LOG_ERROR, "%s", err_str);
err_ret = 1;
goto out;
@@ -1074,8 +1072,7 @@ glusterd_handle_add_brick (rpcsvc_request_t *req)
}
if (!(ret = glusterd_check_volume_exists (volname))) {
- snprintf(err_str, 2048, "Volname %s does not exist",
- volname);
+ snprintf(err_str, 2048, "Volume %s does not exist", volname);
gf_log ("glusterd", GF_LOG_ERROR, "%s", err_str);
err_ret = -1;
goto out;
@@ -1338,7 +1335,7 @@ glusterd_handle_reset_volume (rpcsvc_request_t *req)
ret = glusterd_reset_volume (req, dict);
out:
- if (cli_req.volname)
+ if (cli_req.volname)
free (cli_req.volname);//malloced by xdr
return ret;
@@ -1454,7 +1451,7 @@ glusterd_handle_remove_brick (rpcsvc_request_t *req)
ret = glusterd_volinfo_find (cli_req.volname, &volinfo);
if (ret) {
- snprintf (err_str, 2048, "volname %s not found",
+ snprintf (err_str, 2048, "Volume %s does not exist",
cli_req.volname);
gf_log ("", GF_LOG_ERROR, "%s", err_str);
err_ret = 1;
@@ -1514,7 +1511,7 @@ glusterd_handle_remove_brick (rpcsvc_request_t *req)
ret = glusterd_volume_brickinfo_get_by_brick(brick, volinfo, &brickinfo);
if (ret) {
- snprintf(err_str, 2048," Incorrect brick %s for volname"
+ snprintf(err_str, 2048," Incorrect brick %s for volume"
" %s", brick, cli_req.volname);
gf_log ("", GF_LOG_ERROR, "%s", err_str);
err_ret = 1;
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
index b2f247a0672..f0336c7b1ea 100644
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
@@ -332,6 +332,7 @@ glusterd_op_stage_create_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
char cmd_str[1024];
xlator_t *this = NULL;
glusterd_conf_t *priv = NULL;
+ char msg[2048] = {0};
GF_ASSERT (req);
@@ -370,9 +371,12 @@ glusterd_op_stage_create_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
exists = glusterd_check_volume_exists (volname);
if (exists) {
- gf_log ("", GF_LOG_ERROR, "Volume with name: %s exists",
- volname);
+ snprintf (msg, sizeof (msg), "Volume %s already exists",
+ volname);
+ gf_log ("", GF_LOG_ERROR, msg);
+ *op_errstr = gf_strdup (msg);
ret = -1;
+ goto out;
} else {
ret = 0;
}
@@ -504,7 +508,7 @@ glusterd_op_stage_start_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
exists = glusterd_check_volume_exists (volname);
if (!exists) {
- snprintf (msg, 2048, "Volume with name %s does not exist", volname);
+ snprintf (msg, 2048, "Volume %s does not exist", volname);
gf_log ("", GF_LOG_ERROR, "%s",
msg);
*op_errstr = gf_strdup (msg);
@@ -521,9 +525,9 @@ glusterd_op_stage_start_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) {
ret = glusterd_resolve_brick (brickinfo);
if (ret) {
- gf_log ("", GF_LOG_ERROR, "Unable to resolve brick"
- " with hostname: %s, export: %s",
- brickinfo->hostname,brickinfo->path);
+ gf_log ("", GF_LOG_ERROR,
+ "Unable to resolve brick %s:%s",
+ brickinfo->hostname, brickinfo->path);
goto out;
}
@@ -567,7 +571,7 @@ glusterd_op_stage_stop_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
int flags = 0;
gf_boolean_t exists = _gf_false;
glusterd_volinfo_t *volinfo = NULL;
- char msg[2048] = {0,};
+ char msg[2048] = {0};
dict = dict_new ();
if (!dict)
@@ -580,11 +584,11 @@ glusterd_op_stage_stop_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
exists = glusterd_check_volume_exists (volname);
if (!exists) {
- snprintf (msg, 2048, "Volume with name %s does not exist", volname);
- gf_log ("", GF_LOG_ERROR, "%s",
- msg);
+ snprintf (msg, sizeof (msg), "Volume %s does not exist", volname);
+ gf_log ("", GF_LOG_ERROR, msg);
*op_errstr = gf_strdup (msg);
ret = -1;
+ goto out;
} else {
ret = 0;
}
@@ -618,12 +622,13 @@ out:
}
static int
-glusterd_op_stage_delete_volume (gd1_mgmt_stage_op_req *req)
+glusterd_op_stage_delete_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
{
int ret = 0;
char volname [1024] = {0,};
gf_boolean_t exists = _gf_false;
glusterd_volinfo_t *volinfo = NULL;
+ char msg[2048] = {0};
GF_ASSERT (req);
@@ -632,8 +637,10 @@ glusterd_op_stage_delete_volume (gd1_mgmt_stage_op_req *req)
exists = glusterd_check_volume_exists (volname);
if (!exists) {
- gf_log ("", GF_LOG_ERROR, "Volume with name %s does not exist",
- volname);
+ snprintf (msg, sizeof (msg), "Volume %s does not exist",
+ volname);
+ gf_log ("", GF_LOG_ERROR, msg);
+ *op_errstr = gf_strdup (msg);
ret = -1;
goto out;
} else {
@@ -648,9 +655,11 @@ glusterd_op_stage_delete_volume (gd1_mgmt_stage_op_req *req)
ret = glusterd_is_volume_started (volinfo);
if (!ret) {
- gf_log ("", GF_LOG_ERROR, "Volume %s has been started."
- "Volume needs to be stopped before deletion.",
- volname);
+ snprintf (msg, sizeof (msg), "Volume %s has been started."
+ "Volume needs to be stopped before deletion.",
+ volname);
+ gf_log ("", GF_LOG_ERROR, msg);
+ *op_errstr = gf_strdup (msg);
ret = -1;
goto out;
}
@@ -769,7 +778,7 @@ glusterd_op_stage_add_brick (gd1_mgmt_stage_op_req *req, char **op_errstr)
ret = glusterd_brickinfo_from_brick (brick, &brickinfo);
if (ret) {
gf_log ("", GF_LOG_ERROR, "Add-brick: Unable"
- " to get brickinfo");
+ " to get brickinfo");
goto out;
}
brick_alloc = _gf_true;
@@ -992,8 +1001,8 @@ glusterd_op_stage_replace_brick (gd1_mgmt_stage_op_req *req, char **op_errstr,
break;
case GF_REPLACE_OP_PAUSE:
if (glusterd_is_rb_paused (volinfo)) {
- gf_log ("", GF_LOG_ERROR, "Replace brick is already"
- " paused for volume ");
+ gf_log ("", GF_LOG_ERROR, "Replace brick is already "
+ "paused for volume ");
ret = -1;
goto out;
} else if (!glusterd_is_rb_started(volinfo)) {
@@ -1032,7 +1041,7 @@ glusterd_op_stage_replace_brick (gd1_mgmt_stage_op_req *req, char **op_errstr,
}
ret = glusterd_volume_brickinfo_get_by_brick (src_brick, volinfo,
- &src_brickinfo);
+ &src_brickinfo);
if (ret) {
snprintf (msg, sizeof (msg), "brick: %s does not exist in "
"volume: %s", src_brick, volname);
@@ -1136,12 +1145,17 @@ out:
}
static int
-glusterd_op_stage_log_filename (gd1_mgmt_stage_op_req *req)
+glusterd_op_stage_log_filename (gd1_mgmt_stage_op_req *req, char **op_errstr)
{
int ret = -1;
dict_t *dict = NULL;
char *volname = NULL;
gf_boolean_t exists = _gf_false;
+ char msg[2048] = {0};
+ char *path = NULL;
+ char hostname[2048] = {0};
+ char *brick = NULL;
+ glusterd_volinfo_t *volinfo = NULL;
GF_ASSERT (req);
@@ -1162,13 +1176,50 @@ glusterd_op_stage_log_filename (gd1_mgmt_stage_op_req *req)
}
exists = glusterd_check_volume_exists (volname);
- if (!exists) {
- gf_log ("", GF_LOG_ERROR, "Volume with name: %s not exists",
- volname);
+ ret = glusterd_volinfo_find (volname, &volinfo);
+ if (!exists || ret) {
+ snprintf (msg, sizeof (msg), "Volume %s does not exist",
+ volname);
+ gf_log ("", GF_LOG_ERROR, msg);
+ *op_errstr = gf_strdup (msg);
ret = -1;
goto out;
}
+ ret = dict_get_str (dict, "brick", &brick);
+ if (ret)
+ goto out;
+
+ if (strchr (brick, ':')) {
+ ret = glusterd_volume_brickinfo_get_by_brick (brick, volinfo,
+ NULL);
+ if (ret) {
+ snprintf (msg, sizeof (msg), "Incorrect brick %s "
+ "for volume %s", brick, volname);
+ gf_log ("", GF_LOG_ERROR, msg);
+ *op_errstr = gf_strdup (msg);
+ goto out;
+ }
+ }
+
+ ret = dict_get_str (dict, "path", &path);
+ if (ret) {
+ gf_log ("", GF_LOG_ERROR, "path not found");
+ goto out;
+ }
+
+ ret = gethostname (hostname, sizeof (hostname));
+ if (ret) {
+ snprintf (msg, sizeof (msg), "Failed to get hostname, error:%s",
+ strerror (errno));
+ gf_log ("glusterd", GF_LOG_ERROR, "%s");
+ *op_errstr = gf_strdup (msg);
+ goto out;
+ }
+
+ ret = glusterd_brick_create_path (hostname, path, 0777, op_errstr);
+ if (ret)
+ goto out;
out:
if (dict)
dict_unref (dict);
@@ -1178,12 +1229,15 @@ out:
}
static int
-glusterd_op_stage_log_rotate (gd1_mgmt_stage_op_req *req)
+glusterd_op_stage_log_rotate (gd1_mgmt_stage_op_req *req, char **op_errstr)
{
int ret = -1;
dict_t *dict = NULL;
char *volname = NULL;
+ glusterd_volinfo_t *volinfo = NULL;
gf_boolean_t exists = _gf_false;
+ char msg[2048] = {0};
+ char *brick = NULL;
GF_ASSERT (req);
@@ -1204,13 +1258,42 @@ glusterd_op_stage_log_rotate (gd1_mgmt_stage_op_req *req)
}
exists = glusterd_check_volume_exists (volname);
+ ret = glusterd_volinfo_find (volname, &volinfo);
if (!exists) {
- gf_log ("", GF_LOG_ERROR, "Volume with name: %s not exists",
- volname);
+ snprintf (msg, sizeof (msg), "Volume %s does not exist",
+ volname);
+ gf_log ("", GF_LOG_ERROR, msg);
+ *op_errstr = gf_strdup (msg);
+ ret = -1;
+ goto out;
+ }
+
+ ret = glusterd_is_volume_started (volinfo);
+
+ if (ret) {
+ snprintf (msg, sizeof (msg), "Volume %s needs to be started before"
+ " log rotate.", volname);
+ gf_log ("", GF_LOG_ERROR, msg);
+ *op_errstr = gf_strdup (msg);
ret = -1;
goto out;
}
+ ret = dict_get_str (dict, "brick", &brick);
+ if (ret)
+ goto out;
+
+ if (strchr (brick, ':')) {
+ ret = glusterd_volume_brickinfo_get_by_brick (brick, volinfo,
+ NULL);
+ if (ret) {
+ snprintf (msg, sizeof (msg), "Incorrect brick %s "
+ "for volume %s", brick, volname);
+ gf_log ("", GF_LOG_ERROR, msg);
+ *op_errstr = gf_strdup (msg);
+ goto out;
+ }
+ }
out:
if (dict)
dict_unref (dict);
@@ -1235,9 +1318,9 @@ glusterd_op_stage_set_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
char errstr[2048] = {0, };
glusterd_volinfo_t *volinfo = NULL;
dict_t *val_dict = NULL;
-
+
GF_ASSERT (req);
-
+
dict = dict_new ();
if (!dict)
goto out;
@@ -1245,7 +1328,7 @@ glusterd_op_stage_set_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
val_dict = dict_new();
if (!val_dict)
goto out;
-
+
ret = dict_unserialize (req->buf.buf_val, req->buf.buf_len, &dict);
if (ret) {
@@ -1263,10 +1346,9 @@ glusterd_op_stage_set_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
exists = glusterd_check_volume_exists (volname);
if (!exists) {
- gf_log ("", GF_LOG_ERROR, "Volume with name: %s "
- "does not exist", volname);
- snprintf (errstr, 2048, "Volume : %s does not exist",
+ snprintf (errstr, sizeof (errstr), "Volume %s does not exist",
volname);
+ gf_log ("", GF_LOG_ERROR, errstr);
*op_errstr = gf_strdup (errstr);
ret = -1;
goto out;
@@ -1304,19 +1386,18 @@ glusterd_op_stage_set_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
sprintf (str, "key%d", count);
ret = dict_get_str (dict, str, &key);
-
- if (ret)
+
+ if (ret)
break;
-
exists = glusterd_check_option_exists (key, &key_fixed);
if (exists == -1) {
ret = -1;
goto out;
}
if (!exists) {
- gf_log ("", GF_LOG_ERROR, "Option with name: %s "
- "does not exist", key);
+ gf_log ("", GF_LOG_ERROR, "Option with name: %s "
+ "does not exist", key);
ret = snprintf (errstr, 2048,
"option : %s does not exist",
key);
@@ -1324,17 +1405,16 @@ glusterd_op_stage_set_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
snprintf (errstr + ret, 2048 - ret,
"\nDid you mean %s?", key_fixed);
*op_errstr = gf_strdup (errstr);
-
- ret = -1;
- goto out;
+ ret = -1;
+ goto out;
}
sprintf (str, "value%d", count);
ret = dict_get_str (dict, str, &value);
-
+
if (ret) {
- gf_log ("", GF_LOG_ERROR, "invalid key,value pair"
- "in 'volume set'");
+ gf_log ("", GF_LOG_ERROR,
+ "invalid key,value pair in 'volume set'");
ret = -1;
goto out;
}
@@ -1344,8 +1424,8 @@ glusterd_op_stage_set_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
ret = dict_set_str (val_dict, key, value);
if (ret) {
- gf_log ("", GF_LOG_ERROR, "Unable to set the options"
- "in 'volume set'");
+ gf_log ("", GF_LOG_ERROR,
+ "Unable to set the options in 'volume set'");
ret = -1;
goto out;
}
@@ -1359,9 +1439,8 @@ glusterd_op_stage_set_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
*op_errstr = NULL;
ret = glusterd_validate_reconfopts (volinfo, val_dict, op_errstr);
if (ret) {
- gf_log ("glsuterd", GF_LOG_DEBUG,
- "Could not create temp volfile, some option failed: %s",
- *op_errstr);
+ gf_log ("glusterd", GF_LOG_DEBUG, "Could not create temp "
+ "volfile, some option failed: %s", *op_errstr);
goto out;
}
@@ -1384,21 +1463,22 @@ out:
gf_log ("glsuterd", GF_LOG_DEBUG,
"Error, Cannot Validate option :%s",
*op_errstr);
- }
- else
+ } else {
gf_log ("glsuterd", GF_LOG_DEBUG,
- "Error, Cannot Validate option");
+ "Error, Cannot Validate option");
+ }
}
return ret;
}
static int
-glusterd_op_stage_reset_volume (gd1_mgmt_stage_op_req *req)
+glusterd_op_stage_reset_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
{
int ret = 0;
dict_t *dict = NULL;
char *volname = NULL;
gf_boolean_t exists = _gf_false;
+ char msg[2048] = {0};
GF_ASSERT (req);
@@ -1423,16 +1503,17 @@ glusterd_op_stage_reset_volume (gd1_mgmt_stage_op_req *req)
exists = glusterd_check_volume_exists (volname);
if (!exists) {
- gf_log ("", GF_LOG_ERROR, "Volume with name: %s "
- "does not exist",
- volname);
+ snprintf (msg, sizeof (msg), "Volume %s does not "
+ "exist", volname);
+ gf_log ("", GF_LOG_ERROR, msg);
+ *op_errstr = gf_strdup (msg);
ret = -1;
goto out;
}
out:
- if (dict)
+ if (dict)
dict_unref (dict);
gf_log ("", GF_LOG_DEBUG, "Returning %d", ret);
@@ -1768,8 +1849,8 @@ glusterd_op_stage_sync_volume (gd1_mgmt_stage_op_req *req, char **op_errstr)
if (!ret) {
exists = glusterd_check_volume_exists (volname);
if (!exists) {
- snprintf (msg, sizeof (msg), "volume: %s, "
- "doesn't exist", volname);
+ snprintf (msg, sizeof (msg), "Volume %s "
+ "does not exist", volname);
*op_errstr = gf_strdup (msg);
ret = -1;
goto out;
@@ -2376,7 +2457,8 @@ rb_mountpoint_mkdir (glusterd_volinfo_t *volinfo,
ret = mkdir (mount_point_path, 0777);
if (ret && (errno != EEXIST)) {
- gf_log ("", GF_LOG_DEBUG, "mkdir failed, errno: %d", errno);
+ gf_log ("", GF_LOG_DEBUG, "mkdir failed, errno: %d",
+ errno);
goto out;
}
@@ -3104,16 +3186,16 @@ glusterd_op_replace_brick (gd1_mgmt_stage_op_req *req, dict_t *rsp_dict)
}
if (ret) {
- gf_log ("", GF_LOG_CRITICAL, "Unable to cleanup "
- "dst brick");
+ gf_log ("", GF_LOG_CRITICAL,
+ "Unable to cleanup dst brick");
goto out;
}
ret = glusterd_nfs_server_stop ();
if (ret) {
- gf_log ("", GF_LOG_ERROR, "Unable to stop nfs"
- "server, ret: %d", ret);
+ gf_log ("", GF_LOG_ERROR,
+ "Unable to stop nfs server, ret: %d", ret);
}
ret = glusterd_op_perform_replace_brick (volinfo, src_brick,
@@ -3131,8 +3213,8 @@ glusterd_op_replace_brick (gd1_mgmt_stage_op_req *req, dict_t *rsp_dict)
ret = glusterd_check_generate_start_nfs (volinfo);
if (ret) {
- gf_log ("", GF_LOG_CRITICAL, "Failed to generate "
- " nfs volume file");
+ gf_log ("", GF_LOG_CRITICAL,
+ "Failed to generate nfs volume file");
}
ret = glusterd_store_update_volume (volinfo);
@@ -3157,7 +3239,8 @@ glusterd_op_replace_brick (gd1_mgmt_stage_op_req *req, dict_t *rsp_dict)
"Recieved pause - doing nothing");
ctx = glusterd_op_get_ctx (GD_OP_REPLACE_BRICK);
if (ctx) {
- ret = rb_do_operation_pause (volinfo, src_brickinfo, dst_brickinfo);
+ ret = rb_do_operation_pause (volinfo, src_brickinfo,
+ dst_brickinfo);
if (ret) {
gf_log ("", GF_LOG_ERROR,
"Pause operation failed");
@@ -3263,7 +3346,7 @@ glusterd_options_reset (glusterd_volinfo_t *volinfo)
if (ret) {
gf_log ("", GF_LOG_ERROR, "Unable to create volfile for"
- " 'volume set'");
+ " 'volume set'");
ret = -1;
goto out;
}
@@ -3284,7 +3367,7 @@ glusterd_options_reset (glusterd_volinfo_t *volinfo)
ret = 0;
out:
- gf_log ("", GF_LOG_DEBUG, "Returning %d", ret);
+ gf_log ("", GF_LOG_DEBUG, "Returning %d", ret);
return ret;
}
@@ -3296,7 +3379,7 @@ glusterd_op_reset_volume (gd1_mgmt_stage_op_req *req)
int ret = -1;
char *volname = NULL;
dict_t *dict = NULL;
-
+
dict = dict_new ();
if (!dict)
goto out;
@@ -3319,13 +3402,15 @@ glusterd_op_reset_volume (gd1_mgmt_stage_op_req *req)
gf_log ("", GF_LOG_ERROR, "Unable to allocate memory");
goto out;
}
-
+
ret = glusterd_options_reset (volinfo);
out:
+ if (dict)
+ dict_unref (dict);
gf_log ("", GF_LOG_DEBUG, "'volume reset' returning %d", ret);
return ret;
-
+
}
static int
@@ -3395,8 +3480,8 @@ glusterd_op_set_volume (gd1_mgmt_stage_op_req *req)
ret = dict_get_str (dict, str, &value);
if (ret) {
- gf_log ("", GF_LOG_ERROR, "invalid key,value pair"
- "in 'volume set'");
+ gf_log ("", GF_LOG_ERROR,
+ "invalid key,value pair in 'volume set'");
ret = -1;
goto out;
}
@@ -3410,8 +3495,8 @@ glusterd_op_set_volume (gd1_mgmt_stage_op_req *req)
ret = -1;
if (ret) {
- gf_log ("", GF_LOG_ERROR, "Unable to set the options"
- "in 'volume set'");
+ gf_log ("", GF_LOG_ERROR,
+ "Unable to set the options in 'volume set'");
ret = -1;
goto out;
}
@@ -3432,7 +3517,7 @@ glusterd_op_set_volume (gd1_mgmt_stage_op_req *req)
if (ret) {
gf_log ("", GF_LOG_ERROR, "Unable to create volfile for"
- " 'volume set'");
+ " 'volume set'");
ret = -1;
goto out;
}
@@ -3648,6 +3733,7 @@ glusterd_op_log_filename (gd1_mgmt_stage_op_req *req)
struct stat stbuf = {0,};
int valid_brick = 0;
glusterd_brickinfo_t *tmpbrkinfo = NULL;
+ char* new_logdir = NULL;
GF_ASSERT (req);
@@ -3673,6 +3759,7 @@ glusterd_op_log_filename (gd1_mgmt_stage_op_req *req)
gf_log ("", GF_LOG_ERROR, "volname not found");
goto out;
}
+
ret = dict_get_str (dict, "path", &path);
if (ret) {
gf_log ("", GF_LOG_ERROR, "path not found");
@@ -3695,7 +3782,15 @@ glusterd_op_log_filename (gd1_mgmt_stage_op_req *req)
gf_log ("", GF_LOG_ERROR, "not a directory");
goto out;
}
- volinfo->logdir = gf_strdup (path);
+ new_logdir = gf_strdup (path);
+ if (!new_logdir) {
+ ret = -1;
+ gf_log ("", GF_LOG_ERROR, "Out of memory");
+ goto out;
+ }
+ if (volinfo->logdir)
+ GF_FREE (volinfo->logdir);
+ volinfo->logdir = new_logdir;
} else {
ret = glusterd_brickinfo_from_brick (brick, &tmpbrkinfo);
if (ret) {
@@ -3711,15 +3806,15 @@ glusterd_op_log_filename (gd1_mgmt_stage_op_req *req)
if (uuid_is_null (brickinfo->uuid)) {
ret = glusterd_resolve_brick (brickinfo);
+ if (ret)
+ goto out;
}
/* check if the brickinfo belongs to the 'this' machine */
if (uuid_compare (brickinfo->uuid, priv->uuid))
continue;
- if (brick &&
- (strcmp (tmpbrkinfo->hostname, brickinfo->hostname) ||
- strcmp (tmpbrkinfo->path,brickinfo->path)))
+ if (brick && strcmp (tmpbrkinfo->path,brickinfo->path))
continue;
valid_brick = 1;
@@ -3998,8 +4093,10 @@ glusterd_op_sync_volume (gd1_mgmt_stage_op_req *req, char **op_errstr,
if (!ret) {
ret = glusterd_volinfo_find (volname, &volinfo);
if (ret) {
- gf_log ("", GF_LOG_ERROR, "Volume with name: %s "
- "not exists", volname);
+ snprintf (msg, sizeof (msg), "Volume %s does not exist",
+ volname);
+ gf_log ("", GF_LOG_ERROR, msg);
+ *op_errstr = gf_strdup (msg);
goto out;
}
}
@@ -4561,6 +4658,10 @@ glusterd_op_send_cli_response (int32_t op, int32_t op_ret,
rsp.op_ret = op_ret;
rsp.op_errno = op_errno;
rsp.volname = "";
+ if (op_errstr)
+ rsp.op_errstr = op_errstr;
+ else
+ rsp.op_errstr = "";
cli_rsp = &rsp;
sfunc = gf_xdr_serialize_cli_delete_vol_rsp;
break;
@@ -4640,7 +4741,7 @@ glusterd_op_send_cli_response (int32_t op, int32_t op_ret,
sfunc = gf_xdr_serialize_cli_set_vol_rsp;
break;
}
-
+
case GD_MGMT_CLI_RESET_VOLUME:
{
gf_log ("", GF_LOG_DEBUG, "Return value to CLI");
@@ -4662,7 +4763,10 @@ glusterd_op_send_cli_response (int32_t op, int32_t op_ret,
gf1_cli_log_filename_rsp rsp = {0,};
rsp.op_ret = op_ret;
rsp.op_errno = op_errno;
- rsp.errstr = "";
+ if (op_errstr)
+ rsp.errstr = op_errstr;
+ else
+ rsp.errstr = "";
cli_rsp = &rsp;
sfunc = gf_xdr_serialize_cli_log_filename_rsp;
break;
@@ -4672,7 +4776,10 @@ glusterd_op_send_cli_response (int32_t op, int32_t op_ret,
gf1_cli_log_rotate_rsp rsp = {0,};
rsp.op_ret = op_ret;
rsp.op_errno = op_errno;
- rsp.errstr = "";
+ if (op_errstr)
+ rsp.errstr = op_errstr;
+ else
+ rsp.errstr = "";
cli_rsp = &rsp;
sfunc = gf_xdr_serialize_cli_log_rotate_rsp;
break;
@@ -4945,7 +5052,7 @@ glusterd_op_stage_validate (gd1_mgmt_stage_op_req *req, char **op_errstr,
break;
case GD_OP_DELETE_VOLUME:
- ret = glusterd_op_stage_delete_volume (req);
+ ret = glusterd_op_stage_delete_volume (req, op_errstr);
break;
case GD_OP_ADD_BRICK:
@@ -4962,7 +5069,7 @@ glusterd_op_stage_validate (gd1_mgmt_stage_op_req *req, char **op_errstr,
break;
case GD_OP_RESET_VOLUME:
- ret = glusterd_op_stage_reset_volume (req);
+ ret = glusterd_op_stage_reset_volume (req, op_errstr);
break;
case GD_OP_REMOVE_BRICK:
@@ -4970,11 +5077,11 @@ glusterd_op_stage_validate (gd1_mgmt_stage_op_req *req, char **op_errstr,
break;
case GD_OP_LOG_FILENAME:
- ret = glusterd_op_stage_log_filename (req);
+ ret = glusterd_op_stage_log_filename (req, op_errstr);
break;
case GD_OP_LOG_ROTATE:
- ret = glusterd_op_stage_log_rotate (req);
+ ret = glusterd_op_stage_log_rotate (req, op_errstr);
break;
case GD_OP_SYNC_VOLUME:
@@ -5466,12 +5573,14 @@ glusterd_op_free_ctx (glusterd_op_t op, void *ctx, gf_boolean_t ctx_free)
case GD_OP_SYNC_VOLUME:
case GD_OP_SET_VOLUME:
case GD_OP_START_VOLUME:
+ case GD_OP_RESET_VOLUME:
dict_unref (ctx);
break;
case GD_OP_DELETE_VOLUME:
GF_FREE (ctx);
break;
default:
+ GF_ASSERT (0);
break;
}
}
diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c
index 27acaf271a2..5224a91d4af 100644
--- a/xlators/mgmt/glusterd/src/glusterd-volgen.c
+++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c
@@ -1566,7 +1566,7 @@ validate_clientopts (glusterd_volinfo_t *volinfo,
}
int
-validate_brickopts (glusterd_volinfo_t *volinfo,
+validate_brickopts (glusterd_volinfo_t *volinfo,
char *brickinfo_path,
dict_t *val_dict,
char **op_errstr)
@@ -1595,12 +1595,12 @@ glusterd_validate_brickreconf (glusterd_volinfo_t *volinfo,
{
glusterd_brickinfo_t *brickinfo = NULL;
int ret = -1;
-
+
list_for_each_entry (brickinfo, &volinfo->bricks, brick_list) {
gf_log ("", GF_LOG_DEBUG,
"Validating %s", brickinfo->hostname);
- ret = validate_brickopts (volinfo, brickinfo->path, val_dict,
+ ret = validate_brickopts (volinfo, brickinfo->path, val_dict,
op_errstr);
if (ret)
goto out;
@@ -1609,7 +1609,7 @@ glusterd_validate_brickreconf (glusterd_volinfo_t *volinfo,
ret = 0;
out:
- return ret;
+ return ret;
}
int
diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
index 8853db813e0..9914e7be73e 100644
--- a/xlators/mgmt/glusterd/src/glusterd.h
+++ b/xlators/mgmt/glusterd/src/glusterd.h
@@ -50,6 +50,7 @@
#define GLUSTERD_MAX_VOLUME_NAME 1000
#define DEFAULT_LOG_FILE_DIRECTORY DATADIR "/log/glusterfs"
#define GLUSTERD_TR_LOG_SIZE 50
+#define GLUSTERD_NAME "glusterd"
typedef enum glusterd_op_ {
diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c
index 6c763e7fbbf..7c92441ea89 100644
--- a/xlators/protocol/server/src/server.c
+++ b/xlators/protocol/server/src/server.c
@@ -503,8 +503,12 @@ validate_options (xlator_t *this, dict_t *options, char **op_errstr)
}
}
- if (!auth_modules)
- auth_modules = dict_new ();
+ auth_modules = dict_new ();
+ if (!auth_modules) {
+ gf_log (this->name, GF_LOG_ERROR, "Out of memory");
+ ret = -1;
+ goto out;
+ }
dict_foreach (options, get_auth_types, auth_modules);
ret = validate_auth_options (this, options);
@@ -516,11 +520,9 @@ validate_options (xlator_t *this, dict_t *options, char **op_errstr)
}
ret = gf_auth_init (this, auth_modules);
- if (ret) {
- dict_unref (auth_modules);
- goto out;
- }
out:
+ if (auth_modules)
+ dict_unref (auth_modules);
return ret;
}