diff options
| author | Krutika Dhananjay <kdhananj@redhat.com> | 2012-09-12 17:16:22 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2012-09-20 08:26:22 -0700 | 
| commit | e09245b8d152fdae8152f8e29d2be1827e6090e1 (patch) | |
| tree | c930304e13da4d4f56b60ef692653d445ba10f30 | |
| parent | f9652adfd1315c0a817917eb35f61f43f58e673b (diff) | |
glusterd: Fix to log command status at the appropriate time
PROBLEM:
In the existing implementation, the success/failure of
execution of a command is decided (and logged) in glusterd
handler functions. Strictly speaking, the logging mechanism
must take into account what course the command takes within
the state machine before concluding whether it succeeded or
failed.
FIX:
This patch attempts to fix the above issue for vol commands.
The format of the log message is as follows:
    for failure:
    <command string> : FAILED : <cause of failure>
    for success:
    <command string> : SUCCESS
APPROACH (in a nutshell):
 * The command string is packed into dict at cli and sent to
   glusterd.
 * glusterd logs the command status just before doing a
   "submit_reply", which is called (either directly or
   indirectly via a call to glusterd_op_cli_send_response)
   at 2 places for every vol command:
   i. in handler functions, and
   ii. in glusterd_op_txn_complete
In short, the failure of a command in the handler implies the
command has indeed failed. However, its success in the handler
does NOT necessarily mean the command succeeded/will succeed.
Change-Id: I5a8a2ddc318ef2dc2a9699f704a6bcd2f0ab0277
BUG: 823081
Signed-off-by: Krutika Dhananjay <kdhananj@redhat.com>
Reviewed-on: http://review.gluster.org/3948
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
| -rw-r--r-- | cli/src/cli-cmd-volume.c | 74 | ||||
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 524 | ||||
| -rw-r--r-- | cli/src/cli.h | 1 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-brick-ops.c | 29 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-geo-rep.c | 8 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 54 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-log-ops.c | 10 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-quota.c | 7 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-rebalance.c | 53 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-replace-brick.c | 14 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-rpc-ops.c | 4 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 35 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.h | 5 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-ops.c | 63 | 
14 files changed, 344 insertions, 537 deletions
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index 3a67de13..b9bed82e 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -29,6 +29,17 @@  #include "cli1-xdr.h"  #include "run.h" +#define SAVE_WORDS_IN_LOCAL(local, words, frame)            \ +        do {                                                \ +                local = cli_local_get ();                   \ +                                                            \ +                if (local) {                                \ +                        local->words = words;               \ +                        if (frame)                          \ +                                frame->local = local;       \ +                }                                           \ +        } while (0) +  extern struct rpc_clnt *global_rpc;  extern rpc_clnt_prog_t *cli_rpc_prog; @@ -111,6 +122,7 @@ cli_cmd_sync_volume_cbk (struct cli_state *state, struct cli_cmd_word *word,          int                     sent = 0;          int                     parse_error = 0;          dict_t                  *dict = NULL; +        cli_local_t             *local = NULL;          if ((wordcount < 3) || (wordcount > 4)) {                  cli_usage_out (word->pattern); @@ -151,6 +163,8 @@ cli_cmd_sync_volume_cbk (struct cli_state *state, struct cli_cmd_word *word,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, dict);          } @@ -332,6 +346,7 @@ cli_cmd_volume_create_cbk (struct cli_state *state, struct cli_cmd_word *word,          int32_t                 brick_count = 0;          int32_t                 sub_count = 0;          int32_t                 type = GF_CLUSTER_TYPE_NONE; +        cli_local_t             *local = NULL;          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_CREATE_VOLUME]; @@ -340,6 +355,8 @@ cli_cmd_volume_create_cbk (struct cli_state *state, struct cli_cmd_word *word,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          ret = cli_cmd_volume_create_parse (words, wordcount, &options);          if (ret) { @@ -409,6 +426,7 @@ cli_cmd_volume_delete_cbk (struct cli_state *state, struct cli_cmd_word *word,          const char              *question = NULL;          int                     sent = 0;          int                     parse_error = 0; +        cli_local_t             *local = NULL;          question = "Deleting volume will erase all information about the volume. "                     "Do you want to continue?"; @@ -418,6 +436,8 @@ cli_cmd_volume_delete_cbk (struct cli_state *state, struct cli_cmd_word *word,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          if (wordcount != 3) {                  cli_usage_out (word->pattern);                  parse_error = 1; @@ -460,6 +480,7 @@ cli_cmd_volume_start_cbk (struct cli_state *state, struct cli_cmd_word *word,          int                     parse_error = 0;          dict_t                  *dict = NULL;          int                     flags = 0; +        cli_local_t             *local = NULL;          frame = create_frame (THIS, THIS->ctx->pool);          if (!frame) @@ -471,6 +492,8 @@ cli_cmd_volume_start_cbk (struct cli_state *state, struct cli_cmd_word *word,                 goto out;          } +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          dict = dict_new ();          if (!dict) {                  goto out; @@ -583,6 +606,7 @@ cli_cmd_volume_stop_cbk (struct cli_state *state, struct cli_cmd_word *word,          int                     parse_error = 0;          dict_t                  *dict = NULL;          char                    *volname = NULL; +        cli_local_t             *local = NULL;          const char *question = "Stopping volume will make its data inaccessible. "                                 "Do you want to continue?"; @@ -591,6 +615,8 @@ cli_cmd_volume_stop_cbk (struct cli_state *state, struct cli_cmd_word *word,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          if (wordcount < 3 || wordcount > 4) {                  cli_usage_out (word->pattern);                  parse_error = 1; @@ -718,6 +744,7 @@ cli_cmd_volume_defrag_cbk (struct cli_state *state, struct cli_cmd_word *word,          dict_t               *dict = NULL;          int                     sent = 0;          int                     parse_error = 0; +        cli_local_t          *local = NULL;  #ifdef GF_SOLARIS_HOST_OS          cli_out ("Command not supported on Solaris");          goto out; @@ -727,6 +754,8 @@ cli_cmd_volume_defrag_cbk (struct cli_state *state, struct cli_cmd_word *word,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          dict = dict_new ();          if (!dict)                  goto out; @@ -813,6 +842,7 @@ cli_cmd_volume_reset_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; +        cli_local_t             *local = NULL;          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_RESET_VOLUME]; @@ -820,6 +850,8 @@ cli_cmd_volume_reset_cbk (struct cli_state *state, struct cli_cmd_word *word,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          ret = cli_cmd_volume_reset_parse (words, wordcount, &options);          if (ret) { @@ -859,6 +891,7 @@ cli_cmd_volume_profile_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; +        cli_local_t             *local = NULL;          ret = cli_cmd_volume_profile_parse (words, wordcount, &options); @@ -874,6 +907,8 @@ cli_cmd_volume_profile_cbk (struct cli_state *state, struct cli_cmd_word *word,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          } @@ -905,6 +940,7 @@ cli_cmd_volume_set_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; +        cli_local_t             *local = NULL;          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_SET_VOLUME]; @@ -912,6 +948,8 @@ cli_cmd_volume_set_cbk (struct cli_state *state, struct cli_cmd_word *word,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          ret = cli_cmd_volume_set_parse (words, wordcount, &options);          if (ret) { @@ -952,6 +990,7 @@ cli_cmd_volume_add_brick_cbk (struct cli_state *state,          int                     sent = 0;          int                     parse_error = 0;          gf_answer_t             answer = GF_ANSWER_NO; +        cli_local_t             *local = NULL;          const char *question = "Changing the 'stripe count' of the volume is "                  "not a supported feature. In some cases it may result in data " @@ -963,6 +1002,8 @@ cli_cmd_volume_add_brick_cbk (struct cli_state *state,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          ret = cli_cmd_volume_add_brick_parse (words, wordcount, &options);          if (ret) { @@ -1015,6 +1056,7 @@ cli_cmd_quota_cbk (struct cli_state *state, struct cli_cmd_word *word,          call_frame_t            *frame     = NULL;          dict_t                  *options   = NULL;          gf_answer_t              answer    = GF_ANSWER_NO; +        cli_local_t             *local     = NULL;          const char *question = "Disabling quota will delete all the quota "                                 "configuration. Do you want to continue?"; @@ -1030,6 +1072,8 @@ cli_cmd_quota_cbk (struct cli_state *state, struct cli_cmd_word *word,                  goto out;          } +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          ret = cli_cmd_quota_parse (words, wordcount, &options);          if (ret < 0) {                  cli_usage_out (word->pattern); @@ -1071,6 +1115,7 @@ cli_cmd_volume_remove_brick_cbk (struct cli_state *state,          int                     sent = 0;          int                     parse_error = 0;          int                     need_question = 0; +        cli_local_t             *local = NULL;          const char *question = "Removing brick(s) can result in data loss. "                                 "Do you want to Continue?"; @@ -1079,6 +1124,8 @@ cli_cmd_volume_remove_brick_cbk (struct cli_state *state,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          ret = cli_cmd_volume_remove_brick_parse (words, wordcount, &options,                                                   &need_question); @@ -1131,6 +1178,7 @@ cli_cmd_volume_replace_brick_cbk (struct cli_state *state,          dict_t                  *options = NULL;          int                     sent = 0;          int                     parse_error = 0; +        cli_local_t             *local = NULL;  #ifdef GF_SOLARIS_HOST_OS          cli_out ("Command not supported on Solaris"); @@ -1142,6 +1190,8 @@ cli_cmd_volume_replace_brick_cbk (struct cli_state *state,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          ret = cli_cmd_volume_replace_brick_parse (words, wordcount, &options);          if (ret) { @@ -1190,6 +1240,7 @@ cli_cmd_volume_top_cbk (struct cli_state *state, struct cli_cmd_word *word,          dict_t                  *options = NULL;          int                     sent     = 0;          int                     parse_error = 0; +        cli_local_t             *local = NULL;          ret = cli_cmd_volume_top_parse (words, wordcount, &options); @@ -1205,6 +1256,8 @@ cli_cmd_volume_top_cbk (struct cli_state *state, struct cli_cmd_word *word,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          } @@ -1236,6 +1289,7 @@ cli_cmd_log_rotate_cbk (struct cli_state *state, struct cli_cmd_word *word,          dict_t                  *options = NULL;          int                     sent = 0;          int                     parse_error = 0; +        cli_local_t             *local = NULL;          if (!((wordcount == 4) || (wordcount == 5))) {                  cli_usage_out (word->pattern); @@ -1249,6 +1303,8 @@ cli_cmd_log_rotate_cbk (struct cli_state *state, struct cli_cmd_word *word,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          ret = cli_cmd_log_rotate_parse (words, wordcount, &options);          if (ret)                  goto out; @@ -1259,14 +1315,13 @@ cli_cmd_log_rotate_cbk (struct cli_state *state, struct cli_cmd_word *word,  out:          if (options) -                dict_destroy (options); +                dict_unref (options);          if (ret) {                  cli_cmd_sent_status_get (&sent);                  if ((sent == 0) && (parse_error == 0))                          cli_out ("Volume log rotate failed");          } -          CLI_STACK_DESTROY (frame);          return ret; @@ -1341,6 +1396,7 @@ cli_cmd_volume_gsync_set_cbk (struct cli_state *state, struct cli_cmd_word *word          dict_t                  *options = NULL;          rpc_clnt_procedure_t    *proc    = NULL;          call_frame_t            *frame   = NULL; +        cli_local_t             *local   = NULL;          proc = &cli_rpc_prog->proctable [GLUSTER_CLI_GSYNC_SET];          if (proc == NULL) { @@ -1354,6 +1410,8 @@ cli_cmd_volume_gsync_set_cbk (struct cli_state *state, struct cli_cmd_word *word                  goto out;          } +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          ret = cli_cmd_gsync_set_parse (words, wordcount, &options);          if (ret) {                  cli_usage_out (word->pattern); @@ -1386,6 +1444,7 @@ cli_cmd_volume_status_cbk (struct cli_state *state,          call_frame_t         *frame       = NULL;          dict_t               *dict        = NULL;          uint32_t              cmd         = 0; +        cli_local_t          *local       = NULL;          ret = cli_cmd_volume_status_parse (words, wordcount, &dict); @@ -1413,6 +1472,8 @@ cli_cmd_volume_status_cbk (struct cli_state *state,          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          ret = proc->fn (frame, THIS, dict);   out: @@ -1612,12 +1673,15 @@ cli_cmd_volume_heal_cbk (struct cli_state *state, struct cli_cmd_word *word,          int                     parse_error = 0;          dict_t                  *options = NULL;          xlator_t                *this = NULL; +        cli_local_t             *local = NULL;          this = THIS;          frame = create_frame (this, this->ctx->pool);          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          if (wordcount < 3) {                 cli_usage_out (word->pattern);                 parse_error = 1; @@ -1662,11 +1726,14 @@ cli_cmd_volume_statedump_cbk (struct cli_state *state, struct cli_cmd_word *word          dict_t                          *options = NULL;          int                             sent = 0;          int                             parse_error = 0; +        cli_local_t                     *local = NULL;          frame = create_frame (THIS, THIS->ctx->pool);          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          if (wordcount < 3) {                  cli_usage_out (word->pattern);                  parse_error = 1; @@ -1747,11 +1814,14 @@ cli_cmd_volume_clearlocks_cbk (struct cli_state *state,          dict_t                          *options = NULL;          int                             sent = 0;          int                             parse_error = 0; +        cli_local_t                     *local = NULL;          frame = create_frame (THIS, THIS->ctx->pool);          if (!frame)                  goto out; +        SAVE_WORDS_IN_LOCAL (local, words, frame); +          if (wordcount < 7 || wordcount > 8) {                  cli_usage_out (word->pattern);                  parse_error = 1; diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 868a587f..368a03cc 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -67,6 +67,10 @@ int32_t  gf_cli_get_volume (call_frame_t *frame, xlator_t *this,                        void *data); +int +cli_to_glusterd (gf_cli_req *req, call_frame_t *frame, fop_cbk_fn_t cbkfn, +                 xdrproc_t xdrproc, dict_t *dict, int procnum, xlator_t *this, +                 rpc_clnt_prog_t *prog, struct iobref *iobref);  rpc_clnt_prog_t cli_handshake_prog = {          .progname  = "cli handshake", @@ -2533,7 +2537,6 @@ gf_cli_create_volume (call_frame_t *frame, xlator_t *this,          gf_cli_req              req = {{0,}};          int                     ret = 0;          dict_t                  *dict = NULL; -        cli_local_t             *local = NULL;          if (!frame || !this ||  !data) {                  ret = -1; @@ -2542,34 +2545,14 @@ gf_cli_create_volume (call_frame_t *frame, xlator_t *this,          dict = dict_ref ((dict_t *)data); -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_DEBUG, -                        "failed to get serialized length of dict"); -                goto out; -        } - -        local = cli_local_get (); - -        if (local) { -                local->dict = dict_ref (dict); -                frame->local = local; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_CREATE_VOLUME, NULL, -                              this, gf_cli_create_volume_cbk, -                              (xdrproc_t) xdr_gf_cli_req); - - +        ret = cli_to_glusterd (&req, frame, gf_cli_create_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_CREATE_VOLUME, this, cli_rpc_prog, +                               NULL);  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); -        if (dict) -                dict_unref (dict); -          GF_FREE (req.dict.dict_val);          return ret; @@ -2581,7 +2564,6 @@ gf_cli_delete_volume (call_frame_t *frame, xlator_t *this,  {          gf_cli_req              req = {{0,}};          int                     ret = 0; -        cli_local_t             *local = NULL;          dict_t                  *dict = NULL;          if (!frame || !this ||  !data) { @@ -2589,35 +2571,19 @@ gf_cli_delete_volume (call_frame_t *frame, xlator_t *this,                  goto out;          } -        local = cli_local_get (); -          dict = dict_new ();          ret = dict_set_str (dict, "volname", data);          if (ret) {                  gf_log (THIS->name, GF_LOG_WARNING, "dict set failed");                  goto out;          } -        if (local) { -                local->dict = dict_ref (dict); -                frame->local = local; -        } -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "failed to get serialize dict"); -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_DELETE_VOLUME, NULL, -                              this, gf_cli_delete_volume_cbk, -                              (xdrproc_t)xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_delete_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_DELETE_VOLUME, this, cli_rpc_prog, +                               NULL);  out: -        if (dict) -                dict_unref (dict);          GF_FREE (req.dict.dict_val);          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -2630,7 +2596,6 @@ gf_cli_start_volume (call_frame_t *frame, xlator_t *this,  {          gf_cli_req              req = {{0,}};          int                     ret = 0; -        cli_local_t             *local = NULL;          dict_t                  *dict = NULL;          if (!frame || !this ||  !data) { @@ -2639,26 +2604,11 @@ gf_cli_start_volume (call_frame_t *frame, xlator_t *this,          }          dict = data; -        local = cli_local_get (); - -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "failed to serialize dict"); -                goto out; -        } - -        if (local) { -                local->dict = dict_ref (dict); -                frame->local = local; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_START_VOLUME, NULL, -                              this, gf_cli_start_volume_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_start_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_START_VOLUME, this, cli_rpc_prog, +                               NULL);  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -2672,7 +2622,6 @@ gf_cli_stop_volume (call_frame_t *frame, xlator_t *this,  {          gf_cli_req             req = {{0,}};          int                    ret = 0; -        cli_local_t            *local = NULL;          dict_t                 *dict = data;          if (!frame || !this ||  !data) { @@ -2680,27 +2629,12 @@ gf_cli_stop_volume (call_frame_t *frame, xlator_t *this,                  goto out;          } -        local = cli_local_get ();          dict = data; -        if (local) { -                local->dict = dict_ref (dict); -                frame->local = local; -        } - -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "failed to serialize the data"); - -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_STOP_VOLUME, NULL, -                              this, gf_cli_stop_volume_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_stop_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_STOP_VOLUME, this, cli_rpc_prog, +                               NULL);  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -2714,7 +2648,6 @@ gf_cli_defrag_volume (call_frame_t *frame, xlator_t *this,  {          gf_cli_req              req     =  {{0,}};          int                     ret     = 0; -        cli_local_t            *local   = NULL;          char                   *volname = NULL;          char                   *cmd_str = NULL;          dict_t                 *dict    = NULL; @@ -2762,7 +2695,6 @@ gf_cli_defrag_volume (call_frame_t *frame, xlator_t *this,          }  done: -        local = cli_local_get ();          req_dict = dict_new ();          if (!req_dict) { @@ -2784,30 +2716,12 @@ done:                  goto out;          } -        if (local) { -                local->dict = dict_ref (req_dict); -                frame->local = local; -                local = NULL; -        } - -        ret = dict_allocate_and_serialize (req_dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "failed to serialize the data"); - -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_DEFRAG_VOLUME, NULL, -                              this, gf_cli_defrag_volume_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_defrag_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, req_dict, +                               GLUSTER_CLI_DEFRAG_VOLUME, this, cli_rpc_prog, +                               NULL);  out: -        if (local) -                cli_local_wipe (local); -          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);          return ret; @@ -2864,22 +2778,13 @@ gf_cli_reset_volume (call_frame_t *frame, xlator_t *this,          dict = data; -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "failed to get serialized length of dict"); -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                               GLUSTER_CLI_RESET_VOLUME, NULL, -                               this, gf_cli_reset_volume_cbk, -                               (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_reset_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_RESET_VOLUME, this, cli_rpc_prog, +                               NULL);  out: -                gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - +        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);          return ret;  } @@ -2898,18 +2803,10 @@ gf_cli_set_volume (call_frame_t *frame, xlator_t *this,          dict = data; -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_DEBUG, -                        "failed to get serialized length of dict"); -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_SET_VOLUME, NULL, -                              this, gf_cli_set_volume_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_set_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_SET_VOLUME, this, cli_rpc_prog, +                               NULL);  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -2944,18 +2841,9 @@ gf_cli_add_brick (call_frame_t *frame, xlator_t *this,                  goto out; -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_DEBUG, -                        "failed to get serialized length of dict"); -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_ADD_BRICK, NULL, -                              this, gf_cli_add_brick_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_add_brick_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_ADD_BRICK, this, cli_rpc_prog, NULL);  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -2977,27 +2865,14 @@ gf_cli_remove_brick (call_frame_t *frame, xlator_t *this,          char                     *volname = NULL;          dict_t                   *req_dict = NULL;          int32_t                   cmd = 0; -        cli_local_t              *local = NULL;          if (!frame || !this ||  !data) {                  ret = -1;                  goto out;          } -        local = cli_local_get (); -        if (!local) { -                ret = -1; -                gf_log (this->name, GF_LOG_ERROR, -                        "Out of memory"); -                goto out; -        } - -        frame->local = local; -          dict = data; -        local->dict = dict_ref (dict); -          ret = dict_get_str (dict, "volname", &volname);          if (ret)                  goto out; @@ -3009,18 +2884,11 @@ gf_cli_remove_brick (call_frame_t *frame, xlator_t *this,          if ((command != GF_OP_CMD_STATUS) &&              (command != GF_OP_CMD_STOP)) { -                ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                                   &req.dict.dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_DEBUG, -                                "failed to get serialized length of dict"); -                        goto out; -                } -                ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                                      GLUSTER_CLI_REMOVE_BRICK, NULL, -                                      this, gf_cli_remove_brick_cbk, -                                      (xdrproc_t) xdr_gf_cli_req); +                ret = cli_to_glusterd (&req, frame, gf_cli_remove_brick_cbk, +                                       (xdrproc_t) xdr_gf_cli_req, dict, +                                       GLUSTER_CLI_REMOVE_BRICK, this, +                                       cli_rpc_prog, NULL);          } else {                  /* Need rebalance status to e sent :-) */                  req_dict = dict_new (); @@ -3048,22 +2916,14 @@ gf_cli_remove_brick (call_frame_t *frame, xlator_t *this,                          goto out;                  } -                ret = dict_allocate_and_serialize (req_dict, &status_req.dict.dict_val, -                                                   &status_req.dict.dict_len); -                if (ret < 0) { -                        gf_log (this->name, GF_LOG_ERROR, -                                "failed to serialize the data"); +                ret = cli_to_glusterd (&status_req, frame, +                                       gf_cli3_remove_brick_status_cbk, +                                       (xdrproc_t) xdr_gf_cli_req, req_dict, +                                       GLUSTER_CLI_DEFRAG_VOLUME, this, +                                       cli_rpc_prog, NULL); -                        goto out;                  } -                ret = cli_cmd_submit (&status_req, frame, cli_rpc_prog, -                                      GLUSTER_CLI_DEFRAG_VOLUME, NULL, -                                      this, gf_cli3_remove_brick_status_cbk, -                                      (xdrproc_t) xdr_gf_cli_req); - -        } -  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -3071,9 +2931,6 @@ out:          GF_FREE (status_req.dict.dict_val); -        if (req_dict) -                dict_unref (req_dict); -          return ret;  } @@ -3083,7 +2940,6 @@ gf_cli_replace_brick (call_frame_t *frame, xlator_t *this,  {          gf_cli_req                  req        =  {{0,}};          int                         ret        = 0; -        cli_local_t                *local      = NULL;          dict_t                     *dict       = NULL;          char                       *src_brick  = NULL;          char                       *dst_brick  = NULL; @@ -3097,17 +2953,6 @@ gf_cli_replace_brick (call_frame_t *frame, xlator_t *this,          dict = data; -        local = cli_local_get (); -        if (!local) { -                ret = -1; -                gf_log (this->name, GF_LOG_ERROR, -                        "Out of memory"); -                goto out; -        } - -        local->dict  = dict_ref (dict); -        frame->local = local; -          ret = dict_get_int32 (dict, "operation", &op);          if (ret) {                  gf_log (this->name, GF_LOG_DEBUG, @@ -3140,19 +2985,10 @@ gf_cli_replace_brick (call_frame_t *frame, xlator_t *this,                  "%s with operation=%d", src_brick,                  dst_brick, op); - -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_DEBUG, -                        "failed to get serialized length of dict"); -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_REPLACE_BRICK, NULL, -                              this, gf_cli_replace_brick_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_replace_brick_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_REPLACE_BRICK, this, cli_rpc_prog, +                               NULL);  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -3178,18 +3014,10 @@ gf_cli_log_rotate (call_frame_t *frame, xlator_t *this,          dict = data; -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); - -        if (ret < 0) { -                gf_log (THIS->name, GF_LOG_ERROR, "failed to serialize dict"); -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_LOG_ROTATE, NULL, -                              this, gf_cli_log_rotate_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_log_rotate_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_LOG_ROTATE, this, cli_rpc_prog, +                               NULL);  out: @@ -3213,18 +3041,11 @@ gf_cli_sync_volume (call_frame_t *frame, xlator_t *this,          }          dict = data; -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); - -        if (ret < 0) { -                gf_log (THIS->name, GF_LOG_ERROR, "failed to serialize dict"); -                goto out; -        } -        ret = cli_cmd_submit (&req, frame, -                              cli_rpc_prog, GLUSTER_CLI_SYNC_VOLUME, -                              NULL, this, gf_cli_sync_volume_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_sync_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_SYNC_VOLUME, this, cli_rpc_prog, +                               NULL);  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -3278,21 +3099,13 @@ gf_cli_quota (call_frame_t *frame, xlator_t *this,          dict = data; -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "failed to get serialized length of dict"); -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_QUOTA, NULL, -                              this, gf_cli_quota_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_quota_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_QUOTA, this, cli_rpc_prog, NULL); -        GF_FREE (req.dict.dict_val);  out: +        GF_FREE (req.dict.dict_val); +          return ret;  } @@ -3652,19 +3465,10 @@ gf_cli_gsync_set (call_frame_t *frame, xlator_t *this,          dict = data; -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "failed to serialize the data"); - -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_GSYNC_SET, NULL, -                              this, gf_cli_gsync_set_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_gsync_set_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_GSYNC_SET, this, cli_rpc_prog, +                               NULL);  out:          GF_FREE (req.dict.dict_val); @@ -4021,21 +3825,10 @@ gf_cli_profile_volume (call_frame_t *frame, xlator_t *this, void *data)                  goto out;          dict = data; -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); - -        if (ret < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "failed to serialize the data"); - -                goto out; -        } - - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_PROFILE_VOLUME, NULL, -                              this, gf_cli_profile_volume_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_profile_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_PROFILE_VOLUME, this, cli_rpc_prog, +                               NULL);  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -4295,20 +4088,10 @@ gf_cli_top_volume (call_frame_t *frame, xlator_t *this, void *data)                  goto out;          dict = data; -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "failed to serialize the data"); - -                goto out; -        } - - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_PROFILE_VOLUME, NULL, -                              this, gf_cli_top_volume_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_top_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_PROFILE_VOLUME, this, cli_rpc_prog, +                               NULL);  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -5588,19 +5371,10 @@ gf_cli_status_volume (call_frame_t *frame, xlator_t *this,          dict = data; -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log ("cli", GF_LOG_ERROR, -                        "failed to serialize the data"); - -                goto out; -        } -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_STATUS_VOLUME, NULL, -                              this, gf_cli_status_cbk, -                              (xdrproc_t)xdr_gf_cli_req); - +        ret = cli_to_glusterd (&req, frame, gf_cli_status_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_STATUS_VOLUME, this, cli_rpc_prog, +                               NULL);   out:          gf_log ("cli", GF_LOG_DEBUG, "Returning: %d", ret);          return ret; @@ -5624,14 +5398,10 @@ gf_cli_status_volume_all (call_frame_t *frame, xlator_t *this, void *data)          if (ret)                  goto out; -        local = cli_local_get (); -        if (!local) { -                ret = -1; -                gf_log ("cli", GF_LOG_ERROR, "Failed to allocate local"); -                goto out; +        if (frame->local) { +                local = frame->local; +                local->all = _gf_true;          } -        frame->local = local; -        local->all = _gf_true;          ret = gf_cli_status_volume (frame, this, data);          if (ret) @@ -6008,7 +5778,6 @@ gf_cli_heal_volume (call_frame_t *frame, xlator_t *this,  {          gf_cli_req              req = {{0,}};          int                     ret = 0; -        cli_local_t             *local = NULL;          dict_t                  *dict = NULL;          if (!frame || !this ||  !data) { @@ -6017,26 +5786,11 @@ gf_cli_heal_volume (call_frame_t *frame, xlator_t *this,          }          dict = data; -        local = cli_local_get (); -        if (local) { -                local->dict = dict_ref (dict); -                frame->local = local; -        } - -        ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "failed to serialize the data"); - -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_HEAL_VOLUME, NULL, -                              this, gf_cli_heal_volume_cbk, -                              (xdrproc_t) xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_heal_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, dict, +                               GLUSTER_CLI_HEAL_VOLUME, this, cli_rpc_prog, +                               NULL);  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -6103,23 +5857,12 @@ gf_cli_statedump_volume (call_frame_t *frame, xlator_t *this,          options = data; -        ret = dict_allocate_and_serialize (options, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log (this->name, GF_LOG_ERROR, -                        "failed to serialize the data"); - -                goto out; -        } - -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_STATEDUMP_VOLUME, NULL, -                              this, gf_cli_statedump_volume_cbk, -                              (xdrproc_t)xdr_gf_cli_req); +        ret = cli_to_glusterd (&req, frame, gf_cli_statedump_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, options, +                               GLUSTER_CLI_STATEDUMP_VOLUME, this, cli_rpc_prog, +                               NULL);  out: -        if (options) -                dict_destroy (options);          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);          GF_FREE (req.dict.dict_val); @@ -6303,27 +6046,88 @@ gf_cli_clearlocks_volume (call_frame_t *frame, xlator_t *this,          options = data; -        ret = dict_allocate_and_serialize (options, &req.dict.dict_val, -                                           &req.dict.dict_len); -        if (ret < 0) { -                gf_log ("cli", GF_LOG_ERROR, -                        "failed to serialize the data"); +        ret = cli_to_glusterd (&req, frame, gf_cli_clearlocks_volume_cbk, +                               (xdrproc_t) xdr_gf_cli_req, options, +                               GLUSTER_CLI_CLRLOCKS_VOLUME, this, cli_rpc_prog, +                               NULL); +out: +        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); +        GF_FREE (req.dict.dict_val); +        return ret; +} + +int +cli_to_glusterd (gf_cli_req *req, call_frame_t *frame, +                 fop_cbk_fn_t cbkfn, xdrproc_t xdrproc, dict_t *dict, +                 int procnum, xlator_t *this, rpc_clnt_prog_t *prog, +                 struct iobref *iobref) +{ +        int                ret = 0; +        size_t             len = 0; +        char               *cmd = NULL; +        int                i = 0; +        const char         **words = NULL; +        cli_local_t        *local = NULL; + +        if (!this || !frame || !dict) { +                ret = -1;                  goto out;          } -        ret = cli_cmd_submit (&req, frame, cli_rpc_prog, -                              GLUSTER_CLI_CLRLOCKS_VOLUME, NULL, -                              this, gf_cli_clearlocks_volume_cbk, -                              (xdrproc_t)xdr_gf_cli_req); +        if (!frame->local) { +                ret = -1; +                goto out; +        } -out: -        if (options) -                dict_destroy (options); -        gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); +        local = frame->local; -        GF_FREE (req.dict.dict_val); +        if (!local->words) { +                ret = -1; +                goto out; +        } + +        words = local->words; +        local->dict = dict_ref (dict); + +        while (words[i]) +                len += strlen (words[i++]) + 1; + +        cmd = GF_CALLOC (1, len, gf_common_mt_char); + +        if (!cmd) { +                ret = -1; +                goto out; +        } + +        for (i = 0; words[i]; i++) { +                strncat (cmd, words[i], strlen (words[i])); +                strncat (cmd, " ", strlen (" ")); +        } + +        cmd [len - 1] = '\0'; + +        ret = dict_set_dynstr (dict, "cmd-str", cmd); +        if (ret) +                goto out; + +        ret = dict_allocate_and_serialize (dict, &(req->dict).dict_val, +                                           &(req->dict).dict_len); + +        if (ret < 0) { +                gf_log (this->name, GF_LOG_DEBUG, +                        "failed to get serialized length of dict"); +                goto out; +        } + +        ret = cli_cmd_submit (req, frame, prog, procnum, iobref, this, +                              cbkfn, (xdrproc_t) xdrproc); + +out: +        if (dict) +                dict_unref (dict);          return ret; +  }  struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = { diff --git a/cli/src/cli.h b/cli/src/cli.h index 4cb23541..0299220c 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -118,6 +118,7 @@ struct cli_local {          } get_vol;          dict_t          *dict; +        const char      **words;          /* Marker for volume status all */          gf_boolean_t    all;  #if (HAVE_LIB_XML) diff --git a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c index 9efccd9a..b32c9872 100644 --- a/xlators/mgmt/glusterd/src/glusterd-brick-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-brick-ops.c @@ -343,7 +343,6 @@ glusterd_handle_add_brick (rpcsvc_request_t *req)          char                            *bricks = NULL;          char                            *volname = NULL;          int                             brick_count = 0; -        char                            *brick_list = NULL;          void                            *cli_rsp = NULL;          char                            err_str[2048] = {0,};          gf_cli_rsp                      rsp = {0,}; @@ -388,8 +387,6 @@ glusterd_handle_add_brick (rpcsvc_request_t *req)          ret = dict_get_str (dict, "volname", &volname); -        gf_cmd_log ("Volume add-brick", "on volname: %s attempted", -                    volname);          if (ret) {                  gf_log ("", GF_LOG_ERROR, "Unable to get volume name");                  snprintf (err_str, sizeof (err_str), "Unable to get volume " @@ -510,9 +507,6 @@ brick_val:                  goto out;          } -        gf_cmd_log ("Volume add-brick", "volname: %s type %d count:%d bricks:%s" -                    ,volname, volinfo->type, brick_count, brick_list); -          if (type != volinfo->type) {                  ret = dict_set_int32 (dict, "type", type);                  if (ret) @@ -523,19 +517,17 @@ brick_val:          ret = glusterd_op_begin (req, GD_OP_ADD_BRICK, dict);  out: -        gf_cmd_log ("Volume add-brick","on volname: %s %s", volname, -                   (ret != 0)? "FAILED" : "SUCCESS");          if (ret) { -                if (dict) -                        dict_unref (dict);                  rsp.op_ret = -1;                  rsp.op_errno = 0;                  if (err_str[0] == '\0')                          snprintf (err_str, sizeof (err_str), "Operation failed");                  rsp.op_errstr = err_str;                  cli_rsp = &rsp; -                glusterd_submit_reply(req, cli_rsp, NULL, 0, NULL, -                                      (xdrproc_t)xdr_gf_cli_rsp); +                glusterd_to_cli (req, cli_rsp, NULL, 0, NULL, +                                 (xdrproc_t)xdr_gf_cli_rsp, dict); +                if (dict) +                        dict_unref (dict);                  ret = 0; //sent error to cli, prevent second reply          } @@ -610,7 +602,6 @@ glusterd_handle_remove_brick (rpcsvc_request_t *req)                  goto out;          } -        gf_cmd_log ("Volume remove-brick","on volname: %s attempted", volname);          ret = dict_get_int32 (dict, "count", &count);          if (ret) {                  gf_log ("", GF_LOG_ERROR, "Unable to get count"); @@ -814,17 +805,11 @@ glusterd_handle_remove_brick (rpcsvc_request_t *req)                          break;                  }          } -        gf_cmd_log ("Volume remove-brick","volname: %s count:%d bricks:%s", -                    volname, count, brick_list);          ret = glusterd_op_begin (req, GD_OP_REMOVE_BRICK, dict); -        gf_cmd_log ("Volume remove-brick","on volname: %s %s", volname, -                    (ret) ? "FAILED" : "SUCCESS");  out:          if (ret) { -                if (dict) -                        dict_unref (dict);                  rsp.op_ret = -1;                  rsp.op_errno = 0;                  if (err_str[0] == '\0') @@ -832,8 +817,10 @@ out:                  gf_log ("", GF_LOG_ERROR, "%s", err_str);                  rsp.op_errstr = err_str;                  cli_rsp = &rsp; -                glusterd_submit_reply(req, cli_rsp, NULL, 0, NULL, -                                      (xdrproc_t)xdr_gf_cli_rsp); +                glusterd_to_cli (req, cli_rsp, NULL, 0, NULL, +                                 (xdrproc_t)xdr_gf_cli_rsp, dict); +                if (dict) +                        dict_unref (dict);                  ret = 0; //sent error to cli, prevent second reply diff --git a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c index 29e3bdd7..3dcb12f3 100644 --- a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c +++ b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c @@ -131,21 +131,17 @@ glusterd_handle_gsync_set (rpcsvc_request_t *req)                  break;          } -        gf_cmd_log ("volume "GEOREP, " %s command on %s,%s", operation, master, -                    slave);          ret = glusterd_op_begin (req, GD_OP_GSYNC_SET, dict); -        gf_cmd_log ("volume "GEOREP, " %s command on %s,%s %s  ", operation, -                    master, slave, (ret != 0)? "FAILED" : "SUCCEEDED");  out:          glusterd_friend_sm ();          glusterd_op_sm ();          if (ret) { +                ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, +                                                     dict, "operation failed");                  if (dict)                          dict_unref (dict); -                ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed");          }          return ret;  } diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 01f2adb3..13e53c17 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -982,19 +982,16 @@ glusterd_handle_reset_volume (rpcsvc_request_t *req)                  goto out;          } -        gf_cmd_log ("Volume reset", "volume  : %s", volname);          ret = glusterd_op_begin (req, GD_OP_RESET_VOLUME, dict); -        gf_cmd_log ("Volume reset", " on volume %s %s ", volname, -                ((ret == 0)? " SUCCEDED":" FAILED"));  out:          glusterd_friend_sm ();          glusterd_op_sm ();          if (ret) { +                ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, +                                                     dict, "operation failed");                  if (dict)                          dict_unref (dict); -                ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed");          }          return ret; @@ -1067,12 +1064,7 @@ glusterd_handle_set_volume (rpcsvc_request_t *req)                  goto out;          } - -        gf_cmd_log ("volume set", "volume-name:%s: key:%s, value:%s",volname, -                    key, value);          ret = glusterd_op_begin (req, GD_OP_SET_VOLUME, dict); -        gf_cmd_log ("volume set", "volume-name:%s: key:%s, value:%s %s", -                    volname, key, value, (ret == 0)? "SUCCEDED" : "FAILED" );  out:          glusterd_friend_sm (); @@ -1083,7 +1075,7 @@ out:                                                       (op_errstr)? op_errstr:"");          else if (ret)                  ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed"); +                                                     dict, "operation failed");          if (op_errstr)                  GF_FREE (op_errstr); @@ -1187,8 +1179,8 @@ out:                  cli_rsp.op_errstr = msg;                  if (msg[0] == '\0')                          snprintf (msg, sizeof (msg), "Operation failed"); -                glusterd_submit_reply(req, &cli_rsp, NULL, 0, NULL, -                                      (xdrproc_t)xdr_gf_cli_rsp); +                glusterd_to_cli (req, &cli_rsp, NULL, 0, NULL, +                                 (xdrproc_t)xdr_gf_cli_rsp, dict);                  if (dict)                          dict_unref (dict); @@ -1830,22 +1822,19 @@ glusterd_handle_cli_profile_volume (rpcsvc_request_t *req)                  goto out;          } -        gf_cmd_log ("Volume stats", "volume  : %s, op: %d", volname, op);          ret = glusterd_op_begin (req, cli_op, dict); -        gf_cmd_log ("Volume stats", " on volume %s, op: %d %s ", -                    volname, op, -                    ((ret == 0)? " SUCCEDED":" FAILED"));  out:          glusterd_friend_sm ();          glusterd_op_sm (); -        if (ret && dict) -                dict_unref (dict);          free (cli_req.dict.dict_val); -        if (ret) +        if (ret) {                  ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed"); +                                                     dict, "operation failed"); +                if (dict) +                        dict_unref (dict); +        }          gf_log (THIS->name, GF_LOG_DEBUG, "Returning %d", ret);          return ret; @@ -2648,15 +2637,15 @@ glusterd_handle_status_volume (rpcsvc_request_t *req)          ret = glusterd_op_begin (req, GD_OP_STATUS_VOLUME, dict);  out: -        if (ret && dict) -                dict_unref (dict); -          glusterd_friend_sm ();          glusterd_op_sm (); -        if (ret) +        if (ret) {                  ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed"); +                                                     dict, "operation failed"); +                if (dict) +                        dict_unref (dict); +        }          free (cli_req.dict.dict_val);          return ret; @@ -2710,19 +2699,16 @@ glusterd_handle_cli_clearlocks_volume (rpcsvc_request_t *req)          ret = glusterd_op_begin (req, cli_op, dict); -        gf_cmd_log ("clear-locks", "on volume %s %s", volname, -                    ((0 == ret) ? "SUCCEEDED" : "FAILED")); -  out: -        if (ret && dict) -                dict_unref (dict); -          glusterd_friend_sm ();          glusterd_op_sm (); -        if (ret) +        if (ret) {                  ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed"); +                                                     dict, "operation failed"); +                if (dict) +                        dict_unref (dict); +        }          free (cli_req.dict.dict_val);          return ret; diff --git a/xlators/mgmt/glusterd/src/glusterd-log-ops.c b/xlators/mgmt/glusterd/src/glusterd-log-ops.c index 4b35afde..9ab52a34 100644 --- a/xlators/mgmt/glusterd/src/glusterd-log-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-log-ops.c @@ -72,15 +72,15 @@ glusterd_handle_log_rotate (rpcsvc_request_t *req)          ret = glusterd_op_begin (req, GD_OP_LOG_ROTATE, dict);  out: -        if (ret && dict) -                dict_unref (dict); -          glusterd_friend_sm ();          glusterd_op_sm (); -        if (ret) +        if (ret) {                  ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed"); +                                                     dict, "operation failed"); +                if (dict) +                        dict_unref (dict); +        }          free (cli_req.dict.dict_val);          return ret; diff --git a/xlators/mgmt/glusterd/src/glusterd-quota.c b/xlators/mgmt/glusterd/src/glusterd-quota.c index 1f97fe11..103f88e7 100644 --- a/xlators/mgmt/glusterd/src/glusterd-quota.c +++ b/xlators/mgmt/glusterd/src/glusterd-quota.c @@ -91,20 +91,17 @@ glusterd_handle_quota (rpcsvc_request_t *req)                  strncpy (operation, "remove", sizeof (operation));                  break;          } -        gf_cmd_log ("volume quota", " %s command on %s", operation, volname);          ret = glusterd_op_begin (req, GD_OP_QUOTA, dict); -        gf_cmd_log ("volume quota", " %s command on %s %s", operation,volname, -                    (ret != 0)? "FAILED" : "SUCCEEDED");  out:          glusterd_friend_sm ();          glusterd_op_sm ();          if (ret) { +                ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, +                                                     dict, "operation failed");                  if (dict)                          dict_unref (dict); -                ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed");          }          return ret; diff --git a/xlators/mgmt/glusterd/src/glusterd-rebalance.c b/xlators/mgmt/glusterd/src/glusterd-rebalance.c index 2de20fdc..dab8f68f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-rebalance.c +++ b/xlators/mgmt/glusterd/src/glusterd-rebalance.c @@ -40,51 +40,6 @@  int32_t  glusterd_brick_op_cbk (struct rpc_req *req, struct iovec *iov,                            int count, void *myframe); - -void -glusterd_rebalance_cmd_attempted_log (int cmd, char *volname) -{ -        switch (cmd) { -                case GF_DEFRAG_CMD_START_LAYOUT_FIX: -                        gf_cmd_log ("Volume rebalance"," on volname: %s " -                                    "cmd: start fix layout , attempted", -                                    volname); -                        gf_log ("glusterd", GF_LOG_INFO, "Received rebalance " -                                "volume start layout fix on %s", volname); -                        break; -                case GF_DEFRAG_CMD_START_FORCE: -                        gf_cmd_log ("Volume rebalance"," on volname: %s " -                                    "cmd: start data force attempted", -                                    volname); -                        gf_log ("glusterd", GF_LOG_INFO, "Received rebalance " -                                "volume start migrate data on %s", volname); -                        break; -                case GF_DEFRAG_CMD_START: -                        gf_cmd_log ("Volume rebalance"," on volname: %s " -                                    "cmd: start, attempted", volname); -                        gf_log ("glusterd", GF_LOG_INFO, "Received rebalance " -                                "volume start on %s", volname); -                        break; -                case GF_DEFRAG_CMD_STOP: -                        gf_cmd_log ("Volume rebalance"," on volname: %s " -                                    "cmd: stop, attempted", volname); -                        gf_log ("glusterd", GF_LOG_INFO, "Received rebalance " -                                "volume stop on %s", volname); -                        break; -                default: -                        break; -        } -} - -void -glusterd_rebalance_cmd_log (int cmd, char *volname, int status) -{ -        if (cmd != GF_DEFRAG_CMD_STATUS) { -                gf_cmd_log ("volume rebalance"," on volname: %s %d %s", -                            volname, cmd, ((status)?"FAILED":"SUCCESS")); -        } -} -  int  glusterd_defrag_start_validate (glusterd_volinfo_t *volinfo, char *op_errstr,                                  size_t len) @@ -463,8 +418,6 @@ glusterd_handle_defrag_volume (rpcsvc_request_t *req)                  goto out;          } -        glusterd_rebalance_cmd_attempted_log (cmd, volname); -          ret = dict_set_static_bin (dict, "node-uuid", MY_UUID, 16);          if (ret)                  goto out; @@ -482,10 +435,10 @@ out:          glusterd_op_sm ();          if (ret) { +                ret = glusterd_op_send_cli_response (GD_OP_REBALANCE, ret, 0, req, +                                                     dict, "operation failed");                  if (dict)                          dict_unref (dict); -                ret = glusterd_op_send_cli_response (GD_OP_REBALANCE, ret, 0, req, -                                                     NULL, "operation failed");          }          free (cli_req.dict.dict_val);//malloced by xdr @@ -628,8 +581,6 @@ glusterd_op_rebalance (dict_t *dict, char **op_errstr, dict_t *rsp_dict)                  break;          } -        glusterd_rebalance_cmd_log (cmd, volname, ret); -  out:          if (ret && op_errstr && msg[0])                  *op_errstr = gf_strdup (msg); diff --git a/xlators/mgmt/glusterd/src/glusterd-replace-brick.c b/xlators/mgmt/glusterd/src/glusterd-replace-brick.c index f9212799..5fcbb84e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-replace-brick.c +++ b/xlators/mgmt/glusterd/src/glusterd-replace-brick.c @@ -140,25 +140,21 @@ glusterd_handle_replace_brick (rpcsvc_request_t *req)          gf_log ("", GF_LOG_DEBUG, "dst brick=%s", dst_brick);          gf_log ("glusterd", GF_LOG_INFO, "Received replace brick %s request",                  operation); -        gf_cmd_log ("Volume replace-brick","volname: %s src_brick:%s" -                    " dst_brick:%s op:%s", volname, src_brick, dst_brick, -                    operation);          ret = glusterd_op_begin (req, GD_OP_REPLACE_BRICK, dict); -        gf_cmd_log ("Volume replace-brick","on volname: %s %s", volname, -                   (ret) ? "FAILED" : "SUCCESS");  out: -        if (ret && dict) -                dict_unref (dict);          free (cli_req.dict.dict_val);//malloced by xdr          glusterd_friend_sm ();          glusterd_op_sm (); -        if (ret) +        if (ret) {                  ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed"); +                                                     dict, "operation failed"); +                if (dict) +                        dict_unref (dict); +        }          return ret;  } diff --git a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c index 0a31868c..89d2dd1e 100644 --- a/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-rpc-ops.c @@ -172,8 +172,8 @@ glusterd_op_send_cli_response (glusterd_op_t op, int32_t op_ret,          cli_rsp = &rsp;          xdrproc = (xdrproc_t) xdr_gf_cli_rsp; -        glusterd_submit_reply (req, cli_rsp, NULL, 0, NULL, -                               xdrproc); +        glusterd_to_cli (req, cli_rsp, NULL, 0, NULL, +                         xdrproc, ctx);          ret = 0;          GF_FREE (free_ptr); diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index efae2b51..821ea2cc 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -37,7 +37,6 @@  #include "glusterd-pmap.h"  #include "xdr-generic.h" -  #include <sys/resource.h>  #include <inttypes.h>  #include <signal.h> @@ -5712,3 +5711,37 @@ glusterd_volset_help (dict_t *dict, char **op_errstr)          gf_log ("glusterd", GF_LOG_DEBUG, "Returning %d", ret);          return ret;  } + +int +glusterd_to_cli (rpcsvc_request_t *req, gf_cli_rsp *arg, struct iovec *payload, +                 int payloadcount, struct iobref *iobref, xdrproc_t xdrproc, +                 dict_t *dict) +{ +        int                ret = -1; +        char               *cmd = NULL; +        int                op_ret = 0; +        char               *op_errstr = NULL; +        int                op_errno = 0; + +        op_ret = arg->op_ret; +        op_errstr = arg->op_errstr; +        op_errno = arg->op_errno; + +        ret = dict_get_str (dict, "cmd-str", &cmd); +        if (ret) +                gf_log ("glusterd", GF_LOG_ERROR, "Failed to get command string"); + +        if (cmd) { +                if (op_ret) +                        gf_cmd_log ("", "%s : FAILED %s %s", cmd, +                                       (op_errstr)? ":":" ", +                                       (op_errstr)? op_errstr: " "); +                else +                        gf_cmd_log ("", "%s : SUCCESS", cmd); +        } + +        glusterd_submit_reply (req, arg, payload, payloadcount, iobref, +                               (xdrproc_t) xdrproc); + +        return ret; +} diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index 3084af9b..167bffaa 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -67,6 +67,11 @@ glusterd_submit_reply (rpcsvc_request_t *req, void *arg,                         struct iobref *iobref, xdrproc_t xdrproc);  int +glusterd_to_cli (rpcsvc_request_t *req, gf_cli_rsp *arg, struct iovec *payload, +                 int payloadcount, struct iobref *iobref, xdrproc_t xdrproc, +                 dict_t *dict); + +int  glusterd_submit_request (struct rpc_clnt *rpc, void *req,                           call_frame_t *frame, rpc_clnt_prog_t *prog,                           int procnum, struct iobref *iobref, diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index 8d7c8475..c6bde925 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -98,7 +98,6 @@ glusterd_handle_create_volume (rpcsvc_request_t *req)                            "name");                  goto out;          } -        gf_cmd_log ("Volume create", "on volname: %s attempted", volname);          if ((ret = glusterd_check_volume_exists (volname))) {                  snprintf(err_str, 2048, "Volume %s already exists", volname); @@ -153,11 +152,6 @@ glusterd_handle_create_volume (rpcsvc_request_t *req)                  free_ptr = brick_list;          } -        gf_cmd_log ("Volume create", "on volname: %s type:%s count:%d bricks:%s", -                    volname, ((type == 0)? "DEFAULT": -                    ((type == 1)? "STRIPE":"REPLICATE")), brick_count, bricks); - -          while ( i < brick_count) {                  i++;                  brick= strtok_r (brick_list, " \n", &tmpptr); @@ -193,21 +187,19 @@ glusterd_handle_create_volume (rpcsvc_request_t *req)                  goto out;          ret = glusterd_op_begin (req, GD_OP_CREATE_VOLUME, dict); -        gf_cmd_log ("Volume create", "on volname: %s %s", volname, -                    (ret != 0) ? "FAILED": "SUCCESS");  out:          if (ret) { -                if (dict) -                        dict_unref (dict);                  rsp.op_ret = -1;                  rsp.op_errno = 0;                  if (err_str[0] == '\0')                          snprintf (err_str, sizeof (err_str), "Operation failed");                  rsp.op_errstr = err_str;                  cli_rsp = &rsp; -                glusterd_submit_reply(req, cli_rsp, NULL, 0, NULL, -                                      (xdrproc_t)xdr_gf_cli_rsp); +                glusterd_to_cli (req, cli_rsp, NULL, 0, NULL, +                                 (xdrproc_t)xdr_gf_cli_rsp, dict); +                if (dict) +                        dict_unref (dict);                  ret = 0; //Client response sent, prevent second response          } @@ -270,12 +262,7 @@ glusterd_handle_cli_start_volume (rpcsvc_request_t *req)          ret = glusterd_op_begin (req, GD_OP_START_VOLUME, dict); -        gf_cmd_log ("volume start","on volname: %s %s", volname, -                    ((ret == 0) ? "SUCCESS": "FAILED")); -  out: -        if (ret && dict) -                dict_unref (dict);          free (cli_req.dict.dict_val); //its malloced by xdr          glusterd_friend_sm (); @@ -283,7 +270,9 @@ out:          if (ret)                  ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed"); +                                                     dict, "operation failed"); +        if (dict) +                dict_unref (dict);          return ret;  } @@ -334,8 +323,6 @@ glusterd_handle_cli_stop_volume (rpcsvc_request_t *req)                  "for volume %s", dup_volname);          ret = glusterd_op_begin (req, GD_OP_STOP_VOLUME, dict); -        gf_cmd_log ("Volume stop","on volname: %s %s", dup_volname, -                    ((ret)?"FAILED":"SUCCESS"));  out:          free (cli_req.dict.dict_val); //its malloced by xdr @@ -344,10 +331,10 @@ out:          glusterd_op_sm ();          if (ret) { +                ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, +                                                     dict, "operation failed");                  if (dict)                          dict_unref (dict); -                ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed");          }          return ret; @@ -394,26 +381,22 @@ glusterd_handle_cli_delete_volume (rpcsvc_request_t *req)                  goto out;          } -        gf_cmd_log ("Volume delete","on volname: %s attempted", volname); -          gf_log ("glusterd", GF_LOG_INFO, "Received delete vol req"                  "for volume %s", volname);          ret = glusterd_op_begin (req, GD_OP_DELETE_VOLUME, dict); -        gf_cmd_log ("Volume delete", "on volname: %s %s", volname, -                   ((ret) ? "FAILED" : "SUCCESS"));  out:          free (cli_req.dict.dict_val); //its malloced by xdr -        if (ret && dict) -                dict_unref (dict);          glusterd_friend_sm ();          glusterd_op_sm ();          if (ret) {                  ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, "operation failed"); +                                                     dict, "operation failed"); +                if (dict) +                        dict_unref (dict);          }          return ret; @@ -485,13 +468,7 @@ glusterd_handle_cli_heal_volume (rpcsvc_request_t *req)          ret = glusterd_op_begin (req, GD_OP_HEAL_VOLUME, dict); -        gf_cmd_log ("volume heal","on volname: %s %s", volname, -                    ((ret == 0) ? "SUCCESS": "FAILED")); -  out: -        if (ret && dict) -                dict_unref (dict); -          glusterd_friend_sm ();          glusterd_op_sm (); @@ -499,7 +476,9 @@ out:                  if (!op_errstr)                          op_errstr = gf_strdup ("operation failed");                  ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, -                                                     NULL, op_errstr); +                                                     dict, op_errstr); +                if (dict) +                        dict_unref (dict);                  GF_FREE (op_errstr);          } @@ -515,6 +494,7 @@ glusterd_handle_cli_statedump_volume (rpcsvc_request_t *req)          char                            *options = NULL;          dict_t                          *dict = NULL;          int32_t                         option_cnt = 0; +        glusterd_op_t                   cli_op = GD_OP_STATEDUMP_VOLUME;          GF_ASSERT (req); @@ -562,12 +542,13 @@ glusterd_handle_cli_statedump_volume (rpcsvc_request_t *req)          ret = glusterd_op_begin (req, GD_OP_STATEDUMP_VOLUME, dict); -        gf_cmd_log ("statedump", "on volume %s %s", volname, -                    ((0 == ret) ? "SUCCEEDED" : "FAILED")); -  out: -        if (ret && dict) -                dict_unref (dict); +        if (ret) { +                ret = glusterd_op_send_cli_response (cli_op, ret, 0, req, +                                                     dict, "Operation failed"); +                if (dict) +                        dict_unref (dict); +        }          free (cli_req.dict.dict_val);          glusterd_friend_sm ();          glusterd_op_sm();  | 
