diff options
Diffstat (limited to 'cli')
| -rw-r--r-- | cli/src/cli-cmd-parser.c | 92 | ||||
| -rw-r--r-- | cli/src/cli-cmd-volume.c | 215 | ||||
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 175 | ||||
| -rw-r--r-- | cli/src/cli.h | 4 | 
4 files changed, 200 insertions, 286 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index 3b81792dc2c..4181e6c8162 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -2339,3 +2339,95 @@ out:          return ret;  } + +int +cli_cmd_volume_defrag_parse (const char **words, int wordcount, +                             dict_t **options) +{ +        dict_t                 *dict = NULL; +        int                      ret = -1; +        char                *option  = NULL; +        char                *volname = NULL; +        char                *command = NULL; +        gf_cli_defrag_type       cmd = 0; + +        GF_ASSERT (words); +        GF_ASSERT (options); + +        dict = dict_new (); +        if (!dict) +                goto out; + +        if (!((wordcount == 4) || (wordcount == 5))) +                goto out; + +        if (wordcount == 4) { +                if (strcmp (words[3], "start") && strcmp (words[3], "stop") && +                    strcmp (words[3], "status")) +                            goto out; +        } else { +                if (strcmp (words[3], "fix-layout") && +                    strcmp (words[3], "start")) +                        goto out; +        } + +        volname = (char *) words[2]; + +        if (wordcount == 4) { +                command = (char *) words[3]; +        } +        if (wordcount == 5) { +               if ((strcmp (words[3], "fix-layout") || +                    strcmp (words[4], "start")) && +                    (strcmp (words[3], "start") || +                    strcmp (words[4], "force"))) { +                        ret = -1; +                        goto out; +                } +                command = (char *) words[3]; +                option = (char *) words[4]; +        } + +        if (strcmp (command, "start") == 0) { +                cmd = GF_DEFRAG_CMD_START; +                if (option && strcmp (option, "force") == 0) { +                                cmd = GF_DEFRAG_CMD_START_FORCE; +                        } +                goto done; +        } + +        if (strcmp (command, "fix-layout") == 0) { +                cmd = GF_DEFRAG_CMD_START_LAYOUT_FIX; +                goto done; +        } +        if (strcmp (command, "stop") == 0) { +                cmd = GF_DEFRAG_CMD_STOP; +                goto done; +        } +        if (strcmp (command, "status") == 0) { +                cmd = GF_DEFRAG_CMD_STATUS; +        } + +done: +        ret = dict_set_str (dict, "volname", volname); + +        if (ret) { +                gf_log (THIS->name, GF_LOG_ERROR, "failed to set dict"); +                goto out; +        } + +        ret = dict_set_int32 (dict, "rebalance-command", (int32_t) cmd); + +        if (ret) { +                gf_log (THIS->name, GF_LOG_ERROR, "failed to set dict"); +                goto out; +        } + +        *options = dict; + +out: +        if (ret && dict) +                dict_destroy (dict); + +        return ret; +} diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index b9bed82e115..ac70cd5c068 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -29,15 +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;       \ -                }                                           \ +#define CLI_LOCAL_INIT(local, words, frame, dictionary) \ +        do {                                                 \ +                local = cli_local_get ();                    \ +                                                             \ +                if (local) {                                 \ +                        local->words = words;                \ +                        if (dictionary)                      \ +                                local->dict = dictionary;    \ +                        if (frame)                           \ +                                frame->local = local;        \ +                }                                            \          } while (0)  extern struct rpc_clnt *global_rpc; @@ -163,7 +165,7 @@ 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); +        CLI_LOCAL_INIT (local, words, frame, dict);          if (proc->fn) {                  ret = proc->fn (frame, THIS, dict); @@ -176,9 +178,6 @@ out:                          cli_out ("Volume sync failed");          } -        if (dict) -                dict_unref (dict); -          CLI_STACK_DESTROY (frame);          return ret; @@ -348,15 +347,12 @@ cli_cmd_volume_create_cbk (struct cli_state *state, struct cli_cmd_word *word,          int32_t                 type = GF_CLUSTER_TYPE_NONE;          cli_local_t             *local = NULL; -          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_CREATE_VOLUME];          frame = create_frame (THIS, THIS->ctx->pool);          if (!frame)                  goto out; -        SAVE_WORDS_IN_LOCAL (local, words, frame); -          ret = cli_cmd_volume_create_parse (words, wordcount, &options);          if (ret) { @@ -395,13 +391,14 @@ cli_cmd_volume_create_cbk (struct cli_state *state, struct cli_cmd_word *word,                          goto out;                  }          } + +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          }  out: -        if (options) -                dict_unref (options);          if (ret) {                  cli_cmd_sent_status_get (&sent);                  if ((sent == 0) && (parse_error == 0)) @@ -427,6 +424,7 @@ cli_cmd_volume_delete_cbk (struct cli_state *state, struct cli_cmd_word *word,          int                     sent = 0;          int                     parse_error = 0;          cli_local_t             *local = NULL; +        dict_t                  *dict = NULL;          question = "Deleting volume will erase all information about the volume. "                     "Do you want to continue?"; @@ -436,7 +434,9 @@ 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); +        dict = dict_new (); +        if (!dict) +                goto out;          if (wordcount != 3) {                  cli_usage_out (word->pattern); @@ -453,8 +453,17 @@ cli_cmd_volume_delete_cbk (struct cli_state *state, struct cli_cmd_word *word,          volname = (char *)words[2]; +        ret = dict_set_str (dict, "volname", volname); + +        if (ret) { +                gf_log (THIS->name, GF_LOG_WARNING, "dict set failed"); +                goto out; +        } + +        CLI_LOCAL_INIT (local, words, frame, dict); +          if (proc->fn) { -                ret = proc->fn (frame, THIS, volname); +                ret = proc->fn (frame, THIS, dict);          }  out: @@ -492,8 +501,6 @@ 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; @@ -533,13 +540,13 @@ cli_cmd_volume_start_cbk (struct cli_state *state, struct cli_cmd_word *word,          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_START_VOLUME]; +        CLI_LOCAL_INIT (local, words, frame, dict); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, dict);          }  out: -        if (dict) -                dict_unref (dict);          if (ret) {                  cli_cmd_sent_status_get (&sent);                  if ((sent == 0) && (parse_error == 0)) @@ -615,8 +622,6 @@ 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; @@ -658,6 +663,8 @@ cli_cmd_volume_stop_cbk (struct cli_state *state, struct cli_cmd_word *word,          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_STOP_VOLUME]; +        CLI_LOCAL_INIT (local, words, frame, dict); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, dict);          } @@ -668,8 +675,6 @@ out:                  if ((sent == 0) && (parse_error == 0))                          cli_out ("Volume stop on '%s' failed", volname);          } -        if (dict) -                dict_unref (dict);          CLI_STACK_DESTROY (frame); @@ -754,72 +759,22 @@ 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; +        ret = cli_cmd_volume_defrag_parse (words, wordcount, &dict); -        if (!((wordcount == 4) || (wordcount == 5))) { +        if (ret) {                  cli_usage_out (word->pattern);                  parse_error = 1; -                goto out; -        } - -        if (wordcount == 4) { -                if (strcmp (words[3], "start") && strcmp (words[3], "stop") && -                    strcmp (words[3], "status")) { -                            cli_usage_out (word->pattern); -                            parse_error = 1; -                            goto out; -                    } -        } else { -                if (strcmp (words[3], "fix-layout") && -                    strcmp (words[3], "start")) { -                        cli_usage_out (word->pattern); -                        parse_error = 1; -                        goto out; -                } -        } - -        ret = dict_set_str (dict, "volname", (char *)words[2]); -        if (ret) -                goto out; - -        if (wordcount == 4) { -                ret = dict_set_str (dict, "command", (char *)words[3]); -                if (ret) -                        goto out; -        } -        if (wordcount == 5) { -               if ((strcmp (words[3], "fix-layout") || -                    strcmp (words[4], "start")) && -                    (strcmp (words[3], "start") || -                    strcmp (words[4], "force"))) { -                        cli_usage_out (word->pattern); -                        parse_error = 1; -                        ret = -1; -                        goto out; -                } - -                ret = dict_set_str (dict, "option", (char *)words[4]); -                if (ret) -                        goto out; -                ret = dict_set_str (dict, "command", (char *)words[3]); -                if (ret) -                        goto out;          }          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_DEFRAG_VOLUME]; +        CLI_LOCAL_INIT (local, words, frame, dict); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, dict);          }  out: -        if (dict) -                dict_destroy (dict); -          if (ret) {                  cli_cmd_sent_status_get (&sent);                  if ((sent == 0) && (parse_error == 0)) @@ -837,7 +792,6 @@ cli_cmd_volume_reset_cbk (struct cli_state *state, struct cli_cmd_word *word,  {          int                     sent = 0;          int                     parse_error = 0; -          int                     ret = -1;          rpc_clnt_procedure_t    *proc = NULL;          call_frame_t            *frame = NULL; @@ -850,24 +804,20 @@ 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) {                  cli_usage_out (word->pattern);                  parse_error = 1;                  goto out;          } +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          }  out: -        if (options) -                dict_unref (options); -          if (ret) {                  cli_cmd_sent_status_get (&sent);                  if ((sent == 0) && (parse_error == 0)) @@ -907,16 +857,13 @@ 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); +        CLI_LOCAL_INIT (local, words, frame, options);          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          }  out: -        if (options) -                dict_unref (options); -          if (ret) {                  cli_cmd_sent_status_get (&sent);                  if ((sent == 0) && (parse_error == 0)) @@ -948,24 +895,20 @@ 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) {                  cli_usage_out (word->pattern);                  parse_error = 1;                  goto out;          } +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          }  out: -        if (options) -                dict_unref (options); -          if (ret) {                  cli_cmd_sent_status_get (&sent);                  if ((sent == 0) && (parse_error == 0)) @@ -1002,10 +945,7 @@ 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) {                  cli_usage_out (word->pattern);                  parse_error = 1; @@ -1025,14 +965,13 @@ cli_cmd_volume_add_brick_cbk (struct cli_state *state,          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_ADD_BRICK]; +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          }  out: -        if (options) -                dict_unref (options); -          if (ret) {                  cli_cmd_sent_status_get (&sent);                  if ((sent == 0) && (parse_error == 0)) @@ -1072,9 +1011,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);                  parse_err = 1; @@ -1086,13 +1024,12 @@ cli_cmd_quota_cbk (struct cli_state *state, struct cli_cmd_word *word,                          goto out;          } +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn)                  ret = proc->fn (frame, THIS, options);  out: -        if (options) -                dict_unref (options); -          if (ret && parse_err == 0)                  cli_out ("Quota command failed"); @@ -1124,11 +1061,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); -          if (ret) {                  cli_usage_out (word->pattern);                  parse_error = 1; @@ -1146,6 +1080,8 @@ cli_cmd_volume_remove_brick_cbk (struct cli_state *state,          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_REMOVE_BRICK]; +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          } @@ -1157,9 +1093,6 @@ out:                          cli_out ("Volume remove-brick failed");          } -        if (options) -                dict_unref (options); -          CLI_STACK_DESTROY (frame);          return ret; @@ -1190,8 +1123,6 @@ 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) { @@ -1200,14 +1131,13 @@ cli_cmd_volume_replace_brick_cbk (struct cli_state *state,                  goto out;          } +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          }  out: -        if (options) -                dict_unref (options); -          if (ret) {                  cli_cmd_sent_status_get (&sent);                  if ((sent == 0) && (parse_error == 0)) @@ -1256,16 +1186,13 @@ 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); +        CLI_LOCAL_INIT (local, words, frame, options);          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          }  out: -        if (options) -                dict_unref (options); -          if (ret) {                  cli_cmd_sent_status_get (&sent);                  if ((sent == 0) && (parse_error == 0)) @@ -1303,20 +1230,17 @@ 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; +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          }  out: -        if (options) -                dict_unref (options); -          if (ret) {                  cli_cmd_sent_status_get (&sent);                  if ((sent == 0) && (parse_error == 0)) @@ -1410,8 +1334,6 @@ 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); @@ -1419,13 +1341,12 @@ cli_cmd_volume_gsync_set_cbk (struct cli_state *state, struct cli_cmd_word *word                  goto out;          } +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn)                  ret = proc->fn (frame, THIS, options);  out: -        if (options) -                dict_unref (options); -          if (ret && parse_err == 0)                  cli_out (GEOREP" command failed"); @@ -1472,14 +1393,11 @@ cli_cmd_volume_status_cbk (struct cli_state *state,          if (!frame)                  goto out; -        SAVE_WORDS_IN_LOCAL (local, words, frame); +        CLI_LOCAL_INIT (local, words, frame, dict);          ret = proc->fn (frame, THIS, dict); - out: -        if (dict) -                dict_unref (dict); - +out:          CLI_STACK_DESTROY (frame);          return ret; @@ -1680,8 +1598,6 @@ cli_cmd_volume_heal_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; @@ -1697,6 +1613,8 @@ cli_cmd_volume_heal_cbk (struct cli_state *state, struct cli_cmd_word *word,          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_HEAL_VOLUME]; +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          } @@ -1708,9 +1626,6 @@ out:                          cli_out ("Volume heal failed");          } -        if (options) -                dict_unref (options); -          CLI_STACK_DESTROY (frame);          return ret; @@ -1732,8 +1647,6 @@ cli_cmd_volume_statedump_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; @@ -1757,6 +1670,9 @@ cli_cmd_volume_statedump_cbk (struct cli_state *state, struct cli_cmd_word *word                  goto out;          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_STATEDUMP_VOLUME]; + +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          } @@ -1820,8 +1736,6 @@ cli_cmd_volume_clearlocks_cbk (struct cli_state *state,          if (!frame)                  goto out; -        SAVE_WORDS_IN_LOCAL (local, words, frame); -          if (wordcount < 7 || wordcount > 8) {                  cli_usage_out (word->pattern);                  parse_error = 1; @@ -1846,6 +1760,9 @@ cli_cmd_volume_clearlocks_cbk (struct cli_state *state,                  goto out;          proc = &cli_rpc_prog->proctable[GLUSTER_CLI_CLRLOCKS_VOLUME]; + +        CLI_LOCAL_INIT (local, words, frame, options); +          if (proc->fn) {                  ret = proc->fn (frame, THIS, options);          } diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 368a03cc092..104bca1ec75 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -776,7 +776,6 @@ gf_cli_create_volume_cbk (struct rpc_req *req, struct iovec *iov,          }          local = ((call_frame_t *) (myframe))->local; -        ((call_frame_t *) (myframe))->local = NULL;          ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp);          if (ret < 0) { @@ -814,10 +813,6 @@ gf_cli_create_volume_cbk (struct rpc_req *req, struct iovec *iov,  out:          cli_cmd_broadcast_response (ret); -        if (dict) -                dict_unref (dict); -        if (local) -                cli_local_wipe (local);          free (rsp.dict.dict_val);          free (rsp.op_errstr);          return ret; @@ -846,7 +841,6 @@ gf_cli_delete_volume_cbk (struct rpc_req *req, struct iovec *iov,          frame = myframe;          local = frame->local; -        frame->local = NULL;          if (local)                  dict = local->dict; @@ -882,10 +876,7 @@ gf_cli_delete_volume_cbk (struct rpc_req *req, struct iovec *iov,  out:          cli_cmd_broadcast_response (ret); -        cli_local_wipe (local);          free (rsp.dict.dict_val); -        if (dict) -                dict_unref (dict);          gf_log ("", GF_LOG_INFO, "Returning with %d", ret);          return ret; @@ -914,10 +905,8 @@ gf_cli_start_volume_cbk (struct rpc_req *req, struct iovec *iov,          frame = myframe; -        if (frame) { +        if (frame)                  local = frame->local; -                frame->local = NULL; -        }          if (local)                  dict = local->dict; @@ -953,12 +942,8 @@ gf_cli_start_volume_cbk (struct rpc_req *req, struct iovec *iov,  out:          cli_cmd_broadcast_response (ret); -        if (local) -                cli_local_wipe (local);          free (rsp.dict.dict_val);          free (rsp.op_errstr); -        if (dict) -                dict_unref (dict);          return ret;  } @@ -985,10 +970,8 @@ gf_cli_stop_volume_cbk (struct rpc_req *req, struct iovec *iov,          frame = myframe; -        if (frame) { +        if (frame)                  local = frame->local; -                frame->local = NULL; -        }          if (local) {                  dict = local->dict; @@ -1026,8 +1009,6 @@ out:          cli_cmd_broadcast_response (ret);          free (rsp.op_errstr);          free (rsp.dict.dict_val); -        if (local) -                cli_local_wipe (local);          return ret;  } @@ -1071,14 +1052,11 @@ gf_cli_defrag_volume_cbk (struct rpc_req *req, struct iovec *iov,          frame = myframe; -        if (frame) { +        if (frame)                  local = frame->local; -                frame->local = NULL; -        } -        if (local) { +        if (local)                  local_dict = local->dict; -        }          ret = dict_get_str (local_dict, "volname", &volname);          if (ret) { @@ -1260,10 +1238,6 @@ out:          free (rsp.dict.dict_val); //malloced by xdr          if (dict)                  dict_unref (dict); -        if (local_dict) -                dict_unref (local_dict); -        if (local) -                cli_local_wipe (local);          cli_cmd_broadcast_response (ret);          return ret;  } @@ -1424,6 +1398,8 @@ gf_cli_set_volume_cbk (struct rpc_req *req, struct iovec *iov,          ret = rsp.op_ret;  out: +        if (dict) +                dict_unref (dict);          cli_cmd_broadcast_response (ret);          return ret;  } @@ -1722,14 +1698,6 @@ gf_cli_remove_brick_cbk (struct rpc_req *req, struct iovec *iov,          ret = rsp.op_ret;  out: -        if (frame) -                frame->local = NULL; - -        if (local) { -                dict_unref (local->dict); -                cli_local_wipe (local); -        } -          cli_cmd_broadcast_response (ret);          free (rsp.dict.dict_val);          free (rsp.op_errstr); @@ -1889,14 +1857,6 @@ gf_cli_replace_brick_cbk (struct rpc_req *req, struct iovec *iov,          ret = rsp.op_ret;  out: -        if (frame) -                frame->local = NULL; - -        if (local) { -                dict_unref (local->dict); -                cli_local_wipe (local); -        } -          cli_cmd_broadcast_response (ret);          free (rsp.dict.dict_val);          if (rsp_dict) @@ -2237,6 +2197,8 @@ xml_output:          ret = rsp.op_ret;  out:          cli_cmd_broadcast_response (ret); +        if (dict) +                dict_unref (dict);          free (rsp.dict.dict_val); @@ -2543,7 +2505,7 @@ gf_cli_create_volume (call_frame_t *frame, xlator_t *this,                  goto out;          } -        dict = dict_ref ((dict_t *)data); +        dict = data;          ret = cli_to_glusterd (&req, frame, gf_cli_create_volume_cbk,                                 (xdrproc_t) xdr_gf_cli_req, dict, @@ -2571,12 +2533,7 @@ gf_cli_delete_volume (call_frame_t *frame, xlator_t *this,                  goto out;          } -        dict = dict_new (); -        ret = dict_set_str (dict, "volname", data); -        if (ret) { -                gf_log (THIS->name, GF_LOG_WARNING, "dict set failed"); -                goto out; -        } +        dict = data;          ret = cli_to_glusterd (&req, frame, gf_cli_delete_volume_cbk,                                 (xdrproc_t) xdr_gf_cli_req, dict, @@ -2648,11 +2605,7 @@ gf_cli_defrag_volume (call_frame_t *frame, xlator_t *this,  {          gf_cli_req              req     =  {{0,}};          int                     ret     = 0; -        char                   *volname = NULL; -        char                   *cmd_str = NULL;          dict_t                 *dict    = NULL; -        gf_cli_defrag_type      cmd     = 0; -        dict_t                  *req_dict = NULL;          if (!frame || !this ||  !data) {                  ret = -1; @@ -2661,63 +2614,8 @@ gf_cli_defrag_volume (call_frame_t *frame, xlator_t *this,          dict = data; -        ret = dict_get_str (dict, "volname", &volname); -        if (ret) -                gf_log ("", GF_LOG_DEBUG, "error"); - -        ret = dict_get_str (dict, "command", &cmd_str); -        if (ret) { -                gf_log ("", GF_LOG_DEBUG, "error"); -                goto out; -        } - -        if (strcmp (cmd_str, "start") == 0) { -                cmd = GF_DEFRAG_CMD_START; -                ret = dict_get_str (dict, "option", &cmd_str); -                if (!ret) { -                        if (strcmp (cmd_str, "force") == 0) { -                                cmd = GF_DEFRAG_CMD_START_FORCE; -                        } -                } -                goto done; -        } - -        if (strcmp (cmd_str, "fix-layout") == 0) { -                cmd = GF_DEFRAG_CMD_START_LAYOUT_FIX; -                goto done; -        } -        if (strcmp (cmd_str, "stop") == 0) { -                cmd = GF_DEFRAG_CMD_STOP; -                goto done; -        } -        if (strcmp (cmd_str, "status") == 0) { -                cmd = GF_DEFRAG_CMD_STATUS; -        } - -done: - -        req_dict = dict_new (); -        if (!req_dict) { -                ret = -1; -                goto out; -        } - -        ret = dict_set_str (req_dict, "volname", volname); -        if (ret) { -                gf_log (THIS->name, GF_LOG_ERROR, -                        "Failed to set dict"); -                goto out; -        } - -        ret = dict_set_int32 (req_dict, "rebalance-command", (int32_t) cmd); -        if (ret) { -                gf_log (THIS->name, GF_LOG_ERROR, -                        "Failed to set dict"); -                goto out; -        } -          ret = cli_to_glusterd (&req, frame, gf_cli_defrag_volume_cbk, -                               (xdrproc_t) xdr_gf_cli_req, req_dict, +                               (xdrproc_t) xdr_gf_cli_req, dict,                                 GLUSTER_CLI_DEFRAG_VOLUME, this, cli_rpc_prog,                                 NULL); @@ -2840,7 +2738,6 @@ gf_cli_add_brick (call_frame_t *frame, xlator_t *this,          if (ret)                  goto out; -          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); @@ -2925,6 +2822,8 @@ gf_cli_remove_brick (call_frame_t *frame, xlator_t *this,                  }  out: +        if (req_dict) +                dict_unref (req_dict);          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret);          GF_FREE (req.dict.dict_val); @@ -3019,7 +2918,6 @@ gf_cli_log_rotate (call_frame_t *frame, xlator_t *this,                                 GLUSTER_CLI_LOG_ROTATE, this, cli_rpc_prog,                                 NULL); -  out:          gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); @@ -3442,7 +3340,8 @@ gf_cli_gsync_set_cbk (struct rpc_req *req, struct iovec *iov,          }  out: - +        if (dict) +                dict_unref (dict);          cli_cmd_broadcast_response (ret);          free (rsp.dict.dict_val); @@ -5204,8 +5103,9 @@ gf_cli_status_cbk (struct rpc_req *req, struct iovec *iov,                  goto out;          if ((cmd & GF_CLI_STATUS_ALL)) { -                if (local) { -                        local->dict = dict; +                if (local && local->dict) { +                        dict_ref (dict); +                        ret = dict_set_static_ptr (local->dict, "rsp-dict", dict);                          ret = 0;                  } else {                          gf_log ("cli", GF_LOG_ERROR, "local not found"); @@ -5352,6 +5252,8 @@ cont:          ret = rsp.op_ret;  out: +        if (dict) +                dict_unref (dict);          GF_FREE (status.brick);          cli_cmd_broadcast_response (ret); @@ -5389,27 +5291,29 @@ gf_cli_status_volume_all (call_frame_t *frame, xlator_t *this, void *data)          uint32_t         cmd          = 0;          char             key[1024]    = {0};          char            *volname      = NULL; -        dict_t          *vol_dict     = NULL; +        void            *vol_dict     = NULL;          dict_t          *dict         = NULL;          cli_local_t     *local        = NULL; -        dict = (dict_t *)data; -        ret = dict_get_uint32 (dict, "cmd", &cmd); -        if (ret) -                goto out; -          if (frame->local) {                  local = frame->local;                  local->all = _gf_true;          } +        ret = dict_get_uint32 (local->dict, "cmd", &cmd); +        if (ret) +                goto out; + +          ret = gf_cli_status_volume (frame, this, data);          if (ret)                  goto out; -        vol_dict =  local->dict; +        ret = dict_get_ptr (local->dict, "rsp-dict", &vol_dict); +        if (ret) +                goto out; -        ret = dict_get_int32 (vol_dict, "vol_count", &vol_count); +        ret = dict_get_int32 ((dict_t *)vol_dict, "vol_count", &vol_count);          if (ret) {                  cli_err ("Failed to get names of volumes");                  goto out; @@ -5437,7 +5341,7 @@ gf_cli_status_volume_all (call_frame_t *frame, xlator_t *this, void *data)                  if (ret)                          goto out; -                ret = dict_set_dynstr (dict, "volname", volname); +                ret = dict_set_str (dict, "volname", volname);                  if (ret)                          goto out; @@ -5455,10 +5359,12 @@ gf_cli_status_volume_all (call_frame_t *frame, xlator_t *this, void *data)   out:          if (ret)                  gf_log ("cli", GF_LOG_ERROR, "status all failed"); + +        if (vol_dict) +                dict_unref (vol_dict); +          if (ret && dict)                  dict_unref (dict); -        if (frame) -                frame->local = NULL;          return ret;  } @@ -5673,10 +5579,8 @@ gf_cli_heal_volume_cbk (struct rpc_req *req, struct iovec *iov,          frame = myframe; -        if (frame) { +        if (frame)                  local = frame->local; -                frame->local = NULL; -        }          if (local) {                  input_dict = local->dict; @@ -5764,8 +5668,6 @@ gf_cli_heal_volume_cbk (struct rpc_req *req, struct iovec *iov,  out:          cli_cmd_broadcast_response (ret); -        if (local) -                cli_local_wipe (local);          free (rsp.op_errstr);          if (dict)                  dict_unref (dict); @@ -6029,6 +5931,8 @@ gf_cli_clearlocks_volume_cbk (struct rpc_req *req, struct iovec *iov,          ret = rsp.op_ret;  out: +        if (dict) +                dict_unref (dict);          cli_cmd_broadcast_response (ret);          return ret;  } @@ -6088,7 +5992,6 @@ cli_to_glusterd (gf_cli_req *req, call_frame_t *frame,          }          words = local->words; -        local->dict = dict_ref (dict);          while (words[i])                  len += strlen (words[i++]) + 1; @@ -6124,8 +6027,6 @@ cli_to_glusterd (gf_cli_req *req, call_frame_t *frame,                                cbkfn, (xdrproc_t) xdrproc);  out: -        if (dict) -                dict_unref (dict);          return ret;  } diff --git a/cli/src/cli.h b/cli/src/cli.h index 0299220cea1..7aa2148f494 100644 --- a/cli/src/cli.h +++ b/cli/src/cli.h @@ -273,6 +273,10 @@ cli_cmd_volume_heal_options_parse (const char **words, int wordcount,                                     dict_t **options);  int +cli_cmd_volume_defrag_parse (const char **words, int wordcount, +                             dict_t **options); + +int  cli_print_brick_status (cli_volume_status_t *status);  void  | 
