diff options
author | Gluster Ant <bugzilla-bot@gluster.org> | 2018-09-12 17:52:45 +0530 |
---|---|---|
committer | Nigel Babu <nigelb@redhat.com> | 2018-09-12 17:52:45 +0530 |
commit | e16868dede6455cab644805af6fe1ac312775e13 (patch) | |
tree | 15aebdb4fff2d87cf8a72f836816b3aa634da58d /cli/src | |
parent | 45a71c0548b6fd2c757aa2e7b7671a1411948894 (diff) |
Land part 2 of clang-format changes
Change-Id: Ia84cc24c8924e6d22d02ac15f611c10e26db99b4
Signed-off-by: Nigel Babu <nigelb@redhat.com>
Diffstat (limited to 'cli/src')
-rw-r--r-- | cli/src/cli-cmd-global.c | 176 | ||||
-rw-r--r-- | cli/src/cli-cmd-misc.c | 149 | ||||
-rw-r--r-- | cli/src/cli-cmd-parser.c | 9435 | ||||
-rw-r--r-- | cli/src/cli-cmd-peer.c | 432 | ||||
-rw-r--r-- | cli/src/cli-cmd-snapshot.c | 206 | ||||
-rw-r--r-- | cli/src/cli-cmd-system.c | 953 | ||||
-rw-r--r-- | cli/src/cli-cmd-volume.c | 5579 | ||||
-rw-r--r-- | cli/src/cli-cmd.c | 541 | ||||
-rw-r--r-- | cli/src/cli-quotad-client.c | 199 | ||||
-rw-r--r-- | cli/src/cli-rl.c | 502 | ||||
-rw-r--r-- | cli/src/cli-rpc-ops.c | 20062 | ||||
-rw-r--r-- | cli/src/cli-xml-output.c | 9924 | ||||
-rw-r--r-- | cli/src/cli.c | 1115 | ||||
-rw-r--r-- | cli/src/input.c | 102 | ||||
-rw-r--r-- | cli/src/registry.c | 495 |
15 files changed, 24747 insertions, 25123 deletions
diff --git a/cli/src/cli-cmd-global.c b/cli/src/cli-cmd-global.c index 3c8ae227ca7..e1bedf13542 100644 --- a/cli/src/cli-cmd-global.c +++ b/cli/src/cli-cmd-global.c @@ -30,111 +30,109 @@ extern rpc_clnt_prog_t *cli_rpc_prog; int -cli_cmd_global_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount); +cli_cmd_global_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount); int -cli_cmd_get_state_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount); +cli_cmd_get_state_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount); struct cli_cmd global_cmds[] = { - { "global help", - cli_cmd_global_help_cbk, - "list global commands", - }, - { "get-state [<daemon>] [[odir </path/to/output/dir/>] " - "[file <filename>]] [detail|volumeoptions]", - cli_cmd_get_state_cbk, - "Get local state representation of mentioned daemon", - }, - {NULL, NULL, NULL} -}; + { + "global help", + cli_cmd_global_help_cbk, + "list global commands", + }, + { + "get-state [<daemon>] [[odir </path/to/output/dir/>] " + "[file <filename>]] [detail|volumeoptions]", + cli_cmd_get_state_cbk, + "Get local state representation of mentioned daemon", + }, + {NULL, NULL, NULL}}; int -cli_cmd_global_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount) +cli_cmd_global_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount) { - struct cli_cmd *cmd = NULL; - struct cli_cmd *global_cmd = NULL; - int count = 0; - - cmd = GF_MALLOC (sizeof (global_cmds), cli_mt_cli_cmd); - memcpy (cmd, global_cmds, sizeof (global_cmds)); - count = (sizeof (global_cmds) / sizeof (struct cli_cmd)); - cli_cmd_sort (cmd, count); - - cli_out ("\ngluster global commands"); - cli_out ("========================\n"); - for (global_cmd = cmd; global_cmd->pattern; global_cmd++) - if (_gf_false == global_cmd->disable) - cli_out ("%s - %s", global_cmd->pattern, - global_cmd->desc); - - cli_out ("\n"); - GF_FREE (cmd); - return 0; + struct cli_cmd *cmd = NULL; + struct cli_cmd *global_cmd = NULL; + int count = 0; + + cmd = GF_MALLOC(sizeof(global_cmds), cli_mt_cli_cmd); + memcpy(cmd, global_cmds, sizeof(global_cmds)); + count = (sizeof(global_cmds) / sizeof(struct cli_cmd)); + cli_cmd_sort(cmd, count); + + cli_out("\ngluster global commands"); + cli_out("========================\n"); + for (global_cmd = cmd; global_cmd->pattern; global_cmd++) + if (_gf_false == global_cmd->disable) + cli_out("%s - %s", global_cmd->pattern, global_cmd->desc); + + cli_out("\n"); + GF_FREE(cmd); + return 0; } int -cli_cmd_global_register (struct cli_state *state) +cli_cmd_global_register(struct cli_state *state) { - int ret = 0; - struct cli_cmd *cmd = NULL; - for (cmd = global_cmds; cmd->pattern; cmd++) { - ret = cli_cmd_register (&state->tree, cmd); - if (ret) - goto out; - } + int ret = 0; + struct cli_cmd *cmd = NULL; + for (cmd = global_cmds; cmd->pattern; cmd++) { + ret = cli_cmd_register(&state->tree, cmd); + if (ret) + goto out; + } out: - return ret; - + return ret; } int -cli_cmd_get_state_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_get_state_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int sent = 0; - int parse_error = 0; - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - cli_local_t *local = NULL; - char *op_errstr = NULL; - - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; - - ret = cli_cmd_get_state_parse (state, words, wordcount, &options, - &op_errstr); - - if (ret) { - if (op_errstr) { - cli_err ("%s", op_errstr); - cli_usage_out (word->pattern); - GF_FREE (op_errstr); - } else - cli_usage_out (word->pattern); - - parse_error = 1; - goto out; - } - - CLI_LOCAL_INIT (local, words, frame, options); - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GET_STATE]; - if (proc->fn) - ret = proc->fn (frame, THIS, options); + int sent = 0; + int parse_error = 0; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *options = NULL; + cli_local_t *local = NULL; + char *op_errstr = NULL; + + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + + ret = cli_cmd_get_state_parse(state, words, wordcount, &options, + &op_errstr); + + if (ret) { + if (op_errstr) { + cli_err("%s", op_errstr); + cli_usage_out(word->pattern); + GF_FREE(op_errstr); + } else + cli_usage_out(word->pattern); + + parse_error = 1; + goto out; + } + + CLI_LOCAL_INIT(local, words, frame, options); + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GET_STATE]; + if (proc->fn) + ret = proc->fn(frame, THIS, options); out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Getting daemon state failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Getting daemon state failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } - diff --git a/cli/src/cli-cmd-misc.c b/cli/src/cli-cmd-misc.c index c887515af85..04dd2efc220 100644 --- a/cli/src/cli-cmd-misc.c +++ b/cli/src/cli-cmd-misc.c @@ -35,107 +35,98 @@ extern struct cli_cmd global_cmds[]; struct cli_cmd cli_misc_cmds[]; int -cli_cmd_quit_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_quit_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - exit (0); + exit(0); } - static gf_boolean_t -cli_is_help_command (const char *pattern) +cli_is_help_command(const char *pattern) { - /* FixFixFix - * This is not the best way to determine whether - * this is a help command - */ - if (strstr (pattern, "help")) - return _gf_true; - - return _gf_false; + /* FixFixFix + * This is not the best way to determine whether + * this is a help command + */ + if (strstr(pattern, "help")) + return _gf_true; + + return _gf_false; } - int -cli_cmd_display_help (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount) +cli_cmd_display_help(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount) { - struct cli_cmd *cmd[] = {cli_misc_cmds, cli_probe_cmds, - volume_cmds, bitrot_cmds, quota_cmds, + struct cli_cmd *cmd[] = { + cli_misc_cmds, + cli_probe_cmds, + volume_cmds, + bitrot_cmds, + quota_cmds, #if !defined(__NetBSD__) - tier_cmds, + tier_cmds, #endif - snapshot_cmds, global_cmds, NULL}; - struct cli_cmd *cmd_ind = NULL; - int i = 0; - gf_boolean_t list_all = _gf_false; - - /* cli_system_cmds commands for internal usage - they are not exposed - */ - - /* If "help all" */ - if (wordcount == 2) - list_all = _gf_true; - - for (i = 0; cmd[i] != NULL; i++) { - for (cmd_ind = cmd[i]; cmd_ind->pattern; cmd_ind++) { - if ((_gf_false == cmd_ind->disable) && - cli_is_help_command (cmd_ind->pattern)) { - if (list_all && (cmd_ind->cbk)) { - cmd_ind->cbk (state, in_word, words, - wordcount); - } else { - cli_out (" %-25s- %s", cmd_ind->pattern, - cmd_ind->desc); - } - } + snapshot_cmds, + global_cmds, + NULL + }; + struct cli_cmd *cmd_ind = NULL; + int i = 0; + gf_boolean_t list_all = _gf_false; + + /* cli_system_cmds commands for internal usage + they are not exposed + */ + + /* If "help all" */ + if (wordcount == 2) + list_all = _gf_true; + + for (i = 0; cmd[i] != NULL; i++) { + for (cmd_ind = cmd[i]; cmd_ind->pattern; cmd_ind++) { + if ((_gf_false == cmd_ind->disable) && + cli_is_help_command(cmd_ind->pattern)) { + if (list_all && (cmd_ind->cbk)) { + cmd_ind->cbk(state, in_word, words, wordcount); + } else { + cli_out(" %-25s- %s", cmd_ind->pattern, cmd_ind->desc); } + } } + } - cli_out ("\n"); - return 0; + cli_out("\n"); + return 0; } - struct cli_cmd cli_help_cmds[] = { - { "help [all]", - cli_cmd_display_help, - "display help for command classes"}, - - { NULL, NULL, NULL } -}; - + {"help [all]", cli_cmd_display_help, "display help for command classes"}, -struct cli_cmd cli_misc_cmds[] = { - { "quit", - cli_cmd_quit_cbk, - "quit"}, - { "exit", - cli_cmd_quit_cbk, - "exit"}, + {NULL, NULL, NULL}}; - { NULL, NULL, NULL } -}; +struct cli_cmd cli_misc_cmds[] = {{"quit", cli_cmd_quit_cbk, "quit"}, + {"exit", cli_cmd_quit_cbk, "exit"}, + {NULL, NULL, NULL}}; int -cli_cmd_misc_register (struct cli_state *state) +cli_cmd_misc_register(struct cli_state *state) { - int ret = 0; - struct cli_cmd *cmd = NULL; - - for (cmd = cli_misc_cmds; cmd->pattern; cmd++) { - ret = cli_cmd_register (&state->tree, cmd); - if (ret) - goto out; - } - - for (cmd = cli_help_cmds; cmd->pattern; cmd++) { - ret = cli_cmd_register (&state->tree, cmd); - if (ret) - goto out; - } + int ret = 0; + struct cli_cmd *cmd = NULL; + + for (cmd = cli_misc_cmds; cmd->pattern; cmd++) { + ret = cli_cmd_register(&state->tree, cmd); + if (ret) + goto out; + } + + for (cmd = cli_help_cmds; cmd->pattern; cmd++) { + ret = cli_cmd_register(&state->tree, cmd); + if (ret) + goto out; + } out: - return ret; + return ret; } diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index 48d6ebd64a7..3f9056b5d9e 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -27,2726 +27,2794 @@ #define MAX_SNAP_DESCRIPTION_LEN 1024 struct snap_config_opt_vals_ snap_confopt_vals[] = { - {.op_name = "snap-max-hard-limit", - .question = "Changing snapshot-max-hard-limit " - "will limit the creation of new snapshots " - "if they exceed the new limit.\n" - "Do you want to continue?" - }, - {.op_name = "snap-max-soft-limit", - .question = "If Auto-delete is enabled, snap-max-soft-limit will" - " trigger deletion of oldest snapshot, on the " - "creation of new snapshot, when the " - "snap-max-soft-limit is reached.\n" - "Do you want to change the snap-max-soft-limit?" - }, - {.op_name = "both", - .question = "Changing snapshot-max-hard-limit " - "will limit the creation of new snapshots " - "if they exceed the new snapshot-max-hard-limit.\n" - "If Auto-delete is enabled, snap-max-soft-limit will" - " trigger deletion of oldest snapshot, on the " - "creation of new snapshot, when the " - "snap-max-soft-limit is reached.\n" - "Do you want to continue?" - }, - {.op_name = NULL, - } -}; + {.op_name = "snap-max-hard-limit", + .question = "Changing snapshot-max-hard-limit " + "will limit the creation of new snapshots " + "if they exceed the new limit.\n" + "Do you want to continue?"}, + {.op_name = "snap-max-soft-limit", + .question = "If Auto-delete is enabled, snap-max-soft-limit will" + " trigger deletion of oldest snapshot, on the " + "creation of new snapshot, when the " + "snap-max-soft-limit is reached.\n" + "Do you want to change the snap-max-soft-limit?"}, + {.op_name = "both", + .question = "Changing snapshot-max-hard-limit " + "will limit the creation of new snapshots " + "if they exceed the new snapshot-max-hard-limit.\n" + "If Auto-delete is enabled, snap-max-soft-limit will" + " trigger deletion of oldest snapshot, on the " + "creation of new snapshot, when the " + "snap-max-soft-limit is reached.\n" + "Do you want to continue?"}, + { + .op_name = NULL, + }}; enum cli_snap_config_set_types { - GF_SNAP_CONFIG_SET_HARD = 0, - GF_SNAP_CONFIG_SET_SOFT = 1, - GF_SNAP_CONFIG_SET_BOTH = 2, + GF_SNAP_CONFIG_SET_HARD = 0, + GF_SNAP_CONFIG_SET_SOFT = 1, + GF_SNAP_CONFIG_SET_BOTH = 2, }; typedef enum cli_snap_config_set_types cli_snap_config_set_types; typedef struct _cli_brick { - struct list_head list; - const char *name; - int32_t len; + struct list_head list; + const char *name; + int32_t len; } cli_brick_t; int -cli_cmd_validate_volume (char *volname); +cli_cmd_validate_volume(char *volname); static const char * -id_sel (void *wcon) +id_sel(void *wcon) { - return (const char *)wcon; + return (const char *)wcon; } static char * -str_getunamb (const char *tok, char **opwords) +str_getunamb(const char *tok, char **opwords) { - return (char *)cli_getunamb (tok, (void **)opwords, id_sel); + return (char *)cli_getunamb(tok, (void **)opwords, id_sel); } int32_t -cli_cmd_bricks_parse (const char **words, int wordcount, int brick_index, - char **bricks, int *brick_count) +cli_cmd_bricks_parse(const char **words, int wordcount, int brick_index, + char **bricks, int *brick_count) { - int ret = 0; - char *delimiter = NULL; - char *host_name = NULL; - char *tmp_host = NULL; - char *bricks_str = NULL; - int len = 0; - int brick_list_len = 1; /* For initial space */ - struct list_head brick_list = { 0, }; - cli_brick_t *brick = NULL; - - GF_ASSERT (words); - GF_ASSERT (wordcount); - GF_ASSERT (bricks); - GF_ASSERT (brick_index > 0); - GF_ASSERT (brick_index < wordcount); - - INIT_LIST_HEAD(&brick_list); - - while (brick_index < wordcount) { - if (validate_brick_name ((char *)words[brick_index])) { - cli_err ("Wrong brick type: %s, use <HOSTNAME>:" - "<export-dir-abs-path>", words[brick_index]); - ret = -1; - goto out; - } else { - delimiter = strrchr (words[brick_index], ':'); - ret = gf_canonicalize_path (delimiter + 1); - if (ret) - goto out; - } - - tmp_host = gf_strdup ((char *)words[brick_index]); - if (!tmp_host) { - gf_log ("cli", GF_LOG_ERROR, "Out of memory"); - ret = -1; - goto out; - } - get_host_name (tmp_host, &host_name); - if (!host_name) { - ret = -1; - gf_log("cli",GF_LOG_ERROR, "Unable to allocate " - "memory"); - GF_FREE (tmp_host); - goto out; - } - - if (!(strcmp (host_name, "localhost") && - strcmp (host_name, "127.0.0.1") && - strncmp (host_name, "0.", 2))) { - cli_err ("Please provide a valid hostname/ip other " - "than localhost, 127.0.0.1 or loopback " - "address (0.0.0.0 to 0.255.255.255)."); - ret = -1; - GF_FREE (tmp_host); - goto out; - } - if (!valid_internet_address (host_name, _gf_false)) { - cli_err ("internet address '%s' does not conform to " - "standards", host_name); - } - GF_FREE (tmp_host); - list_for_each_entry(brick, &brick_list, list) { - if (strcmp(brick->name, words[brick_index]) == 0) { - ret = -1; - cli_err("Found duplicate exports %s", - words[brick_index]); - goto out; - } - } - - brick = GF_MALLOC(sizeof(cli_brick_t), gf_common_list_node); - if (brick == NULL) { - ret = -1; - gf_log("cli", GF_LOG_ERROR, "Out of memory"); - goto out; - } - len = strlen(words[brick_index]); - brick->name = words[brick_index]; - brick->len = len; - list_add_tail(&brick->list, &brick_list); - - brick_list_len += len + 1; /* Brick name + space */ - ++(*brick_count); - ++brick_index; - } - - /* If brick count is not valid exit here */ - if (!*brick_count) { - cli_err ("No bricks specified"); - ret = -1; + int ret = 0; + char *delimiter = NULL; + char *host_name = NULL; + char *tmp_host = NULL; + char *bricks_str = NULL; + int len = 0; + int brick_list_len = 1; /* For initial space */ + struct list_head brick_list = { + 0, + }; + cli_brick_t *brick = NULL; + + GF_ASSERT(words); + GF_ASSERT(wordcount); + GF_ASSERT(bricks); + GF_ASSERT(brick_index > 0); + GF_ASSERT(brick_index < wordcount); + + INIT_LIST_HEAD(&brick_list); + + while (brick_index < wordcount) { + if (validate_brick_name((char *)words[brick_index])) { + cli_err( + "Wrong brick type: %s, use <HOSTNAME>:" + "<export-dir-abs-path>", + words[brick_index]); + ret = -1; + goto out; + } else { + delimiter = strrchr(words[brick_index], ':'); + ret = gf_canonicalize_path(delimiter + 1); + if (ret) goto out; } - brick_list_len++; /* For terminating null char */ - - bricks_str = GF_MALLOC(brick_list_len, gf_common_mt_char); - if (bricks_str == NULL) { + tmp_host = gf_strdup((char *)words[brick_index]); + if (!tmp_host) { + gf_log("cli", GF_LOG_ERROR, "Out of memory"); + ret = -1; + goto out; + } + get_host_name(tmp_host, &host_name); + if (!host_name) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, + "Unable to allocate " + "memory"); + GF_FREE(tmp_host); + goto out; + } + + if (!(strcmp(host_name, "localhost") && + strcmp(host_name, "127.0.0.1") && strncmp(host_name, "0.", 2))) { + cli_err( + "Please provide a valid hostname/ip other " + "than localhost, 127.0.0.1 or loopback " + "address (0.0.0.0 to 0.255.255.255)."); + ret = -1; + GF_FREE(tmp_host); + goto out; + } + if (!valid_internet_address(host_name, _gf_false)) { + cli_err( + "internet address '%s' does not conform to " + "standards", + host_name); + } + GF_FREE(tmp_host); + list_for_each_entry(brick, &brick_list, list) + { + if (strcmp(brick->name, words[brick_index]) == 0) { ret = -1; - gf_log("cli", GF_LOG_ERROR, "Out of memory"); + cli_err("Found duplicate exports %s", words[brick_index]); goto out; + } } - *bricks = bricks_str; - *bricks_str = ' '; - bricks_str++; - while (!list_empty(&brick_list)) { - brick = list_first_entry(&brick_list, cli_brick_t, list); - list_del_init(&brick->list); - memcpy(bricks_str, brick->name, brick->len); - bricks_str[brick->len] = ' '; - bricks_str += brick->len + 1; - GF_FREE(brick); + + brick = GF_MALLOC(sizeof(cli_brick_t), gf_common_list_node); + if (brick == NULL) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Out of memory"); + goto out; } - *bricks_str = 0; + len = strlen(words[brick_index]); + brick->name = words[brick_index]; + brick->len = len; + list_add_tail(&brick->list, &brick_list); + + brick_list_len += len + 1; /* Brick name + space */ + ++(*brick_count); + ++brick_index; + } + + /* If brick count is not valid exit here */ + if (!*brick_count) { + cli_err("No bricks specified"); + ret = -1; + goto out; + } + + brick_list_len++; /* For terminating null char */ + + bricks_str = GF_MALLOC(brick_list_len, gf_common_mt_char); + if (bricks_str == NULL) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Out of memory"); + goto out; + } + *bricks = bricks_str; + *bricks_str = ' '; + bricks_str++; + while (!list_empty(&brick_list)) { + brick = list_first_entry(&brick_list, cli_brick_t, list); + list_del_init(&brick->list); + memcpy(bricks_str, brick->name, brick->len); + bricks_str[brick->len] = ' '; + bricks_str += brick->len + 1; + GF_FREE(brick); + } + *bricks_str = 0; out: - while (!list_empty(&brick_list)) { - brick = list_first_entry(&brick_list, cli_brick_t, list); - list_del_init(&brick->list); - GF_FREE(brick); - } + while (!list_empty(&brick_list)) { + brick = list_first_entry(&brick_list, cli_brick_t, list); + list_del_init(&brick->list); + GF_FREE(brick); + } - return ret; + return ret; } int32_t -cli_cmd_create_disperse_check (struct cli_state *state, int *disperse, - int *redundancy, int *data, int count) +cli_cmd_create_disperse_check(struct cli_state *state, int *disperse, + int *redundancy, int *data, int count) { - int i = 0; - int tmp = 0; - gf_answer_t answer = GF_ANSWER_NO; - char question[128]; - - const char *question1 = "There isn't an optimal redundancy value " - "for this configuration. Do you want to " - "create the volume with redundancy 1 ?"; - - const char *question2 = "The optimal redundancy for this " - "configuration is %d. Do you want to create " - "the volume with this value ?"; - - const char *question3 = "This configuration is not optimal on most " - "workloads. Do you want to use it ?"; - - const char *question4 = "Redundancy for this configuration is %d. " - "Do you want to create " - "the volume with this value ?"; - - if (*data > 0) { - if (*disperse > 0 && *redundancy > 0) { - if (*disperse != (*data + *redundancy)) { - cli_err ("Disperse count(%d) should be equal " - "to sum of disperse-data count(%d) and " - "redundancy count(%d)", *disperse, - *data, *redundancy); - return -1; - } - } else if (*redundancy > 0) { - *disperse = *data + *redundancy; - } else if (*disperse > 0) { - *redundancy = *disperse - *data; - } else { - if ((count - *data) >= *data) { - cli_err ("Please provide redundancy count " - "along with disperse-data count"); - return -1; - } else { - sprintf (question, question4, count - *data); - answer = cli_cmd_get_confirmation (state, - question); - if (answer == GF_ANSWER_NO) - return -1; - *redundancy = count - *data; - *disperse = count; - } - } + int i = 0; + int tmp = 0; + gf_answer_t answer = GF_ANSWER_NO; + char question[128]; + + const char *question1 = + "There isn't an optimal redundancy value " + "for this configuration. Do you want to " + "create the volume with redundancy 1 ?"; + + const char *question2 = + "The optimal redundancy for this " + "configuration is %d. Do you want to create " + "the volume with this value ?"; + + const char *question3 = + "This configuration is not optimal on most " + "workloads. Do you want to use it ?"; + + const char *question4 = + "Redundancy for this configuration is %d. " + "Do you want to create " + "the volume with this value ?"; + + if (*data > 0) { + if (*disperse > 0 && *redundancy > 0) { + if (*disperse != (*data + *redundancy)) { + cli_err( + "Disperse count(%d) should be equal " + "to sum of disperse-data count(%d) and " + "redundancy count(%d)", + *disperse, *data, *redundancy); + return -1; + } + } else if (*redundancy > 0) { + *disperse = *data + *redundancy; + } else if (*disperse > 0) { + *redundancy = *disperse - *data; + } else { + if ((count - *data) >= *data) { + cli_err( + "Please provide redundancy count " + "along with disperse-data count"); + return -1; + } else { + sprintf(question, question4, count - *data); + answer = cli_cmd_get_confirmation(state, question); + if (answer == GF_ANSWER_NO) + return -1; + *redundancy = count - *data; + *disperse = count; + } } + } - if (*disperse <= 0) { - if (count < 3) { - cli_err ("number of bricks must be greater " - "than 2"); + if (*disperse <= 0) { + if (count < 3) { + cli_err( + "number of bricks must be greater " + "than 2"); - return -1; - } - *disperse = count; + return -1; } + *disperse = count; + } - if (*redundancy == -1) { - tmp = *disperse - 1; - for (i = tmp / 2; - (i > 0) && ((tmp & -tmp) != tmp); - i--, tmp--); - - if (i == 0) { - answer = cli_cmd_get_confirmation(state, question1); - if (answer == GF_ANSWER_NO) - return -1; + if (*redundancy == -1) { + tmp = *disperse - 1; + for (i = tmp / 2; (i > 0) && ((tmp & -tmp) != tmp); i--, tmp--) + ; - *redundancy = 1; - } - else - { - *redundancy = *disperse - tmp; - if (*redundancy > 1) { - sprintf(question, question2, *redundancy); - answer = cli_cmd_get_confirmation(state, - question); - if (answer == GF_ANSWER_NO) - return -1; - } - } + if (i == 0) { + answer = cli_cmd_get_confirmation(state, question1); + if (answer == GF_ANSWER_NO) + return -1; - tmp = 0; + *redundancy = 1; } else { - tmp = *disperse - *redundancy; + *redundancy = *disperse - tmp; + if (*redundancy > 1) { + sprintf(question, question2, *redundancy); + answer = cli_cmd_get_confirmation(state, question); + if (answer == GF_ANSWER_NO) + return -1; + } } - if (*redundancy > (*disperse - 1) / 2) { - cli_err ("redundancy must be less than %d for a " - "disperse %d volume", - (*disperse + 1) / 2, *disperse); + tmp = 0; + } else { + tmp = *disperse - *redundancy; + } - return -1; - } + if (*redundancy > (*disperse - 1) / 2) { + cli_err( + "redundancy must be less than %d for a " + "disperse %d volume", + (*disperse + 1) / 2, *disperse); - if ((tmp & -tmp) != tmp) { - answer = cli_cmd_get_confirmation(state, question3); - if (answer == GF_ANSWER_NO) - return -1; - } + return -1; + } - return 0; + if ((tmp & -tmp) != tmp) { + answer = cli_cmd_get_confirmation(state, question3); + if (answer == GF_ANSWER_NO) + return -1; + } + + return 0; } static int32_t -cli_validate_disperse_volume (char *word, gf1_cluster_type type, - const char **words, int32_t wordcount, - int32_t index, int32_t *disperse_count, - int32_t *redundancy_count, - int32_t *data_count) +cli_validate_disperse_volume(char *word, gf1_cluster_type type, + const char **words, int32_t wordcount, + int32_t index, int32_t *disperse_count, + int32_t *redundancy_count, int32_t *data_count) { - int ret = -1; + int ret = -1; - switch (type) { + switch (type) { case GF_CLUSTER_TYPE_NONE: case GF_CLUSTER_TYPE_DISPERSE: - if (strcmp (word, "disperse") == 0) { - if (*disperse_count >= 0) { - cli_err ("disperse option given twice"); - goto out; - } - if (wordcount < (index+2)) { - goto out; - } - ret = gf_string2int (words[index + 1], disperse_count); - if (ret == -1 && errno == EINVAL) { - *disperse_count = 0; - ret = 1; - } else if (ret == -1) { - goto out; - } else { - if (*disperse_count < 3) { - cli_err ("disperse count must " - "be greater than 2"); - goto out; - } - ret = 2; - } - } else if (strcmp (word, "disperse-data") == 0) { - if (*data_count >= 0) { - cli_err ("disperse-data option given twice"); - goto out; - } - if (wordcount < (index+2)) { - goto out; - } - ret = gf_string2int (words[index+1], data_count); - if (ret == -1 || *data_count < 2) { - cli_err ("disperse-data must be greater than 1"); - goto out; - } - ret = 2; - } else if (strcmp (word, "redundancy") == 0) { - if (*redundancy_count >= 0) { - cli_err ("redundancy option given twice"); - goto out; - } - if (wordcount < (index+2)) { - goto out; - } - ret = gf_string2int (words[index+1], redundancy_count); - if (ret == -1 || *redundancy_count < 1) { - cli_err ("redundancy must be greater than 0"); - goto out; - } - ret = 2; - } - break; + if (strcmp(word, "disperse") == 0) { + if (*disperse_count >= 0) { + cli_err("disperse option given twice"); + goto out; + } + if (wordcount < (index + 2)) { + goto out; + } + ret = gf_string2int(words[index + 1], disperse_count); + if (ret == -1 && errno == EINVAL) { + *disperse_count = 0; + ret = 1; + } else if (ret == -1) { + goto out; + } else { + if (*disperse_count < 3) { + cli_err( + "disperse count must " + "be greater than 2"); + goto out; + } + ret = 2; + } + } else if (strcmp(word, "disperse-data") == 0) { + if (*data_count >= 0) { + cli_err("disperse-data option given twice"); + goto out; + } + if (wordcount < (index + 2)) { + goto out; + } + ret = gf_string2int(words[index + 1], data_count); + if (ret == -1 || *data_count < 2) { + cli_err("disperse-data must be greater than 1"); + goto out; + } + ret = 2; + } else if (strcmp(word, "redundancy") == 0) { + if (*redundancy_count >= 0) { + cli_err("redundancy option given twice"); + goto out; + } + if (wordcount < (index + 2)) { + goto out; + } + ret = gf_string2int(words[index + 1], redundancy_count); + if (ret == -1 || *redundancy_count < 1) { + cli_err("redundancy must be greater than 0"); + goto out; + } + ret = 2; + } + break; case GF_CLUSTER_TYPE_STRIPE_REPLICATE: - cli_err ("striped-replicated-dispersed volume " - "is not supported"); - goto out; + cli_err( + "striped-replicated-dispersed volume " + "is not supported"); + goto out; case GF_CLUSTER_TYPE_TIER: - cli_err ("tier-dispersed volume is not " - "supported"); - goto out; + cli_err( + "tier-dispersed volume is not " + "supported"); + goto out; case GF_CLUSTER_TYPE_STRIPE: - cli_err ("striped-dispersed volume is not " - "supported"); - goto out; + cli_err( + "striped-dispersed volume is not " + "supported"); + goto out; case GF_CLUSTER_TYPE_REPLICATE: - cli_err ("replicated-dispersed volume is not " - "supported"); - goto out; + cli_err( + "replicated-dispersed volume is not " + "supported"); + goto out; default: - cli_err ("Invalid type given"); - break; - } + cli_err("Invalid type given"); + break; + } out: - return ret; + return ret; } int32_t -cli_validate_volname (const char *volname) +cli_validate_volname(const char *volname) { - int32_t ret = -1; - int32_t i = -1; - int volname_len; - static const char * const invalid_volnames[] = { - "volume", "type", "subvolumes", "option", - "end-volume", "all", "volume_not_in_ring", - "description", "force", - "snap-max-hard-limit", - "snap-max-soft-limit", "auto-delete", - "activate-on-create", NULL}; - - if (volname[0] == '-') - goto out; - - for (i = 0; invalid_volnames[i]; i++) { - if (!strcmp (volname, invalid_volnames[i])) { - cli_err ("\"%s\" cannot be the name of a volume.", - volname); - goto out; - } - } + int32_t ret = -1; + int32_t i = -1; + int volname_len; + static const char *const invalid_volnames[] = {"volume", + "type", + "subvolumes", + "option", + "end-volume", + "all", + "volume_not_in_ring", + "description", + "force", + "snap-max-hard-limit", + "snap-max-soft-limit", + "auto-delete", + "activate-on-create", + NULL}; - if (strchr (volname, '/')) - goto out; + if (volname[0] == '-') + goto out; - volname_len = strlen (volname); - if (volname_len > GD_VOLUME_NAME_MAX) { - cli_err("Volume name exceeds %d characters.", - GD_VOLUME_NAME_MAX); - goto out; + for (i = 0; invalid_volnames[i]; i++) { + if (!strcmp(volname, invalid_volnames[i])) { + cli_err("\"%s\" cannot be the name of a volume.", volname); + goto out; } + } - for (i = 0; i < volname_len; i++) { - if (!isalnum (volname[i]) && (volname[i] != '_') && - (volname[i] != '-')) { - cli_err ("Volume name should not contain \"%c\"" - " character.\nVolume names can only" - "contain alphanumeric, '-' and '_' " - "characters.", volname[i]); - goto out; - } - } + if (strchr(volname, '/')) + goto out; - ret = 0; + volname_len = strlen(volname); + if (volname_len > GD_VOLUME_NAME_MAX) { + cli_err("Volume name exceeds %d characters.", GD_VOLUME_NAME_MAX); + goto out; + } + + for (i = 0; i < volname_len; i++) { + if (!isalnum(volname[i]) && (volname[i] != '_') && + (volname[i] != '-')) { + cli_err( + "Volume name should not contain \"%c\"" + " character.\nVolume names can only" + "contain alphanumeric, '-' and '_' " + "characters.", + volname[i]); + goto out; + } + } + + ret = 0; out: - return ret; + return ret; } int32_t -cli_cmd_volume_create_parse (struct cli_state *state, const char **words, - int wordcount, dict_t **options, char **brick_list) +cli_cmd_volume_create_parse(struct cli_state *state, const char **words, + int wordcount, dict_t **options, char **brick_list) { - dict_t *dict = NULL; - char *volname = NULL; - int ret = -1; - gf1_cluster_type type = GF_CLUSTER_TYPE_NONE; - int sub_count = 1; - int brick_index = 0; - char *trans_type = NULL; - int32_t index = 0; - char *bricks = NULL; - int32_t brick_count = 0; - char *opwords[] = { "replica", "stripe", "transport", "disperse", - "redundancy", "disperse-data", "arbiter", NULL }; - - char *w = NULL; - int op_count = 0; - int32_t replica_count = 1; - int32_t arbiter_count = 0; - int32_t stripe_count = 1; - int32_t disperse_count = -1; - int32_t redundancy_count = -1; - int32_t disperse_data_count = -1; - gf_boolean_t is_force = _gf_false; - int wc = wordcount; - gf_answer_t answer = GF_ANSWER_NO; - const char *question = NULL; - - GF_ASSERT (words); - GF_ASSERT (options); - - dict = dict_new (); - - if (!dict) - goto out; + dict_t *dict = NULL; + char *volname = NULL; + int ret = -1; + gf1_cluster_type type = GF_CLUSTER_TYPE_NONE; + int sub_count = 1; + int brick_index = 0; + char *trans_type = NULL; + int32_t index = 0; + char *bricks = NULL; + int32_t brick_count = 0; + char *opwords[] = {"replica", "stripe", "transport", "disperse", + "redundancy", "disperse-data", "arbiter", NULL}; + + char *w = NULL; + int op_count = 0; + int32_t replica_count = 1; + int32_t arbiter_count = 0; + int32_t stripe_count = 1; + int32_t disperse_count = -1; + int32_t redundancy_count = -1; + int32_t disperse_data_count = -1; + gf_boolean_t is_force = _gf_false; + int wc = wordcount; + gf_answer_t answer = GF_ANSWER_NO; + const char *question = NULL; + + GF_ASSERT(words); + GF_ASSERT(options); + + dict = dict_new(); + + if (!dict) + goto out; - if (wordcount < 3) - goto out; + if (wordcount < 3) + goto out; - volname = (char *)words[2]; + volname = (char *)words[2]; - GF_ASSERT (volname); + GF_ASSERT(volname); - /* Validate the volume name here itself */ - if (cli_validate_volname (volname) < 0) - goto out; + /* Validate the volume name here itself */ + if (cli_validate_volname(volname) < 0) + goto out; - if (wordcount < 4) { - ret = -1; - goto out; - } + if (wordcount < 4) { + ret = -1; + goto out; + } - type = GF_CLUSTER_TYPE_NONE; - index = 3; + type = GF_CLUSTER_TYPE_NONE; + index = 3; - while (op_count < 3) { + while (op_count < 3) { + ret = -1; + w = str_getunamb(words[index], opwords); + if (!w) { + break; + } else if ((strcmp(w, "replica")) == 0) { + switch (type) { + case GF_CLUSTER_TYPE_STRIPE_REPLICATE: + case GF_CLUSTER_TYPE_REPLICATE: + cli_err("replica option given twice"); + goto out; + case GF_CLUSTER_TYPE_NONE: + type = GF_CLUSTER_TYPE_REPLICATE; + break; + case GF_CLUSTER_TYPE_STRIPE: + type = GF_CLUSTER_TYPE_STRIPE_REPLICATE; + break; + case GF_CLUSTER_TYPE_TIER: + cli_err( + "replicated-tiered volume is not " + "supported"); + goto out; + break; + case GF_CLUSTER_TYPE_DISPERSE: + cli_err( + "replicated-dispersed volume is not " + "supported"); + goto out; + default: + cli_err("Invalid type given"); + goto out; + } + + if (wordcount < (index + 2)) { ret = -1; - w = str_getunamb (words[index], opwords); - if (!w) { - break; - } else if ((strcmp (w, "replica")) == 0) { - switch (type) { - case GF_CLUSTER_TYPE_STRIPE_REPLICATE: - case GF_CLUSTER_TYPE_REPLICATE: - cli_err ("replica option given twice"); - goto out; - case GF_CLUSTER_TYPE_NONE: - type = GF_CLUSTER_TYPE_REPLICATE; - break; - case GF_CLUSTER_TYPE_STRIPE: - type = GF_CLUSTER_TYPE_STRIPE_REPLICATE; - break; - case GF_CLUSTER_TYPE_TIER: - cli_err ("replicated-tiered volume is not " - "supported"); - goto out; - break; - case GF_CLUSTER_TYPE_DISPERSE: - cli_err ("replicated-dispersed volume is not " - "supported"); - goto out; - default: - cli_err ("Invalid type given"); - goto out; - } - - if (wordcount < (index+2)) { - ret = -1; - goto out; - } - - replica_count = strtol (words[index+1], NULL, 0); - if (replica_count < 2) { - cli_err ("replica count should be greater" - " than 1"); - ret = -1; - goto out; - } - - index += 2; - if (words[index]) { - if (!strcmp (words[index], "arbiter")) { - ret = gf_string2int (words[index+1], - &arbiter_count); - if ((ret == -1) || (arbiter_count != 1)) { - cli_err ("For arbiter " - "configuration, " - "replica count must be" - " 2 and arbiter count " - "must be 1. The 3rd " - "brick of the replica " - "will be the arbiter"); - ret = -1; - goto out; - } - ret = dict_set_int32 (dict, "arbiter-count", - arbiter_count); - if (ret) - goto out; - index += 2; - } - } - - /* Do this to keep glusterd happy with sending - "replica 3 arbiter 1" options to server */ - if ((arbiter_count == 1) && (replica_count == 2)) - replica_count += arbiter_count; - - if (replica_count == 2) { - if (strcmp (words[wordcount - 1], "force")) { - question = "Replica 2 volumes are prone" - " to split-brain. Use " - "Arbiter or Replica 3 to " - "avoid this. See: " - "http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/." - "\nDo you still want to " - "continue?\n"; - answer = cli_cmd_get_confirmation (state, - question); - if (GF_ANSWER_NO == answer) { - gf_log ("cli", GF_LOG_ERROR, - "Volume create " - "cancelled, exiting"); - ret = -1; - goto out; - } - } - } - ret = dict_set_int32 (dict, "replica-count", replica_count); - if (ret) - goto out; - - } else if ((strcmp (w, "stripe")) == 0) { - switch (type) { - case GF_CLUSTER_TYPE_STRIPE_REPLICATE: - case GF_CLUSTER_TYPE_STRIPE: - cli_err ("stripe option given twice"); - goto out; - case GF_CLUSTER_TYPE_NONE: - type = GF_CLUSTER_TYPE_STRIPE; - break; - case GF_CLUSTER_TYPE_REPLICATE: - type = GF_CLUSTER_TYPE_STRIPE_REPLICATE; - break; - case GF_CLUSTER_TYPE_DISPERSE: - cli_err ("striped-dispersed volume is not " - "supported"); - goto out; - case GF_CLUSTER_TYPE_TIER: - cli_err ("striped-tier volume is not " - "supported"); - goto out; - default: - cli_err ("Invalid type given"); - goto out; - } - if (wordcount < (index + 2)) { - ret = -1; - goto out; - } - stripe_count = strtol (words[index+1], NULL, 0); - if (stripe_count < 2) { - cli_err ("stripe count should be greater" - " than 1"); - ret = -1; - goto out; - } - ret = dict_set_int32 (dict, "stripe-count", stripe_count); - if (ret) - goto out; - - index += 2; + goto out; + } - } else if ((strcmp (w, "transport")) == 0) { - if (trans_type) { - cli_err ("'transport' option given more" - " than one time"); - goto out; - } - if ((strcasecmp (words[index+1], "tcp") == 0)) { - trans_type = gf_strdup ("tcp"); - } else if ((strcasecmp (words[index+1], "rdma") == 0)) { - trans_type = gf_strdup ("rdma"); - } else if ((strcasecmp (words[index+1], "tcp,rdma") == 0) || - (strcasecmp (words[index+1], "rdma,tcp") == 0)) { - trans_type = gf_strdup ("tcp,rdma"); - } else { - gf_log ("", GF_LOG_ERROR, "incorrect transport" - " protocol specified"); - ret = -1; - goto out; - } - index += 2; - - } else if ((strcmp (w, "disperse") == 0) || - (strcmp (w, "redundancy") == 0) || - (strcmp (w, "disperse-data") == 0)) { - ret = cli_validate_disperse_volume (w, type, words, - wordcount, index, &disperse_count, - &redundancy_count, &disperse_data_count); - if (ret < 0) - goto out; - index += ret; - type = GF_CLUSTER_TYPE_DISPERSE; - } else if ((strcmp (w, "arbiter") == 0)) { - cli_err ("arbiter option must be preceded by replica " - "option."); + replica_count = strtol(words[index + 1], NULL, 0); + if (replica_count < 2) { + cli_err( + "replica count should be greater" + " than 1"); + ret = -1; + goto out; + } + + index += 2; + if (words[index]) { + if (!strcmp(words[index], "arbiter")) { + ret = gf_string2int(words[index + 1], &arbiter_count); + if ((ret == -1) || (arbiter_count != 1)) { + cli_err( + "For arbiter " + "configuration, " + "replica count must be" + " 2 and arbiter count " + "must be 1. The 3rd " + "brick of the replica " + "will be the arbiter"); ret = -1; goto out; - } else { - GF_ASSERT (!"opword mismatch"); + } + ret = dict_set_int32(dict, "arbiter-count", arbiter_count); + if (ret) + goto out; + index += 2; + } + } + + /* Do this to keep glusterd happy with sending + "replica 3 arbiter 1" options to server */ + if ((arbiter_count == 1) && (replica_count == 2)) + replica_count += arbiter_count; + + if (replica_count == 2) { + if (strcmp(words[wordcount - 1], "force")) { + question = + "Replica 2 volumes are prone" + " to split-brain. Use " + "Arbiter or Replica 3 to " + "avoid this. See: " + "http://docs.gluster.org/en/latest/" + "Administrator%20Guide/" + "Split%20brain%20and%20ways%20to%20deal%20with%20it/." + "\nDo you still want to " + "continue?\n"; + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + gf_log("cli", GF_LOG_ERROR, + "Volume create " + "cancelled, exiting"); ret = -1; goto out; - } - op_count++; - } - - if (!trans_type) - trans_type = gf_strdup ("tcp"); - - if (index >= wordcount) { + } + } + } + ret = dict_set_int32(dict, "replica-count", replica_count); + if (ret) + goto out; + + } else if ((strcmp(w, "stripe")) == 0) { + switch (type) { + case GF_CLUSTER_TYPE_STRIPE_REPLICATE: + case GF_CLUSTER_TYPE_STRIPE: + cli_err("stripe option given twice"); + goto out; + case GF_CLUSTER_TYPE_NONE: + type = GF_CLUSTER_TYPE_STRIPE; + break; + case GF_CLUSTER_TYPE_REPLICATE: + type = GF_CLUSTER_TYPE_STRIPE_REPLICATE; + break; + case GF_CLUSTER_TYPE_DISPERSE: + cli_err( + "striped-dispersed volume is not " + "supported"); + goto out; + case GF_CLUSTER_TYPE_TIER: + cli_err( + "striped-tier volume is not " + "supported"); + goto out; + default: + cli_err("Invalid type given"); + goto out; + } + if (wordcount < (index + 2)) { + ret = -1; + goto out; + } + stripe_count = strtol(words[index + 1], NULL, 0); + if (stripe_count < 2) { + cli_err( + "stripe count should be greater" + " than 1"); ret = -1; goto out; + } + ret = dict_set_int32(dict, "stripe-count", stripe_count); + if (ret) + goto out; + + index += 2; + + } else if ((strcmp(w, "transport")) == 0) { + if (trans_type) { + cli_err( + "'transport' option given more" + " than one time"); + goto out; + } + if ((strcasecmp(words[index + 1], "tcp") == 0)) { + trans_type = gf_strdup("tcp"); + } else if ((strcasecmp(words[index + 1], "rdma") == 0)) { + trans_type = gf_strdup("rdma"); + } else if ((strcasecmp(words[index + 1], "tcp,rdma") == 0) || + (strcasecmp(words[index + 1], "rdma,tcp") == 0)) { + trans_type = gf_strdup("tcp,rdma"); + } else { + gf_log("", GF_LOG_ERROR, + "incorrect transport" + " protocol specified"); + ret = -1; + goto out; + } + index += 2; + + } else if ((strcmp(w, "disperse") == 0) || + (strcmp(w, "redundancy") == 0) || + (strcmp(w, "disperse-data") == 0)) { + ret = cli_validate_disperse_volume( + w, type, words, wordcount, index, &disperse_count, + &redundancy_count, &disperse_data_count); + if (ret < 0) + goto out; + index += ret; + type = GF_CLUSTER_TYPE_DISPERSE; + } else if ((strcmp(w, "arbiter") == 0)) { + cli_err( + "arbiter option must be preceded by replica " + "option."); + ret = -1; + goto out; + } else { + GF_ASSERT(!"opword mismatch"); + ret = -1; + goto out; } + op_count++; + } - brick_index = index; - - if (strcmp (words[wordcount - 1], "force") == 0) { - is_force = _gf_true; - wc = wordcount - 1; - } + if (!trans_type) + trans_type = gf_strdup("tcp"); - ret = cli_cmd_bricks_parse (words, wc, brick_index, &bricks, - &brick_count); - if (ret) - goto out; + if (index >= wordcount) { + ret = -1; + goto out; + } - if (type == GF_CLUSTER_TYPE_DISPERSE) { - ret = cli_cmd_create_disperse_check (state, &disperse_count, - &redundancy_count, - &disperse_data_count, - brick_count); - if (!ret) - ret = dict_set_int32 (dict, "disperse-count", - disperse_count); - if (!ret) - ret = dict_set_int32 (dict, "redundancy-count", - redundancy_count); - if (ret) - goto out; + brick_index = index; - sub_count = disperse_count; - } else - sub_count = stripe_count * replica_count; - - if (brick_count % sub_count) { - if (type == GF_CLUSTER_TYPE_STRIPE) - cli_err ("number of bricks is not a multiple of " - "stripe count"); - else if (type == GF_CLUSTER_TYPE_REPLICATE) - cli_err ("number of bricks is not a multiple of " - "replica count"); - else if (type == GF_CLUSTER_TYPE_DISPERSE) - cli_err ("number of bricks is not a multiple of " - "disperse count"); - else - cli_err ("number of bricks given doesn't match " - "required count"); + if (strcmp(words[wordcount - 1], "force") == 0) { + is_force = _gf_true; + wc = wordcount - 1; + } - ret = -1; - goto out; - } + ret = cli_cmd_bricks_parse(words, wc, brick_index, &bricks, &brick_count); + if (ret) + goto out; - /* Everything is parsed fine. start setting info in dict */ - ret = dict_set_str (dict, "volname", volname); + if (type == GF_CLUSTER_TYPE_DISPERSE) { + ret = cli_cmd_create_disperse_check(state, &disperse_count, + &redundancy_count, + &disperse_data_count, brick_count); + if (!ret) + ret = dict_set_int32(dict, "disperse-count", disperse_count); + if (!ret) + ret = dict_set_int32(dict, "redundancy-count", redundancy_count); if (ret) - goto out; + goto out; + + sub_count = disperse_count; + } else + sub_count = stripe_count * replica_count; + + if (brick_count % sub_count) { + if (type == GF_CLUSTER_TYPE_STRIPE) + cli_err( + "number of bricks is not a multiple of " + "stripe count"); + else if (type == GF_CLUSTER_TYPE_REPLICATE) + cli_err( + "number of bricks is not a multiple of " + "replica count"); + else if (type == GF_CLUSTER_TYPE_DISPERSE) + cli_err( + "number of bricks is not a multiple of " + "disperse count"); + else + cli_err( + "number of bricks given doesn't match " + "required count"); - ret = dict_set_int32 (dict, "type", type); - if (ret) - goto out; + ret = -1; + goto out; + } - ret = dict_set_dynstr (dict, "transport", trans_type); - if (ret) - goto out; - trans_type = NULL; + /* Everything is parsed fine. start setting info in dict */ + ret = dict_set_str(dict, "volname", volname); + if (ret) + goto out; - ret = dict_set_dynstr (dict, "bricks", bricks); - if (ret) - goto out; + ret = dict_set_int32(dict, "type", type); + if (ret) + goto out; - ret = dict_set_int32 (dict, "count", brick_count); - if (ret) - goto out; + ret = dict_set_dynstr(dict, "transport", trans_type); + if (ret) + goto out; + trans_type = NULL; - ret = dict_set_int32 (dict, "force", is_force); - if (ret) - goto out; + ret = dict_set_dynstr(dict, "bricks", bricks); + if (ret) + goto out; - *options = dict; - *brick_list = bricks; + ret = dict_set_int32(dict, "count", brick_count); + if (ret) + goto out; + + ret = dict_set_int32(dict, "force", is_force); + if (ret) + goto out; + + *options = dict; + *brick_list = bricks; out: - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to parse create volume CLI"); - if (dict) - dict_unref (dict); - } + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to parse create volume CLI"); + if (dict) + dict_unref(dict); + } - GF_FREE (trans_type); + GF_FREE(trans_type); - return ret; + return ret; } int32_t -cli_cmd_volume_reset_parse (const char **words, int wordcount, dict_t **options) +cli_cmd_volume_reset_parse(const char **words, int wordcount, dict_t **options) { - dict_t *dict = NULL; - char *volname = NULL; - int ret = -1; + dict_t *dict = NULL; + char *volname = NULL; + int ret = -1; - GF_ASSERT (words); - GF_ASSERT (options); + GF_ASSERT(words); + GF_ASSERT(options); - dict = dict_new (); + dict = dict_new(); - if (!dict) - goto out; + if (!dict) + goto out; - if (wordcount < 3) - goto out; + if (wordcount < 3) + goto out; - if (wordcount > 5) - goto out; + if (wordcount > 5) + goto out; - volname = (char *)words[2]; + volname = (char *)words[2]; - if (!volname) { - ret = -1; - goto out; - } + if (!volname) { + ret = -1; + goto out; + } - ret = dict_set_str (dict, "volname", volname); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", volname); + if (ret) + goto out; - if (wordcount == 3) { - ret = dict_set_str (dict, "key", "all"); - if (ret) - goto out; - } + if (wordcount == 3) { + ret = dict_set_str(dict, "key", "all"); + if (ret) + goto out; + } - if (wordcount >= 4) { - if (!strcmp ("force", (char*)words[3])) { - ret = dict_set_int32 (dict, "force", 1); - if (ret) - goto out; - ret = dict_set_str (dict, "key", "all"); - if (ret) - goto out; - } else { - ret = dict_set_str (dict, "key", (char *)words[3]); - if (ret) - goto out; - } + if (wordcount >= 4) { + if (!strcmp("force", (char *)words[3])) { + ret = dict_set_int32(dict, "force", 1); + if (ret) + goto out; + ret = dict_set_str(dict, "key", "all"); + if (ret) + goto out; + } else { + ret = dict_set_str(dict, "key", (char *)words[3]); + if (ret) + goto out; } + } - if (wordcount == 5) { - if (strcmp ("force", (char*)words[4])) { - ret = -1; - goto out; - } else { - ret = dict_set_int32 (dict, "force", 1); - if (ret) - goto out; - } + if (wordcount == 5) { + if (strcmp("force", (char *)words[4])) { + ret = -1; + goto out; + } else { + ret = dict_set_int32(dict, "force", 1); + if (ret) + goto out; } + } - *options = dict; + *options = dict; out: - if (ret && dict) { - dict_unref (dict); - } + if (ret && dict) { + dict_unref(dict); + } - return ret; + return ret; } int32_t -cli_cmd_get_state_parse (struct cli_state *state, - const char **words, int wordcount, - dict_t **options, char **op_errstr) +cli_cmd_get_state_parse(struct cli_state *state, const char **words, + int wordcount, dict_t **options, char **op_errstr) { - dict_t *dict = NULL; - int ret = -1; - char *odir = NULL; - char *filename = NULL; - char *daemon_name = NULL; - int count = 0; - uint32_t cmd = 0; - - GF_VALIDATE_OR_GOTO ("cli", options, out); - GF_VALIDATE_OR_GOTO ("cli", words, out); - - dict = dict_new (); - if (!dict) - goto out; - - if (wordcount < 1 || wordcount > 7) { - *op_errstr = gf_strdup ("Problem parsing arguments." - " Check usage."); - goto out; - } + dict_t *dict = NULL; + int ret = -1; + char *odir = NULL; + char *filename = NULL; + char *daemon_name = NULL; + int count = 0; + uint32_t cmd = 0; + + GF_VALIDATE_OR_GOTO("cli", options, out); + GF_VALIDATE_OR_GOTO("cli", words, out); + + dict = dict_new(); + if (!dict) + goto out; - if (wordcount >= 1) { - gf_asprintf (&daemon_name, "%s", "glusterd"); - - for (count = 1; count < wordcount; count++) { - if (strcmp (words[count], "odir") == 0 || - strcmp (words[count], "file") == 0) { - if (strcmp (words[count], "odir") == 0) { - if (++count < wordcount) { - odir = (char *) words[count]; - continue; - } else { - ret = -1; - goto out; - } - } else if (strcmp (words[count], "file") == 0) { - if (++count < wordcount) { - filename = (char *) words[count]; - continue; - } else { - ret = -1; - goto out; - } - } - } else { - if (count > 1) { - if (count == wordcount-1) { - if (strcmp (words[count], - "detail") == 0) { - cmd = GF_CLI_GET_STATE_DETAIL; - continue; - } else if (strcmp (words[count], - "volumeoptions") == 0) { - cmd = GF_CLI_GET_STATE_VOLOPTS; - continue; - } - } else { - *op_errstr = gf_strdup ("Problem" - " parsing arguments. " - "Check usage."); - ret = -1; - goto out; - } - - } - if (strcmp (words[count], "glusterd") == 0) { - continue; - } else { - if (count == wordcount-1) { - if (strcmp (words[count], - "detail") == 0) { - cmd = GF_CLI_GET_STATE_DETAIL; - continue; - } else if (strcmp (words[count], - "volumeoptions") == 0) { - cmd = GF_CLI_GET_STATE_VOLOPTS; - continue; - } - } - - *op_errstr = gf_strdup ("glusterd is " - "the only supported daemon."); - ret = -1; - goto out; - } + if (wordcount < 1 || wordcount > 7) { + *op_errstr = gf_strdup( + "Problem parsing arguments." + " Check usage."); + goto out; + } + + if (wordcount >= 1) { + gf_asprintf(&daemon_name, "%s", "glusterd"); + + for (count = 1; count < wordcount; count++) { + if (strcmp(words[count], "odir") == 0 || + strcmp(words[count], "file") == 0) { + if (strcmp(words[count], "odir") == 0) { + if (++count < wordcount) { + odir = (char *)words[count]; + continue; + } else { + ret = -1; + goto out; + } + } else if (strcmp(words[count], "file") == 0) { + if (++count < wordcount) { + filename = (char *)words[count]; + continue; + } else { + ret = -1; + goto out; + } + } + } else { + if (count > 1) { + if (count == wordcount - 1) { + if (strcmp(words[count], "detail") == 0) { + cmd = GF_CLI_GET_STATE_DETAIL; + continue; + } else if (strcmp(words[count], "volumeoptions") == 0) { + cmd = GF_CLI_GET_STATE_VOLOPTS; + continue; } - } - - ret = dict_set_dynstr (dict, "daemon", daemon_name); - if (ret) { - *op_errstr = gf_strdup ("Command failed. Please check " - " log file for more details."); - gf_log (THIS->name, GF_LOG_ERROR, - "Setting daemon name to dictionary failed"); + } else { + *op_errstr = gf_strdup( + "Problem" + " parsing arguments. " + "Check usage."); + ret = -1; goto out; + } } - daemon_name = NULL; - - if (odir) { - ret = dict_set_str (dict, "odir", odir); - if (ret) { - *op_errstr = gf_strdup ("Command failed. Please" - " check log file for" - " more details."); - gf_log (THIS->name, GF_LOG_ERROR, - "Setting output directory to" - "dictionary failed"); - goto out; + if (strcmp(words[count], "glusterd") == 0) { + continue; + } else { + if (count == wordcount - 1) { + if (strcmp(words[count], "detail") == 0) { + cmd = GF_CLI_GET_STATE_DETAIL; + continue; + } else if (strcmp(words[count], "volumeoptions") == 0) { + cmd = GF_CLI_GET_STATE_VOLOPTS; + continue; } - } + } - if (filename) { - ret = dict_set_str (dict, "filename", filename); - if (ret) { - *op_errstr = gf_strdup ("Command failed. Please" - " check log file for" - " more details."); - gf_log (THIS->name, GF_LOG_ERROR, - "Setting filename to dictionary failed"); - goto out; - } - } - - if (cmd) { - ret = dict_set_uint32 (dict, "getstate-cmd", cmd); - if (ret) { - *op_errstr = gf_strdup ("Command failed. Please" - " check log file for" - " more details."); - gf_log (THIS->name, GF_LOG_ERROR, "Setting " - "get-state command type to dictionary " - "failed"); - goto out; - } + *op_errstr = gf_strdup( + "glusterd is " + "the only supported daemon."); + ret = -1; + goto out; } + } } - out: - if (dict) - *options = dict; + ret = dict_set_dynstr(dict, "daemon", daemon_name); + if (ret) { + *op_errstr = gf_strdup( + "Command failed. Please check " + " log file for more details."); + gf_log(THIS->name, GF_LOG_ERROR, + "Setting daemon name to dictionary failed"); + goto out; + } + daemon_name = NULL; + + if (odir) { + ret = dict_set_str(dict, "odir", odir); + if (ret) { + *op_errstr = gf_strdup( + "Command failed. Please" + " check log file for" + " more details."); + gf_log(THIS->name, GF_LOG_ERROR, + "Setting output directory to" + "dictionary failed"); + goto out; + } + } + + if (filename) { + ret = dict_set_str(dict, "filename", filename); + if (ret) { + *op_errstr = gf_strdup( + "Command failed. Please" + " check log file for" + " more details."); + gf_log(THIS->name, GF_LOG_ERROR, + "Setting filename to dictionary failed"); + goto out; + } + } + + if (cmd) { + ret = dict_set_uint32(dict, "getstate-cmd", cmd); + if (ret) { + *op_errstr = gf_strdup( + "Command failed. Please" + " check log file for" + " more details."); + gf_log(THIS->name, GF_LOG_ERROR, + "Setting " + "get-state command type to dictionary " + "failed"); + goto out; + } + } + } - if (ret && dict) - dict_unref (dict); +out: + if (dict) + *options = dict; - GF_FREE(daemon_name); + if (ret && dict) + dict_unref(dict); - return ret; + GF_FREE(daemon_name); + + return ret; } int32_t -cli_cmd_inode_quota_parse (const char **words, int wordcount, dict_t **options) +cli_cmd_inode_quota_parse(const char **words, int wordcount, dict_t **options) { - dict_t *dict = NULL; - char *volname = NULL; - int ret = -1; + dict_t *dict = NULL; + char *volname = NULL; + int ret = -1; - GF_ASSERT (words); - GF_ASSERT (options); + GF_ASSERT(words); + GF_ASSERT(options); - dict = dict_new (); - if (!dict) { - gf_log ("cli", GF_LOG_ERROR, "dict_new failed"); - goto out; - } + dict = dict_new(); + if (!dict) { + gf_log("cli", GF_LOG_ERROR, "dict_new failed"); + goto out; + } - if (wordcount != 4) - goto out; + if (wordcount != 4) + goto out; - volname = (char *)words[2]; - if (!volname) { - ret = -1; - goto out; - } + volname = (char *)words[2]; + if (!volname) { + ret = -1; + goto out; + } - /* Validate the volume name here itself */ - if (cli_validate_volname (volname) < 0) - goto out; + /* Validate the volume name here itself */ + if (cli_validate_volname(volname) < 0) + goto out; - ret = dict_set_str (dict, "volname", volname); - if (ret < 0) - goto out; + ret = dict_set_str(dict, "volname", volname); + if (ret < 0) + goto out; - if (strcmp (words[3], "enable") != 0) { - cli_out ("Invalid quota option : %s", words[3]); - ret = -1; - goto out; - } + if (strcmp(words[3], "enable") != 0) { + cli_out("Invalid quota option : %s", words[3]); + ret = -1; + goto out; + } - ret = dict_set_int32 (dict, "type", - GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS); - if (ret < 0) - goto out; + ret = dict_set_int32(dict, "type", GF_QUOTA_OPTION_TYPE_ENABLE_OBJECTS); + if (ret < 0) + goto out; - *options = dict; + *options = dict; out: - if (ret < 0) { - if (dict) - dict_unref (dict); - } + if (ret < 0) { + if (dict) + dict_unref(dict); + } - return ret; + return ret; } int32_t -cli_cmd_quota_parse (const char **words, int wordcount, dict_t **options) +cli_cmd_quota_parse(const char **words, int wordcount, dict_t **options) { - dict_t *dict = NULL; - char *volname = NULL; - int ret = -1; - int i = -1; - char key[20] = {0, }; - int64_t value = 0; - gf_quota_type type = GF_QUOTA_OPTION_TYPE_NONE; - char *opwords[] = { "enable", "disable", "limit-usage", - "remove", "list", "alert-time", - "soft-timeout", "hard-timeout", - "default-soft-limit", "limit-objects", - "list-objects", "remove-objects", NULL}; - char *w = NULL; - uint32_t time = 0; - double percent = 0; - char *end_ptr = NULL; - int64_t limit = 0; - - GF_ASSERT (words); - GF_ASSERT (options); - - dict = dict_new (); - if (!dict) { - gf_log ("cli", GF_LOG_ERROR, "dict_new failed"); - goto out; - } - - if (wordcount < 4) { - - if ((wordcount == 3) && !(strcmp (words[2], "help"))) { - ret = 1; - } - goto out; - } + dict_t *dict = NULL; + char *volname = NULL; + int ret = -1; + int i = -1; + char key[20] = { + 0, + }; + int64_t value = 0; + gf_quota_type type = GF_QUOTA_OPTION_TYPE_NONE; + char *opwords[] = {"enable", + "disable", + "limit-usage", + "remove", + "list", + "alert-time", + "soft-timeout", + "hard-timeout", + "default-soft-limit", + "limit-objects", + "list-objects", + "remove-objects", + NULL}; + char *w = NULL; + uint32_t time = 0; + double percent = 0; + char *end_ptr = NULL; + int64_t limit = 0; + + GF_ASSERT(words); + GF_ASSERT(options); + + dict = dict_new(); + if (!dict) { + gf_log("cli", GF_LOG_ERROR, "dict_new failed"); + goto out; + } - volname = (char *)words[2]; - if (!volname) { - ret = -1; - goto out; + if (wordcount < 4) { + if ((wordcount == 3) && !(strcmp(words[2], "help"))) { + ret = 1; } + goto out; + } - /* Validate the volume name here itself */ - if (cli_validate_volname (volname) < 0) - goto out; + volname = (char *)words[2]; + if (!volname) { + ret = -1; + goto out; + } - ret = dict_set_str (dict, "volname", volname); - if (ret < 0) - goto out; + /* Validate the volume name here itself */ + if (cli_validate_volname(volname) < 0) + goto out; - w = str_getunamb (words[3], opwords); - if (!w) { - cli_out ("Invalid quota option : %s", words[3]); - ret = - 1; - goto out; - } + ret = dict_set_str(dict, "volname", volname); + if (ret < 0) + goto out; - if (strcmp (w, "enable") == 0) { - if (wordcount == 4) { - type = GF_QUOTA_OPTION_TYPE_ENABLE; - ret = 0; - goto set_type; - } else { - ret = -1; - goto out; - } - } + w = str_getunamb(words[3], opwords); + if (!w) { + cli_out("Invalid quota option : %s", words[3]); + ret = -1; + goto out; + } - if (strcmp (w, "disable") == 0) { - if (wordcount == 4) { - type = GF_QUOTA_OPTION_TYPE_DISABLE; - ret = 0; - goto set_type; - } else { - ret = -1; - goto out; - } + if (strcmp(w, "enable") == 0) { + if (wordcount == 4) { + type = GF_QUOTA_OPTION_TYPE_ENABLE; + ret = 0; + goto set_type; + } else { + ret = -1; + goto out; } + } - if (strcmp (w, "limit-usage") == 0) { - type = GF_QUOTA_OPTION_TYPE_LIMIT_USAGE; - } else if (strcmp (w, "limit-objects") == 0) { - type = GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS; + if (strcmp(w, "disable") == 0) { + if (wordcount == 4) { + type = GF_QUOTA_OPTION_TYPE_DISABLE; + ret = 0; + goto set_type; + } else { + ret = -1; + goto out; } + } - if (type == GF_QUOTA_OPTION_TYPE_LIMIT_USAGE || - type == GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS) { + if (strcmp(w, "limit-usage") == 0) { + type = GF_QUOTA_OPTION_TYPE_LIMIT_USAGE; + } else if (strcmp(w, "limit-objects") == 0) { + type = GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS; + } - if (wordcount < 6 || wordcount > 7) { - ret = -1; - goto out; - } + if (type == GF_QUOTA_OPTION_TYPE_LIMIT_USAGE || + type == GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS) { + if (wordcount < 6 || wordcount > 7) { + ret = -1; + goto out; + } - if (words[4][0] != '/') { - cli_err ("Please enter absolute path"); - ret = -1; - goto out; - } - ret = dict_set_str (dict, "path", (char *) words[4]); - if (ret) - goto out; + if (words[4][0] != '/') { + cli_err("Please enter absolute path"); + ret = -1; + goto out; + } + ret = dict_set_str(dict, "path", (char *)words[4]); + if (ret) + goto out; + + if (!words[5]) { + cli_err("Please enter the limit value to be set"); + ret = -1; + goto out; + } + + if (type == GF_QUOTA_OPTION_TYPE_LIMIT_USAGE) { + ret = gf_string2bytesize_int64(words[5], &value); + if (ret != 0 || value <= 0) { + if (errno == ERANGE || value <= 0) { + ret = -1; + cli_err( + "Please enter an integer " + "value in the range of " + "(1 - %" PRId64 ")", + INT64_MAX); + } else + cli_err( + "Please enter a correct " + "value"); + goto out; + } + } else { + errno = 0; + limit = strtol(words[5], &end_ptr, 10); + if (errno == ERANGE || errno == EINVAL || limit <= 0 || + strcmp(end_ptr, "") != 0) { + ret = -1; + cli_err( + "Please enter an integer value in " + "the range 1 - %" PRId64, + INT64_MAX); + goto out; + } + } - if (!words[5]) { - cli_err ("Please enter the limit value to be set"); - ret = -1; - goto out; - } + ret = dict_set_str(dict, "hard-limit", (char *)words[5]); + if (ret < 0) + goto out; - if (type == GF_QUOTA_OPTION_TYPE_LIMIT_USAGE) { - ret = gf_string2bytesize_int64 (words[5], &value); - if (ret != 0 || value <= 0) { - if (errno == ERANGE || value <= 0) { - ret = -1; - cli_err ("Please enter an integer " - "value in the range of " - "(1 - %"PRId64 ")", - INT64_MAX); - } else - cli_err ("Please enter a correct " - "value"); - goto out; - } - } else { - errno = 0; - limit = strtol (words[5], &end_ptr, 10); - if (errno == ERANGE || errno == EINVAL || limit <= 0 - || strcmp (end_ptr, "") != 0) { - ret = -1; - cli_err ("Please enter an integer value in " - "the range 1 - %"PRId64, INT64_MAX); - goto out; - } - } + if (wordcount == 7) { + ret = gf_string2percent(words[6], &percent); + if (ret != 0 || percent > 100) { + ret = -1; + cli_err( + "Please enter a correct value " + "in the range of 0 to 100"); + goto out; + } - ret = dict_set_str (dict, "hard-limit", (char *) words[5]); - if (ret < 0) - goto out; + ret = dict_set_str(dict, "soft-limit", (char *)words[6]); + if (ret < 0) + goto out; + } - if (wordcount == 7) { + goto set_type; + } - ret = gf_string2percent (words[6], &percent); - if (ret != 0 || percent > 100) { - ret = -1; - cli_err ("Please enter a correct value " - "in the range of 0 to 100"); - goto out; - } + if (strcmp(w, "remove") == 0) { + if (wordcount != 5) { + ret = -1; + goto out; + } - ret = dict_set_str (dict, "soft-limit", - (char *) words[6]); - if (ret < 0) - goto out; - } + type = GF_QUOTA_OPTION_TYPE_REMOVE; - goto set_type; + if (words[4][0] != '/') { + cli_err("Please enter absolute path"); + ret = -1; + goto out; } - if (strcmp (w, "remove") == 0) { - if (wordcount != 5) { - ret = -1; - goto out; - } + ret = dict_set_str(dict, "path", (char *)words[4]); + if (ret < 0) + goto out; + goto set_type; + } - type = GF_QUOTA_OPTION_TYPE_REMOVE; + if (strcmp(w, "remove-objects") == 0) { + if (wordcount != 5) { + ret = -1; + goto out; + } - if (words[4][0] != '/') { - cli_err ("Please enter absolute path"); - ret = -1; - goto out; - } + type = GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS; - ret = dict_set_str (dict, "path", (char *) words[4]); - if (ret < 0) - goto out; - goto set_type; + if (words[4][0] != '/') { + cli_err("Please enter absolute path"); + ret = -1; + goto out; } - if (strcmp (w, "remove-objects") == 0) { - if (wordcount != 5) { - ret = -1; - goto out; - } - - type = GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS; + ret = dict_set_str(dict, "path", (char *)words[4]); + if (ret < 0) + goto out; + goto set_type; + } - if (words[4][0] != '/') { - cli_err ("Please enter absolute path"); - ret = -1; - goto out; - } + if (strcmp(w, "list") == 0) { + type = GF_QUOTA_OPTION_TYPE_LIST; - ret = dict_set_str (dict, "path", (char *) words[4]); - if (ret < 0) - goto out; - goto set_type; + if (words[4] && words[4][0] != '/') { + cli_err("Please enter absolute path"); + ret = -1; + goto out; } - if (strcmp (w, "list") == 0) { + i = 4; + while (i < wordcount) { + snprintf(key, 20, "path%d", i - 4); - type = GF_QUOTA_OPTION_TYPE_LIST; + ret = dict_set_str(dict, key, (char *)words[i++]); + if (ret < 0) + goto out; + } - if (words[4] && words[4][0] != '/') { - cli_err ("Please enter absolute path"); - ret = -1; - goto out; - } + ret = dict_set_int32(dict, "count", i - 4); + if (ret < 0) + goto out; - i = 4; - while (i < wordcount) { - snprintf (key, 20, "path%d", i-4); + goto set_type; + } - ret = dict_set_str (dict, key, (char *) words [i++]); - if (ret < 0) - goto out; - } + if (strcmp(w, "list-objects") == 0) { + type = GF_QUOTA_OPTION_TYPE_LIST_OBJECTS; - ret = dict_set_int32 (dict, "count", i - 4); - if (ret < 0) - goto out; + i = 4; + while (i < wordcount) { + snprintf(key, 20, "path%d", i - 4); - goto set_type; + ret = dict_set_str(dict, key, (char *)words[i++]); + if (ret < 0) { + gf_log("cli", GF_LOG_ERROR, + "Failed to set " + "quota patch in request dictionary"); + goto out; + } } - if (strcmp (w, "list-objects") == 0) { - type = GF_QUOTA_OPTION_TYPE_LIST_OBJECTS; - - i = 4; - while (i < wordcount) { - snprintf (key, 20, "path%d", i-4); - - ret = dict_set_str (dict, key, (char *) words[i++]); - if (ret < 0) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set " - "quota patch in request dictionary"); - goto out; - } - } - - ret = dict_set_int32 (dict, "count", i - 4); - if (ret < 0) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set quota " - "limit count in request dictionary"); - goto out; - } - - goto set_type; + ret = dict_set_int32(dict, "count", i - 4); + if (ret < 0) { + gf_log("cli", GF_LOG_ERROR, + "Failed to set quota " + "limit count in request dictionary"); + goto out; } - if (strcmp (w, "alert-time") == 0) { - if (wordcount != 5) { - ret = -1; - goto out; - } - type = GF_QUOTA_OPTION_TYPE_ALERT_TIME; + goto set_type; + } - ret = gf_string2time (words[4], &time); - if (ret) { - cli_err ("Invalid argument %s. Please enter a valid " - "string", words[4]); - goto out; - } + if (strcmp(w, "alert-time") == 0) { + if (wordcount != 5) { + ret = -1; + goto out; + } + type = GF_QUOTA_OPTION_TYPE_ALERT_TIME; - ret = dict_set_str (dict, "value", (char *)words[4]); - if (ret < 0) - goto out; - goto set_type; + ret = gf_string2time(words[4], &time); + if (ret) { + cli_err( + "Invalid argument %s. Please enter a valid " + "string", + words[4]); + goto out; } - if (strcmp (w, "soft-timeout") == 0) { - if (wordcount != 5) { - ret = -1; - goto out; - } - type = GF_QUOTA_OPTION_TYPE_SOFT_TIMEOUT; + ret = dict_set_str(dict, "value", (char *)words[4]); + if (ret < 0) + goto out; + goto set_type; + } - ret = gf_string2time (words[4], &time); - if (ret) { - cli_err ("Invalid argument %s. Please enter a valid " - "string", words[4]); - goto out; - } + if (strcmp(w, "soft-timeout") == 0) { + if (wordcount != 5) { + ret = -1; + goto out; + } + type = GF_QUOTA_OPTION_TYPE_SOFT_TIMEOUT; - ret = dict_set_str (dict, "value", (char *)words[4]); - if (ret < 0) - goto out; - goto set_type; + ret = gf_string2time(words[4], &time); + if (ret) { + cli_err( + "Invalid argument %s. Please enter a valid " + "string", + words[4]); + goto out; } - if (strcmp (w, "hard-timeout") == 0) { - if(wordcount != 5) { - ret = -1; - goto out; - } - type = GF_QUOTA_OPTION_TYPE_HARD_TIMEOUT; + ret = dict_set_str(dict, "value", (char *)words[4]); + if (ret < 0) + goto out; + goto set_type; + } - ret = gf_string2time (words[4], &time); - if (ret) { - cli_err ("Invalid argument %s. Please enter a valid " - "string", words[4]); - goto out; - } + if (strcmp(w, "hard-timeout") == 0) { + if (wordcount != 5) { + ret = -1; + goto out; + } + type = GF_QUOTA_OPTION_TYPE_HARD_TIMEOUT; - ret = dict_set_str (dict, "value", (char *)words[4]); - if (ret < 0) - goto out; - goto set_type; + ret = gf_string2time(words[4], &time); + if (ret) { + cli_err( + "Invalid argument %s. Please enter a valid " + "string", + words[4]); + goto out; } - if (strcmp (w, "default-soft-limit") == 0) { - if(wordcount != 5) { - ret = -1; - goto out; - } - type = GF_QUOTA_OPTION_TYPE_DEFAULT_SOFT_LIMIT; - ret = dict_set_str (dict, "value", (char *)words[4]); - if (ret < 0) - goto out; - goto set_type; - } else { - GF_ASSERT (!"opword mismatch"); + ret = dict_set_str(dict, "value", (char *)words[4]); + if (ret < 0) + goto out; + goto set_type; + } + if (strcmp(w, "default-soft-limit") == 0) { + if (wordcount != 5) { + ret = -1; + goto out; } + type = GF_QUOTA_OPTION_TYPE_DEFAULT_SOFT_LIMIT; -set_type: - ret = dict_set_int32 (dict, "type", type); + ret = dict_set_str(dict, "value", (char *)words[4]); if (ret < 0) - goto out; + goto out; + goto set_type; + } else { + GF_ASSERT(!"opword mismatch"); + } - *options = dict; +set_type: + ret = dict_set_int32(dict, "type", type); + if (ret < 0) + goto out; + + *options = dict; out: - if (ret < 0) { - if (dict) - dict_unref (dict); - } + if (ret < 0) { + if (dict) + dict_unref(dict); + } - return ret; + return ret; } static gf_boolean_t -cli_is_key_spl (char *key) +cli_is_key_spl(char *key) { - return (strcmp (key, "group") == 0); + return (strcmp(key, "group") == 0); } static int32_t cli_add_key_group_value(dict_t *dict, const char *name, const char *value, int32_t id, char **op_errstr) { - char *key = NULL; - char *data = NULL; - int32_t ret = -1; + char *key = NULL; + char *data = NULL; + int32_t ret = -1; - ret = gf_asprintf(&key, "%s%d", name, id); - if (ret < 0) { - goto out; - } - data = gf_strdup(value); - if (data == NULL) { - goto out; - } + ret = gf_asprintf(&key, "%s%d", name, id); + if (ret < 0) { + goto out; + } + data = gf_strdup(value); + if (data == NULL) { + goto out; + } - ret = dict_set_dynstr(dict, key, data); - if (ret == 0) { - data = NULL; - } + ret = dict_set_dynstr(dict, key, data); + if (ret == 0) { + data = NULL; + } out: - GF_FREE(key); - GF_FREE(data); + GF_FREE(key); + GF_FREE(data); - if ((ret != 0) && (op_errstr != NULL)) { - *op_errstr = gf_strdup("Failed to allocate memory"); - } + if ((ret != 0) && (op_errstr != NULL)) { + *op_errstr = gf_strdup("Failed to allocate memory"); + } - return ret; + return ret; } static int -cli_add_key_group (dict_t *dict, char *key, char *value, char **op_errstr) +cli_add_key_group(dict_t *dict, char *key, char *value, char **op_errstr) { - int ret = -1; - int opt_count = 0; - char *saveptr = NULL; - char *tok_key = NULL; - char *tok_val = NULL; - char *tagpath = NULL; - char line[PATH_MAX + 256] = {0,}; - FILE *fp = NULL; - - ret = gf_asprintf (&tagpath, "%s/groups/%s", - GLUSTERD_DEFAULT_WORKDIR, value); - if (ret == -1) { - tagpath = NULL; - goto out; - } - - fp = fopen (tagpath, "r"); - if (!fp) { - ret = -1; - if (op_errstr) { - gf_asprintf(op_errstr, "Unable to open file '%s'. " - "Error: %s", - tagpath, strerror(errno)); - } - goto out; - } - - opt_count = 0; - while (fgets(line, sizeof(line), fp) != NULL) { - if (strlen(line) >= sizeof(line) - 1) { - ret = -1; - if (op_errstr != NULL) { - *op_errstr = gf_strdup("Line too long"); - } - goto out; - } - opt_count++; - tok_key = strtok_r (line, "=", &saveptr); - tok_val = strtok_r (NULL, "\r\n", &saveptr); - if (!tok_key || !tok_val) { - ret = -1; - if (op_errstr) { - gf_asprintf(op_errstr, "'%s' file format " - "not valid.", - tagpath); - } - goto out; - } + int ret = -1; + int opt_count = 0; + char *saveptr = NULL; + char *tok_key = NULL; + char *tok_val = NULL; + char *tagpath = NULL; + char line[PATH_MAX + 256] = { + 0, + }; + FILE *fp = NULL; + + ret = gf_asprintf(&tagpath, "%s/groups/%s", GLUSTERD_DEFAULT_WORKDIR, + value); + if (ret == -1) { + tagpath = NULL; + goto out; + } - ret = cli_add_key_group_value(dict, "key", tok_key, opt_count, - op_errstr); - if (ret != 0) { - goto out; - } - ret = cli_add_key_group_value(dict, "value", tok_val, - opt_count, op_errstr); - if (ret != 0) { - goto out; - } + fp = fopen(tagpath, "r"); + if (!fp) { + ret = -1; + if (op_errstr) { + gf_asprintf(op_errstr, + "Unable to open file '%s'. " + "Error: %s", + tagpath, strerror(errno)); } - - if (!opt_count) { - ret = -1; - if (op_errstr) { - gf_asprintf(op_errstr, "'%s' file format not valid.", - tagpath); - } - goto out; + goto out; + } + + opt_count = 0; + while (fgets(line, sizeof(line), fp) != NULL) { + if (strlen(line) >= sizeof(line) - 1) { + ret = -1; + if (op_errstr != NULL) { + *op_errstr = gf_strdup("Line too long"); + } + goto out; + } + opt_count++; + tok_key = strtok_r(line, "=", &saveptr); + tok_val = strtok_r(NULL, "\r\n", &saveptr); + if (!tok_key || !tok_val) { + ret = -1; + if (op_errstr) { + gf_asprintf(op_errstr, + "'%s' file format " + "not valid.", + tagpath); + } + goto out; + } + + ret = cli_add_key_group_value(dict, "key", tok_key, opt_count, + op_errstr); + if (ret != 0) { + goto out; + } + ret = cli_add_key_group_value(dict, "value", tok_val, opt_count, + op_errstr); + if (ret != 0) { + goto out; + } + } + + if (!opt_count) { + ret = -1; + if (op_errstr) { + gf_asprintf(op_errstr, "'%s' file format not valid.", tagpath); } - ret = dict_set_int32 (dict, "count", opt_count); + goto out; + } + ret = dict_set_int32(dict, "count", opt_count); out: - GF_FREE (tagpath); + GF_FREE(tagpath); - if (fp) - fclose (fp); + if (fp) + fclose(fp); - return ret; + return ret; } int32_t -cli_cmd_volume_set_parse (struct cli_state *state, const char **words, - int wordcount, dict_t **options, char **op_errstr) +cli_cmd_volume_set_parse(struct cli_state *state, const char **words, + int wordcount, dict_t **options, char **op_errstr) { - dict_t *dict = NULL; - char *volname = NULL; - int ret = -1; - int count = 0; - char *key = NULL; - char *value = NULL; - int i = 0; - char str[50] = {0,}; - const char *question = NULL; - gf_answer_t answer = GF_ANSWER_NO; - - GF_ASSERT (words); - GF_ASSERT (options); - - dict = dict_new (); - - if (!dict) - goto out; - - if (wordcount < 3) - goto out; + dict_t *dict = NULL; + char *volname = NULL; + int ret = -1; + int count = 0; + char *key = NULL; + char *value = NULL; + int i = 0; + char str[50] = { + 0, + }; + const char *question = NULL; + gf_answer_t answer = GF_ANSWER_NO; + + GF_ASSERT(words); + GF_ASSERT(options); + + dict = dict_new(); + + if (!dict) + goto out; - volname = (char *)words[2]; + if (wordcount < 3) + goto out; - GF_ASSERT (volname); + volname = (char *)words[2]; - ret = dict_set_str (dict, "volname", volname); + GF_ASSERT(volname); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", volname); - if (!strcmp (volname, "all")) { - ret = dict_set_str (dict, "globalname", "All"); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, - "dict set on global key failed."); - goto out; - } + if (ret) + goto out; - ret = dict_set_int32 (dict, "hold_global_locks", _gf_true); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, - "dict set on global key failed."); - goto out; - } + if (!strcmp(volname, "all")) { + ret = dict_set_str(dict, "globalname", "All"); + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, "dict set on global key failed."); + goto out; } - if ((!strcmp (volname, "help") || !strcmp (volname, "help-xml")) - && wordcount == 3 ) { - ret = dict_set_str (dict, volname, volname); - if (ret) - goto out; + ret = dict_set_int32(dict, "hold_global_locks", _gf_true); + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, "dict set on global key failed."); + goto out; + } + } - } else if (wordcount < 5) { - ret = -1; - goto out; + if ((!strcmp(volname, "help") || !strcmp(volname, "help-xml")) && + wordcount == 3) { + ret = dict_set_str(dict, volname, volname); + if (ret) + goto out; - } else if (wordcount == 5 && cli_is_key_spl ((char *)words[3])) { - key = (char *) words[3]; - value = (char *) words[4]; - if ( !key || !value) { - ret = -1; - goto out; - } + } else if (wordcount < 5) { + ret = -1; + goto out; - ret = gf_strip_whitespace (value, strlen (value)); - if (ret == -1) - goto out; + } else if (wordcount == 5 && cli_is_key_spl((char *)words[3])) { + key = (char *)words[3]; + value = (char *)words[4]; + if (!key || !value) { + ret = -1; + goto out; + } - if (strlen (value) == 0) { - ret = -1; - goto out; - } + ret = gf_strip_whitespace(value, strlen(value)); + if (ret == -1) + goto out; - ret = cli_add_key_group (dict, key, value, op_errstr); - if (ret == 0) - *options = dict; - goto out; + if (strlen(value) == 0) { + ret = -1; + goto out; } - for (i = 3; i < wordcount; i+=2) { - - key = (char *) words[i]; - value = (char *) words[i+1]; + ret = cli_add_key_group(dict, key, value, op_errstr); + if (ret == 0) + *options = dict; + goto out; + } - if ( !key || !value) { - ret = -1; - goto out; - } + for (i = 3; i < wordcount; i += 2) { + key = (char *)words[i]; + value = (char *)words[i + 1]; - count++; + if (!key || !value) { + ret = -1; + goto out; + } - if (fnmatch ("user.*", key, FNM_NOESCAPE) != 0) { - ret = gf_strip_whitespace (value, strlen (value)); - if (ret == -1) - goto out; - } + count++; - if (strlen (value) == 0) { - ret = -1; - goto out; - } + if (fnmatch("user.*", key, FNM_NOESCAPE) != 0) { + ret = gf_strip_whitespace(value, strlen(value)); + if (ret == -1) + goto out; + } - if (cli_is_key_spl (key)) { - ret = -1; - goto out; - } + if (strlen(value) == 0) { + ret = -1; + goto out; + } - sprintf (str, "key%d", count); - ret = dict_set_str (dict, str, key); - if (ret) - goto out; + if (cli_is_key_spl(key)) { + ret = -1; + goto out; + } - sprintf (str, "value%d", count); - ret = dict_set_str (dict, str, value); + sprintf(str, "key%d", count); + ret = dict_set_str(dict, str, key); + if (ret) + goto out; - if (ret) - goto out; + sprintf(str, "value%d", count); + ret = dict_set_str(dict, str, value); - if ((!strcmp (key, "cluster.enable-shared-storage")) && - (!strcmp (value, "disable"))) { - question = "Disabling cluster.enable-shared-storage " - "will delete the shared storage volume" - "(gluster_shared_storage), which is used " - "by snapshot scheduler, geo-replication " - "and NFS-Ganesha. Do you still want to " - "continue?"; - answer = cli_cmd_get_confirmation (state, question); - if (GF_ANSWER_NO == answer) { - gf_log ("cli", GF_LOG_ERROR, "Operation " - "cancelled, exiting"); - *op_errstr = gf_strdup ("Aborted by user."); - ret = -1; - goto out; - } - } - if ((!strcmp (key, "nfs.disable")) && - (!strcmp (value, "off"))) { - question = "Gluster NFS is being deprecated in favor " - "of NFS-Ganesha Enter \"yes\" to continue " - "using Gluster NFS"; - answer = cli_cmd_get_confirmation (state, question); - if (GF_ANSWER_NO == answer) { - gf_log ("cli", GF_LOG_ERROR, "Operation " - "cancelled, exiting"); - *op_errstr = gf_strdup ("Aborted by user."); - ret = -1; - goto out; - } - } + if (ret) + goto out; + + if ((!strcmp(key, "cluster.enable-shared-storage")) && + (!strcmp(value, "disable"))) { + question = + "Disabling cluster.enable-shared-storage " + "will delete the shared storage volume" + "(gluster_shared_storage), which is used " + "by snapshot scheduler, geo-replication " + "and NFS-Ganesha. Do you still want to " + "continue?"; + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + gf_log("cli", GF_LOG_ERROR, + "Operation " + "cancelled, exiting"); + *op_errstr = gf_strdup("Aborted by user."); + ret = -1; + goto out; + } + } + if ((!strcmp(key, "nfs.disable")) && (!strcmp(value, "off"))) { + question = + "Gluster NFS is being deprecated in favor " + "of NFS-Ganesha Enter \"yes\" to continue " + "using Gluster NFS"; + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + gf_log("cli", GF_LOG_ERROR, + "Operation " + "cancelled, exiting"); + *op_errstr = gf_strdup("Aborted by user."); + ret = -1; + goto out; + } } + } - ret = dict_set_int32 (dict, "count", wordcount-3); + ret = dict_set_int32(dict, "count", wordcount - 3); - if (ret) - goto out; + if (ret) + goto out; - *options = dict; + *options = dict; out: - if (ret && dict) - dict_unref (dict); + if (ret && dict) + dict_unref(dict); - return ret; + return ret; } int32_t -cli_cmd_volume_add_brick_parse (struct cli_state *state, const char **words, - int wordcount, dict_t **options, int *ret_type) +cli_cmd_volume_add_brick_parse(struct cli_state *state, const char **words, + int wordcount, dict_t **options, int *ret_type) { - dict_t *dict = NULL; - char *volname = NULL; - int ret = -1; - int brick_count = 0, brick_index = 0; - char *bricks = NULL; - char *opwords_cl[] = { "replica", "stripe", NULL }; - gf1_cluster_type type = GF_CLUSTER_TYPE_NONE; - int count = 1; - int arbiter_count = 0; - char *w = NULL; - int index; - gf_boolean_t is_force = _gf_false; - int wc = wordcount; - gf_answer_t answer = GF_ANSWER_NO; - const char *question = NULL; - - GF_ASSERT (words); - GF_ASSERT (options); - - dict = dict_new (); - - if (!dict) - goto out; - - if (wordcount < 3) - goto out; + dict_t *dict = NULL; + char *volname = NULL; + int ret = -1; + int brick_count = 0, brick_index = 0; + char *bricks = NULL; + char *opwords_cl[] = {"replica", "stripe", NULL}; + gf1_cluster_type type = GF_CLUSTER_TYPE_NONE; + int count = 1; + int arbiter_count = 0; + char *w = NULL; + int index; + gf_boolean_t is_force = _gf_false; + int wc = wordcount; + gf_answer_t answer = GF_ANSWER_NO; + const char *question = NULL; + + GF_ASSERT(words); + GF_ASSERT(options); + + dict = dict_new(); + + if (!dict) + goto out; - volname = (char *)words[2]; + if (wordcount < 3) + goto out; - GF_ASSERT (volname); + volname = (char *)words[2]; - ret = dict_set_str (dict, "volname", volname); + GF_ASSERT(volname); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", volname); - if (wordcount < 4) { - ret = -1; - goto out; - } - if (wordcount < 6) { - /* seems no options are given, go directly to the parse_brick */ - brick_index = 3; - type = GF_CLUSTER_TYPE_NONE; - goto parse_bricks; - } + if (ret) + goto out; - w = str_getunamb (words[3], opwords_cl); - if (!w) { - type = GF_CLUSTER_TYPE_NONE; - index = 3; - } else if ((strcmp (w, "replica")) == 0) { - type = GF_CLUSTER_TYPE_REPLICATE; - count = strtol (words[4], NULL, 0); - if (!count || (count < 2)) { - cli_err ("replica count should be greater than 1"); - ret = -1; - goto out; - } - ret = dict_set_int32 (dict, "replica-count", count); - if (ret) - goto out; - index = 5; - if (words[index] && !strcmp (words[index], "arbiter")) { - arbiter_count = strtol (words[6], NULL, 0); - if (arbiter_count != 1 || count != 3) { - cli_err ("For arbiter configuration, replica " - "count must be 3 and arbiter count " - "must be 1. The 3rd brick of the " - "replica will be the arbiter"); - ret = -1; - goto out; - } - ret = dict_set_int32 (dict, "arbiter-count", - arbiter_count); - if (ret) - goto out; - index = 7; - } + if (wordcount < 4) { + ret = -1; + goto out; + } + if (wordcount < 6) { + /* seems no options are given, go directly to the parse_brick */ + brick_index = 3; + type = GF_CLUSTER_TYPE_NONE; + goto parse_bricks; + } - if (count == 2) { - if (strcmp (words[wordcount - 1], "force")) { - question = "Replica 2 volumes are prone to " - "split-brain. Use Arbiter or " - "Replica 3 to avaoid this. See: " - "http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/." - "\nDo you still want to continue?\n"; - answer = cli_cmd_get_confirmation (state, - question); - if (GF_ANSWER_NO == answer) { - gf_log ("cli", GF_LOG_ERROR, "Add brick" - " cancelled, exiting"); - ret = -1; - goto out; - } - } - } - } else if ((strcmp (w, "stripe")) == 0) { - type = GF_CLUSTER_TYPE_STRIPE; - count = strtol (words[4], NULL, 0); - if (!count || (count < 2)) { - cli_err ("stripe count should be greater than 1"); - ret = -1; - goto out; - } - ret = dict_set_int32 (dict, "stripe-count", count); - if (ret) - goto out; - index = 5; - } else { - GF_ASSERT (!"opword mismatch"); + w = str_getunamb(words[3], opwords_cl); + if (!w) { + type = GF_CLUSTER_TYPE_NONE; + index = 3; + } else if ((strcmp(w, "replica")) == 0) { + type = GF_CLUSTER_TYPE_REPLICATE; + count = strtol(words[4], NULL, 0); + if (!count || (count < 2)) { + cli_err("replica count should be greater than 1"); + ret = -1; + goto out; + } + ret = dict_set_int32(dict, "replica-count", count); + if (ret) + goto out; + index = 5; + if (words[index] && !strcmp(words[index], "arbiter")) { + arbiter_count = strtol(words[6], NULL, 0); + if (arbiter_count != 1 || count != 3) { + cli_err( + "For arbiter configuration, replica " + "count must be 3 and arbiter count " + "must be 1. The 3rd brick of the " + "replica will be the arbiter"); ret = -1; goto out; + } + ret = dict_set_int32(dict, "arbiter-count", arbiter_count); + if (ret) + goto out; + index = 7; } - brick_index = index; + if (count == 2) { + if (strcmp(words[wordcount - 1], "force")) { + question = + "Replica 2 volumes are prone to " + "split-brain. Use Arbiter or " + "Replica 3 to avaoid this. See: " + "http://docs.gluster.org/en/latest/Administrator%20Guide/" + "Split%20brain%20and%20ways%20to%20deal%20with%20it/." + "\nDo you still want to continue?\n"; + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + gf_log("cli", GF_LOG_ERROR, + "Add brick" + " cancelled, exiting"); + ret = -1; + goto out; + } + } + } + } else if ((strcmp(w, "stripe")) == 0) { + type = GF_CLUSTER_TYPE_STRIPE; + count = strtol(words[4], NULL, 0); + if (!count || (count < 2)) { + cli_err("stripe count should be greater than 1"); + ret = -1; + goto out; + } + ret = dict_set_int32(dict, "stripe-count", count); + if (ret) + goto out; + index = 5; + } else { + GF_ASSERT(!"opword mismatch"); + ret = -1; + goto out; + } + + brick_index = index; parse_bricks: - if (strcmp (words[wordcount - 1], "force") == 0) { - is_force = _gf_true; - wc = wordcount - 1; - } + if (strcmp(words[wordcount - 1], "force") == 0) { + is_force = _gf_true; + wc = wordcount - 1; + } - ret = cli_cmd_bricks_parse (words, wc, brick_index, &bricks, - &brick_count); - if (ret) - goto out; + ret = cli_cmd_bricks_parse(words, wc, brick_index, &bricks, &brick_count); + if (ret) + goto out; - ret = dict_set_dynstr (dict, "bricks", bricks); - if (ret) - goto out; + ret = dict_set_dynstr(dict, "bricks", bricks); + if (ret) + goto out; - ret = dict_set_int32 (dict, "count", brick_count); + ret = dict_set_int32(dict, "count", brick_count); - if (ret) - goto out; + if (ret) + goto out; - ret = dict_set_int32 (dict, "force", is_force); - if (ret) - goto out; + ret = dict_set_int32(dict, "force", is_force); + if (ret) + goto out; - *options = dict; + *options = dict; out: - if (ret_type) - *ret_type = type; + if (ret_type) + *ret_type = type; - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to parse add-brick CLI"); - if (dict) - dict_unref (dict); - } + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to parse add-brick CLI"); + if (dict) + dict_unref(dict); + } - return ret; + return ret; } int32_t -cli_cmd_volume_tier_parse (const char **words, int wordcount, - dict_t **options) +cli_cmd_volume_tier_parse(const char **words, int wordcount, dict_t **options) { - dict_t *dict = NULL; - char *volname = NULL; - int ret = -1; - int32_t command = GF_DEFRAG_CMD_NONE; - int32_t is_force = 0; + dict_t *dict = NULL; + char *volname = NULL; + int ret = -1; + int32_t command = GF_DEFRAG_CMD_NONE; + int32_t is_force = 0; - GF_ASSERT (words); - GF_ASSERT (options); + GF_ASSERT(words); + GF_ASSERT(options); - dict = dict_new (); + dict = dict_new(); - if (!dict) - goto out; + if (!dict) + goto out; - if (!(wordcount == 4 || wordcount == 5)) { - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - ret = -1; - goto out; - } + if (!(wordcount == 4 || wordcount == 5)) { + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + ret = -1; + goto out; + } - volname = (char *)words[2]; + volname = (char *)words[2]; - GF_ASSERT (volname); + GF_ASSERT(volname); - ret = cli_cmd_validate_volume (volname); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to validate volume name"); - goto out; - } + ret = cli_cmd_validate_volume(volname); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to validate volume name"); + goto out; + } - ret = dict_set_str (dict, "volname", volname); + ret = dict_set_str(dict, "volname", volname); - if (ret) - goto out; + if (ret) + goto out; - volname = (char *)words[2]; - if (wordcount == 4) { - if (!strcmp(words[3], "status")) - command = GF_DEFRAG_CMD_STATUS_TIER; - else if (!strcmp(words[3], "start")) - command = GF_DEFRAG_CMD_START_TIER; - else if (!strcmp(words[3], "stop")) - command = GF_DEFRAG_CMD_STOP_TIER; - else { - ret = -1; - goto out; - } - } else if (wordcount == 5) { - if ((!strcmp (words[3], "start")) && - (!strcmp (words[4], "force"))) { - command = GF_DEFRAG_CMD_START_TIER; - is_force = 1; - ret = dict_set_int32 (dict, "force", is_force); - if (ret) - goto out; - } else { - ret = -1; - goto out; - } + volname = (char *)words[2]; + if (wordcount == 4) { + if (!strcmp(words[3], "status")) + command = GF_DEFRAG_CMD_STATUS_TIER; + else if (!strcmp(words[3], "start")) + command = GF_DEFRAG_CMD_START_TIER; + else if (!strcmp(words[3], "stop")) + command = GF_DEFRAG_CMD_STOP_TIER; + else { + ret = -1; + goto out; + } + } else if (wordcount == 5) { + if ((!strcmp(words[3], "start")) && (!strcmp(words[4], "force"))) { + command = GF_DEFRAG_CMD_START_TIER; + is_force = 1; + ret = dict_set_int32(dict, "force", is_force); + if (ret) + goto out; + } else { + ret = -1; + goto out; } + } - ret = dict_set_int32 (dict, "rebalance-command", command); - if (ret) - goto out; + ret = dict_set_int32(dict, "rebalance-command", command); + if (ret) + goto out; - *options = dict; + *options = dict; out: - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to parse tier CLI"); - if (dict) - dict_unref (dict); - } + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to parse tier CLI"); + if (dict) + dict_unref(dict); + } - return ret; + return ret; } int32_t -cli_cmd_volume_detach_tier_parse (const char **words, int wordcount, - dict_t **options, int *question) +cli_cmd_volume_detach_tier_parse(const char **words, int wordcount, + dict_t **options, int *question) { - int ret = -1; - char *word = NULL; - dict_t *dict = NULL; - int32_t command = GF_DEFRAG_CMD_NONE; - - dict = dict_new (); - if (!dict) - goto out; - - ret = dict_set_str (dict, "volname", (char *)words[2]); - if (ret) - goto out; + int ret = -1; + char *word = NULL; + dict_t *dict = NULL; + int32_t command = GF_DEFRAG_CMD_NONE; - if (wordcount == 3 && !strcmp ((char *)words[2], "help")) { - return -1; - } + dict = dict_new(); + if (!dict) + goto out; - if (wordcount != 4) { - ret = -1; - goto out; - } + ret = dict_set_str(dict, "volname", (char *)words[2]); + if (ret) + goto out; - word = (char *)words[3]; + if (wordcount == 3 && !strcmp((char *)words[2], "help")) { + return -1; + } + if (wordcount != 4) { ret = -1; + goto out; + } + + word = (char *)words[3]; + + ret = -1; + + if (!strcmp(word, "start")) { + command = GF_DEFRAG_CMD_DETACH_START; + } else if (!strcmp(word, "commit")) { + *question = 1; + command = GF_DEFRAG_CMD_DETACH_COMMIT; + } else if (!strcmp(word, "force")) { + *question = 1; + command = GF_DEFRAG_CMD_DETACH_COMMIT_FORCE; + } else if (!strcmp(word, "stop")) + command = GF_DEFRAG_CMD_DETACH_STOP; + else if (!strcmp(word, "status")) + command = GF_DEFRAG_CMD_DETACH_STATUS; + else + goto out; - if (!strcmp(word, "start")) { - command = GF_DEFRAG_CMD_DETACH_START; - } else if (!strcmp(word, "commit")) { - *question = 1; - command = GF_DEFRAG_CMD_DETACH_COMMIT; - } else if (!strcmp(word, "force")) { - *question = 1; - command = GF_DEFRAG_CMD_DETACH_COMMIT_FORCE; - } else if (!strcmp(word, "stop")) - command = GF_DEFRAG_CMD_DETACH_STOP; - else if (!strcmp(word, "status")) - command = GF_DEFRAG_CMD_DETACH_STATUS; - else - goto out; - - ret = dict_set_int32 (dict, "command", command); - if (ret) - goto out; + ret = dict_set_int32(dict, "command", command); + if (ret) + goto out; - *options = dict; - ret = 0; + *options = dict; + ret = 0; out: - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to parse detach tier CLI"); - if (dict) - dict_unref (dict); - } + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to parse detach tier CLI"); + if (dict) + dict_unref(dict); + } - return ret; + return ret; } int32_t -cli_cmd_volume_remove_brick_parse (struct cli_state *state, const char **words, - int wordcount, dict_t **options, - int *question, int *brick_count, - int32_t *comm) +cli_cmd_volume_remove_brick_parse(struct cli_state *state, const char **words, + int wordcount, dict_t **options, + int *question, int *brick_count, + int32_t *comm) { - dict_t *dict = NULL; - char *volname = NULL; - char *delimiter = NULL; - int ret = -1; - char key[50]; - int brick_index = 0; - int32_t tmp_index = 0; - int32_t j = 0; - char *tmp_brick = NULL; - char *tmp_brick1 = NULL; - char *type_opword[] = { "replica", NULL }; - char *opwords[] = { "start", "commit", "stop", "status", - "force", NULL }; - char *w = NULL; - int32_t command = GF_OP_CMD_NONE; - long count = 0; - gf_answer_t answer = GF_ANSWER_NO; - const char *ques = NULL; - - GF_ASSERT (words); - GF_ASSERT (options); - - if (wordcount < 5) - goto out; - - dict = dict_new (); - if (!dict) - goto out; + dict_t *dict = NULL; + char *volname = NULL; + char *delimiter = NULL; + int ret = -1; + char key[50]; + int brick_index = 0; + int32_t tmp_index = 0; + int32_t j = 0; + char *tmp_brick = NULL; + char *tmp_brick1 = NULL; + char *type_opword[] = {"replica", NULL}; + char *opwords[] = {"start", "commit", "stop", "status", "force", NULL}; + char *w = NULL; + int32_t command = GF_OP_CMD_NONE; + long count = 0; + gf_answer_t answer = GF_ANSWER_NO; + const char *ques = NULL; + + GF_ASSERT(words); + GF_ASSERT(options); + + if (wordcount < 5) + goto out; - volname = (char *)words[2]; + dict = dict_new(); + if (!dict) + goto out; - GF_ASSERT (volname); + volname = (char *)words[2]; - ret = dict_set_str (dict, "volname", volname); - if (ret) - goto out; + GF_ASSERT(volname); - brick_index = 3; - w = str_getunamb (words[3], type_opword); - if (w && !strcmp ("replica", w)) { - if (wordcount < 6) { - ret = -1; - goto out; - } - count = strtol (words[4], NULL, 0); - if (count < 1) { - cli_err ("replica count should be greater than 0 in " - "case of remove-brick"); - ret = -1; - goto out; - } + ret = dict_set_str(dict, "volname", volname); + if (ret) + goto out; - if (count == 2) { - if (strcmp (words[wordcount - 1], "force")) { - ques = "Replica 2 volumes are prone to " - "split-brain. Use Arbiter or Replica 3 " - "to avaoid this. See: " - "http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/." - "\nDo you still want to continue?\n"; - answer = cli_cmd_get_confirmation (state, - ques); - if (GF_ANSWER_NO == answer) { - gf_log ("cli", GF_LOG_ERROR, "Remove " - "brick cancelled, exiting"); - ret = -1; - goto out; - } - } + brick_index = 3; + w = str_getunamb(words[3], type_opword); + if (w && !strcmp("replica", w)) { + if (wordcount < 6) { + ret = -1; + goto out; + } + count = strtol(words[4], NULL, 0); + if (count < 1) { + cli_err( + "replica count should be greater than 0 in " + "case of remove-brick"); + ret = -1; + goto out; + } + + if (count == 2) { + if (strcmp(words[wordcount - 1], "force")) { + ques = + "Replica 2 volumes are prone to " + "split-brain. Use Arbiter or Replica 3 " + "to avaoid this. See: " + "http://docs.gluster.org/en/latest/Administrator%20Guide/" + "Split%20brain%20and%20ways%20to%20deal%20with%20it/." + "\nDo you still want to continue?\n"; + answer = cli_cmd_get_confirmation(state, ques); + if (GF_ANSWER_NO == answer) { + gf_log("cli", GF_LOG_ERROR, + "Remove " + "brick cancelled, exiting"); + ret = -1; + goto out; } - - ret = dict_set_int32 (dict, "replica-count", count); - if (ret) - goto out; - brick_index = 5; - } else if (w) { - GF_ASSERT (!"opword mismatch"); + } } - w = str_getunamb (words[wordcount - 1], opwords); - if (!w) { - ret = -1; - goto out; + ret = dict_set_int32(dict, "replica-count", count); + if (ret) + goto out; + brick_index = 5; + } else if (w) { + GF_ASSERT(!"opword mismatch"); + } + + w = str_getunamb(words[wordcount - 1], opwords); + if (!w) { + ret = -1; + goto out; + } else { + /* handled this option */ + wordcount--; + if (!strcmp("start", w)) { + command = GF_OP_CMD_START; + if (question) + *question = 1; + } else if (!strcmp("commit", w)) { + command = GF_OP_CMD_COMMIT; + } else if (!strcmp("stop", w)) { + command = GF_OP_CMD_STOP; + } else if (!strcmp("status", w)) { + command = GF_OP_CMD_STATUS; + } else if (!strcmp("force", w)) { + command = GF_OP_CMD_COMMIT_FORCE; + if (question) + *question = 1; } else { - /* handled this option */ - wordcount--; - if (!strcmp ("start", w)) { - command = GF_OP_CMD_START; - if (question) - *question = 1; - } else if (!strcmp ("commit", w)) { - command = GF_OP_CMD_COMMIT; - } else if (!strcmp ("stop", w)) { - command = GF_OP_CMD_STOP; - } else if (!strcmp ("status", w)) { - command = GF_OP_CMD_STATUS; - } else if (!strcmp ("force", w)) { - command = GF_OP_CMD_COMMIT_FORCE; - if (question) - *question = 1; - } else { - GF_ASSERT (!"opword mismatch"); - ret = -1; - goto out; - } + GF_ASSERT(!"opword mismatch"); + ret = -1; + goto out; } + } - ret = dict_set_int32 (dict, "command", command); - if (ret) - gf_log ("cli", GF_LOG_INFO, "failed to set 'command' %d", - command); - + ret = dict_set_int32(dict, "command", command); + if (ret) + gf_log("cli", GF_LOG_INFO, "failed to set 'command' %d", command); - tmp_index = brick_index; - tmp_brick = GF_MALLOC(2048 * sizeof(*tmp_brick), gf_common_mt_char); + tmp_index = brick_index; + tmp_brick = GF_MALLOC(2048 * sizeof(*tmp_brick), gf_common_mt_char); - if (!tmp_brick) { - gf_log ("",GF_LOG_ERROR,"cli_cmd_volume_remove_brick_parse: " - "Unable to get memory"); - ret = -1; - goto out; - } + if (!tmp_brick) { + gf_log("", GF_LOG_ERROR, + "cli_cmd_volume_remove_brick_parse: " + "Unable to get memory"); + ret = -1; + goto out; + } - tmp_brick1 = GF_MALLOC(2048 * sizeof(*tmp_brick1), gf_common_mt_char); + tmp_brick1 = GF_MALLOC(2048 * sizeof(*tmp_brick1), gf_common_mt_char); - if (!tmp_brick1) { - gf_log ("",GF_LOG_ERROR,"cli_cmd_volume_remove_brick_parse: " - "Unable to get memory"); + if (!tmp_brick1) { + gf_log("", GF_LOG_ERROR, + "cli_cmd_volume_remove_brick_parse: " + "Unable to get memory"); + ret = -1; + goto out; + } + + while (brick_index < wordcount) { + if (validate_brick_name((char *)words[brick_index])) { + cli_err( + "wrong brick type: %s, use <HOSTNAME>:" + "<export-dir-abs-path>", + words[brick_index]); + ret = -1; + goto out; + } else { + delimiter = strrchr(words[brick_index], ':'); + ret = gf_canonicalize_path(delimiter + 1); + if (ret) + goto out; + } + + j = tmp_index; + strcpy(tmp_brick, words[brick_index]); + while (j < brick_index) { + strcpy(tmp_brick1, words[j]); + if (!(strcmp(tmp_brick, tmp_brick1))) { + gf_log("", GF_LOG_ERROR, + "Duplicate bricks" + " found %s", + words[brick_index]); + cli_err("Duplicate bricks found %s", words[brick_index]); ret = -1; goto out; + } + j++; } + snprintf(key, 50, "brick%d", ++(*brick_count)); + ret = dict_set_str(dict, key, (char *)words[brick_index++]); - while (brick_index < wordcount) { - if (validate_brick_name ((char *)words[brick_index])) { - cli_err ("wrong brick type: %s, use <HOSTNAME>:" - "<export-dir-abs-path>", words[brick_index]); - ret = -1; - goto out; - } else { - delimiter = strrchr(words[brick_index], ':'); - ret = gf_canonicalize_path (delimiter + 1); - if (ret) - goto out; - } - - j = tmp_index; - strcpy(tmp_brick, words[brick_index]); - while ( j < brick_index) { - strcpy(tmp_brick1, words[j]); - if (!(strcmp (tmp_brick, tmp_brick1))) { - gf_log("",GF_LOG_ERROR, "Duplicate bricks" - " found %s", words[brick_index]); - cli_err("Duplicate bricks found %s", - words[brick_index]); - ret = -1; - goto out; - } - j++; - } - snprintf (key, 50, "brick%d", ++(*brick_count)); - ret = dict_set_str (dict, key, (char *)words[brick_index++]); - - if (ret) - goto out; - } + if (ret) + goto out; + } - if (command != GF_OP_CMD_STATUS && command != GF_OP_CMD_STOP) { - ret = dict_set_int32 (dict, "count", *brick_count); - if (ret) - goto out; - } + if (command != GF_OP_CMD_STATUS && command != GF_OP_CMD_STOP) { + ret = dict_set_int32(dict, "count", *brick_count); + if (ret) + goto out; + } - *options = dict; + *options = dict; out: - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to parse remove-brick CLI"); - if (dict) - dict_unref (dict); - } + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to parse remove-brick CLI"); + if (dict) + dict_unref(dict); + } - GF_FREE (tmp_brick); - GF_FREE (tmp_brick1); + GF_FREE(tmp_brick); + GF_FREE(tmp_brick1); - *comm = command; + *comm = command; - return ret; + return ret; } int32_t -cli_cmd_brick_op_validate_bricks (const char **words, dict_t *dict, - int src, int dst) +cli_cmd_brick_op_validate_bricks(const char **words, dict_t *dict, int src, + int dst) { - int ret = -1; - char *delimiter = NULL; - - if (validate_brick_name ((char *)words[src])) { - cli_err ("wrong brick type: %s, use " - "<HOSTNAME>:<export-dir-abs-path>", words[3]); - ret = -1; - goto out; - } else { - delimiter = strrchr ((char *)words[src], '/'); - ret = gf_canonicalize_path (delimiter); - if (ret) - goto out; - } - - ret = dict_set_str (dict, "src-brick", (char *)words[src]); + int ret = -1; + char *delimiter = NULL; + + if (validate_brick_name((char *)words[src])) { + cli_err( + "wrong brick type: %s, use " + "<HOSTNAME>:<export-dir-abs-path>", + words[3]); + ret = -1; + goto out; + } else { + delimiter = strrchr((char *)words[src], '/'); + ret = gf_canonicalize_path(delimiter); if (ret) - goto out; + goto out; + } - if (dst == -1) { - ret = 0; - goto out; - } + ret = dict_set_str(dict, "src-brick", (char *)words[src]); + if (ret) + goto out; - if (validate_brick_name ((char *)words[dst])) { - cli_err ("wrong brick type: %s, use " - "<HOSTNAME>:<export-dir-abs-path>", words[dst]); - ret = -1; - goto out; - } else { - delimiter = strrchr ((char *)words[dst], '/'); - ret = gf_canonicalize_path (delimiter); - if (ret) - goto out; - } + if (dst == -1) { + ret = 0; + goto out; + } - ret = dict_set_str (dict, "dst-brick", (char *)words[dst]); + if (validate_brick_name((char *)words[dst])) { + cli_err( + "wrong brick type: %s, use " + "<HOSTNAME>:<export-dir-abs-path>", + words[dst]); + ret = -1; + goto out; + } else { + delimiter = strrchr((char *)words[dst], '/'); + ret = gf_canonicalize_path(delimiter); if (ret) - goto out; - ret = 0; + goto out; + } + + ret = dict_set_str(dict, "dst-brick", (char *)words[dst]); + if (ret) + goto out; + ret = 0; out: - return ret; + return ret; } int32_t -cli_cmd_volume_reset_brick_parse (const char **words, int wordcount, - dict_t **options) +cli_cmd_volume_reset_brick_parse(const char **words, int wordcount, + dict_t **options) { - int ret = -1; - char *volname = NULL; - dict_t *dict = NULL; - - if (wordcount < 5 || wordcount > 7) - goto out; - - dict = dict_new (); + int ret = -1; + char *volname = NULL; + dict_t *dict = NULL; - if (!dict) - goto out; + if (wordcount < 5 || wordcount > 7) + goto out; - volname = (char *)words[2]; + dict = dict_new(); - ret = dict_set_str (dict, "volname", volname); - if (ret) - goto out; + if (!dict) + goto out; - if (wordcount == 5) { - if (strcmp (words[4], "start")) { - cli_err ("Invalid option '%s' for reset-brick. Please " - "enter valid reset-brick command", words[4]); - ret = -1; - goto out; - } + volname = (char *)words[2]; - ret = cli_cmd_brick_op_validate_bricks (words, dict, 3, -1); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", volname); + if (ret) + goto out; - ret = dict_set_str (dict, "operation", "GF_RESET_OP_START"); - if (ret) - goto out; - } else if (wordcount == 6) { - if (strcmp (words[5], "commit")) { - cli_err ("Invalid option '%s' for reset-brick. Please " - "enter valid reset-brick command", words[5]); - ret = -1; - goto out; - } + if (wordcount == 5) { + if (strcmp(words[4], "start")) { + cli_err( + "Invalid option '%s' for reset-brick. Please " + "enter valid reset-brick command", + words[4]); + ret = -1; + goto out; + } - ret = cli_cmd_brick_op_validate_bricks (words, dict, 3, 4); - if (ret) - goto out; + ret = cli_cmd_brick_op_validate_bricks(words, dict, 3, -1); + if (ret) + goto out; - ret = dict_set_str (dict, "operation", "GF_RESET_OP_COMMIT"); - if (ret) - goto out; - } else if (wordcount == 7) { - if (strcmp (words[5], "commit") || strcmp (words[6], "force")) { - cli_err ("Invalid option '%s %s' for reset-brick. Please " - "enter valid reset-brick command", - words[5], words[6]); - ret = -1; - goto out; - } + ret = dict_set_str(dict, "operation", "GF_RESET_OP_START"); + if (ret) + goto out; + } else if (wordcount == 6) { + if (strcmp(words[5], "commit")) { + cli_err( + "Invalid option '%s' for reset-brick. Please " + "enter valid reset-brick command", + words[5]); + ret = -1; + goto out; + } + + ret = cli_cmd_brick_op_validate_bricks(words, dict, 3, 4); + if (ret) + goto out; - ret = cli_cmd_brick_op_validate_bricks (words, dict, 3, 4); - if (ret) - goto out; + ret = dict_set_str(dict, "operation", "GF_RESET_OP_COMMIT"); + if (ret) + goto out; + } else if (wordcount == 7) { + if (strcmp(words[5], "commit") || strcmp(words[6], "force")) { + cli_err( + "Invalid option '%s %s' for reset-brick. Please " + "enter valid reset-brick command", + words[5], words[6]); + ret = -1; + goto out; + } + + ret = cli_cmd_brick_op_validate_bricks(words, dict, 3, 4); + if (ret) + goto out; - ret = dict_set_str (dict, "operation", - "GF_RESET_OP_COMMIT_FORCE"); - if (ret) - goto out; - } + ret = dict_set_str(dict, "operation", "GF_RESET_OP_COMMIT_FORCE"); + if (ret) + goto out; + } - *options = dict; + *options = dict; out: - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Unable to parse reset-brick CLI"); - if (dict) - dict_unref (dict); - } + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to parse reset-brick CLI"); + if (dict) + dict_unref(dict); + } - return ret; + return ret; } int32_t -cli_cmd_volume_replace_brick_parse (const char **words, int wordcount, - dict_t **options) +cli_cmd_volume_replace_brick_parse(const char **words, int wordcount, + dict_t **options) { - int ret = -1; - char *volname = NULL; - dict_t *dict = NULL; + int ret = -1; + char *volname = NULL; + dict_t *dict = NULL; - GF_ASSERT (words); - GF_ASSERT (options); + GF_ASSERT(words); + GF_ASSERT(options); - if (wordcount != 7) { - ret = -1; - goto out; - } + if (wordcount != 7) { + ret = -1; + goto out; + } - dict = dict_new (); + dict = dict_new(); - if (!dict) { - gf_log ("cli", GF_LOG_ERROR, "Failed to allocate dictionary"); - goto out; - } + if (!dict) { + gf_log("cli", GF_LOG_ERROR, "Failed to allocate dictionary"); + goto out; + } - volname = (char *)words[2]; + volname = (char *)words[2]; - GF_ASSERT (volname); + GF_ASSERT(volname); - ret = dict_set_str (dict, "volname", volname); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", volname); + if (ret) + goto out; - ret = cli_cmd_brick_op_validate_bricks (words, dict, 3, 4); - if (ret) - goto out; + ret = cli_cmd_brick_op_validate_bricks(words, dict, 3, 4); + if (ret) + goto out; - /* commit force option */ - if (strcmp ("commit", words[5]) || strcmp ("force", words[6])) { - cli_err ("Invalid option '%s' '%s' for replace-brick. Please " - "enter valid replace-brick command", words[5], - words[6]); - ret = -1; - goto out; - } + /* commit force option */ + if (strcmp("commit", words[5]) || strcmp("force", words[6])) { + cli_err( + "Invalid option '%s' '%s' for replace-brick. Please " + "enter valid replace-brick command", + words[5], words[6]); + ret = -1; + goto out; + } - ret = dict_set_str (dict, "operation", "GF_REPLACE_OP_COMMIT_FORCE"); - if (ret) - goto out; + ret = dict_set_str(dict, "operation", "GF_REPLACE_OP_COMMIT_FORCE"); + if (ret) + goto out; - *options = dict; + *options = dict; out: - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to parse reset-brick CLI"); - if (dict) - dict_unref (dict); - } + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to parse reset-brick CLI"); + if (dict) + dict_unref(dict); + } - return ret; + return ret; } int32_t -cli_cmd_log_filename_parse (const char **words, int wordcount, dict_t **options) +cli_cmd_log_filename_parse(const char **words, int wordcount, dict_t **options) { - dict_t *dict = NULL; - char *volname = NULL; - char *str = NULL; - int ret = -1; - char *delimiter = NULL; + dict_t *dict = NULL; + char *volname = NULL; + char *str = NULL; + int ret = -1; + char *delimiter = NULL; - GF_ASSERT (words); - GF_ASSERT (options); + GF_ASSERT(words); + GF_ASSERT(options); - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - volname = (char *)words[3]; - GF_ASSERT (volname); + volname = (char *)words[3]; + GF_ASSERT(volname); - ret = dict_set_str (dict, "volname", volname); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", volname); + if (ret) + goto out; - str = (char *)words[4]; - if (strchr (str, ':')) { - delimiter = strchr (words[4], ':'); - if (!delimiter || delimiter == words[4] - || *(delimiter+1) != '/') { - cli_err ("wrong brick type: %s, use <HOSTNAME>:" - "<export-dir-abs-path>", words[4]); - ret = -1; - goto out; - } else { - ret = gf_canonicalize_path (delimiter + 1); - if (ret) - goto out; - } - ret = dict_set_str (dict, "brick", str); - if (ret) - goto out; - /* Path */ - str = (char *)words[5]; - ret = dict_set_str (dict, "path", str); - if (ret) - goto out; + str = (char *)words[4]; + if (strchr(str, ':')) { + delimiter = strchr(words[4], ':'); + if (!delimiter || delimiter == words[4] || *(delimiter + 1) != '/') { + cli_err( + "wrong brick type: %s, use <HOSTNAME>:" + "<export-dir-abs-path>", + words[4]); + ret = -1; + goto out; } else { - ret = dict_set_str (dict, "path", str); - if (ret) - goto out; + ret = gf_canonicalize_path(delimiter + 1); + if (ret) + goto out; } + ret = dict_set_str(dict, "brick", str); + if (ret) + goto out; + /* Path */ + str = (char *)words[5]; + ret = dict_set_str(dict, "path", str); + if (ret) + goto out; + } else { + ret = dict_set_str(dict, "path", str); + if (ret) + goto out; + } - *options = dict; + *options = dict; out: - if (ret && dict) - dict_unref (dict); + if (ret && dict) + dict_unref(dict); - return ret; + return ret; } int32_t -cli_cmd_log_level_parse (const char **words, int worcount, dict_t **options) +cli_cmd_log_level_parse(const char **words, int worcount, dict_t **options) { - dict_t *dict = NULL; - int ret = -1; - - GF_ASSERT (words); - GF_ASSERT (options); - - /* - * loglevel command format: - * > volume log level <VOL> <XLATOR[*]> <LOGLEVEL> - * > volume log level colon-o posix WARNING - * > volume log level colon-o replicate* DEBUG - * > volume log level coon-o * TRACE - */ - - GF_ASSERT ((strncmp(words[0], "volume", 6) == 0)); - GF_ASSERT ((strncmp(words[1], "log", 3) == 0)); - GF_ASSERT ((strncmp(words[2], "level", 5) == 0)); - - ret = glusterd_check_log_level(words[5]); - if (ret == -1) { - cli_err("Invalid log level [%s] specified", words[5]); - cli_err("Valid values for loglevel: (DEBUG|WARNING|ERROR" - "|CRITICAL|NONE|TRACE)"); - goto out; - } + dict_t *dict = NULL; + int ret = -1; + + GF_ASSERT(words); + GF_ASSERT(options); + + /* + * loglevel command format: + * > volume log level <VOL> <XLATOR[*]> <LOGLEVEL> + * > volume log level colon-o posix WARNING + * > volume log level colon-o replicate* DEBUG + * > volume log level coon-o * TRACE + */ + + GF_ASSERT((strncmp(words[0], "volume", 6) == 0)); + GF_ASSERT((strncmp(words[1], "log", 3) == 0)); + GF_ASSERT((strncmp(words[2], "level", 5) == 0)); + + ret = glusterd_check_log_level(words[5]); + if (ret == -1) { + cli_err("Invalid log level [%s] specified", words[5]); + cli_err( + "Valid values for loglevel: (DEBUG|WARNING|ERROR" + "|CRITICAL|NONE|TRACE)"); + goto out; + } - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - GF_ASSERT(words[3]); - GF_ASSERT(words[4]); + GF_ASSERT(words[3]); + GF_ASSERT(words[4]); - ret = dict_set_str (dict, "volname", (char *)words[3]); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", (char *)words[3]); + if (ret) + goto out; - ret = dict_set_str (dict, "xlator", (char *)words[4]); - if (ret) - goto out; + ret = dict_set_str(dict, "xlator", (char *)words[4]); + if (ret) + goto out; - ret = dict_set_str (dict, "loglevel", (char *)words[5]); - if (ret) - goto out; + ret = dict_set_str(dict, "loglevel", (char *)words[5]); + if (ret) + goto out; - *options = dict; + *options = dict; - out: - if (ret && dict) - dict_unref (dict); +out: + if (ret && dict) + dict_unref(dict); - return ret; + return ret; } int32_t -cli_cmd_log_locate_parse (const char **words, int wordcount, dict_t **options) +cli_cmd_log_locate_parse(const char **words, int wordcount, dict_t **options) { - dict_t *dict = NULL; - char *volname = NULL; - char *str = NULL; - int ret = -1; - char *delimiter = NULL; + dict_t *dict = NULL; + char *volname = NULL; + char *str = NULL; + int ret = -1; + char *delimiter = NULL; - GF_ASSERT (words); - GF_ASSERT (options); + GF_ASSERT(words); + GF_ASSERT(options); - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - volname = (char *)words[3]; - GF_ASSERT (volname); + volname = (char *)words[3]; + GF_ASSERT(volname); - ret = dict_set_str (dict, "volname", volname); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", volname); + if (ret) + goto out; - if (words[4]) { - delimiter = strchr (words[4], ':'); - if (!delimiter || delimiter == words[4] - || *(delimiter+1) != '/') { - cli_err ("wrong brick type: %s, use <HOSTNAME>:" - "<export-dir-abs-path>", words[4]); - ret = -1; - goto out; - } else { - ret = gf_canonicalize_path (delimiter + 1); - if (ret) - goto out; - } - str = (char *)words[4]; - ret = dict_set_str (dict, "brick", str); - if (ret) - goto out; + if (words[4]) { + delimiter = strchr(words[4], ':'); + if (!delimiter || delimiter == words[4] || *(delimiter + 1) != '/') { + cli_err( + "wrong brick type: %s, use <HOSTNAME>:" + "<export-dir-abs-path>", + words[4]); + ret = -1; + goto out; + } else { + ret = gf_canonicalize_path(delimiter + 1); + if (ret) + goto out; } + str = (char *)words[4]; + ret = dict_set_str(dict, "brick", str); + if (ret) + goto out; + } - *options = dict; + *options = dict; out: - if (ret && dict) - dict_unref (dict); + if (ret && dict) + dict_unref(dict); - return ret; + return ret; } int32_t -cli_cmd_log_rotate_parse (const char **words, int wordcount, dict_t **options) +cli_cmd_log_rotate_parse(const char **words, int wordcount, dict_t **options) { - dict_t *dict = NULL; - char *volname = NULL; - char *str = NULL; - int ret = -1; - char *delimiter = NULL; + dict_t *dict = NULL; + char *volname = NULL; + char *str = NULL; + int ret = -1; + char *delimiter = NULL; - GF_ASSERT (words); - GF_ASSERT (options); + GF_ASSERT(words); + GF_ASSERT(options); - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - if (strcmp ("rotate", words[3]) == 0) - volname = (char *)words[2]; - else if (strcmp ("rotate", words[2]) == 0) - volname = (char *)words[3]; - GF_ASSERT (volname); + if (strcmp("rotate", words[3]) == 0) + volname = (char *)words[2]; + else if (strcmp("rotate", words[2]) == 0) + volname = (char *)words[3]; + GF_ASSERT(volname); - ret = dict_set_str (dict, "volname", volname); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", volname); + if (ret) + goto out; - if (words[4]) { - delimiter = strchr (words[4], ':'); - if (!delimiter || delimiter == words[4] - || *(delimiter+1) != '/') { - cli_err ("wrong brick type: %s, use <HOSTNAME>:" - "<export-dir-abs-path>", words[4]); - ret = -1; - goto out; - } else { - ret = gf_canonicalize_path (delimiter + 1); - if (ret) - goto out; - } - str = (char *)words[4]; - ret = dict_set_str (dict, "brick", str); - if (ret) - goto out; + if (words[4]) { + delimiter = strchr(words[4], ':'); + if (!delimiter || delimiter == words[4] || *(delimiter + 1) != '/') { + cli_err( + "wrong brick type: %s, use <HOSTNAME>:" + "<export-dir-abs-path>", + words[4]); + ret = -1; + goto out; + } else { + ret = gf_canonicalize_path(delimiter + 1); + if (ret) + goto out; } + str = (char *)words[4]; + ret = dict_set_str(dict, "brick", str); + if (ret) + goto out; + } - *options = dict; + *options = dict; out: - if (ret && dict) - dict_unref (dict); + if (ret && dict) + dict_unref(dict); - return ret; + return ret; } static gf_boolean_t -gsyncd_url_check (const char *w) +gsyncd_url_check(const char *w) { - return !!strpbrk (w, ":/"); + return !!strpbrk(w, ":/"); } static gf_boolean_t -gsyncd_glob_check (const char *w) +gsyncd_glob_check(const char *w) { - return !!strpbrk (w, "*?["); + return !!strpbrk(w, "*?["); } static int -config_parse (const char **words, int wordcount, dict_t *dict, - unsigned cmdi, unsigned glob) +config_parse(const char **words, int wordcount, dict_t *dict, unsigned cmdi, + unsigned glob) { - int32_t ret = -1; - int32_t i = -1; - char *append_str = NULL; - size_t append_len = 0; - char *subop = NULL; - char *ret_chkpt = NULL; - struct tm checkpoint_time; - char chkpt_buf[20] = ""; - - switch ((wordcount - 1) - cmdi) { + int32_t ret = -1; + int32_t i = -1; + char *append_str = NULL; + size_t append_len = 0; + char *subop = NULL; + char *ret_chkpt = NULL; + struct tm checkpoint_time; + char chkpt_buf[20] = ""; + + switch ((wordcount - 1) - cmdi) { case 0: - subop = gf_strdup ("get-all"); - break; + subop = gf_strdup("get-all"); + break; case 1: - if (words[cmdi + 1][0] == '!') { - (words[cmdi + 1])++; - if (gf_asprintf (&subop, "del%s", - glob ? "-glob" : "") == -1) - subop = NULL; - } else - subop = gf_strdup ("get"); + if (words[cmdi + 1][0] == '!') { + (words[cmdi + 1])++; + if (gf_asprintf(&subop, "del%s", glob ? "-glob" : "") == -1) + subop = NULL; + } else + subop = gf_strdup("get"); - ret = dict_set_str (dict, "op_name", ((char *)words[cmdi + 1])); - if (ret < 0) - goto out; - break; + ret = dict_set_str(dict, "op_name", ((char *)words[cmdi + 1])); + if (ret < 0) + goto out; + break; default: - if (gf_asprintf (&subop, "set%s", glob ? "-glob" : "") == -1) - subop = NULL; + if (gf_asprintf(&subop, "set%s", glob ? "-glob" : "") == -1) + subop = NULL; - ret = dict_set_str (dict, "op_name", ((char *)words[cmdi + 1])); - if (ret < 0) - goto out; + ret = dict_set_str(dict, "op_name", ((char *)words[cmdi + 1])); + if (ret < 0) + goto out; - /* join the varargs by spaces to get the op_value */ + /* join the varargs by spaces to get the op_value */ - for (i = cmdi + 2; i < wordcount; i++) - append_len += (strlen (words[i]) + 1); - /* trailing strcat will add two bytes, make space for that */ - append_len++; + for (i = cmdi + 2; i < wordcount; i++) + append_len += (strlen(words[i]) + 1); + /* trailing strcat will add two bytes, make space for that */ + append_len++; - append_str = GF_MALLOC (append_len, cli_mt_append_str); - if (!append_str) { - ret = -1; - goto out; - } + append_str = GF_MALLOC(append_len, cli_mt_append_str); + if (!append_str) { + ret = -1; + goto out; + } + + for (i = cmdi + 2; i < wordcount; i++) { + strcat(append_str, words[i]); + strcat(append_str, " "); + } + append_str[append_len - 2] = '\0'; + /* "checkpoint now" is special: we resolve that "now" */ + if ((strcmp(words[cmdi + 1], "checkpoint") == 0) && + (strcmp(append_str, "now") == 0)) { + struct timeval tv = { + 0, + }; + + ret = gettimeofday(&tv, NULL); + if (ret == -1) + goto out; - for (i = cmdi + 2; i < wordcount; i++) { - strcat (append_str, words[i]); - strcat (append_str, " "); - } - append_str[append_len - 2] = '\0'; - /* "checkpoint now" is special: we resolve that "now" */ - if ((strcmp (words[cmdi + 1], "checkpoint") == 0) && - (strcmp (append_str, "now") == 0)) { - struct timeval tv = {0,}; - - ret = gettimeofday (&tv, NULL); - if (ret == -1) - goto out; - - GF_FREE (append_str); - append_str = GF_MALLOC (300, cli_mt_append_str); - if (!append_str) { - ret = -1; - goto out; - } - snprintf (append_str, 300, "%" GF_PRI_SECOND, - tv.tv_sec); - } else if ((strcmp (words[cmdi + 1], "checkpoint") == 0) && - (strcmp (append_str, "now") != 0)) { - memset(&checkpoint_time, 0, sizeof(struct tm)); - ret_chkpt = strptime(append_str, "%Y-%m-%d %H:%M:%S", - &checkpoint_time); - - if (ret_chkpt == NULL) { - ret = -1; - cli_err ("Invalid Checkpoint label. Use format " - "\"Y-m-d H:M:S\", Example: 2016-10-25 15:30:45"); - goto out; - } - GF_FREE (append_str); - append_str = GF_MALLOC (300, cli_mt_append_str); - if (!append_str) { - ret = -1; - goto out; - } - strftime (chkpt_buf, sizeof(chkpt_buf), "%s", - &checkpoint_time); - snprintf (append_str, 300, "%s", chkpt_buf); + GF_FREE(append_str); + append_str = GF_MALLOC(300, cli_mt_append_str); + if (!append_str) { + ret = -1; + goto out; + } + snprintf(append_str, 300, "%" GF_PRI_SECOND, tv.tv_sec); + } else if ((strcmp(words[cmdi + 1], "checkpoint") == 0) && + (strcmp(append_str, "now") != 0)) { + memset(&checkpoint_time, 0, sizeof(struct tm)); + ret_chkpt = strptime(append_str, "%Y-%m-%d %H:%M:%S", + &checkpoint_time); + + if (ret_chkpt == NULL) { + ret = -1; + cli_err( + "Invalid Checkpoint label. Use format " + "\"Y-m-d H:M:S\", Example: 2016-10-25 15:30:45"); + goto out; + } + GF_FREE(append_str); + append_str = GF_MALLOC(300, cli_mt_append_str); + if (!append_str) { + ret = -1; + goto out; } + strftime(chkpt_buf, sizeof(chkpt_buf), "%s", &checkpoint_time); + snprintf(append_str, 300, "%s", chkpt_buf); + } - ret = dict_set_dynstr (dict, "op_value", append_str); - if (ret != 0) { - goto out; - } - append_str = NULL; - } + ret = dict_set_dynstr(dict, "op_value", append_str); + if (ret != 0) { + goto out; + } + append_str = NULL; + } - ret = -1; - if (subop) { - ret = dict_set_dynstr (dict, "subop", subop); - if (!ret) - subop = NULL; - } + ret = -1; + if (subop) { + ret = dict_set_dynstr(dict, "subop", subop); + if (!ret) + subop = NULL; + } out: - GF_FREE (append_str); - GF_FREE (subop); + GF_FREE(append_str); + GF_FREE(subop); - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } /* ssh_port_parse: Parses and validates when ssh_port is given. @@ -2755,1529 +2823,1493 @@ out: */ static int32_t -parse_ssh_port (const char **words, int wordcount, dict_t *dict, - unsigned *cmdi, int ssh_index, char *type) { - - int ret = 0; - char *end_ptr = NULL; - int64_t limit = 0; - - if (!strcmp ((char *)words[ssh_index], "ssh-port")) { - if (strcmp ((char *)words[ssh_index-1], "create")) { - ret = -1; - goto out; - } - (*cmdi)++; - limit = strtol (words[ssh_index+1], &end_ptr, 10); - if (errno == ERANGE || errno == EINVAL || limit <= 0 - || strcmp (end_ptr, "") != 0) { - ret = -1; - cli_err ("Please enter an integer value for ssh_port "); - goto out; - } +parse_ssh_port(const char **words, int wordcount, dict_t *dict, unsigned *cmdi, + int ssh_index, char *type) +{ + int ret = 0; + char *end_ptr = NULL; + int64_t limit = 0; - ret = dict_set_int32 (dict, "ssh_port", limit); - if (ret) - goto out; - (*cmdi)++; - } else if (strcmp ((char *)words[ssh_index+1], "create")) { - ret = -1; - goto out; + if (!strcmp((char *)words[ssh_index], "ssh-port")) { + if (strcmp((char *)words[ssh_index - 1], "create")) { + ret = -1; + goto out; + } + (*cmdi)++; + limit = strtol(words[ssh_index + 1], &end_ptr, 10); + if (errno == ERANGE || errno == EINVAL || limit <= 0 || + strcmp(end_ptr, "") != 0) { + ret = -1; + cli_err("Please enter an integer value for ssh_port "); + goto out; } - ret = dict_set_int32 (dict, type, 1); + ret = dict_set_int32(dict, "ssh_port", limit); if (ret) - goto out; + goto out; (*cmdi)++; + } else if (strcmp((char *)words[ssh_index + 1], "create")) { + ret = -1; + goto out; + } - out: - return ret; + ret = dict_set_int32(dict, type, 1); + if (ret) + goto out; + (*cmdi)++; + +out: + return ret; } static int32_t -force_push_pem_no_verify_parse (const char **words, int wordcount, - dict_t *dict, unsigned *cmdi) +force_push_pem_no_verify_parse(const char **words, int wordcount, dict_t *dict, + unsigned *cmdi) { - int32_t ret = 0; - - if (!strcmp ((char *)words[wordcount-1], "force")) { - if ((strcmp ((char *)words[wordcount-2], "start")) && - (strcmp ((char *)words[wordcount-2], "stop")) && - (strcmp ((char *)words[wordcount-2], "create")) && - (strcmp ((char *)words[wordcount-2], "no-verify")) && - (strcmp ((char *)words[wordcount-2], "push-pem")) && - (strcmp ((char *)words[wordcount-2], "pause")) && - (strcmp ((char *)words[wordcount-2], "resume"))) { - ret = -1; - goto out; - } - ret = dict_set_uint32 (dict, "force", - _gf_true); - if (ret) - goto out; - (*cmdi)++; - - if (!strcmp ((char *)words[wordcount-2], "push-pem")) { - ret = parse_ssh_port (words, wordcount, dict, cmdi, - wordcount-4, "push_pem"); - if (ret) - goto out; - } else if (!strcmp ((char *)words[wordcount-2], "no-verify")) { - ret = parse_ssh_port (words, wordcount, dict, cmdi, - wordcount-4, "no_verify"); - if (ret) - goto out; - } - } else if (!strcmp ((char *)words[wordcount-1], "push-pem")) { - ret = parse_ssh_port (words, wordcount, dict, cmdi, wordcount-3, - "push_pem"); - if (ret) - goto out; - } else if (!strcmp ((char *)words[wordcount-1], "no-verify")) { - ret = parse_ssh_port (words, wordcount, dict, cmdi, wordcount-3, - "no_verify"); - if (ret) - goto out; + int32_t ret = 0; + + if (!strcmp((char *)words[wordcount - 1], "force")) { + if ((strcmp((char *)words[wordcount - 2], "start")) && + (strcmp((char *)words[wordcount - 2], "stop")) && + (strcmp((char *)words[wordcount - 2], "create")) && + (strcmp((char *)words[wordcount - 2], "no-verify")) && + (strcmp((char *)words[wordcount - 2], "push-pem")) && + (strcmp((char *)words[wordcount - 2], "pause")) && + (strcmp((char *)words[wordcount - 2], "resume"))) { + ret = -1; + goto out; + } + ret = dict_set_uint32(dict, "force", _gf_true); + if (ret) + goto out; + (*cmdi)++; + + if (!strcmp((char *)words[wordcount - 2], "push-pem")) { + ret = parse_ssh_port(words, wordcount, dict, cmdi, wordcount - 4, + "push_pem"); + if (ret) + goto out; + } else if (!strcmp((char *)words[wordcount - 2], "no-verify")) { + ret = parse_ssh_port(words, wordcount, dict, cmdi, wordcount - 4, + "no_verify"); + if (ret) + goto out; } + } else if (!strcmp((char *)words[wordcount - 1], "push-pem")) { + ret = parse_ssh_port(words, wordcount, dict, cmdi, wordcount - 3, + "push_pem"); + if (ret) + goto out; + } else if (!strcmp((char *)words[wordcount - 1], "no-verify")) { + ret = parse_ssh_port(words, wordcount, dict, cmdi, wordcount - 3, + "no_verify"); + if (ret) + goto out; + } out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } - int32_t -cli_cmd_gsync_set_parse (const char **words, int wordcount, dict_t **options) +cli_cmd_gsync_set_parse(const char **words, int wordcount, dict_t **options) { - int32_t ret = -1; - dict_t *dict = NULL; - gf1_cli_gsync_set type = GF_GSYNC_OPTION_TYPE_NONE; - int i = 0; - unsigned masteri = 0; - unsigned slavei = 0; - unsigned glob = 0; - unsigned cmdi = 0; - char *opwords[] = { "create", "status", "start", "stop", - "config", "force", "delete", - "ssh-port", "no-verify", "push-pem", - "detail", "pause", "resume", NULL }; - char *w = NULL; - char *save_ptr = NULL; - char *slave_temp = NULL; - char *token = NULL; - - GF_ASSERT (words); - GF_ASSERT (options); - - dict = dict_new (); - if (!dict) - goto out; - - /* new syntax: - * - * volume geo-replication $m $s create [[ssh-port n] [[no-verify] | [push-pem]]] [force] - * volume geo-replication [$m [$s]] status [detail] - * volume geo-replication [$m] $s config [[!]$opt [$val]] - * volume geo-replication $m $s start|stop [force] - * volume geo-replication $m $s delete [reset-sync-time] - * volume geo-replication $m $s pause [force] - * volume geo-replication $m $s resume [force] - */ + int32_t ret = -1; + dict_t *dict = NULL; + gf1_cli_gsync_set type = GF_GSYNC_OPTION_TYPE_NONE; + int i = 0; + unsigned masteri = 0; + unsigned slavei = 0; + unsigned glob = 0; + unsigned cmdi = 0; + char *opwords[] = {"create", "status", "start", "stop", "config", + "force", "delete", "ssh-port", "no-verify", "push-pem", + "detail", "pause", "resume", NULL}; + char *w = NULL; + char *save_ptr = NULL; + char *slave_temp = NULL; + char *token = NULL; + + GF_ASSERT(words); + GF_ASSERT(options); + + dict = dict_new(); + if (!dict) + goto out; - if (wordcount < 3) - goto out; + /* new syntax: + * + * volume geo-replication $m $s create [[ssh-port n] [[no-verify] | + * [push-pem]]] [force] volume geo-replication [$m [$s]] status [detail] + * volume geo-replication [$m] $s config [[!]$opt [$val]] + * volume geo-replication $m $s start|stop [force] + * volume geo-replication $m $s delete [reset-sync-time] + * volume geo-replication $m $s pause [force] + * volume geo-replication $m $s resume [force] + */ + + if (wordcount < 3) + goto out; - for (i = 2; i <= 3 && i < wordcount - 1; i++) { - if (gsyncd_glob_check (words[i])) - glob = i; - if (gsyncd_url_check (words[i])) { - slavei = i; - break; - } + for (i = 2; i <= 3 && i < wordcount - 1; i++) { + if (gsyncd_glob_check(words[i])) + glob = i; + if (gsyncd_url_check(words[i])) { + slavei = i; + break; } + } - if (glob && !slavei) - /* glob is allowed only for config, thus it implies there is a - * slave argument; but that might have not been recognized on - * the first scan as it's url characteristics has been covered - * by the glob syntax. - * - * In this case, the slave is perforce the last glob-word -- the - * upcoming one is neither glob, nor url, so it's definitely not - * the slave. - */ - slavei = glob; - if (slavei) { - cmdi = slavei + 1; - if (slavei == 3) - masteri = 2; - } else if (i <= 4) { - if (strtail ("detail", (char *)words[wordcount-1])) { - cmdi = wordcount - 2; - if (i == 4) - masteri = 2; - } else { - /* no $s, can only be status cmd - * (with either a single $m before it or nothing) - * -- these conditions imply that i <= 3 after - * the iteration and that i is the successor of - * the (0 or 1 length) sequence of $m-s. - */ - cmdi = i; - if (i == 3) - masteri = 2; - } - } else - goto out; - - /* now check if input really complies syntax - * (in a somewhat redundant way, in favor - * transparent soundness) + if (glob && !slavei) + /* glob is allowed only for config, thus it implies there is a + * slave argument; but that might have not been recognized on + * the first scan as it's url characteristics has been covered + * by the glob syntax. + * + * In this case, the slave is perforce the last glob-word -- the + * upcoming one is neither glob, nor url, so it's definitely not + * the slave. */ + slavei = glob; + if (slavei) { + cmdi = slavei + 1; + if (slavei == 3) + masteri = 2; + } else if (i <= 4) { + if (strtail("detail", (char *)words[wordcount - 1])) { + cmdi = wordcount - 2; + if (i == 4) + masteri = 2; + } else { + /* no $s, can only be status cmd + * (with either a single $m before it or nothing) + * -- these conditions imply that i <= 3 after + * the iteration and that i is the successor of + * the (0 or 1 length) sequence of $m-s. + */ + cmdi = i; + if (i == 3) + masteri = 2; + } + } else + goto out; - if (masteri && gsyncd_url_check (words[masteri])) - goto out; - if (slavei && !glob && !gsyncd_url_check (words[slavei])) - goto out; - - w = str_getunamb (words[cmdi], opwords); - if (!w) - goto out; - - if (strcmp (w, "create") == 0) { - type = GF_GSYNC_OPTION_TYPE_CREATE; - - if (!masteri || !slavei) - goto out; - } else if (strcmp (w, "status") == 0) { - type = GF_GSYNC_OPTION_TYPE_STATUS; - - if (slavei && !masteri) - goto out; - } else if (strcmp (w, "config") == 0) { - type = GF_GSYNC_OPTION_TYPE_CONFIG; - - if (!slavei) - goto out; - } else if (strcmp (w, "start") == 0) { - type = GF_GSYNC_OPTION_TYPE_START; - - if (!masteri || !slavei) - goto out; - } else if (strcmp (w, "stop") == 0) { - type = GF_GSYNC_OPTION_TYPE_STOP; + /* now check if input really complies syntax + * (in a somewhat redundant way, in favor + * transparent soundness) + */ - if (!masteri || !slavei) - goto out; - } else if (strcmp (w, "delete") == 0) { - type = GF_GSYNC_OPTION_TYPE_DELETE; + if (masteri && gsyncd_url_check(words[masteri])) + goto out; + if (slavei && !glob && !gsyncd_url_check(words[slavei])) + goto out; - if (!masteri || !slavei) - goto out; - } else if (strcmp (w, "pause") == 0) { - type = GF_GSYNC_OPTION_TYPE_PAUSE; + w = str_getunamb(words[cmdi], opwords); + if (!w) + goto out; - if (!masteri || !slavei) - goto out; - } else if (strcmp (w, "resume") == 0) { - type = GF_GSYNC_OPTION_TYPE_RESUME; + if (strcmp(w, "create") == 0) { + type = GF_GSYNC_OPTION_TYPE_CREATE; + + if (!masteri || !slavei) + goto out; + } else if (strcmp(w, "status") == 0) { + type = GF_GSYNC_OPTION_TYPE_STATUS; + + if (slavei && !masteri) + goto out; + } else if (strcmp(w, "config") == 0) { + type = GF_GSYNC_OPTION_TYPE_CONFIG; + + if (!slavei) + goto out; + } else if (strcmp(w, "start") == 0) { + type = GF_GSYNC_OPTION_TYPE_START; + + if (!masteri || !slavei) + goto out; + } else if (strcmp(w, "stop") == 0) { + type = GF_GSYNC_OPTION_TYPE_STOP; + + if (!masteri || !slavei) + goto out; + } else if (strcmp(w, "delete") == 0) { + type = GF_GSYNC_OPTION_TYPE_DELETE; + + if (!masteri || !slavei) + goto out; + } else if (strcmp(w, "pause") == 0) { + type = GF_GSYNC_OPTION_TYPE_PAUSE; + + if (!masteri || !slavei) + goto out; + } else if (strcmp(w, "resume") == 0) { + type = GF_GSYNC_OPTION_TYPE_RESUME; + + if (!masteri || !slavei) + goto out; + } else + GF_ASSERT(!"opword mismatch"); + + ret = force_push_pem_no_verify_parse(words, wordcount, dict, &cmdi); + if (ret) + goto out; - if (!masteri || !slavei) - goto out; - } else - GF_ASSERT (!"opword mismatch"); + if (strtail("detail", (char *)words[wordcount - 1])) { + if (!strtail("status", (char *)words[wordcount - 2])) { + ret = -1; + goto out; + } - ret = force_push_pem_no_verify_parse (words, wordcount, dict, &cmdi); + ret = dict_set_uint32(dict, "status-detail", _gf_true); if (ret) - goto out; - - if (strtail ("detail", (char *)words[wordcount-1])) { - if (!strtail ("status", (char *)words[wordcount-2])) { - ret = -1; - goto out; - } - - ret = dict_set_uint32 (dict, "status-detail", _gf_true); - if (ret) - goto out; - cmdi++; - } + goto out; + cmdi++; + } - if (type == GF_GSYNC_OPTION_TYPE_DELETE && - !strcmp ((char *)words[wordcount-1], "reset-sync-time")) { - if (strcmp ((char *)words[wordcount-2], "delete")) { - ret = -1; - goto out; - } - ret = dict_set_uint32 (dict, "reset-sync-time", _gf_true); - if (ret) - goto out; - cmdi++; + if (type == GF_GSYNC_OPTION_TYPE_DELETE && + !strcmp((char *)words[wordcount - 1], "reset-sync-time")) { + if (strcmp((char *)words[wordcount - 2], "delete")) { + ret = -1; + goto out; } + ret = dict_set_uint32(dict, "reset-sync-time", _gf_true); + if (ret) + goto out; + cmdi++; + } - if (type != GF_GSYNC_OPTION_TYPE_CONFIG && - (cmdi < wordcount - 1 || glob)) - goto out; + if (type != GF_GSYNC_OPTION_TYPE_CONFIG && (cmdi < wordcount - 1 || glob)) + goto out; - /* If got so far, input is valid, assemble the message */ + /* If got so far, input is valid, assemble the message */ - ret = 0; + ret = 0; - if (masteri) { - ret = dict_set_str (dict, "master", (char *)words[masteri]); - if (!ret) - ret = dict_set_str (dict, "volname", - (char *)words[masteri]); - } - if (!ret && slavei) { - /* If geo-rep is created with root user using the syntax - * gluster vol geo-rep <mastervol> root@<slavehost> ... - * pass down only <slavehost> else pass as it is. - */ - slave_temp = gf_strdup (words[slavei]); - if (slave_temp == NULL) { - ret = -1; - goto out; - } - token = strtok_r (slave_temp, "@", &save_ptr); - if (token && !strcmp (token, "root")) { - ret = dict_set_str (dict, "slave", - (char *)words[slavei]+5); - } else { - ret = dict_set_str (dict, "slave", - (char *)words[slavei]); - } - } + if (masteri) { + ret = dict_set_str(dict, "master", (char *)words[masteri]); if (!ret) - ret = dict_set_int32 (dict, "type", type); - if (!ret && type == GF_GSYNC_OPTION_TYPE_CONFIG) - ret = config_parse (words, wordcount, dict, cmdi, glob); + ret = dict_set_str(dict, "volname", (char *)words[masteri]); + } + if (!ret && slavei) { + /* If geo-rep is created with root user using the syntax + * gluster vol geo-rep <mastervol> root@<slavehost> ... + * pass down only <slavehost> else pass as it is. + */ + slave_temp = gf_strdup(words[slavei]); + if (slave_temp == NULL) { + ret = -1; + goto out; + } + token = strtok_r(slave_temp, "@", &save_ptr); + if (token && !strcmp(token, "root")) { + ret = dict_set_str(dict, "slave", (char *)words[slavei] + 5); + } else { + ret = dict_set_str(dict, "slave", (char *)words[slavei]); + } + } + if (!ret) + ret = dict_set_int32(dict, "type", type); + if (!ret && type == GF_GSYNC_OPTION_TYPE_CONFIG) + ret = config_parse(words, wordcount, dict, cmdi, glob); out: - if (slave_temp) - GF_FREE (slave_temp); - if (ret) { - if (dict) - dict_unref (dict); - } else - *options = dict; - + if (slave_temp) + GF_FREE(slave_temp); + if (ret) { + if (dict) + dict_unref(dict); + } else + *options = dict; - return ret; + return ret; } int32_t -cli_cmd_volume_profile_parse (const char **words, int wordcount, - dict_t **options) +cli_cmd_volume_profile_parse(const char **words, int wordcount, + dict_t **options) { - dict_t *dict = NULL; - char *volname = NULL; - int ret = -1; - gf1_cli_stats_op op = GF_CLI_STATS_NONE; - gf1_cli_info_op info_op = GF_CLI_INFO_NONE; - gf_boolean_t is_peek = _gf_false; + dict_t *dict = NULL; + char *volname = NULL; + int ret = -1; + gf1_cli_stats_op op = GF_CLI_STATS_NONE; + gf1_cli_info_op info_op = GF_CLI_INFO_NONE; + gf_boolean_t is_peek = _gf_false; - char *opwords[] = { "start", "stop", "info", NULL }; - char *w = NULL; + char *opwords[] = {"start", "stop", "info", NULL}; + char *w = NULL; - GF_ASSERT (words); - GF_ASSERT (options); + GF_ASSERT(words); + GF_ASSERT(options); - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - if (wordcount < 4) - goto out; + if (wordcount < 4) + goto out; - volname = (char *)words[2]; + volname = (char *)words[2]; - ret = dict_set_str (dict, "volname", volname); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", volname); + if (ret) + goto out; - w = str_getunamb (words[3], opwords); - if (!w) { - ret = -1; - goto out; - } + w = str_getunamb(words[3], opwords); + if (!w) { + ret = -1; + goto out; + } - if ((strcmp (w, "start") == 0 || strcmp (w, "stop") == 0) && - wordcount > 5) - goto out; + if ((strcmp(w, "start") == 0 || strcmp(w, "stop") == 0) && wordcount > 5) + goto out; - if (strcmp (w, "info") == 0 && wordcount > 7) - goto out; + if (strcmp(w, "info") == 0 && wordcount > 7) + goto out; - if (strcmp (w, "start") == 0) { - op = GF_CLI_STATS_START; - } else if (strcmp (w, "stop") == 0) { - op = GF_CLI_STATS_STOP; - } else if (strcmp (w, "info") == 0) { - op = GF_CLI_STATS_INFO; - info_op = GF_CLI_INFO_ALL; - if (wordcount > 4) { - if (strcmp (words[4], "incremental") == 0) { - info_op = GF_CLI_INFO_INCREMENTAL; - if (wordcount > 5 && - strcmp (words[5], "peek") == 0) { - is_peek = _gf_true; - } - } else if (strcmp (words[4], "cumulative") == 0) { - info_op = GF_CLI_INFO_CUMULATIVE; - } else if (strcmp (words[4], "clear") == 0) { - info_op = GF_CLI_INFO_CLEAR; - } else if (strcmp (words[4], "peek") == 0) { - is_peek = _gf_true; - } - } - } else - GF_ASSERT (!"opword mismatch"); + if (strcmp(w, "start") == 0) { + op = GF_CLI_STATS_START; + } else if (strcmp(w, "stop") == 0) { + op = GF_CLI_STATS_STOP; + } else if (strcmp(w, "info") == 0) { + op = GF_CLI_STATS_INFO; + info_op = GF_CLI_INFO_ALL; + if (wordcount > 4) { + if (strcmp(words[4], "incremental") == 0) { + info_op = GF_CLI_INFO_INCREMENTAL; + if (wordcount > 5 && strcmp(words[5], "peek") == 0) { + is_peek = _gf_true; + } + } else if (strcmp(words[4], "cumulative") == 0) { + info_op = GF_CLI_INFO_CUMULATIVE; + } else if (strcmp(words[4], "clear") == 0) { + info_op = GF_CLI_INFO_CLEAR; + } else if (strcmp(words[4], "peek") == 0) { + is_peek = _gf_true; + } + } + } else + GF_ASSERT(!"opword mismatch"); + + ret = dict_set_int32(dict, "op", (int32_t)op); + if (ret) + goto out; - ret = dict_set_int32 (dict, "op", (int32_t)op); - if (ret) - goto out; + ret = dict_set_int32(dict, "info-op", (int32_t)info_op); + if (ret) + goto out; - ret = dict_set_int32 (dict, "info-op", (int32_t)info_op); - if (ret) - goto out; + ret = dict_set_int32(dict, "peek", is_peek); + if (ret) + goto out; - ret = dict_set_int32 (dict, "peek", is_peek); + if (!strcmp(words[wordcount - 1], "nfs")) { + ret = dict_set_int32(dict, "nfs", _gf_true); if (ret) - goto out; - - if (!strcmp (words[wordcount - 1], "nfs")) { - ret = dict_set_int32 (dict, "nfs", _gf_true); - if (ret) - goto out; - } + goto out; + } - *options = dict; + *options = dict; out: - if (ret && dict) - dict_unref (dict); - return ret; + if (ret && dict) + dict_unref(dict); + return ret; } int32_t -cli_cmd_volume_top_parse (const char **words, int wordcount, - dict_t **options) +cli_cmd_volume_top_parse(const char **words, int wordcount, dict_t **options) { - dict_t *dict = NULL; - char *volname = NULL; - char *value = NULL; - char *key = NULL; - int ret = -1; - gf1_cli_stats_op op = GF_CLI_STATS_NONE; - gf1_cli_top_op top_op = GF_CLI_TOP_NONE; - int32_t list_cnt = -1; - int index = 0; - int perf = 0; - int32_t blk_size = 0; - int count = 0; - gf_boolean_t nfs = _gf_false; - char *delimiter = NULL; - char *opwords[] = { "open", "read", "write", "opendir", - "readdir", "read-perf", "write-perf", - "clear", NULL }; - char *w = NULL; - - GF_ASSERT (words); - GF_ASSERT (options); - - dict = dict_new (); - if (!dict) - goto out; + dict_t *dict = NULL; + char *volname = NULL; + char *value = NULL; + char *key = NULL; + int ret = -1; + gf1_cli_stats_op op = GF_CLI_STATS_NONE; + gf1_cli_top_op top_op = GF_CLI_TOP_NONE; + int32_t list_cnt = -1; + int index = 0; + int perf = 0; + int32_t blk_size = 0; + int count = 0; + gf_boolean_t nfs = _gf_false; + char *delimiter = NULL; + char *opwords[] = {"open", "read", "write", "opendir", "readdir", + "read-perf", "write-perf", "clear", NULL}; + char *w = NULL; + + GF_ASSERT(words); + GF_ASSERT(options); + + dict = dict_new(); + if (!dict) + goto out; - if (wordcount < 4) - goto out; + if (wordcount < 4) + goto out; - volname = (char *)words[2]; + volname = (char *)words[2]; - ret = dict_set_str (dict, "volname", volname); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", volname); + if (ret) + goto out; - op = GF_CLI_STATS_TOP; - ret = dict_set_int32 (dict, "op", (int32_t)op); - if (ret) - goto out; + op = GF_CLI_STATS_TOP; + ret = dict_set_int32(dict, "op", (int32_t)op); + if (ret) + goto out; - w = str_getunamb (words[3], opwords); - if (!w) { - ret = -1; - goto out; + w = str_getunamb(words[3], opwords); + if (!w) { + ret = -1; + goto out; + } + if (strcmp(w, "open") == 0) { + top_op = GF_CLI_TOP_OPEN; + } else if (strcmp(w, "read") == 0) { + top_op = GF_CLI_TOP_READ; + } else if (strcmp(w, "write") == 0) { + top_op = GF_CLI_TOP_WRITE; + } else if (strcmp(w, "opendir") == 0) { + top_op = GF_CLI_TOP_OPENDIR; + } else if (strcmp(w, "readdir") == 0) { + top_op = GF_CLI_TOP_READDIR; + } else if (strcmp(w, "read-perf") == 0) { + top_op = GF_CLI_TOP_READ_PERF; + perf = 1; + } else if (strcmp(w, "write-perf") == 0) { + top_op = GF_CLI_TOP_WRITE_PERF; + perf = 1; + } else if (strcmp(w, "clear") == 0) { + ret = dict_set_int32(dict, "clear-stats", 1); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not set clear-stats in dict"); + goto out; } - if (strcmp (w, "open") == 0) { - top_op = GF_CLI_TOP_OPEN; - } else if (strcmp (w, "read") == 0) { - top_op = GF_CLI_TOP_READ; - } else if (strcmp (w, "write") == 0) { - top_op = GF_CLI_TOP_WRITE; - } else if (strcmp (w, "opendir") == 0) { - top_op = GF_CLI_TOP_OPENDIR; - } else if (strcmp (w, "readdir") == 0) { - top_op = GF_CLI_TOP_READDIR; - } else if (strcmp (w, "read-perf") == 0) { - top_op = GF_CLI_TOP_READ_PERF; - perf = 1; - } else if (strcmp (w, "write-perf") == 0) { - top_op = GF_CLI_TOP_WRITE_PERF; - perf = 1; - } else if (strcmp (w, "clear") == 0) { - ret = dict_set_int32 (dict, "clear-stats", 1); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Could not set clear-stats in dict"); - goto out; - } - } else - GF_ASSERT (!"opword mismatch"); - ret = dict_set_int32 (dict, "top-op", (int32_t)top_op); + } else + GF_ASSERT(!"opword mismatch"); + ret = dict_set_int32(dict, "top-op", (int32_t)top_op); + if (ret) + goto out; + + if ((wordcount > 4) && !strcmp(words[4], "nfs")) { + nfs = _gf_true; + ret = dict_set_int32(dict, "nfs", nfs); if (ret) + goto out; + index = 5; + } else { + index = 4; + } + + for (; index < wordcount; index += 2) { + key = (char *)words[index]; + value = (char *)words[index + 1]; + + if (!key || !value) { + ret = -1; + goto out; + } + if (!strcmp(key, "brick")) { + delimiter = strchr(value, ':'); + if (!delimiter || delimiter == value || *(delimiter + 1) != '/') { + cli_err( + "wrong brick type: %s, use <HOSTNAME>:" + "<export-dir-abs-path>", + value); + ret = -1; goto out; - - if ((wordcount > 4) && !strcmp (words[4], "nfs")) { - nfs = _gf_true; - ret = dict_set_int32 (dict, "nfs", nfs); + } else { + ret = gf_canonicalize_path(delimiter + 1); if (ret) - goto out; - index = 5; - } else { - index = 4; - } - - for (; index < wordcount; index+=2) { - - key = (char *) words[index]; - value = (char *) words[index+1]; - - if (!key || !value) { - ret = -1; - goto out; - } - if (!strcmp (key, "brick")) { - delimiter = strchr (value, ':'); - if (!delimiter || delimiter == value - || *(delimiter+1) != '/') { - cli_err ("wrong brick type: %s, use <HOSTNAME>:" - "<export-dir-abs-path>", value); - ret = -1; - goto out; - } else { - ret = gf_canonicalize_path (delimiter + 1); - if (ret) - goto out; - } - ret = dict_set_str (dict, "brick", value); - - } else if (!strcmp (key, "list-cnt")) { - ret = gf_is_str_int (value); - if (!ret) - list_cnt = atoi (value); - if (ret || (list_cnt < 0) || (list_cnt > 100)) { - cli_err ("list-cnt should be between 0 to 100"); - ret = -1; - goto out; - } - } else if (perf && !nfs && !strcmp (key, "bs")) { - ret = gf_is_str_int (value); - if (!ret) - blk_size = atoi (value); - if (ret || (blk_size <= 0)) { - if (blk_size < 0) - cli_err ("block size is an invalid" - " number"); - else - cli_err ("block size should be an " - "integer greater than zero"); - ret = -1; - goto out; - } - ret = dict_set_uint32 (dict, "blk-size", - (uint32_t)blk_size); - } else if (perf && !nfs && !strcmp (key, "count")) { - ret = gf_is_str_int (value); - if (!ret) - count = atoi(value); - if (ret || (count <= 0)) { - if (count < 0) - cli_err ("count is an invalid number"); - else - cli_err ("count should be an integer " - "greater than zero"); - - ret = -1; - goto out; - } - ret = dict_set_uint32 (dict, "blk-cnt", count); - } else { - ret = -1; - goto out; - } - if (ret) { - gf_log ("", GF_LOG_WARNING, "Dict set failed for " - "key %s", key); - goto out; - } - } - if (list_cnt == -1) - list_cnt = 100; - ret = dict_set_int32 (dict, "list-cnt", list_cnt); - if (ret) { - gf_log ("", GF_LOG_WARNING, "Dict set failed for list_cnt"); + goto out; + } + ret = dict_set_str(dict, "brick", value); + + } else if (!strcmp(key, "list-cnt")) { + ret = gf_is_str_int(value); + if (!ret) + list_cnt = atoi(value); + if (ret || (list_cnt < 0) || (list_cnt > 100)) { + cli_err("list-cnt should be between 0 to 100"); + ret = -1; goto out; - } - - if ((blk_size > 0) ^ (count > 0)) { - cli_err ("Need to give both 'bs' and 'count'"); + } + } else if (perf && !nfs && !strcmp(key, "bs")) { + ret = gf_is_str_int(value); + if (!ret) + blk_size = atoi(value); + if (ret || (blk_size <= 0)) { + if (blk_size < 0) + cli_err( + "block size is an invalid" + " number"); + else + cli_err( + "block size should be an " + "integer greater than zero"); ret = -1; goto out; - } else if (((uint64_t)blk_size * count) > (10 * GF_UNIT_GB)) { - cli_err ("'bs * count' value %"PRIu64" is greater than " - "maximum allowed value of 10GB", - ((uint64_t)blk_size * count)); + } + ret = dict_set_uint32(dict, "blk-size", (uint32_t)blk_size); + } else if (perf && !nfs && !strcmp(key, "count")) { + ret = gf_is_str_int(value); + if (!ret) + count = atoi(value); + if (ret || (count <= 0)) { + if (count < 0) + cli_err("count is an invalid number"); + else + cli_err( + "count should be an integer " + "greater than zero"); + ret = -1; goto out; + } + ret = dict_set_uint32(dict, "blk-cnt", count); + } else { + ret = -1; + goto out; } + if (ret) { + gf_log("", GF_LOG_WARNING, + "Dict set failed for " + "key %s", + key); + goto out; + } + } + if (list_cnt == -1) + list_cnt = 100; + ret = dict_set_int32(dict, "list-cnt", list_cnt); + if (ret) { + gf_log("", GF_LOG_WARNING, "Dict set failed for list_cnt"); + goto out; + } - *options = dict; + if ((blk_size > 0) ^ (count > 0)) { + cli_err("Need to give both 'bs' and 'count'"); + ret = -1; + goto out; + } else if (((uint64_t)blk_size * count) > (10 * GF_UNIT_GB)) { + cli_err("'bs * count' value %" PRIu64 + " is greater than " + "maximum allowed value of 10GB", + ((uint64_t)blk_size * count)); + ret = -1; + goto out; + } + + *options = dict; out: - if (ret && dict) - dict_unref (dict); - return ret; + if (ret && dict) + dict_unref(dict); + return ret; } uint32_t -cli_cmd_get_statusop (const char *arg) +cli_cmd_get_statusop(const char *arg) { - int i = 0; - uint32_t ret = GF_CLI_STATUS_NONE; - char *w = NULL; - char *opwords[] = {"detail", "mem", "clients", "fd", - "inode", "callpool", "tasks", "client-list", - NULL}; - struct { - char *opname; - uint32_t opcode; - } optable[] = { - { "detail", GF_CLI_STATUS_DETAIL }, - { "mem", GF_CLI_STATUS_MEM }, - { "clients", GF_CLI_STATUS_CLIENTS }, - { "fd", GF_CLI_STATUS_FD }, - { "inode", GF_CLI_STATUS_INODE }, - { "callpool", GF_CLI_STATUS_CALLPOOL }, - { "tasks", GF_CLI_STATUS_TASKS }, - { "client-list", GF_CLI_STATUS_CLIENT_LIST }, - { NULL } - }; - - w = str_getunamb (arg, opwords); - if (!w) { - gf_log ("cli", GF_LOG_DEBUG, - "Not a status op %s", arg); - goto out; - } + int i = 0; + uint32_t ret = GF_CLI_STATUS_NONE; + char *w = NULL; + char *opwords[] = {"detail", "mem", "clients", "fd", "inode", + "callpool", "tasks", "client-list", NULL}; + struct { + char *opname; + uint32_t opcode; + } optable[] = {{"detail", GF_CLI_STATUS_DETAIL}, + {"mem", GF_CLI_STATUS_MEM}, + {"clients", GF_CLI_STATUS_CLIENTS}, + {"fd", GF_CLI_STATUS_FD}, + {"inode", GF_CLI_STATUS_INODE}, + {"callpool", GF_CLI_STATUS_CALLPOOL}, + {"tasks", GF_CLI_STATUS_TASKS}, + {"client-list", GF_CLI_STATUS_CLIENT_LIST}, + {NULL}}; + + w = str_getunamb(arg, opwords); + if (!w) { + gf_log("cli", GF_LOG_DEBUG, "Not a status op %s", arg); + goto out; + } - for (i = 0; optable[i].opname; i++) { - if (!strcmp (w, optable[i].opname)) { - ret = optable[i].opcode; - break; - } + for (i = 0; optable[i].opname; i++) { + if (!strcmp(w, optable[i].opname)) { + ret = optable[i].opcode; + break; } + } - out: - return ret; +out: + return ret; } int -cli_cmd_volume_status_parse (const char **words, int wordcount, - dict_t **options) +cli_cmd_volume_status_parse(const char **words, int wordcount, dict_t **options) { - dict_t *dict = NULL; - int ret = -1; - uint32_t cmd = 0; + dict_t *dict = NULL; + int ret = -1; + uint32_t cmd = 0; - GF_ASSERT (options); + GF_ASSERT(options); - dict = dict_new (); - if (!dict) - goto out; - - switch (wordcount) { + dict = dict_new(); + if (!dict) + goto out; + switch (wordcount) { case 2: - cmd = GF_CLI_STATUS_ALL; - ret = 0; - break; + cmd = GF_CLI_STATUS_ALL; + ret = 0; + break; case 3: - if (!strcmp (words[2], "all")) { - cmd = GF_CLI_STATUS_ALL; - ret = 0; + if (!strcmp(words[2], "all")) { + cmd = GF_CLI_STATUS_ALL; + ret = 0; - } else { - cmd = GF_CLI_STATUS_VOL; - ret = dict_set_str (dict, "volname", (char *)words[2]); - } + } else { + cmd = GF_CLI_STATUS_VOL; + ret = dict_set_str(dict, "volname", (char *)words[2]); + } - break; + break; case 4: - cmd = cli_cmd_get_statusop (words[3]); - - if (!strcmp (words[2], "all")) { - if (cmd == GF_CLI_STATUS_NONE) { - cli_err ("%s is not a valid status option", - words[3]); - ret = -1; - goto out; - } - cmd |= GF_CLI_STATUS_ALL; - ret = 0; - - } else { - ret = dict_set_str (dict, "volname", - (char *)words[2]); - if (ret) - goto out; - - if (cmd == GF_CLI_STATUS_NONE) { - if (!strcmp (words[3], "nfs")) { - cmd |= GF_CLI_STATUS_NFS; - } else if (!strcmp (words[3], "shd")) { - cmd |= GF_CLI_STATUS_SHD; - } else if (!strcmp (words[3], "quotad")) { - cmd |= GF_CLI_STATUS_QUOTAD; - } else if (!strcmp (words[3], "snapd")) { - cmd |= GF_CLI_STATUS_SNAPD; - } else if (!strcmp (words[3], "tierd")) { - cmd |= GF_CLI_STATUS_TIERD; - } else if (!strcmp (words[3], "bitd")) { - cmd |= GF_CLI_STATUS_BITD; - } else if (!strcmp (words[3], "scrub")) { - cmd |= GF_CLI_STATUS_SCRUB; - } else { - cmd = GF_CLI_STATUS_BRICK; - ret = dict_set_str (dict, "brick", - (char *)words[3]); - } - - } else { - cmd |= GF_CLI_STATUS_VOL; - ret = 0; - } - } - - break; - - case 5: - if (!strcmp (words[2], "all")) { - cli_err ("Cannot specify brick/nfs for \"all\""); - ret = -1; - goto out; - } + cmd = cli_cmd_get_statusop(words[3]); - cmd = cli_cmd_get_statusop (words[4]); + if (!strcmp(words[2], "all")) { if (cmd == GF_CLI_STATUS_NONE) { - cli_err ("%s is not a valid status option", - words[4]); - ret = -1; - goto out; + cli_err("%s is not a valid status option", words[3]); + ret = -1; + goto out; } + cmd |= GF_CLI_STATUS_ALL; + ret = 0; - - ret = dict_set_str (dict, "volname", (char *)words[2]); + } else { + ret = dict_set_str(dict, "volname", (char *)words[2]); if (ret) - goto out; + goto out; - if (!strcmp (words[3], "nfs")) { - if (cmd == GF_CLI_STATUS_FD || - cmd == GF_CLI_STATUS_DETAIL || - cmd == GF_CLI_STATUS_TASKS) { - cli_err ("Detail/FD/Tasks status not available" - " for NFS Servers"); - ret = -1; - goto out; - } + if (cmd == GF_CLI_STATUS_NONE) { + if (!strcmp(words[3], "nfs")) { cmd |= GF_CLI_STATUS_NFS; - } else if (!strcmp (words[3], "shd")){ - if (cmd == GF_CLI_STATUS_FD || - cmd == GF_CLI_STATUS_CLIENTS || - cmd == GF_CLI_STATUS_DETAIL || - cmd == GF_CLI_STATUS_TASKS) { - cli_err ("Detail/FD/Clients/Tasks status not " - "available for Self-heal Daemons"); - ret = -1; - goto out; - } + } else if (!strcmp(words[3], "shd")) { cmd |= GF_CLI_STATUS_SHD; - } else if (!strcmp (words[3], "quotad")) { - if (cmd == GF_CLI_STATUS_FD || - cmd == GF_CLI_STATUS_CLIENTS || - cmd == GF_CLI_STATUS_DETAIL || - cmd == GF_CLI_STATUS_INODE) { - cli_err ("Detail/FD/Clients/Inode status not " - "available for Quota Daemon"); - ret = -1; - goto out; - } + } else if (!strcmp(words[3], "quotad")) { cmd |= GF_CLI_STATUS_QUOTAD; - } else if (!strcmp (words[3], "snapd")) { - if (cmd == GF_CLI_STATUS_FD || - cmd == GF_CLI_STATUS_CLIENTS || - cmd == GF_CLI_STATUS_DETAIL || - cmd == GF_CLI_STATUS_INODE) { - cli_err ("Detail/FD/Clients/Inode status not " - "available for snap daemon"); - ret = -1; - goto out; - } + } else if (!strcmp(words[3], "snapd")) { cmd |= GF_CLI_STATUS_SNAPD; - } else if (!strcmp (words[3], "tierd")) { - if (cmd == GF_CLI_STATUS_FD || - cmd == GF_CLI_STATUS_CLIENTS || - cmd == GF_CLI_STATUS_DETAIL || - cmd == GF_CLI_STATUS_INODE) { - cli_err ("Detail/FD/Clients/Inode status not " - "available for tier daemon"); - ret = -1; - goto out; - } + } else if (!strcmp(words[3], "tierd")) { cmd |= GF_CLI_STATUS_TIERD; + } else if (!strcmp(words[3], "bitd")) { + cmd |= GF_CLI_STATUS_BITD; + } else if (!strcmp(words[3], "scrub")) { + cmd |= GF_CLI_STATUS_SCRUB; + } else { + cmd = GF_CLI_STATUS_BRICK; + ret = dict_set_str(dict, "brick", (char *)words[3]); + } + } else { - if (cmd == GF_CLI_STATUS_TASKS) { - cli_err ("Tasks status not available for " - "bricks"); - ret = -1; - goto out; - } - cmd |= GF_CLI_STATUS_BRICK; - ret = dict_set_str (dict, "brick", (char *)words[3]); + cmd |= GF_CLI_STATUS_VOL; + ret = 0; } - break; + } - default: - goto out; - } + break; - if (ret) + case 5: + if (!strcmp(words[2], "all")) { + cli_err("Cannot specify brick/nfs for \"all\""); + ret = -1; goto out; + } - ret = dict_set_int32 (dict, "cmd", cmd); - if (ret) + cmd = cli_cmd_get_statusop(words[4]); + if (cmd == GF_CLI_STATUS_NONE) { + cli_err("%s is not a valid status option", words[4]); + ret = -1; goto out; + } + + ret = dict_set_str(dict, "volname", (char *)words[2]); + if (ret) + goto out; + + if (!strcmp(words[3], "nfs")) { + if (cmd == GF_CLI_STATUS_FD || cmd == GF_CLI_STATUS_DETAIL || + cmd == GF_CLI_STATUS_TASKS) { + cli_err( + "Detail/FD/Tasks status not available" + " for NFS Servers"); + ret = -1; + goto out; + } + cmd |= GF_CLI_STATUS_NFS; + } else if (!strcmp(words[3], "shd")) { + if (cmd == GF_CLI_STATUS_FD || cmd == GF_CLI_STATUS_CLIENTS || + cmd == GF_CLI_STATUS_DETAIL || cmd == GF_CLI_STATUS_TASKS) { + cli_err( + "Detail/FD/Clients/Tasks status not " + "available for Self-heal Daemons"); + ret = -1; + goto out; + } + cmd |= GF_CLI_STATUS_SHD; + } else if (!strcmp(words[3], "quotad")) { + if (cmd == GF_CLI_STATUS_FD || cmd == GF_CLI_STATUS_CLIENTS || + cmd == GF_CLI_STATUS_DETAIL || cmd == GF_CLI_STATUS_INODE) { + cli_err( + "Detail/FD/Clients/Inode status not " + "available for Quota Daemon"); + ret = -1; + goto out; + } + cmd |= GF_CLI_STATUS_QUOTAD; + } else if (!strcmp(words[3], "snapd")) { + if (cmd == GF_CLI_STATUS_FD || cmd == GF_CLI_STATUS_CLIENTS || + cmd == GF_CLI_STATUS_DETAIL || cmd == GF_CLI_STATUS_INODE) { + cli_err( + "Detail/FD/Clients/Inode status not " + "available for snap daemon"); + ret = -1; + goto out; + } + cmd |= GF_CLI_STATUS_SNAPD; + } else if (!strcmp(words[3], "tierd")) { + if (cmd == GF_CLI_STATUS_FD || cmd == GF_CLI_STATUS_CLIENTS || + cmd == GF_CLI_STATUS_DETAIL || cmd == GF_CLI_STATUS_INODE) { + cli_err( + "Detail/FD/Clients/Inode status not " + "available for tier daemon"); + ret = -1; + goto out; + } + cmd |= GF_CLI_STATUS_TIERD; + } else { + if (cmd == GF_CLI_STATUS_TASKS) { + cli_err( + "Tasks status not available for " + "bricks"); + ret = -1; + goto out; + } + cmd |= GF_CLI_STATUS_BRICK; + ret = dict_set_str(dict, "brick", (char *)words[3]); + } + break; - *options = dict; + default: + goto out; + } + + if (ret) + goto out; + + ret = dict_set_int32(dict, "cmd", cmd); + if (ret) + goto out; - out: - if (ret && dict) - dict_unref (dict); + *options = dict; - return ret; +out: + if (ret && dict) + dict_unref(dict); + + return ret; } gf_boolean_t -cli_cmd_validate_dumpoption (const char *arg, char **option) +cli_cmd_validate_dumpoption(const char *arg, char **option) { - char *opwords[] = {"all", "nfs", "mem", "iobuf", "callpool", "priv", - "fd", "inode", "history", "inodectx", "fdctx", - "quotad", NULL}; - char *w = NULL; - - w = str_getunamb (arg, opwords); - if (!w) { - gf_log ("cli", GF_LOG_DEBUG, "Unknown statedump option %s", - arg); - return _gf_false; - } - *option = w; - return _gf_true; + char *opwords[] = {"all", "nfs", "mem", "iobuf", "callpool", + "priv", "fd", "inode", "history", "inodectx", + "fdctx", "quotad", NULL}; + char *w = NULL; + + w = str_getunamb(arg, opwords); + if (!w) { + gf_log("cli", GF_LOG_DEBUG, "Unknown statedump option %s", arg); + return _gf_false; + } + *option = w; + return _gf_true; } int -cli_cmd_volume_statedump_options_parse (const char **words, int wordcount, - dict_t **options) +cli_cmd_volume_statedump_options_parse(const char **words, int wordcount, + dict_t **options) { - int ret = 0; - int i = 0; - dict_t *dict = NULL; - int option_cnt = 0; - char *option = NULL; - char *option_str = NULL; - char *tmp_str = NULL; - char *tmp = NULL; - char *ip_addr = NULL; - char *pid = NULL; - - if ((wordcount >= 5) && ((strcmp (words[3], "client")) == 0)) { - tmp = gf_strdup(words[4]); - if (!tmp) { - ret = -1; - goto out; - } - ip_addr = strtok(tmp, ":"); - pid = strtok(NULL, ":"); - if (valid_internet_address (ip_addr, _gf_true) - && pid && gf_valid_pid (pid, strlen(pid))) { - ret = gf_asprintf(&option_str, "%s %s %s", words[3], - ip_addr, pid); - if (ret < 0) { - goto out; - } - option_cnt = 3; - } else { - ret = -1; - goto out; - } + int ret = 0; + int i = 0; + dict_t *dict = NULL; + int option_cnt = 0; + char *option = NULL; + char *option_str = NULL; + char *tmp_str = NULL; + char *tmp = NULL; + char *ip_addr = NULL; + char *pid = NULL; + + if ((wordcount >= 5) && ((strcmp(words[3], "client")) == 0)) { + tmp = gf_strdup(words[4]); + if (!tmp) { + ret = -1; + goto out; + } + ip_addr = strtok(tmp, ":"); + pid = strtok(NULL, ":"); + if (valid_internet_address(ip_addr, _gf_true) && pid && + gf_valid_pid(pid, strlen(pid))) { + ret = gf_asprintf(&option_str, "%s %s %s", words[3], ip_addr, pid); + if (ret < 0) { + goto out; + } + option_cnt = 3; } else { - for (i = 3; i < wordcount; i++, option_cnt++) { - if (!cli_cmd_validate_dumpoption (words[i], &option)) { - ret = -1; - goto out; - } - tmp_str = option_str; - option_str = NULL; - ret = gf_asprintf(&option_str, "%s%s ", - tmp_str ? tmp_str : "", option); - GF_FREE(tmp_str); - if (ret < 0) { - goto out; - } - } - if (option_str && - (strstr (option_str, "nfs")) && - strstr (option_str, "quotad")) { - ret = -1; - goto out; - } + ret = -1; + goto out; } - - dict = dict_new (); - if (!dict) { + } else { + for (i = 3; i < wordcount; i++, option_cnt++) { + if (!cli_cmd_validate_dumpoption(words[i], &option)) { ret = -1; goto out; + } + tmp_str = option_str; + option_str = NULL; + ret = gf_asprintf(&option_str, "%s%s ", tmp_str ? tmp_str : "", + option); + GF_FREE(tmp_str); + if (ret < 0) { + goto out; + } + } + if (option_str && (strstr(option_str, "nfs")) && + strstr(option_str, "quotad")) { + ret = -1; + goto out; } + } - /* dynamic string in dict is freed up when dict is freed up, and hence - if option_str is NULL pass in an duplicate empty string to the same */ - ret = dict_set_dynstr (dict, "options", - (option_str ? option_str : gf_strdup(""))); - if (ret) - goto out; - option_str = NULL; + dict = dict_new(); + if (!dict) { + ret = -1; + goto out; + } - ret = dict_set_int32 (dict, "option_cnt", option_cnt); - if (ret) - goto out; + /* dynamic string in dict is freed up when dict is freed up, and hence + if option_str is NULL pass in an duplicate empty string to the same */ + ret = dict_set_dynstr(dict, "options", + (option_str ? option_str : gf_strdup(""))); + if (ret) + goto out; + option_str = NULL; - *options = dict; + ret = dict_set_int32(dict, "option_cnt", option_cnt); + if (ret) + goto out; + + *options = dict; out: - GF_FREE (tmp); - GF_FREE (option_str); - if (ret && dict) - dict_unref (dict); - if (ret) - gf_log ("cli", GF_LOG_ERROR, "Error parsing dumpoptions"); - return ret; + GF_FREE(tmp); + GF_FREE(option_str); + if (ret && dict) + dict_unref(dict); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error parsing dumpoptions"); + return ret; } int -cli_cmd_volume_clrlks_opts_parse (const char **words, int wordcount, - dict_t **options) +cli_cmd_volume_clrlks_opts_parse(const char **words, int wordcount, + dict_t **options) { - int ret = -1; - int i = 0; - dict_t *dict = NULL; - char *kind_opts[4] = {"blocked", "granted", "all", NULL}; - char *types[4] = {"inode", "entry", "posix", NULL}; - char *free_ptr = NULL; - - dict = dict_new (); - if (!dict) - goto out; + int ret = -1; + int i = 0; + dict_t *dict = NULL; + char *kind_opts[4] = {"blocked", "granted", "all", NULL}; + char *types[4] = {"inode", "entry", "posix", NULL}; + char *free_ptr = NULL; + + dict = dict_new(); + if (!dict) + goto out; - if (strcmp (words[4], "kind")) - goto out; + if (strcmp(words[4], "kind")) + goto out; - for (i = 0; kind_opts[i]; i++) { - if (!strcmp (words[5], kind_opts[i])) { - free_ptr = gf_strdup (words[5]); - ret = dict_set_dynstr (dict, "kind", free_ptr); - if (ret) - goto out; - free_ptr = NULL; - break; - } - } - if (i == 3) + for (i = 0; kind_opts[i]; i++) { + if (!strcmp(words[5], kind_opts[i])) { + free_ptr = gf_strdup(words[5]); + ret = dict_set_dynstr(dict, "kind", free_ptr); + if (ret) goto out; + free_ptr = NULL; + break; + } + } + if (i == 3) + goto out; - ret = -1; - for (i = 0; types[i]; i++) { - if (!strcmp (words[6], types[i])) { - free_ptr = gf_strdup (words[6]); - ret = dict_set_dynstr (dict, "type", free_ptr); - if (ret) - goto out; - free_ptr = NULL; - break; - } - } - if (i == 3) + ret = -1; + for (i = 0; types[i]; i++) { + if (!strcmp(words[6], types[i])) { + free_ptr = gf_strdup(words[6]); + ret = dict_set_dynstr(dict, "type", free_ptr); + if (ret) goto out; - - if (wordcount == 8) { - free_ptr = gf_strdup (words[7]); - ret = dict_set_dynstr (dict, "opts", free_ptr); - if (ret) - goto out; - free_ptr = NULL; + free_ptr = NULL; + break; } + } + if (i == 3) + goto out; - ret = 0; - *options = dict; + if (wordcount == 8) { + free_ptr = gf_strdup(words[7]); + ret = dict_set_dynstr(dict, "opts", free_ptr); + if (ret) + goto out; + free_ptr = NULL; + } + + ret = 0; + *options = dict; out: - if (ret) { - GF_FREE (free_ptr); - dict_unref (dict); - } + if (ret) { + GF_FREE(free_ptr); + dict_unref(dict); + } - return ret; + return ret; } static int -extract_hostname_path_from_token (const char *tmp_words, char **hostname, - char **path) +extract_hostname_path_from_token(const char *tmp_words, char **hostname, + char **path) { - int ret = 0; - char *delimiter = NULL; - char *tmp_host = NULL; - char *host_name = NULL; - char *words = NULL; - int str_len = 0; - *hostname = NULL; - *path = NULL; - - str_len = strlen (tmp_words) + 1; - words = GF_MALLOC (str_len, gf_common_mt_char); - if (!words){ - ret = -1; - goto out; - } + int ret = 0; + char *delimiter = NULL; + char *tmp_host = NULL; + char *host_name = NULL; + char *words = NULL; + int str_len = 0; + *hostname = NULL; + *path = NULL; + + str_len = strlen(tmp_words) + 1; + words = GF_MALLOC(str_len, gf_common_mt_char); + if (!words) { + ret = -1; + goto out; + } - snprintf (words, str_len, "%s", tmp_words); + snprintf(words, str_len, "%s", tmp_words); - if (validate_brick_name (words)) { - cli_err ("Wrong brick type: %s, use <HOSTNAME>:" - "<export-dir-abs-path>", words); - ret = -1; - goto out; + if (validate_brick_name(words)) { + cli_err( + "Wrong brick type: %s, use <HOSTNAME>:" + "<export-dir-abs-path>", + words); + ret = -1; + goto out; + } else { + delimiter = strrchr(words, ':'); + ret = gf_canonicalize_path(delimiter + 1); + if (ret) { + goto out; } else { - delimiter = strrchr (words, ':'); - ret = gf_canonicalize_path (delimiter + 1); - if (ret) { - goto out; - } else { - str_len = strlen (delimiter + 1) + 1; - *path = GF_MALLOC (str_len, - gf_common_mt_char); - if (!*path) { - ret = -1; - goto out; - - } - snprintf (*path, str_len, "%s", delimiter +1); - } - } - - tmp_host = gf_strdup (words); - if (!tmp_host) { - gf_log ("cli", GF_LOG_ERROR, "Out of memory"); - ret = -1; - goto out; - } - get_host_name (tmp_host, &host_name); - if (!host_name) { - ret = -1; - gf_log("cli",GF_LOG_ERROR, "Unable to allocate " - "memory"); - goto out; - } - if (!(strcmp (host_name, "localhost") && - strcmp (host_name, "127.0.0.1") && - strncmp (host_name, "0.", 2))) { - cli_err ("Please provide a valid hostname/ip other " - "than localhost, 127.0.0.1 or loopback " - "address (0.0.0.0 to 0.255.255.255)."); - ret = -1; - goto out; - } - if (!valid_internet_address (host_name, _gf_false)) { - cli_err ("internet address '%s' does not conform to " - "standards", host_name); + str_len = strlen(delimiter + 1) + 1; + *path = GF_MALLOC(str_len, gf_common_mt_char); + if (!*path) { ret = -1; goto out; + } + snprintf(*path, str_len, "%s", delimiter + 1); } + } - str_len = strlen (host_name) + 1; - *hostname = GF_MALLOC (str_len, gf_common_mt_char); - if (!*hostname) { - ret = -1; - goto out; - } - snprintf (*hostname, str_len, "%s", host_name); - ret = 0; + tmp_host = gf_strdup(words); + if (!tmp_host) { + gf_log("cli", GF_LOG_ERROR, "Out of memory"); + ret = -1; + goto out; + } + get_host_name(tmp_host, &host_name); + if (!host_name) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, + "Unable to allocate " + "memory"); + goto out; + } + if (!(strcmp(host_name, "localhost") && strcmp(host_name, "127.0.0.1") && + strncmp(host_name, "0.", 2))) { + cli_err( + "Please provide a valid hostname/ip other " + "than localhost, 127.0.0.1 or loopback " + "address (0.0.0.0 to 0.255.255.255)."); + ret = -1; + goto out; + } + if (!valid_internet_address(host_name, _gf_false)) { + cli_err( + "internet address '%s' does not conform to " + "standards", + host_name); + ret = -1; + goto out; + } + + str_len = strlen(host_name) + 1; + *hostname = GF_MALLOC(str_len, gf_common_mt_char); + if (!*hostname) { + ret = -1; + goto out; + } + snprintf(*hostname, str_len, "%s", host_name); + ret = 0; out: - GF_FREE (words); - GF_FREE (tmp_host); - return ret; + GF_FREE(words); + GF_FREE(tmp_host); + return ret; } static int -set_hostname_path_in_dict (const char *token, dict_t *dict, int heal_op) +set_hostname_path_in_dict(const char *token, dict_t *dict, int heal_op) { - char *hostname = NULL; - char *path = NULL; - int ret = 0; + char *hostname = NULL; + char *path = NULL; + int ret = 0; - ret = extract_hostname_path_from_token (token, &hostname, &path); - if (ret) - goto out; + ret = extract_hostname_path_from_token(token, &hostname, &path); + if (ret) + goto out; - switch (heal_op) { + switch (heal_op) { case GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK: - ret = dict_set_dynstr (dict, "heal-source-hostname", - hostname); - if (ret) - goto out; - hostname = NULL; - ret = dict_set_dynstr (dict, "heal-source-brickpath", - path); - if (ret) { - goto out; - } - path = NULL; - break; + ret = dict_set_dynstr(dict, "heal-source-hostname", hostname); + if (ret) + goto out; + hostname = NULL; + ret = dict_set_dynstr(dict, "heal-source-brickpath", path); + if (ret) { + goto out; + } + path = NULL; + break; case GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA: - ret = dict_set_dynstr (dict, "per-replica-cmd-hostname", - hostname); - if (ret) - goto out; - hostname = NULL; - ret = dict_set_dynstr (dict, "per-replica-cmd-path", - path); - if (ret) { - goto out; - } - path = NULL; - break; + ret = dict_set_dynstr(dict, "per-replica-cmd-hostname", hostname); + if (ret) + goto out; + hostname = NULL; + ret = dict_set_dynstr(dict, "per-replica-cmd-path", path); + if (ret) { + goto out; + } + path = NULL; + break; default: - ret = -1; - break; - } + ret = -1; + break; + } out: - GF_FREE(hostname); - GF_FREE(path); - return ret; + GF_FREE(hostname); + GF_FREE(path); + return ret; } static int -heal_command_type_get (const char *command) +heal_command_type_get(const char *command) { - int i = 0; - /* subcommands are set as NULL */ - char *heal_cmds[GF_SHD_OP_HEAL_DISABLE + 1] = { - [GF_SHD_OP_INVALID] = NULL, - [GF_SHD_OP_HEAL_INDEX] = NULL, - [GF_SHD_OP_HEAL_FULL] = "full", - [GF_SHD_OP_INDEX_SUMMARY] = "info", - [GF_SHD_OP_HEALED_FILES] = NULL, - [GF_SHD_OP_HEAL_FAILED_FILES] = NULL, - [GF_SHD_OP_SPLIT_BRAIN_FILES] = NULL, - [GF_SHD_OP_STATISTICS] = "statistics", - [GF_SHD_OP_STATISTICS_HEAL_COUNT] = NULL, - [GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA] = NULL, - [GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE] = NULL, - [GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK] = NULL, - [GF_SHD_OP_HEAL_ENABLE] = "enable", - [GF_SHD_OP_HEAL_DISABLE] = "disable", - }; - - for (i = 0; i <= GF_SHD_OP_HEAL_DISABLE; i++) { - if (heal_cmds[i] && (strcmp (heal_cmds[i], command) == 0)) - return i; - } - - return GF_SHD_OP_INVALID; + int i = 0; + /* subcommands are set as NULL */ + char *heal_cmds[GF_SHD_OP_HEAL_DISABLE + 1] = { + [GF_SHD_OP_INVALID] = NULL, + [GF_SHD_OP_HEAL_INDEX] = NULL, + [GF_SHD_OP_HEAL_FULL] = "full", + [GF_SHD_OP_INDEX_SUMMARY] = "info", + [GF_SHD_OP_HEALED_FILES] = NULL, + [GF_SHD_OP_HEAL_FAILED_FILES] = NULL, + [GF_SHD_OP_SPLIT_BRAIN_FILES] = NULL, + [GF_SHD_OP_STATISTICS] = "statistics", + [GF_SHD_OP_STATISTICS_HEAL_COUNT] = NULL, + [GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA] = NULL, + [GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE] = NULL, + [GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK] = NULL, + [GF_SHD_OP_HEAL_ENABLE] = "enable", + [GF_SHD_OP_HEAL_DISABLE] = "disable", + }; + + for (i = 0; i <= GF_SHD_OP_HEAL_DISABLE; i++) { + if (heal_cmds[i] && (strcmp(heal_cmds[i], command) == 0)) + return i; + } + + return GF_SHD_OP_INVALID; } int -cli_cmd_volume_heal_options_parse (const char **words, int wordcount, - dict_t **options) +cli_cmd_volume_heal_options_parse(const char **words, int wordcount, + dict_t **options) { - int ret = 0; - dict_t *dict = NULL; - gf_xl_afr_op_t op = GF_SHD_OP_INVALID; + int ret = 0; + dict_t *dict = NULL; + gf_xl_afr_op_t op = GF_SHD_OP_INVALID; - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - ret = dict_set_str (dict, "volname", (char *) words[2]); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "failed to set volname"); - goto out; - } + ret = dict_set_str(dict, "volname", (char *)words[2]); + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, "failed to set volname"); + goto out; + } - if (wordcount == 3) { - ret = dict_set_int32 (dict, "heal-op", GF_SHD_OP_HEAL_INDEX); - goto done; + if (wordcount == 3) { + ret = dict_set_int32(dict, "heal-op", GF_SHD_OP_HEAL_INDEX); + goto done; + } + + if (wordcount == 4) { + op = heal_command_type_get(words[3]); + if (op == GF_SHD_OP_INVALID) { + ret = -1; + goto out; } - if (wordcount == 4) { - op = heal_command_type_get (words[3]); - if (op == GF_SHD_OP_INVALID) { - ret = -1; - goto out; - } + ret = dict_set_int32(dict, "heal-op", op); + goto done; + } - ret = dict_set_int32 (dict, "heal-op", op); - goto done; + if (wordcount == 5) { + if (strcmp(words[3], "info") && strcmp(words[3], "statistics") && + strcmp(words[3], "granular-entry-heal")) { + ret = -1; + goto out; } - if (wordcount == 5) { - if (strcmp (words[3], "info") && - strcmp (words[3], "statistics") && - strcmp (words[3], "granular-entry-heal")) { - ret = -1; - goto out; - } - - if (!strcmp (words[3], "info")) { - if (!strcmp (words[4], "split-brain")) { - ret = dict_set_int32 (dict, "heal-op", - GF_SHD_OP_SPLIT_BRAIN_FILES); - goto done; - } - if (!strcmp (words[4], "summary")) { - ret = dict_set_int32 (dict, "heal-op", - GF_SHD_OP_HEAL_SUMMARY); - goto done; - } - } + if (!strcmp(words[3], "info")) { + if (!strcmp(words[4], "split-brain")) { + ret = dict_set_int32(dict, "heal-op", + GF_SHD_OP_SPLIT_BRAIN_FILES); + goto done; + } + if (!strcmp(words[4], "summary")) { + ret = dict_set_int32(dict, "heal-op", GF_SHD_OP_HEAL_SUMMARY); + goto done; + } + } - if (!strcmp (words[3], "statistics")) { - if (!strcmp (words[4], "heal-count")) { - ret = dict_set_int32 (dict, "heal-op", - GF_SHD_OP_STATISTICS_HEAL_COUNT); - goto done; - } - } + if (!strcmp(words[3], "statistics")) { + if (!strcmp(words[4], "heal-count")) { + ret = dict_set_int32(dict, "heal-op", + GF_SHD_OP_STATISTICS_HEAL_COUNT); + goto done; + } + } - if (!strcmp (words[3], "granular-entry-heal")) { - if (!strcmp (words[4], "enable")) { - ret = dict_set_int32 (dict, "heal-op", - GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE); - goto done; - } else if (!strcmp (words[4], "disable")) { - ret = dict_set_int32 (dict, "heal-op", - GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE); - goto done; - } - } + if (!strcmp(words[3], "granular-entry-heal")) { + if (!strcmp(words[4], "enable")) { + ret = dict_set_int32(dict, "heal-op", + GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE); + goto done; + } else if (!strcmp(words[4], "disable")) { + ret = dict_set_int32(dict, "heal-op", + GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE); + goto done; + } + } - ret = -1; + ret = -1; + goto out; + } + if (wordcount == 6) { + if (strcmp(words[3], "split-brain")) { + ret = -1; + goto out; + } + if (!strcmp(words[4], "bigger-file")) { + ret = dict_set_int32(dict, "heal-op", + GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE); + if (ret) goto out; + ret = dict_set_str(dict, "file", (char *)words[5]); + if (ret) + goto out; + goto done; } - if (wordcount == 6) { - if (strcmp (words[3], "split-brain")) { - ret = -1; - goto out; - } - if (!strcmp (words[4], "bigger-file")) { - ret = dict_set_int32 (dict, "heal-op", - GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE); - if (ret) - goto out; - ret = dict_set_str (dict, "file", (char *)words[5]); - if (ret) - goto out; - goto done; - } - if (!strcmp (words[4], "latest-mtime")) { - ret = dict_set_int32 (dict, "heal-op", - GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME); - if (ret) - goto out; - ret = dict_set_str (dict, "file", (char *)words[5]); - if (ret) - goto out; - goto done; - } - if (!strcmp (words[4], "source-brick")) { - ret = dict_set_int32 (dict, "heal-op", - GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK); - if (ret) - goto out; - ret = set_hostname_path_in_dict (words[5], dict, - GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK); - if (ret) - goto out; - goto done; - } - ret = -1; + if (!strcmp(words[4], "latest-mtime")) { + ret = dict_set_int32(dict, "heal-op", + GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME); + if (ret) goto out; + ret = dict_set_str(dict, "file", (char *)words[5]); + if (ret) + goto out; + goto done; } - if (wordcount == 7) { - if (!strcmp (words[3], "statistics") - && !strcmp (words[4], "heal-count") - && !strcmp (words[5], "replica")) { - - ret = dict_set_int32 (dict, "heal-op", - GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA); - if (ret) - goto out; - ret = set_hostname_path_in_dict (words[6], dict, - GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA); - if (ret) - goto out; - goto done; - - } - if (!strcmp (words[3], "split-brain") && - !strcmp (words[4], "source-brick")) { - ret = dict_set_int32 (dict, "heal-op", - GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK); - ret = set_hostname_path_in_dict (words[5], dict, - GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK); - if (ret) - goto out; - ret = dict_set_str (dict, "file", - (char *) words[6]); - if (ret) - goto out; - goto done; - } + if (!strcmp(words[4], "source-brick")) { + ret = dict_set_int32(dict, "heal-op", + GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK); + if (ret) + goto out; + ret = set_hostname_path_in_dict(words[5], dict, + GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK); + if (ret) + goto out; + goto done; } ret = -1; goto out; + } + if (wordcount == 7) { + if (!strcmp(words[3], "statistics") && + !strcmp(words[4], "heal-count") && !strcmp(words[5], "replica")) { + ret = dict_set_int32(dict, "heal-op", + GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA); + if (ret) + goto out; + ret = set_hostname_path_in_dict( + words[6], dict, GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA); + if (ret) + goto out; + goto done; + } + if (!strcmp(words[3], "split-brain") && + !strcmp(words[4], "source-brick")) { + ret = dict_set_int32(dict, "heal-op", + GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK); + ret = set_hostname_path_in_dict(words[5], dict, + GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK); + if (ret) + goto out; + ret = dict_set_str(dict, "file", (char *)words[6]); + if (ret) + goto out; + goto done; + } + } + ret = -1; + goto out; done: - *options = dict; + *options = dict; out: - if (ret && dict) { - dict_unref (dict); - *options = NULL; - } + if (ret && dict) { + dict_unref(dict); + *options = NULL; + } - return ret; + return ret; } int -cli_cmd_volume_old_tier_parse (const char **words, int wordcount, - dict_t **options) +cli_cmd_volume_old_tier_parse(const char **words, int wordcount, + dict_t **options) { - dict_t *dict = NULL; - int ret = -1; - char *volname = NULL; - gf_cli_defrag_type cmd = 0; + dict_t *dict = NULL; + int ret = -1; + char *volname = NULL; + gf_cli_defrag_type cmd = 0; - GF_ASSERT (words); - GF_ASSERT (options); + GF_ASSERT(words); + GF_ASSERT(options); - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - if (wordcount != 4) - goto out; + if (wordcount != 4) + goto out; - if ((strcmp (words[1], "tier") == 0) && - (strcmp (words[3], "start") == 0)) { - cmd = GF_DEFRAG_CMD_START_TIER; - } else - goto out; + if ((strcmp(words[1], "tier") == 0) && (strcmp(words[3], "start") == 0)) { + cmd = GF_DEFRAG_CMD_START_TIER; + } else + goto out; - volname = (char *) words[2]; + volname = (char *)words[2]; - ret = dict_set_str (dict, "volname", volname); + ret = dict_set_str(dict, "volname", volname); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "failed to set dict"); - goto out; - } + 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); + 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; - } + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, "failed to set dict"); + goto out; + } - *options = dict; + *options = dict; out: - if (ret && dict) - dict_unref (dict); + if (ret && dict) + dict_unref(dict); - return ret; + return ret; } int -cli_cmd_volume_defrag_parse (const char **words, int wordcount, - dict_t **options) +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]; - } + 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 (strcmp (command, "start") == 0) { - cmd = GF_DEFRAG_CMD_START; - if (option && strcmp (option, "force") == 0) { - cmd = GF_DEFRAG_CMD_START_FORCE; - } - goto done; - } + if (!((wordcount == 4) || (wordcount == 5))) + goto out; - 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; - } + 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); + ret = dict_set_str(dict, "volname", volname); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "failed to set dict"); - goto out; - } + 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); + 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; - } + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, "failed to set dict"); + goto out; + } - *options = dict; + *options = dict; out: - if (ret && dict) - dict_unref (dict); + if (ret && dict) + dict_unref(dict); - return ret; + return ret; } int32_t -cli_snap_create_desc_parse (dict_t *dict, const char **words, - size_t wordcount, int32_t desc_opt_loc) +cli_snap_create_desc_parse(dict_t *dict, const char **words, size_t wordcount, + int32_t desc_opt_loc) { - int32_t ret = -1; - char *desc = NULL; - int32_t desc_len = 0; - int len; - - desc = GF_MALLOC (MAX_SNAP_DESCRIPTION_LEN + 1, - gf_common_mt_char); - if (!desc) { - ret = -1; - goto out; - } - - - len = strlen (words[desc_opt_loc]); - if (len >= MAX_SNAP_DESCRIPTION_LEN) { - cli_out ("snapshot create: description truncated: " - "Description provided is longer than 1024 characters"); - desc_len = MAX_SNAP_DESCRIPTION_LEN; - } else { - desc_len = len; - } + int32_t ret = -1; + char *desc = NULL; + int32_t desc_len = 0; + int len; - snprintf (desc, desc_len + 1, "%s", words[desc_opt_loc]); - /* Calculating the size of the description as given by the user */ - - ret = dict_set_dynstr (dict, "description", desc); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to save snap " - "description"); - goto out; - } + desc = GF_MALLOC(MAX_SNAP_DESCRIPTION_LEN + 1, gf_common_mt_char); + if (!desc) { + ret = -1; + goto out; + } + + len = strlen(words[desc_opt_loc]); + if (len >= MAX_SNAP_DESCRIPTION_LEN) { + cli_out( + "snapshot create: description truncated: " + "Description provided is longer than 1024 characters"); + desc_len = MAX_SNAP_DESCRIPTION_LEN; + } else { + desc_len = len; + } + + snprintf(desc, desc_len + 1, "%s", words[desc_opt_loc]); + /* Calculating the size of the description as given by the user */ + + ret = dict_set_dynstr(dict, "description", desc); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Unable to save snap " + "description"); + goto out; + } - ret = 0; + ret = 0; out: - if (ret && desc) - GF_FREE (desc); + if (ret && desc) + GF_FREE(desc); - return ret; + return ret; } /* Function to check whether the Volume name is repeated */ int -cli_check_if_volname_repeated (const char **words, unsigned int start_index, - uint64_t cur_index) { - uint64_t i = -1; - int ret = 0; +cli_check_if_volname_repeated(const char **words, unsigned int start_index, + uint64_t cur_index) +{ + uint64_t i = -1; + int ret = 0; - GF_ASSERT (words); + GF_ASSERT(words); - for (i = start_index ; i < cur_index ; i++) { - if (strcmp (words[i], words[cur_index]) == 0) { - ret = -1; - goto out; - } + for (i = start_index; i < cur_index; i++) { + if (strcmp(words[i], words[cur_index]) == 0) { + ret = -1; + goto out; } + } out: - return ret; + return ret; } /* snapshot clone <clonename> <snapname> @@ -4289,72 +4321,77 @@ out: * 0 on success */ int -cli_snap_clone_parse (dict_t *dict, const char **words, int wordcount) { - uint64_t i = 0; - int ret = -1; - char *clonename = NULL; - unsigned int cmdi = 2; - /* cmdi is command index, here cmdi is "2" (gluster snapshot clone)*/ - - GF_ASSERT (words); - GF_ASSERT (dict); - - if (wordcount == cmdi + 1) { - cli_err ("Invalid Syntax."); - gf_log ("cli", GF_LOG_ERROR, - "Invalid number of words for snap clone command"); - goto out; - } - - if (strlen(words[cmdi]) >= GLUSTERD_MAX_SNAP_NAME) { - cli_err ("snapshot clone: failed: clonename cannot exceed " - "255 characters."); - gf_log ("cli", GF_LOG_ERROR, "Clone name too long"); - - goto out; - } - - clonename = (char *) words[cmdi]; - for (i = 0 ; i < strlen (clonename); i++) { - /* Following volume name convention */ - if (!isalnum (clonename[i]) && (clonename[i] != '_' - && (clonename[i] != '-'))) { - /* TODO : Is this message enough?? */ - cli_err ("Clonename can contain only alphanumeric, " - "\"-\" and \"_\" characters"); - goto out; - } - } - - ret = dict_set_int32 (dict, "volcount", 1); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save volcount"); - goto out; - } - - ret = dict_set_str (dict, "clonename", (char *)words[cmdi]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save clone " - "name(%s)", (char *)words[cmdi]); - goto out; - } +cli_snap_clone_parse(dict_t *dict, const char **words, int wordcount) +{ + uint64_t i = 0; + int ret = -1; + char *clonename = NULL; + unsigned int cmdi = 2; + /* cmdi is command index, here cmdi is "2" (gluster snapshot clone)*/ + + GF_ASSERT(words); + GF_ASSERT(dict); + + if (wordcount == cmdi + 1) { + cli_err("Invalid Syntax."); + gf_log("cli", GF_LOG_ERROR, + "Invalid number of words for snap clone command"); + goto out; + } - /* Filling snap name in the dictionary */ - ret = dict_set_str (dict, "snapname", (char *)words[cmdi+1]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not " - "save snap name(%s)", (char *)words[cmdi+1]); - goto out; - } + if (strlen(words[cmdi]) >= GLUSTERD_MAX_SNAP_NAME) { + cli_err( + "snapshot clone: failed: clonename cannot exceed " + "255 characters."); + gf_log("cli", GF_LOG_ERROR, "Clone name too long"); + goto out; + } + + clonename = (char *)words[cmdi]; + for (i = 0; i < strlen(clonename); i++) { + /* Following volume name convention */ + if (!isalnum(clonename[i]) && + (clonename[i] != '_' && (clonename[i] != '-'))) { + /* TODO : Is this message enough?? */ + cli_err( + "Clonename can contain only alphanumeric, " + "\"-\" and \"_\" characters"); + goto out; + } + } + + ret = dict_set_int32(dict, "volcount", 1); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not save volcount"); + goto out; + } + + ret = dict_set_str(dict, "clonename", (char *)words[cmdi]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save clone " + "name(%s)", + (char *)words[cmdi]); + goto out; + } + + /* Filling snap name in the dictionary */ + ret = dict_set_str(dict, "snapname", (char *)words[cmdi + 1]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not " + "save snap name(%s)", + (char *)words[cmdi + 1]); + goto out; + } - ret = 0; + ret = 0; out: - return ret; + return ret; } - /* snapshot create <snapname> <vol-name(s)> [description <description>] * [force] * @arg-0, dict : Request Dictionary to be sent to server side. @@ -4365,172 +4402,181 @@ out: * 0 on success */ int -cli_snap_create_parse (dict_t *dict, const char **words, int wordcount) { - uint64_t i = 0; - int ret = -1; - uint64_t volcount = 0; - char key[PATH_MAX] = ""; - char *snapname = NULL; - unsigned int cmdi = 2; - int flags = 0; - /* cmdi is command index, here cmdi is "2" (gluster snapshot create)*/ - - GF_ASSERT (words); - GF_ASSERT (dict); - - if (wordcount <= cmdi + 1) { - cli_err ("Invalid Syntax."); - gf_log ("cli", GF_LOG_ERROR, - "Too less words for snap create command"); - goto out; - } +cli_snap_create_parse(dict_t *dict, const char **words, int wordcount) +{ + uint64_t i = 0; + int ret = -1; + uint64_t volcount = 0; + char key[PATH_MAX] = ""; + char *snapname = NULL; + unsigned int cmdi = 2; + int flags = 0; + /* cmdi is command index, here cmdi is "2" (gluster snapshot create)*/ + + GF_ASSERT(words); + GF_ASSERT(dict); + + if (wordcount <= cmdi + 1) { + cli_err("Invalid Syntax."); + gf_log("cli", GF_LOG_ERROR, "Too less words for snap create command"); + goto out; + } - if (strlen(words[cmdi]) >= GLUSTERD_MAX_SNAP_NAME) { - cli_err ("snapshot create: failed: snapname cannot exceed " - "255 characters."); - gf_log ("cli", GF_LOG_ERROR, "Snapname too long"); + if (strlen(words[cmdi]) >= GLUSTERD_MAX_SNAP_NAME) { + cli_err( + "snapshot create: failed: snapname cannot exceed " + "255 characters."); + gf_log("cli", GF_LOG_ERROR, "Snapname too long"); - goto out; + goto out; + } + + snapname = (char *)words[cmdi]; + for (i = 0; i < strlen(snapname); i++) { + /* Following volume name convention */ + if (!isalnum(snapname[i]) && + (snapname[i] != '_' && (snapname[i] != '-'))) { + /* TODO : Is this message enough?? */ + cli_err( + "Snapname can contain only alphanumeric, " + "\"-\" and \"_\" characters"); + goto out; + } + } + + ret = dict_set_str(dict, "snapname", (char *)words[cmdi]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save snap " + "name(%s)", + (char *)words[cmdi]); + goto out; + } + + /* Filling volume name in the dictionary */ + for (i = cmdi + 1; + i < wordcount && (strcmp(words[i], "description")) != 0 && + (strcmp(words[i], "force") != 0) && + (strcmp(words[i], "no-timestamp") != 0); + i++) { + volcount++; + /* volume index starts from 1 */ + ret = snprintf(key, sizeof(key), "volname%" PRIu64, volcount); + if (ret < 0) { + goto out; } - snapname = (char *) words[cmdi]; - for (i = 0 ; i < strlen (snapname); i++) { - /* Following volume name convention */ - if (!isalnum (snapname[i]) && (snapname[i] != '_' - && (snapname[i] != '-'))) { - /* TODO : Is this message enough?? */ - cli_err ("Snapname can contain only alphanumeric, " - "\"-\" and \"_\" characters"); - goto out; - } + ret = dict_set_str(dict, key, (char *)words[i]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not " + "save volume name(%s)", + (char *)words[i]); + goto out; } - ret = dict_set_str (dict, "snapname", (char *)words[cmdi]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save snap " - "name(%s)", (char *)words[cmdi]); - goto out; + if (i >= cmdi + 2) { + ret = -1; + cli_err( + "Creating multiple volume snapshot is not " + "supported as of now"); + goto out; } + /* TODO : remove this above condition check once + * multiple volume snapshot is supported */ + } - /* Filling volume name in the dictionary */ - for (i = cmdi + 1 ; i < wordcount - && (strcmp (words[i], "description")) != 0 - && (strcmp (words[i], "force") != 0) - && (strcmp (words[i], "no-timestamp") != 0); - i++) { - volcount++; - /* volume index starts from 1 */ - ret = snprintf (key, sizeof (key), "volname%"PRIu64, volcount); - if (ret < 0) { - goto out; - } + if (volcount == 0) { + ret = -1; + cli_err("Please provide the volume name"); + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - ret = dict_set_str (dict, key, (char *)words[i]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not " - "save volume name(%s)", (char *)words[i]); - goto out; - } + ret = dict_set_int32(dict, "volcount", volcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not save volcount"); + goto out; + } + + /* Verify how we got out of "for" loop, + * if it is by reaching wordcount limit then goto "out", + * because we need not parse for "description","force" and + * "no-timestamp" after this. + */ + if (i == wordcount) { + goto out; + } - if (i >= cmdi + 2) { - ret = -1; - cli_err("Creating multiple volume snapshot is not " - "supported as of now"); - goto out; - } - /* TODO : remove this above condition check once - * multiple volume snapshot is supported */ + if (strcmp(words[i], "no-timestamp") == 0) { + ret = dict_set_str(dict, "no-timestamp", "true"); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save " + "time-stamp option"); } + if (i == (wordcount - 1)) + goto out; + i++; + } - if (volcount == 0) { - ret = -1; - cli_err ("Please provide the volume name"); - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; + if ((strcmp(words[i], "description")) == 0) { + ++i; + if (i > (wordcount - 1)) { + ret = -1; + cli_err("Please provide a description"); + gf_log("cli", GF_LOG_ERROR, "Description not provided"); + goto out; } - ret = dict_set_int32 (dict, "volcount", volcount); + ret = cli_snap_create_desc_parse(dict, words, wordcount, i); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save volcount"); - goto out; - } - - /* Verify how we got out of "for" loop, - * if it is by reaching wordcount limit then goto "out", - * because we need not parse for "description","force" and - * "no-timestamp" after this. + gf_log("cli", GF_LOG_ERROR, + "Could not save snap " + "description"); + goto out; + } + + if (i == (wordcount - 1)) + goto out; + i++; + /* point the index to next word. + * As description might be follwed by force option. + * Before that, check if wordcount limit is reached */ - if (i == wordcount) { - goto out; - } - - if (strcmp (words[i], "no-timestamp") == 0) { - ret = dict_set_str (dict, "no-timestamp", "true"); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save " - "time-stamp option"); - } - if (i == (wordcount-1)) - goto out; - i++; - } - - if ((strcmp (words[i], "description")) == 0) { - ++i; - if (i > (wordcount - 1)) { - ret = -1; - cli_err ("Please provide a description"); - gf_log ("cli", GF_LOG_ERROR, - "Description not provided"); - goto out; - } - - ret = cli_snap_create_desc_parse(dict, words, wordcount, i); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save snap " - "description"); - goto out; - } - - if (i == (wordcount - 1)) - goto out; - i++; - /* point the index to next word. - * As description might be follwed by force option. - * Before that, check if wordcount limit is reached - */ - } + } - if (strcmp (words[i], "force") == 0) { - flags = GF_CLI_FLAG_OP_FORCE; + if (strcmp(words[i], "force") == 0) { + flags = GF_CLI_FLAG_OP_FORCE; - } else { - ret = -1; - cli_err ("Invalid Syntax."); - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + } else { + ret = -1; + cli_err("Invalid Syntax."); + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - /* Check if the command has anything after "force" keyword */ - if (++i < wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + /* Check if the command has anything after "force" keyword */ + if (++i < wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - ret = 0; + ret = 0; out: - if(ret == 0) { - /*Adding force flag in either of the case i.e force set - * or unset*/ - ret = dict_set_int32 (dict, "flags", flags); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save " - "snap force option"); - } + if (ret == 0) { + /*Adding force flag in either of the case i.e force set + * or unset*/ + ret = dict_set_int32(dict, "flags", flags); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save " + "snap force option"); } - return ret; + } + return ret; } /* snapshot list [volname] @@ -4542,30 +4588,30 @@ out: * 0 on success */ int -cli_snap_list_parse (dict_t *dict, const char **words, int wordcount) { - int ret = -1; +cli_snap_list_parse(dict_t *dict, const char **words, int wordcount) +{ + int ret = -1; - GF_ASSERT (words); - GF_ASSERT (dict); + GF_ASSERT(words); + GF_ASSERT(dict); - if (wordcount < 2 || wordcount > 3) { - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + if (wordcount < 2 || wordcount > 3) { + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - if (wordcount == 2) { - ret = 0; - goto out; - } + if (wordcount == 2) { + ret = 0; + goto out; + } - ret = dict_set_str (dict, "volname", (char *)words[2]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to save volname in dictionary"); - goto out; - } + ret = dict_set_str(dict, "volname", (char *)words[2]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to save volname in dictionary"); + goto out; + } out: - return ret; + return ret; } /* snapshot info [(snapname | volume <volname>)] @@ -4577,87 +4623,88 @@ out: * 0 on success */ int -cli_snap_info_parse (dict_t *dict, const char **words, int wordcount) +cli_snap_info_parse(dict_t *dict, const char **words, int wordcount) { + int ret = -1; + int32_t cmd = GF_SNAP_INFO_TYPE_ALL; + unsigned int cmdi = 2; + /* cmdi is command index, here cmdi is "2" (gluster snapshot info)*/ - int ret = -1; - int32_t cmd = GF_SNAP_INFO_TYPE_ALL; - unsigned int cmdi = 2; - /* cmdi is command index, here cmdi is "2" (gluster snapshot info)*/ + GF_ASSERT(words); + GF_ASSERT(dict); - GF_ASSERT (words); - GF_ASSERT (dict); + if (wordcount > 4 || wordcount < cmdi) { + gf_log("cli", GF_LOG_ERROR, "Invalid syntax"); + goto out; + } - if (wordcount > 4 || wordcount < cmdi) { - gf_log ("cli", GF_LOG_ERROR, "Invalid syntax"); - goto out; - } + if (wordcount == cmdi) { + ret = 0; + goto out; + } - if (wordcount == cmdi) { - ret = 0; - goto out; + /* If 3rd word is not "volume", then it must + * be snapname. + */ + if (strcmp(words[cmdi], "volume") != 0) { + ret = dict_set_str(dict, "snapname", (char *)words[cmdi]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Unable to save " + "snapname %s", + words[cmdi]); + goto out; } - /* If 3rd word is not "volume", then it must - * be snapname. + /* Once snap name is parsed, if we encounter any other + * word then fail it. Invalid Syntax. + * example : snapshot info <snapname> word */ - if (strcmp (words[cmdi], "volume") != 0) { - ret = dict_set_str (dict, "snapname", - (char *)words[cmdi]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to save " - "snapname %s", words[cmdi]); - goto out; - } - - /* Once snap name is parsed, if we encounter any other - * word then fail it. Invalid Syntax. - * example : snapshot info <snapname> word - */ - if ((cmdi + 1) != wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } - - cmd = GF_SNAP_INFO_TYPE_SNAP; - ret = 0; - goto out; - /* No need to continue the parsing once we - * get the snapname - */ + if ((cmdi + 1) != wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; } - /* If 3rd word is "volume", then check if next word - * is present. As, "snapshot info volume" is an - * invalid command. + cmd = GF_SNAP_INFO_TYPE_SNAP; + ret = 0; + goto out; + /* No need to continue the parsing once we + * get the snapname */ - if ((cmdi + 1) == wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + } - ret = dict_set_str (dict, "volname", (char *)words[wordcount - 1]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save " - "volume name %s", words[wordcount - 1]); - goto out; - } - cmd = GF_SNAP_INFO_TYPE_VOL; + /* If 3rd word is "volume", then check if next word + * is present. As, "snapshot info volume" is an + * invalid command. + */ + if ((cmdi + 1) == wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } + + ret = dict_set_str(dict, "volname", (char *)words[wordcount - 1]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save " + "volume name %s", + words[wordcount - 1]); + goto out; + } + cmd = GF_SNAP_INFO_TYPE_VOL; out: - if (ret == 0) { - ret = dict_set_int32 (dict, "sub-cmd", cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save " - "type of snapshot info"); - } + if (ret == 0) { + ret = dict_set_int32(dict, "sub-cmd", cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save " + "type of snapshot info"); } - return ret; + } + return ret; } - - /* snapshot restore <snapname> * @arg-0, dict : Request Dictionary to be sent to server side. * @arg-1, words : Contains individual words of CLI command. @@ -4667,42 +4714,43 @@ out: * 0 on success */ int -cli_snap_restore_parse (dict_t *dict, const char **words, int wordcount, - struct cli_state *state) +cli_snap_restore_parse(dict_t *dict, const char **words, int wordcount, + struct cli_state *state) { + int ret = -1; + const char *question = NULL; + gf_answer_t answer = GF_ANSWER_NO; - int ret = -1; - const char *question = NULL; - gf_answer_t answer = GF_ANSWER_NO; - - GF_ASSERT (words); - GF_ASSERT (dict); - - if (wordcount != 3) { - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } - - ret = dict_set_str (dict, "snapname", (char *)words[2]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to save snap-name %s", - words[2]); - goto out; - } + GF_ASSERT(words); + GF_ASSERT(dict); - question = "Restore operation will replace the " - "original volume with the snapshotted volume. " - "Do you still want to continue?"; + if (wordcount != 3) { + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - answer = cli_cmd_get_confirmation (state, question); - if (GF_ANSWER_NO == answer) { - ret = 1; - gf_log ("cli", GF_LOG_ERROR, "User cancelled a snapshot " - "restore operation for snap %s", (char *)words[2]); - goto out; - } + ret = dict_set_str(dict, "snapname", (char *)words[2]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to save snap-name %s", words[2]); + goto out; + } + + question = + "Restore operation will replace the " + "original volume with the snapshotted volume. " + "Do you still want to continue?"; + + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + ret = 1; + gf_log("cli", GF_LOG_ERROR, + "User cancelled a snapshot " + "restore operation for snap %s", + (char *)words[2]); + goto out; + } out: - return ret; + return ret; } /* snapshot activate <snapname> [force] @@ -4714,43 +4762,41 @@ out: * 0 on success */ int -cli_snap_activate_parse (dict_t *dict, const char **words, int wordcount) +cli_snap_activate_parse(dict_t *dict, const char **words, int wordcount) { + int ret = -1; + int flags = 0; - int ret = -1; - int flags = 0; - - GF_ASSERT (words); - GF_ASSERT (dict); + GF_ASSERT(words); + GF_ASSERT(dict); - if ((wordcount < 3) || (wordcount > 4)) { - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + if ((wordcount < 3) || (wordcount > 4)) { + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - ret = dict_set_str (dict, "snapname", (char *)words[2]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to save snap-name %s", - words[2]); - goto out; - } + ret = dict_set_str(dict, "snapname", (char *)words[2]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to save snap-name %s", words[2]); + goto out; + } - if (wordcount == 4) { - if (!strcmp("force", (char *)words[3])) { - flags = GF_CLI_FLAG_OP_FORCE; - } else { - gf_log ("cli", GF_LOG_ERROR, "Invalid option"); - ret = -1; - goto out; - } - } - ret = dict_set_int32 (dict, "flags", flags); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to save force option"); - goto out; - } + if (wordcount == 4) { + if (!strcmp("force", (char *)words[3])) { + flags = GF_CLI_FLAG_OP_FORCE; + } else { + gf_log("cli", GF_LOG_ERROR, "Invalid option"); + ret = -1; + goto out; + } + } + ret = dict_set_int32(dict, "flags", flags); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to save force option"); + goto out; + } out: - return ret; + return ret; } /* snapshot deactivate <snapname> @@ -4763,42 +4809,41 @@ out: * 1 if user cancelled the request */ int -cli_snap_deactivate_parse (dict_t *dict, const char **words, int wordcount, - struct cli_state *state) +cli_snap_deactivate_parse(dict_t *dict, const char **words, int wordcount, + struct cli_state *state) { + int ret = -1; + gf_answer_t answer = GF_ANSWER_NO; + const char *question = + "Deactivating snap will make its " + "data inaccessible. Do you want to " + "continue?"; + + GF_ASSERT(words); + GF_ASSERT(dict); + + if ((wordcount != 3)) { + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - int ret = -1; - gf_answer_t answer = GF_ANSWER_NO; - const char *question = "Deactivating snap will make its " - "data inaccessible. Do you want to " - "continue?"; - - - GF_ASSERT (words); - GF_ASSERT (dict); - - if ((wordcount != 3)) { - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } - - ret = dict_set_str (dict, "snapname", (char *)words[2]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to save snap-name %s", - words[2]); - goto out; - } - - answer = cli_cmd_get_confirmation (state, question); - if (GF_ANSWER_NO == answer) { - ret = 1; - gf_log ("cli", GF_LOG_DEBUG, "User cancelled " - "snapshot deactivate operation"); - goto out; - } + ret = dict_set_str(dict, "snapname", (char *)words[2]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to save snap-name %s", words[2]); + goto out; + } + + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + ret = 1; + gf_log("cli", GF_LOG_DEBUG, + "User cancelled " + "snapshot deactivate operation"); + goto out; + } out: - return ret; + return ret; } /* snapshot delete (all | snapname | volume <volname>) @@ -4811,78 +4856,84 @@ out: * 1 if user cancel the operation */ int -cli_snap_delete_parse (dict_t *dict, const char **words, int wordcount, - struct cli_state *state) { - - int ret = -1; - const char *question = NULL; - int32_t cmd = -1; - unsigned int cmdi = 2; - gf_answer_t answer = GF_ANSWER_NO; - - GF_ASSERT (words); - GF_ASSERT (dict); +cli_snap_delete_parse(dict_t *dict, const char **words, int wordcount, + struct cli_state *state) +{ + int ret = -1; + const char *question = NULL; + int32_t cmd = -1; + unsigned int cmdi = 2; + gf_answer_t answer = GF_ANSWER_NO; - if (wordcount > 4 || wordcount <= cmdi) { - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + GF_ASSERT(words); + GF_ASSERT(dict); - question = "Deleting snap will erase all the information about " - "the snap. Do you still want to continue?"; + if (wordcount > 4 || wordcount <= cmdi) { + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - if (strcmp (words [cmdi], "all") == 0) { - ret = 0; - cmd = GF_SNAP_DELETE_TYPE_ALL; - } else if (strcmp (words [cmdi], "volume") == 0) { - if (++cmdi == wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + question = + "Deleting snap will erase all the information about " + "the snap. Do you still want to continue?"; - ret = dict_set_str (dict, "volname", - (char *)words[cmdi]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save " - "volume name %s", words[wordcount - 1]); - goto out; - } - cmd = GF_SNAP_DELETE_TYPE_VOL; - } else { - ret = dict_set_str (dict, "snapname", (char *)words[cmdi]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to save " - "snapname %s", words[2]); - goto out; - } - cmd = GF_SNAP_DELETE_TYPE_SNAP; + if (strcmp(words[cmdi], "all") == 0) { + ret = 0; + cmd = GF_SNAP_DELETE_TYPE_ALL; + } else if (strcmp(words[cmdi], "volume") == 0) { + if (++cmdi == wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; } - if ((cmdi + 1) != wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; + ret = dict_set_str(dict, "volname", (char *)words[cmdi]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save " + "volume name %s", + words[wordcount - 1]); + goto out; + } + cmd = GF_SNAP_DELETE_TYPE_VOL; + } else { + ret = dict_set_str(dict, "snapname", (char *)words[cmdi]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Unable to save " + "snapname %s", + words[2]); + goto out; } + cmd = GF_SNAP_DELETE_TYPE_SNAP; + } - if (cmd == GF_SNAP_DELETE_TYPE_SNAP) { - answer = cli_cmd_get_confirmation (state, question); - if (GF_ANSWER_NO == answer) { - ret = 1; - gf_log ("cli", GF_LOG_DEBUG, "User cancelled " - "snapshot delete operation for snap %s", - (char *)words[2]); - goto out; - } - } + if ((cmdi + 1) != wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - ret = dict_set_int32 (dict, "sub-cmd", cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save " - "type of snapshot delete"); - } + if (cmd == GF_SNAP_DELETE_TYPE_SNAP) { + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + ret = 1; + gf_log("cli", GF_LOG_DEBUG, + "User cancelled " + "snapshot delete operation for snap %s", + (char *)words[2]); + goto out; + } + } + + ret = dict_set_int32(dict, "sub-cmd", cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save " + "type of snapshot delete"); + } out: - return ret; + return ret; } /* snapshot status [(snapname | volume <volname>)] @@ -4894,132 +4945,138 @@ out: * 0 on success */ int -cli_snap_status_parse (dict_t *dict, const char **words, int wordcount) +cli_snap_status_parse(dict_t *dict, const char **words, int wordcount) { + int ret = -1; + int32_t cmd = GF_SNAP_STATUS_TYPE_ALL; + unsigned int cmdi = 2; + /* cmdi is command index, here cmdi is "2" (gluster snapshot status)*/ - int ret = -1; - int32_t cmd = GF_SNAP_STATUS_TYPE_ALL; - unsigned int cmdi = 2; - /* cmdi is command index, here cmdi is "2" (gluster snapshot status)*/ + GF_ASSERT(words); + GF_ASSERT(dict); - GF_ASSERT (words); - GF_ASSERT (dict); + if (wordcount > 4 || wordcount < cmdi) { + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - if (wordcount > 4 || wordcount < cmdi) { - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + if (wordcount == cmdi) { + ret = 0; + goto out; + } - if (wordcount == cmdi) { - ret = 0; - goto out; + /* if 3rd word is not "volume", then it must be "snapname" + */ + if (strcmp(words[cmdi], "volume") != 0) { + ret = dict_set_str(dict, "snapname", (char *)words[cmdi]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Count not save " + "snap name %s", + words[cmdi]); + goto out; } - /* if 3rd word is not "volume", then it must be "snapname" - */ - if (strcmp (words[cmdi], "volume") != 0) { - ret = dict_set_str (dict, "snapname", - (char *)words[cmdi]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Count not save " - "snap name %s", words[cmdi]); - goto out; - } - - if ((cmdi + 1) != wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } - - ret = 0; - cmd = GF_SNAP_STATUS_TYPE_SNAP; - goto out; + if ((cmdi + 1) != wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; } - /* If 3rd word is "volume", then check if next word is present. - * As, "snapshot info volume" is an invalid command - */ - if ((cmdi + 1) == wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + ret = 0; + cmd = GF_SNAP_STATUS_TYPE_SNAP; + goto out; + } - ret = dict_set_str (dict, "volname", (char *)words [wordcount - 1]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Count not save " - "volume name %s", words[wordcount - 1]); - goto out; - } - cmd = GF_SNAP_STATUS_TYPE_VOL; + /* If 3rd word is "volume", then check if next word is present. + * As, "snapshot info volume" is an invalid command + */ + if ((cmdi + 1) == wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } + + ret = dict_set_str(dict, "volname", (char *)words[wordcount - 1]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Count not save " + "volume name %s", + words[wordcount - 1]); + goto out; + } + cmd = GF_SNAP_STATUS_TYPE_VOL; out: - if (ret == 0) { - ret = dict_set_int32 (dict, "sub-cmd", cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save cmd " - "of snapshot status"); - } + if (ret == 0) { + ret = dict_set_int32(dict, "sub-cmd", cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save cmd " + "of snapshot status"); } + } - return ret; + return ret; } - /* return value: * -1 in case of failure. * 0 in case of success. */ int32_t -cli_snap_config_limit_parse (const char **words, dict_t *dict, - unsigned int wordcount, unsigned int index, - char *key) +cli_snap_config_limit_parse(const char **words, dict_t *dict, + unsigned int wordcount, unsigned int index, + char *key) { - int ret = -1; - int limit = 0; - char *end_ptr = NULL; - - GF_ASSERT (words); - GF_ASSERT (dict); - GF_ASSERT (key); + int ret = -1; + int limit = 0; + char *end_ptr = NULL; - if (index >= wordcount) { - ret = -1; - cli_err ("Please provide a value for %s.", key); - gf_log ("cli", GF_LOG_ERROR, "Value not provided for %s", key); - goto out; - } + GF_ASSERT(words); + GF_ASSERT(dict); + GF_ASSERT(key); - limit = strtol (words[index], &end_ptr, 10); + if (index >= wordcount) { + ret = -1; + cli_err("Please provide a value for %s.", key); + gf_log("cli", GF_LOG_ERROR, "Value not provided for %s", key); + goto out; + } - if (limit <= 0 || strcmp (end_ptr, "") != 0) { - ret = -1; - cli_err("Please enter an integer value " - "greater than zero for %s", key); - goto out; - } + limit = strtol(words[index], &end_ptr, 10); - ret = dict_set_int32 (dict, key, limit); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not set " - "%s in dictionary", key); - goto out; - } + if (limit <= 0 || strcmp(end_ptr, "") != 0) { + ret = -1; + cli_err( + "Please enter an integer value " + "greater than zero for %s", + key); + goto out; + } + + ret = dict_set_int32(dict, key, limit); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not set " + "%s in dictionary", + key); + goto out; + } - ret = dict_set_dynstr_with_alloc (dict, "globalname", "All"); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not set global key"); - goto out; - } - ret = dict_set_int32 (dict, "hold_global_locks", _gf_true); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not set global locks"); - goto out; - } + ret = dict_set_dynstr_with_alloc(dict, "globalname", "All"); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not set global key"); + goto out; + } + ret = dict_set_int32(dict, "hold_global_locks", _gf_true); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not set global locks"); + goto out; + } out: - return ret; + return ret; } /* function cli_snap_config_parse @@ -5035,775 +5092,787 @@ out: NOTE : snap-max-soft-limit can only be set for system. */ int32_t -cli_snap_config_parse (const char **words, int wordcount, dict_t *dict, - struct cli_state *state) +cli_snap_config_parse(const char **words, int wordcount, dict_t *dict, + struct cli_state *state) { - int ret = -1; - gf_answer_t answer = GF_ANSWER_NO; - gf_boolean_t vol_presence = _gf_false; - struct snap_config_opt_vals_ *conf_vals = NULL; - int8_t hard_limit = 0; - int8_t soft_limit = 0; - int8_t config_type = -1; - const char *question = NULL; - unsigned int cmdi = 2; - /* cmdi is command index, here cmdi is "2" (gluster snapshot config)*/ - - GF_ASSERT (words); - GF_ASSERT (dict); - GF_ASSERT (state); - - if ((wordcount < 2) || (wordcount > 7)) { - gf_log ("cli", GF_LOG_ERROR, - "Invalid wordcount(%d)", wordcount); - goto out; - } + int ret = -1; + gf_answer_t answer = GF_ANSWER_NO; + gf_boolean_t vol_presence = _gf_false; + struct snap_config_opt_vals_ *conf_vals = NULL; + int8_t hard_limit = 0; + int8_t soft_limit = 0; + int8_t config_type = -1; + const char *question = NULL; + unsigned int cmdi = 2; + /* cmdi is command index, here cmdi is "2" (gluster snapshot config)*/ + + GF_ASSERT(words); + GF_ASSERT(dict); + GF_ASSERT(state); + + if ((wordcount < 2) || (wordcount > 7)) { + gf_log("cli", GF_LOG_ERROR, "Invalid wordcount(%d)", wordcount); + goto out; + } - if (wordcount == 2) { - config_type = GF_SNAP_CONFIG_DISPLAY; - ret = 0; - goto set; + if (wordcount == 2) { + config_type = GF_SNAP_CONFIG_DISPLAY; + ret = 0; + goto set; + } + + /* auto-delete cannot be a volume name */ + /* Check whether the 3rd word is volname */ + if (strcmp(words[cmdi], "snap-max-hard-limit") != 0 && + strcmp(words[cmdi], "snap-max-soft-limit") != 0 && + strcmp(words[cmdi], "auto-delete") != 0 && + strcmp(words[cmdi], "activate-on-create") != 0) { + ret = dict_set_str(dict, "volname", (char *)words[cmdi]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to set volname"); + goto out; } + cmdi++; + vol_presence = _gf_true; - /* auto-delete cannot be a volume name */ - /* Check whether the 3rd word is volname */ - if (strcmp (words[cmdi], "snap-max-hard-limit") != 0 - && strcmp (words[cmdi], "snap-max-soft-limit") != 0 - && strcmp (words[cmdi], "auto-delete") != 0 - && strcmp (words[cmdi], "activate-on-create") != 0) { - ret = dict_set_str (dict, "volname", (char *)words[cmdi]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set volname"); - goto out; - } - cmdi++; - vol_presence = _gf_true; - - if (cmdi == wordcount) { - config_type = GF_SNAP_CONFIG_DISPLAY; - ret = 0; - goto set; - } + if (cmdi == wordcount) { + config_type = GF_SNAP_CONFIG_DISPLAY; + ret = 0; + goto set; } + } - config_type = GF_SNAP_CONFIG_TYPE_SET; + config_type = GF_SNAP_CONFIG_TYPE_SET; - if (strcmp (words[cmdi], "snap-max-hard-limit") == 0) { - ret = cli_snap_config_limit_parse (words, dict, wordcount, - ++cmdi, "snap-max-hard-limit"); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to parse snap " - "config hard limit"); - goto out; - } - hard_limit = 1; - - if (++cmdi == wordcount) { - ret = 0; - goto set; - } + if (strcmp(words[cmdi], "snap-max-hard-limit") == 0) { + ret = cli_snap_config_limit_parse(words, dict, wordcount, ++cmdi, + "snap-max-hard-limit"); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to parse snap " + "config hard limit"); + goto out; } + hard_limit = 1; - if (strcmp (words[cmdi], "snap-max-soft-limit") == 0) { - if (vol_presence == 1) { - ret = -1; - cli_err ("Soft limit cannot be set to individual " - "volumes."); - gf_log ("cli", GF_LOG_ERROR, "Soft limit cannot be " - "set to volumes"); - goto out; - } - - ret = cli_snap_config_limit_parse (words, dict, wordcount, - ++cmdi, "snap-max-soft-limit"); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to parse snap " - "config soft limit"); - goto out; - } - - if (++cmdi != wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } - soft_limit = 1; + if (++cmdi == wordcount) { + ret = 0; + goto set; } + } - if (hard_limit || soft_limit) - goto set; + if (strcmp(words[cmdi], "snap-max-soft-limit") == 0) { + if (vol_presence == 1) { + ret = -1; + cli_err( + "Soft limit cannot be set to individual " + "volumes."); + gf_log("cli", GF_LOG_ERROR, + "Soft limit cannot be " + "set to volumes"); + goto out; + } - if (strcmp(words[cmdi], "auto-delete") == 0) { - if (vol_presence == 1) { - ret = -1; - cli_err ("As of now, auto-delete option cannot be set " - "to volumes"); - gf_log ("cli", GF_LOG_ERROR, "auto-delete option " - "cannot be set to volumes"); - goto out; - } + ret = cli_snap_config_limit_parse(words, dict, wordcount, ++cmdi, + "snap-max-soft-limit"); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to parse snap " + "config soft limit"); + goto out; + } - if (++cmdi >= wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + if (++cmdi != wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } + soft_limit = 1; + } - ret = dict_set_str (dict, "auto-delete", (char *)words[cmdi]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set " - "value of auto-delete in request " - "dictionary"); - goto out; - } + if (hard_limit || soft_limit) + goto set; - if (++cmdi != wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } - } else if (strcmp(words[cmdi], "activate-on-create") == 0) { - if (vol_presence == 1) { - ret = -1; - cli_err ("As of now, activate-on-create option " - "cannot be set to volumes"); - gf_log ("cli", GF_LOG_ERROR, "activate-on-create " - "option cannot be set to volumes"); - goto out; - } + if (strcmp(words[cmdi], "auto-delete") == 0) { + if (vol_presence == 1) { + ret = -1; + cli_err( + "As of now, auto-delete option cannot be set " + "to volumes"); + gf_log("cli", GF_LOG_ERROR, + "auto-delete option " + "cannot be set to volumes"); + goto out; + } - if (++cmdi >= wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + if (++cmdi >= wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - ret = dict_set_str (dict, "snap-activate-on-create", - (char *)words[cmdi]); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set value " - "of activate-on-create in request dictionary"); - goto out; - } + ret = dict_set_str(dict, "auto-delete", (char *)words[cmdi]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to set " + "value of auto-delete in request " + "dictionary"); + goto out; + } + + if (++cmdi != wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } + } else if (strcmp(words[cmdi], "activate-on-create") == 0) { + if (vol_presence == 1) { + ret = -1; + cli_err( + "As of now, activate-on-create option " + "cannot be set to volumes"); + gf_log("cli", GF_LOG_ERROR, + "activate-on-create " + "option cannot be set to volumes"); + goto out; + } + + if (++cmdi >= wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } + + ret = dict_set_str(dict, "snap-activate-on-create", + (char *)words[cmdi]); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to set value " + "of activate-on-create in request dictionary"); + goto out; + } - if (++cmdi != wordcount) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } - } else { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; + if (++cmdi != wordcount) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; } + } else { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - ret = 0; /* Success */ + ret = 0; /* Success */ set: - ret = dict_set_int32 (dict, "config-command", config_type); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to set " - "config-command"); - goto out; - } + ret = dict_set_int32(dict, "config-command", config_type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Unable to set " + "config-command"); + goto out; + } - if (config_type == GF_SNAP_CONFIG_TYPE_SET && - (hard_limit || soft_limit)) { - conf_vals = snap_confopt_vals; - if (hard_limit && soft_limit) { - question = conf_vals[GF_SNAP_CONFIG_SET_BOTH].question; - } else if (soft_limit) { - question = conf_vals[GF_SNAP_CONFIG_SET_SOFT].question; - } else if (hard_limit) { - question = conf_vals[GF_SNAP_CONFIG_SET_HARD].question; - } + if (config_type == GF_SNAP_CONFIG_TYPE_SET && (hard_limit || soft_limit)) { + conf_vals = snap_confopt_vals; + if (hard_limit && soft_limit) { + question = conf_vals[GF_SNAP_CONFIG_SET_BOTH].question; + } else if (soft_limit) { + question = conf_vals[GF_SNAP_CONFIG_SET_SOFT].question; + } else if (hard_limit) { + question = conf_vals[GF_SNAP_CONFIG_SET_HARD].question; + } - answer = cli_cmd_get_confirmation (state, question); - if (GF_ANSWER_NO == answer) { - ret = 1; - gf_log ("cli", GF_LOG_DEBUG, "User cancelled " - "snapshot config operation"); - } + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + ret = 1; + gf_log("cli", GF_LOG_DEBUG, + "User cancelled " + "snapshot config operation"); } + } out: - return ret; + return ret; } int -validate_op_name (const char *op, const char *opname, char **opwords) { - int ret = -1; - int i = 0; +validate_op_name(const char *op, const char *opname, char **opwords) +{ + int ret = -1; + int i = 0; - GF_ASSERT (opname); - GF_ASSERT (opwords); + GF_ASSERT(opname); + GF_ASSERT(opwords); - for (i = 0 ; opwords[i] != NULL; i++) { - if (strcmp (opwords[i], opname) == 0) { - cli_out ("\"%s\" cannot be a %s", opname, op); - goto out; - } + for (i = 0; opwords[i] != NULL; i++) { + if (strcmp(opwords[i], opname) == 0) { + cli_out("\"%s\" cannot be a %s", opname, op); + goto out; } - ret = 0; + } + ret = 0; out: - return ret; + return ret; } int32_t -cli_cmd_snapshot_parse (const char **words, int wordcount, dict_t **options, - struct cli_state *state) +cli_cmd_snapshot_parse(const char **words, int wordcount, dict_t **options, + struct cli_state *state) { - int32_t ret = -1; - dict_t *dict = NULL; - gf1_cli_snapshot type = GF_SNAP_OPTION_TYPE_NONE; - char *w = NULL; - char *opwords[] = {"create", "delete", "restore", - "activate", "deactivate", "list", - "status", "config", "info", "clone", - NULL}; - char *invalid_snapnames[] = {"description", "force", - "volume", "all", NULL}; - char *invalid_volnames[] = {"volume", "type", - "subvolumes", "option", - "end-volume", "all", - "volume_not_in_ring", - "description", "force", - "snap-max-hard-limit", - "snap-max-soft-limit", - "auto-delete", - "activate-on-create", NULL}; - - GF_ASSERT (words); - GF_ASSERT (options); - GF_ASSERT (state); - - dict = dict_new (); - if (!dict) - goto out; + int32_t ret = -1; + dict_t *dict = NULL; + gf1_cli_snapshot type = GF_SNAP_OPTION_TYPE_NONE; + char *w = NULL; + char *opwords[] = {"create", "delete", "restore", "activate", + "deactivate", "list", "status", "config", + "info", "clone", NULL}; + char *invalid_snapnames[] = {"description", "force", "volume", "all", NULL}; + char *invalid_volnames[] = {"volume", + "type", + "subvolumes", + "option", + "end-volume", + "all", + "volume_not_in_ring", + "description", + "force", + "snap-max-hard-limit", + "snap-max-soft-limit", + "auto-delete", + "activate-on-create", + NULL}; - /* Lowest wordcount possible */ - if (wordcount < 2) { - gf_log ("", GF_LOG_ERROR, - "Invalid command: Not enough arguments"); - goto out; - } + GF_ASSERT(words); + GF_ASSERT(options); + GF_ASSERT(state); - w = str_getunamb (words[1], opwords); - if (!w) { - /* Checks if the operation is a valid operation */ - gf_log ("", GF_LOG_ERROR, "Opword Mismatch"); - goto out; - } + dict = dict_new(); + if (!dict) + goto out; - if (!strcmp (w, "create")) { - type = GF_SNAP_OPTION_TYPE_CREATE; - } else if (!strcmp (w, "list")) { - type = GF_SNAP_OPTION_TYPE_LIST; - } else if (!strcmp (w, "info")) { - type = GF_SNAP_OPTION_TYPE_INFO; - } else if (!strcmp (w, "delete")) { - type = GF_SNAP_OPTION_TYPE_DELETE; - } else if (!strcmp (w, "config")) { - type = GF_SNAP_OPTION_TYPE_CONFIG; - } else if (!strcmp (w, "restore")) { - type = GF_SNAP_OPTION_TYPE_RESTORE; - } else if (!strcmp (w, "status")) { - type = GF_SNAP_OPTION_TYPE_STATUS; - } else if (!strcmp (w, "activate")) { - type = GF_SNAP_OPTION_TYPE_ACTIVATE; - } else if (!strcmp (w, "deactivate")) { - type = GF_SNAP_OPTION_TYPE_DEACTIVATE; - } else if (!strcmp(w, "clone")) { - type = GF_SNAP_OPTION_TYPE_CLONE; - } - - if (type != GF_SNAP_OPTION_TYPE_CONFIG && - type != GF_SNAP_OPTION_TYPE_STATUS) { - ret = dict_set_int32 (dict, "hold_snap_locks", _gf_true); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Unable to set hold-snap-locks value " - "as _gf_true"); - goto out; - } - } + /* Lowest wordcount possible */ + if (wordcount < 2) { + gf_log("", GF_LOG_ERROR, "Invalid command: Not enough arguments"); + goto out; + } - /* Following commands does not require volume locks */ - if (type == GF_SNAP_OPTION_TYPE_STATUS || - type == GF_SNAP_OPTION_TYPE_ACTIVATE || - type == GF_SNAP_OPTION_TYPE_DEACTIVATE) { - ret = dict_set_int32 (dict, "hold_vol_locks", _gf_false); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Setting volume lock " - "flag failed"); - goto out; - } + w = str_getunamb(words[1], opwords); + if (!w) { + /* Checks if the operation is a valid operation */ + gf_log("", GF_LOG_ERROR, "Opword Mismatch"); + goto out; + } + + if (!strcmp(w, "create")) { + type = GF_SNAP_OPTION_TYPE_CREATE; + } else if (!strcmp(w, "list")) { + type = GF_SNAP_OPTION_TYPE_LIST; + } else if (!strcmp(w, "info")) { + type = GF_SNAP_OPTION_TYPE_INFO; + } else if (!strcmp(w, "delete")) { + type = GF_SNAP_OPTION_TYPE_DELETE; + } else if (!strcmp(w, "config")) { + type = GF_SNAP_OPTION_TYPE_CONFIG; + } else if (!strcmp(w, "restore")) { + type = GF_SNAP_OPTION_TYPE_RESTORE; + } else if (!strcmp(w, "status")) { + type = GF_SNAP_OPTION_TYPE_STATUS; + } else if (!strcmp(w, "activate")) { + type = GF_SNAP_OPTION_TYPE_ACTIVATE; + } else if (!strcmp(w, "deactivate")) { + type = GF_SNAP_OPTION_TYPE_DEACTIVATE; + } else if (!strcmp(w, "clone")) { + type = GF_SNAP_OPTION_TYPE_CLONE; + } + + if (type != GF_SNAP_OPTION_TYPE_CONFIG && + type != GF_SNAP_OPTION_TYPE_STATUS) { + ret = dict_set_int32(dict, "hold_snap_locks", _gf_true); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Unable to set hold-snap-locks value " + "as _gf_true"); + goto out; + } + } + + /* Following commands does not require volume locks */ + if (type == GF_SNAP_OPTION_TYPE_STATUS || + type == GF_SNAP_OPTION_TYPE_ACTIVATE || + type == GF_SNAP_OPTION_TYPE_DEACTIVATE) { + ret = dict_set_int32(dict, "hold_vol_locks", _gf_false); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Setting volume lock " + "flag failed"); + goto out; } + } - /* Check which op is intended */ - switch (type) { + /* Check which op is intended */ + switch (type) { case GF_SNAP_OPTION_TYPE_CREATE: - /* Syntax : - * gluster snapshot create <snapname> <vol-name(s)> - * [no-timestamp] - * [description <description>] - * [force] - */ - /* In cases where the snapname is not given then - * parsing fails & snapname cannot be "description", - * "force" and "volume", that check is made here - */ - if (wordcount == 2){ - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } + /* Syntax : + * gluster snapshot create <snapname> <vol-name(s)> + * [no-timestamp] + * [description <description>] + * [force] + */ + /* In cases where the snapname is not given then + * parsing fails & snapname cannot be "description", + * "force" and "volume", that check is made here + */ + if (wordcount == 2) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - ret = validate_op_name ("snapname", words[2], - invalid_snapnames); - if (ret) { - goto out; - } + ret = validate_op_name("snapname", words[2], invalid_snapnames); + if (ret) { + goto out; + } - ret = cli_snap_create_parse (dict, words, wordcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "create command parsing failed."); - goto out; - } - break; + ret = cli_snap_create_parse(dict, words, wordcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "create command parsing failed."); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_CLONE: - /* Syntax : - * gluster snapshot clone <clonename> <snapname> - */ - /* In cases where the clonename is not given then - * parsing fails & snapname cannot be "description", - * "force" and "volume", that check is made here - */ - if (wordcount == 2) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid Syntax"); - goto out; - } - - ret = validate_op_name ("clonename", words[2], - invalid_volnames); - if (ret) { - goto out; - } + /* Syntax : + * gluster snapshot clone <clonename> <snapname> + */ + /* In cases where the clonename is not given then + * parsing fails & snapname cannot be "description", + * "force" and "volume", that check is made here + */ + if (wordcount == 2) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid Syntax"); + goto out; + } - ret = cli_snap_clone_parse (dict, words, wordcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "clone command parsing failed."); - goto out; - } - break; + ret = validate_op_name("clonename", words[2], invalid_volnames); + if (ret) { + goto out; + } + ret = cli_snap_clone_parse(dict, words, wordcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "clone command parsing failed."); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_INFO: - /* Syntax : - * gluster snapshot info [(snapname] | [vol <volname>)] - */ - ret = cli_snap_info_parse (dict, words, wordcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to parse " - "snapshot info command"); - goto out; - } - break; + /* Syntax : + * gluster snapshot info [(snapname] | [vol <volname>)] + */ + ret = cli_snap_info_parse(dict, words, wordcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to parse " + "snapshot info command"); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_LIST: - /* Syntax : - * gluster snaphsot list [volname] - */ + /* Syntax : + * gluster snaphsot list [volname] + */ - ret = cli_snap_list_parse (dict, words, wordcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to parse " - "snapshot list command"); - goto out; - } - break; + ret = cli_snap_list_parse(dict, words, wordcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to parse " + "snapshot list command"); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_DELETE: - /* Syntax : - * snapshot delete (all | snapname | volume <volname>) - */ - ret = cli_snap_delete_parse (dict, words, wordcount, state); - if (ret) { - /* A positive ret value means user cancelled - * the command */ - if (ret < 0) { - gf_log ("cli", GF_LOG_ERROR, "Failed to parse " - "snapshot delete command"); - } - goto out; + /* Syntax : + * snapshot delete (all | snapname | volume <volname>) + */ + ret = cli_snap_delete_parse(dict, words, wordcount, state); + if (ret) { + /* A positive ret value means user cancelled + * the command */ + if (ret < 0) { + gf_log("cli", GF_LOG_ERROR, + "Failed to parse " + "snapshot delete command"); } - break; + goto out; + } + break; case GF_SNAP_OPTION_TYPE_CONFIG: - /* snapshot config [volname] [snap-max-hard-limit <count>] - * [snap-max-soft-limit <percent>] */ - ret = cli_snap_config_parse (words, wordcount, dict, state); - if (ret) { - if (ret < 0) - gf_log ("cli", GF_LOG_ERROR, - "config command parsing failed."); - goto out; - } + /* snapshot config [volname] [snap-max-hard-limit <count>] + * [snap-max-soft-limit <percent>] */ + ret = cli_snap_config_parse(words, wordcount, dict, state); + if (ret) { + if (ret < 0) + gf_log("cli", GF_LOG_ERROR, + "config command parsing failed."); + goto out; + } - ret = dict_set_int32 (dict, "type", GF_SNAP_OPTION_TYPE_CONFIG); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to set " - "config type"); - ret = -1; - goto out; - } - break; - - case GF_SNAP_OPTION_TYPE_STATUS: - { - /* Syntax : - * gluster snapshot status [(snapname | - * volume <volname>)] - */ - ret = cli_snap_status_parse (dict, words, wordcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to parse " - "snapshot status command"); - goto out; - } - break; - } + ret = dict_set_int32(dict, "type", GF_SNAP_OPTION_TYPE_CONFIG); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Unable to set " + "config type"); + ret = -1; + goto out; + } + break; + + case GF_SNAP_OPTION_TYPE_STATUS: { + /* Syntax : + * gluster snapshot status [(snapname | + * volume <volname>)] + */ + ret = cli_snap_status_parse(dict, words, wordcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to parse " + "snapshot status command"); + goto out; + } + break; + } case GF_SNAP_OPTION_TYPE_RESTORE: - /* Syntax: - * snapshot restore <snapname> - */ - ret = cli_snap_restore_parse (dict, words, wordcount, state); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to parse " - "restore command"); - goto out; + /* Syntax: + * snapshot restore <snapname> + */ + ret = cli_snap_restore_parse(dict, words, wordcount, state); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to parse " + "restore command"); + goto out; + } + break; + + case GF_SNAP_OPTION_TYPE_ACTIVATE: + /* Syntax: + * snapshot activate <snapname> [force] + */ + ret = cli_snap_activate_parse(dict, words, wordcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to parse " + "start command"); + goto out; + } + break; + case GF_SNAP_OPTION_TYPE_DEACTIVATE: + /* Syntax: + * snapshot deactivate <snapname> + */ + ret = cli_snap_deactivate_parse(dict, words, wordcount, state); + if (ret) { + /* A positive ret value means user cancelled + * the command */ + if (ret < 0) { + gf_log("cli", GF_LOG_ERROR, + "Failed to parse deactivate " + "command"); } - break; - - case GF_SNAP_OPTION_TYPE_ACTIVATE: - /* Syntax: - * snapshot activate <snapname> [force] - */ - ret = cli_snap_activate_parse (dict, words, wordcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to parse " - "start command"); - goto out; - } - break; - case GF_SNAP_OPTION_TYPE_DEACTIVATE: - /* Syntax: - * snapshot deactivate <snapname> - */ - ret = cli_snap_deactivate_parse (dict, words, wordcount, - state); - if (ret) { - /* A positive ret value means user cancelled - * the command */ - if (ret < 0) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to parse deactivate " - "command"); - } - goto out; - } - break; + goto out; + } + break; default: - gf_log ("", GF_LOG_ERROR, "Opword Mismatch"); - goto out; - } + gf_log("", GF_LOG_ERROR, "Opword Mismatch"); + goto out; + } - ret = dict_set_int32 (dict, "type", type); - if (ret) { - gf_log ("", GF_LOG_ERROR, - "Failed to set type."); - goto out; - } - /* If you got so far, input is valid */ - ret = 0; + ret = dict_set_int32(dict, "type", type); + if (ret) { + gf_log("", GF_LOG_ERROR, "Failed to set type."); + goto out; + } + /* If you got so far, input is valid */ + ret = 0; out: - if (ret) { - if (dict) - dict_unref (dict); - } else - *options = dict; + if (ret) { + if (dict) + dict_unref(dict); + } else + *options = dict; - return ret; + return ret; } int -cli_cmd_validate_volume (char *volname) +cli_cmd_validate_volume(char *volname) { - int i = 0; - int ret = -1; - int volname_len; + int i = 0; + int ret = -1; + int volname_len; + if (volname[0] == '-') + return ret; - if (volname[0] == '-') - return ret; + if (!strcmp(volname, "all")) { + cli_err("\"all\" cannot be the name of a volume."); + return ret; + } - if (!strcmp (volname, "all")) { - cli_err ("\"all\" cannot be the name of a volume."); - return ret; - } + if (strchr(volname, '/')) { + cli_err("Volume name should not contain \"/\" character."); + return ret; + } - if (strchr (volname, '/')) { - cli_err ("Volume name should not contain \"/\" character."); - return ret; - } + volname_len = strlen(volname); + if (volname_len > GD_VOLUME_NAME_MAX) { + cli_err("Volname can not exceed %d characters.", GD_VOLUME_NAME_MAX); + return ret; + } - volname_len = strlen (volname); - if (volname_len > GD_VOLUME_NAME_MAX) { - cli_err ("Volname can not exceed %d characters.", - GD_VOLUME_NAME_MAX); - return ret; + for (i = 0; i < volname_len; i++) + if (!isalnum(volname[i]) && (volname[i] != '_') && + (volname[i] != '-')) { + cli_err( + "Volume name should not contain \"%c\"" + " character.\nVolume names can only" + "contain alphanumeric, '-' and '_' " + "characters.", + volname[i]); + return ret; } - for (i = 0; i < volname_len ; i++) - if (!isalnum (volname[i]) && (volname[i] != '_') && - (volname[i] != '-')) { - cli_err ("Volume name should not contain \"%c\"" - " character.\nVolume names can only" - "contain alphanumeric, '-' and '_' " - "characters.", volname[i]); - return ret; - } - - ret = 0; + ret = 0; - return ret; + return ret; } int32_t -cli_cmd_bitrot_parse (const char **words, int wordcount, dict_t **options) +cli_cmd_bitrot_parse(const char **words, int wordcount, dict_t **options) { - int32_t ret = -1; - char *w = NULL; - char *volname = NULL; - char *opwords[] = {"enable", "disable", - "scrub-throttle", - "scrub-frequency", "scrub", - "signing-time", NULL}; - char *scrub_throt_values[] = {"lazy", "normal", - "aggressive", NULL}; - char *scrub_freq_values[] = {"hourly", - "daily", "weekly", - "biweekly", "monthly", - "minute", NULL}; - char *scrub_values[] = {"pause", "resume", - "status", "ondemand", - NULL}; - dict_t *dict = NULL; - gf_bitrot_type type = GF_BITROT_OPTION_TYPE_NONE; - int32_t expiry_time = 0; - - GF_ASSERT (words); - GF_ASSERT (options); - - - /* Hack to print out bitrot help properly */ - if ((wordcount == 3) && !(strcmp (words[2], "help"))) { - ret = 1; - return ret; - } - - if (wordcount < 4 || wordcount > 5) { - gf_log ("cli", GF_LOG_ERROR, "Invalid syntax"); - goto out; - } + int32_t ret = -1; + char *w = NULL; + char *volname = NULL; + char *opwords[] = { + "enable", "disable", "scrub-throttle", "scrub-frequency", "scrub", + "signing-time", NULL}; + char *scrub_throt_values[] = {"lazy", "normal", "aggressive", NULL}; + char *scrub_freq_values[] = {"hourly", "daily", "weekly", "biweekly", + "monthly", "minute", NULL}; + char *scrub_values[] = {"pause", "resume", "status", "ondemand", NULL}; + dict_t *dict = NULL; + gf_bitrot_type type = GF_BITROT_OPTION_TYPE_NONE; + int32_t expiry_time = 0; + + GF_ASSERT(words); + GF_ASSERT(options); + + /* Hack to print out bitrot help properly */ + if ((wordcount == 3) && !(strcmp(words[2], "help"))) { + ret = 1; + return ret; + } - dict = dict_new (); - if (!dict) - goto out; + if (wordcount < 4 || wordcount > 5) { + gf_log("cli", GF_LOG_ERROR, "Invalid syntax"); + goto out; + } - volname = (char *)words[2]; - if (!volname) { - ret = -1; - goto out; - } + dict = dict_new(); + if (!dict) + goto out; - ret = cli_cmd_validate_volume (volname); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to validate volume name"); - goto out; - } + volname = (char *)words[2]; + if (!volname) { + ret = -1; + goto out; + } - ret = dict_set_str (dict, "volname", volname); - if (ret) { - cli_out ("Failed to set volume name in dictionary "); - goto out; - } + ret = cli_cmd_validate_volume(volname); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to validate volume name"); + goto out; + } - w = str_getunamb (words[3], opwords); - if (!w) { - cli_out ("Invalid bit rot option : %s", words[3]); - ret = -1; - goto out; - } + ret = dict_set_str(dict, "volname", volname); + if (ret) { + cli_out("Failed to set volume name in dictionary "); + goto out; + } - if (strcmp (w, "enable") == 0) { - if (wordcount == 4) { - type = GF_BITROT_OPTION_TYPE_ENABLE; - ret = 0; - goto set_type; - } else { - ret = -1; - goto out; - } - } + w = str_getunamb(words[3], opwords); + if (!w) { + cli_out("Invalid bit rot option : %s", words[3]); + ret = -1; + goto out; + } - if (strcmp (w, "disable") == 0) { - if (wordcount == 4) { - type = GF_BITROT_OPTION_TYPE_DISABLE; - ret = 0; - goto set_type; - } else { - ret = -1; - goto out; - } + if (strcmp(w, "enable") == 0) { + if (wordcount == 4) { + type = GF_BITROT_OPTION_TYPE_ENABLE; + ret = 0; + goto set_type; + } else { + ret = -1; + goto out; } + } - if (!strcmp (w, "scrub-throttle")) { - if (!words[4]) { - cli_err ("Missing scrub-throttle value for bitrot " - "option"); - ret = -1; - goto out; - } else { - w = str_getunamb (words[4], scrub_throt_values); - if (!w) { - cli_err ("Invalid scrub-throttle option for " - "bitrot"); - ret = -1; - goto out; - } else { - type = GF_BITROT_OPTION_TYPE_SCRUB_THROTTLE; - ret = dict_set_str (dict, - "scrub-throttle-value", - (char *) words[4]); - if (ret) { - cli_out ("Failed to set scrub-throttle " - "value in the dict"); - goto out; - } - goto set_type; - } + if (strcmp(w, "disable") == 0) { + if (wordcount == 4) { + type = GF_BITROT_OPTION_TYPE_DISABLE; + ret = 0; + goto set_type; + } else { + ret = -1; + goto out; + } + } + + if (!strcmp(w, "scrub-throttle")) { + if (!words[4]) { + cli_err( + "Missing scrub-throttle value for bitrot " + "option"); + ret = -1; + goto out; + } else { + w = str_getunamb(words[4], scrub_throt_values); + if (!w) { + cli_err( + "Invalid scrub-throttle option for " + "bitrot"); + ret = -1; + goto out; + } else { + type = GF_BITROT_OPTION_TYPE_SCRUB_THROTTLE; + ret = dict_set_str(dict, "scrub-throttle-value", + (char *)words[4]); + if (ret) { + cli_out( + "Failed to set scrub-throttle " + "value in the dict"); + goto out; } + goto set_type; + } } + } - if (!strcmp (words[3], "scrub-frequency")) { - if (!words[4]) { - cli_err ("Missing scrub-frequency value"); - ret = -1; - goto out; - } else { - w = str_getunamb (words[4], scrub_freq_values); - if (!w) { - cli_err ("Invalid frequency option for bitrot"); - ret = -1; - goto out; - } else { - type = GF_BITROT_OPTION_TYPE_SCRUB_FREQ; - ret = dict_set_str (dict, - "scrub-frequency-value", - (char *) words[4]); - if (ret) { - cli_out ("Failed to set dict for " - "bitrot"); - goto out; - } - goto set_type; - } + if (!strcmp(words[3], "scrub-frequency")) { + if (!words[4]) { + cli_err("Missing scrub-frequency value"); + ret = -1; + goto out; + } else { + w = str_getunamb(words[4], scrub_freq_values); + if (!w) { + cli_err("Invalid frequency option for bitrot"); + ret = -1; + goto out; + } else { + type = GF_BITROT_OPTION_TYPE_SCRUB_FREQ; + ret = dict_set_str(dict, "scrub-frequency-value", + (char *)words[4]); + if (ret) { + cli_out( + "Failed to set dict for " + "bitrot"); + goto out; } + goto set_type; + } } + } - if (!strcmp (words[3], "scrub")) { - if (!words[4]) { - cli_err ("Missing scrub value for bitrot option"); - ret = -1; - goto out; + if (!strcmp(words[3], "scrub")) { + if (!words[4]) { + cli_err("Missing scrub value for bitrot option"); + ret = -1; + goto out; + } else { + w = str_getunamb(words[4], scrub_values); + if (!w) { + cli_err("Invalid scrub option for bitrot"); + ret = -1; + goto out; + } else { + if (strcmp(words[4], "status") == 0) { + type = GF_BITROT_CMD_SCRUB_STATUS; + } else if (strcmp(words[4], "ondemand") == 0) { + type = GF_BITROT_CMD_SCRUB_ONDEMAND; } else { - w = str_getunamb (words[4], scrub_values); - if (!w) { - cli_err ("Invalid scrub option for bitrot"); - ret = -1; - goto out; - } else { - if (strcmp (words[4], "status") == 0) { - type = GF_BITROT_CMD_SCRUB_STATUS; - } else if (strcmp (words[4], "ondemand") == 0) { - type = GF_BITROT_CMD_SCRUB_ONDEMAND; - } else { - type = GF_BITROT_OPTION_TYPE_SCRUB; - } - ret = dict_set_str (dict, "scrub-value", - (char *) words[4]); - if (ret) { - cli_out ("Failed to set dict for " - "bitrot"); - goto out; - } - goto set_type; - } + type = GF_BITROT_OPTION_TYPE_SCRUB; } + ret = dict_set_str(dict, "scrub-value", (char *)words[4]); + if (ret) { + cli_out( + "Failed to set dict for " + "bitrot"); + goto out; + } + goto set_type; + } } + } - if (!strcmp (words[3], "signing-time")) { - if (!words[4]) { - cli_err ("Missing signing-time value for bitrot " - "option"); - ret = -1; - goto out; - } else { - type = GF_BITROT_OPTION_TYPE_EXPIRY_TIME; - - expiry_time = strtol (words[4], NULL, 0); - if (expiry_time < 1) { - cli_err ("Expiry time value should not be less" - " than 1"); - ret = -1; - goto out; - } - - ret = dict_set_uint32 (dict, "expiry-time", - (unsigned int) expiry_time); - if (ret) { - cli_out ("Failed to set dict for bitrot"); - goto out; - } - goto set_type; - } + if (!strcmp(words[3], "signing-time")) { + if (!words[4]) { + cli_err( + "Missing signing-time value for bitrot " + "option"); + ret = -1; + goto out; } else { - cli_err ("Invalid option %s for bitrot. Please enter valid " - "bitrot option", words[3]); + type = GF_BITROT_OPTION_TYPE_EXPIRY_TIME; + + expiry_time = strtol(words[4], NULL, 0); + if (expiry_time < 1) { + cli_err( + "Expiry time value should not be less" + " than 1"); ret = -1; goto out; + } + + ret = dict_set_uint32(dict, "expiry-time", + (unsigned int)expiry_time); + if (ret) { + cli_out("Failed to set dict for bitrot"); + goto out; + } + goto set_type; } + } else { + cli_err( + "Invalid option %s for bitrot. Please enter valid " + "bitrot option", + words[3]); + ret = -1; + goto out; + } set_type: - ret = dict_set_int32 (dict, "type", type); - if (ret < 0) - goto out; + ret = dict_set_int32(dict, "type", type); + if (ret < 0) + goto out; - *options = dict; + *options = dict; out: - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to parse bitrot command"); - if (dict) - dict_unref (dict); - } + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to parse bitrot command"); + if (dict) + dict_unref(dict); + } - return ret; + return ret; } diff --git a/cli/src/cli-cmd-peer.c b/cli/src/cli-cmd-peer.c index a50ea7c66b5..e0a38904a81 100644 --- a/cli/src/cli-cmd-peer.c +++ b/cli/src/cli-cmd-peer.c @@ -24,292 +24,282 @@ extern struct rpc_clnt *global_rpc; extern rpc_clnt_prog_t *cli_rpc_prog; -int cli_cmd_peer_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, +int +cli_cmd_peer_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, const char **words, int wordcount); int -cli_cmd_peer_probe_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_peer_probe_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *dict = NULL; - int sent = 0; - int parse_error = 0; - cli_local_t *local = NULL; - - if (!(wordcount == 3)) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_PROBE]; - - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; - - dict = dict_new (); - if (!dict) - goto out; - - ret = dict_set_str (dict, "hostname", (char *)words[2]); - if (ret) - goto out; - - ret = valid_internet_address ((char *) words[2], _gf_false); - if (ret == 1) { - ret = 0; - } else { - cli_out ("%s is an invalid address", words[2]); - cli_usage_out (word->pattern); - parse_error = 1; - ret = -1; - goto out; - } -/* if (words[3]) { - ret = dict_set_str (dict, "port", (char *)words[3]); - if (ret) - goto out; - } -*/ - - CLI_LOCAL_INIT (local, words, frame, dict); - - if (proc->fn) { - ret = proc->fn (frame, THIS, dict); - } + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *dict = NULL; + int sent = 0; + int parse_error = 0; + cli_local_t *local = NULL; + + if (!(wordcount == 3)) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_PROBE]; + + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + + dict = dict_new(); + if (!dict) + goto out; + + ret = dict_set_str(dict, "hostname", (char *)words[2]); + if (ret) + goto out; + + ret = valid_internet_address((char *)words[2], _gf_false); + if (ret == 1) { + ret = 0; + } else { + cli_out("%s is an invalid address", words[2]); + cli_usage_out(word->pattern); + parse_error = 1; + ret = -1; + goto out; + } + /* if (words[3]) { + ret = dict_set_str (dict, "port", (char *)words[3]); + if (ret) + goto out; + } + */ + + CLI_LOCAL_INIT(local, words, frame, dict); + + if (proc->fn) { + ret = proc->fn(frame, THIS, dict); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Peer probe failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Peer probe failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - if (ret == 0) { - gf_event (EVENT_PEER_ATTACH, "host=%s", (char *)words[2]); - } + if (ret == 0) { + gf_event(EVENT_PEER_ATTACH, "host=%s", (char *)words[2]); + } - return ret; + return ret; } - int -cli_cmd_peer_deprobe_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_peer_deprobe_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *dict = NULL; - int flags = 0; - int sent = 0; - int parse_error = 0; - cli_local_t *local = NULL; - - if ((wordcount < 3) || (wordcount > 4)) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *dict = NULL; + int flags = 0; + int sent = 0; + int parse_error = 0; + cli_local_t *local = NULL; + + if ((wordcount < 3) || (wordcount > 4)) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_DEPROBE]; + + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + + dict = dict_new(); + + ret = dict_set_str(dict, "hostname", (char *)words[2]); + if (ret) + goto out; + + /* if (words[3]) { + ret = dict_set_str (dict, "port", (char *)words[3]); + if (ret) + goto out; + } + */ + if (wordcount == 4) { + if (!strcmp("force", words[3])) + flags |= GF_CLI_FLAG_OP_FORCE; + else { + ret = -1; + cli_usage_out(word->pattern); + parse_error = 1; + goto out; } + } + ret = dict_set_int32(dict, "flags", flags); + if (ret) + goto out; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_DEPROBE]; + CLI_LOCAL_INIT(local, words, frame, dict); - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; - - dict = dict_new (); - - ret = dict_set_str (dict, "hostname", (char *)words[2]); - if (ret) - goto out; - -/* if (words[3]) { - ret = dict_set_str (dict, "port", (char *)words[3]); - if (ret) - goto out; - } -*/ - if (wordcount == 4) { - if (!strcmp("force", words[3])) - flags |= GF_CLI_FLAG_OP_FORCE; - else { - ret = -1; - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } - } - ret = dict_set_int32 (dict, "flags", flags); - if (ret) - goto out; - - CLI_LOCAL_INIT (local, words, frame, dict); - - if (proc->fn) { - ret = proc->fn (frame, THIS, dict); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, dict); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Peer detach failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Peer detach failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - if (ret == 0) { - gf_event (EVENT_PEER_DETACH, "host=%s", (char *)words[2]); - } + if (ret == 0) { + gf_event(EVENT_PEER_DETACH, "host=%s", (char *)words[2]); + } - return ret; + return ret; } int -cli_cmd_peer_status_cbk (struct cli_state *state, struct cli_cmd_word *word, +cli_cmd_peer_status_cbk(struct cli_state *state, struct cli_cmd_word *word, const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - int sent = 0; - int parse_error = 0; - - if (wordcount != 2) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + int sent = 0; + int parse_error = 0; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_LIST_FRIENDS]; + if (wordcount != 2) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_LIST_FRIENDS]; - if (proc->fn) { - ret = proc->fn (frame, THIS, (void *)GF_CLI_LIST_PEERS); - } + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + + if (proc->fn) { + ret = proc->fn(frame, THIS, (void *)GF_CLI_LIST_PEERS); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Peer status failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Peer status failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } int -cli_cmd_pool_list_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_pool_list_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - int sent = 0; - int parse_error = 0; - - if (wordcount != 2) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + int sent = 0; + int parse_error = 0; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_LIST_FRIENDS]; + if (wordcount != 2) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_LIST_FRIENDS]; - if (proc->fn) { - ret = proc->fn (frame, THIS, - (void *)GF_CLI_LIST_POOL_NODES); - } + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + + if (proc->fn) { + ret = proc->fn(frame, THIS, (void *)GF_CLI_LIST_POOL_NODES); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_err ("pool list: command execution failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_err("pool list: command execution failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } struct cli_cmd cli_probe_cmds[] = { - { "peer probe { <HOSTNAME> | <IP-address> }", - cli_cmd_peer_probe_cbk, - "probe peer specified by <HOSTNAME>"}, + {"peer probe { <HOSTNAME> | <IP-address> }", cli_cmd_peer_probe_cbk, + "probe peer specified by <HOSTNAME>"}, - { "peer detach { <HOSTNAME> | <IP-address> } [force]", - cli_cmd_peer_deprobe_cbk, - "detach peer specified by <HOSTNAME>"}, + {"peer detach { <HOSTNAME> | <IP-address> } [force]", + cli_cmd_peer_deprobe_cbk, "detach peer specified by <HOSTNAME>"}, - { "peer status", - cli_cmd_peer_status_cbk, - "list status of peers"}, + {"peer status", cli_cmd_peer_status_cbk, "list status of peers"}, - { "peer help", - cli_cmd_peer_help_cbk, - "display help for peer commands"}, + {"peer help", cli_cmd_peer_help_cbk, "display help for peer commands"}, - { "pool list", - cli_cmd_pool_list_cbk, - "list all the nodes in the pool (including localhost)"}, + {"pool list", cli_cmd_pool_list_cbk, + "list all the nodes in the pool (including localhost)"}, - { NULL, NULL, NULL } -}; + {NULL, NULL, NULL}}; int -cli_cmd_peer_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, +cli_cmd_peer_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, const char **words, int wordcount) { - struct cli_cmd *cmd = NULL; - struct cli_cmd *probe_cmd = NULL; - int count = 0; + struct cli_cmd *cmd = NULL; + struct cli_cmd *probe_cmd = NULL; + int count = 0; - cli_out ("\ngluster peer commands"); - cli_out ("======================\n"); + cli_out("\ngluster peer commands"); + cli_out("======================\n"); - cmd = GF_MALLOC (sizeof (cli_probe_cmds), cli_mt_cli_cmd); - memcpy (cmd, cli_probe_cmds, sizeof (cli_probe_cmds)); - count = (sizeof (cli_probe_cmds) / sizeof (struct cli_cmd)); - cli_cmd_sort (cmd, count); + cmd = GF_MALLOC(sizeof(cli_probe_cmds), cli_mt_cli_cmd); + memcpy(cmd, cli_probe_cmds, sizeof(cli_probe_cmds)); + count = (sizeof(cli_probe_cmds) / sizeof(struct cli_cmd)); + cli_cmd_sort(cmd, count); - for (probe_cmd = cmd; probe_cmd->pattern; probe_cmd++) - cli_out ("%s - %s", probe_cmd->pattern, probe_cmd->desc); + for (probe_cmd = cmd; probe_cmd->pattern; probe_cmd++) + cli_out("%s - %s", probe_cmd->pattern, probe_cmd->desc); - GF_FREE (cmd); + GF_FREE(cmd); - cli_out ("\n"); - return 0; + cli_out("\n"); + return 0; } int -cli_cmd_probe_register (struct cli_state *state) +cli_cmd_probe_register(struct cli_state *state) { - int ret = 0; - struct cli_cmd *cmd = NULL; - - for (cmd = cli_probe_cmds; cmd->pattern; cmd++) { + int ret = 0; + struct cli_cmd *cmd = NULL; - ret = cli_cmd_register (&state->tree, cmd); - if (ret) - goto out; - } + for (cmd = cli_probe_cmds; cmd->pattern; cmd++) { + ret = cli_cmd_register(&state->tree, cmd); + if (ret) + goto out; + } out: - return ret; + return ret; } diff --git a/cli/src/cli-cmd-snapshot.c b/cli/src/cli-cmd-snapshot.c index 64cbd42ce5a..814ab82f6eb 100644 --- a/cli/src/cli-cmd-snapshot.c +++ b/cli/src/cli-cmd-snapshot.c @@ -20,146 +20,118 @@ extern rpc_clnt_prog_t *cli_rpc_prog; int -cli_cmd_snapshot_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount); +cli_cmd_snapshot_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount); int -cli_cmd_snapshot_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_snapshot_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = 0; - int parse_err = 0; - 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_SNAP]; - - frame = create_frame (THIS, THIS->ctx->pool); - if (frame == NULL) { - ret = -1; - goto out; + int ret = 0; + int parse_err = 0; + 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_SNAP]; + + frame = create_frame(THIS, THIS->ctx->pool); + if (frame == NULL) { + ret = -1; + goto out; + } + + /* Parses the command entered by the user */ + ret = cli_cmd_snapshot_parse(words, wordcount, &options, state); + if (ret) { + if (ret < 0) { + cli_usage_out(word->pattern); + parse_err = 1; + } else { + /* User might have cancelled the snapshot operation */ + ret = 0; } + goto out; + } - /* Parses the command entered by the user */ - ret = cli_cmd_snapshot_parse (words, wordcount, &options, state); - if (ret) { - if (ret < 0) { - cli_usage_out (word->pattern); - parse_err = 1; - } else { - /* User might have cancelled the snapshot operation */ - ret = 0; - } - goto out; - } - - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) - ret = proc->fn (frame, THIS, options); + if (proc->fn) + ret = proc->fn(frame, THIS, options); out: - if (ret && parse_err == 0) - cli_out ("Snapshot command failed"); + if (ret && parse_err == 0) + cli_out("Snapshot command failed"); - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } struct cli_cmd snapshot_cmds[] = { - { "snapshot help", - cli_cmd_snapshot_help_cbk, - "display help for snapshot commands" - }, - { "snapshot create <snapname> <volname> [no-timestamp] " - "[description <description>] [force]", - cli_cmd_snapshot_cbk, - "Snapshot Create." - }, - { "snapshot clone <clonename> <snapname>", - cli_cmd_snapshot_cbk, - "Snapshot Clone." - }, - { "snapshot restore <snapname>", - cli_cmd_snapshot_cbk, - "Snapshot Restore." - }, - { "snapshot status [(snapname | volume <volname>)]", - cli_cmd_snapshot_cbk, - "Snapshot Status." - }, - { "snapshot info [(snapname | volume <volname>)]", - cli_cmd_snapshot_cbk, - "Snapshot Info." - }, - { "snapshot list [volname]", - cli_cmd_snapshot_cbk, - "Snapshot List." - }, - {"snapshot config [volname] ([snap-max-hard-limit <count>] " - "[snap-max-soft-limit <percent>]) " - "| ([auto-delete <enable|disable>])" - "| ([activate-on-create <enable|disable>])", - cli_cmd_snapshot_cbk, - "Snapshot Config." - }, - {"snapshot delete (all | snapname | volume <volname>)", - cli_cmd_snapshot_cbk, - "Snapshot Delete." - }, - {"snapshot activate <snapname> [force]", - cli_cmd_snapshot_cbk, - "Activate snapshot volume." - }, - {"snapshot deactivate <snapname>", - cli_cmd_snapshot_cbk, - "Deactivate snapshot volume." - }, - { NULL, NULL, NULL } -}; + {"snapshot help", cli_cmd_snapshot_help_cbk, + "display help for snapshot commands"}, + {"snapshot create <snapname> <volname> [no-timestamp] " + "[description <description>] [force]", + cli_cmd_snapshot_cbk, "Snapshot Create."}, + {"snapshot clone <clonename> <snapname>", cli_cmd_snapshot_cbk, + "Snapshot Clone."}, + {"snapshot restore <snapname>", cli_cmd_snapshot_cbk, "Snapshot Restore."}, + {"snapshot status [(snapname | volume <volname>)]", cli_cmd_snapshot_cbk, + "Snapshot Status."}, + {"snapshot info [(snapname | volume <volname>)]", cli_cmd_snapshot_cbk, + "Snapshot Info."}, + {"snapshot list [volname]", cli_cmd_snapshot_cbk, "Snapshot List."}, + {"snapshot config [volname] ([snap-max-hard-limit <count>] " + "[snap-max-soft-limit <percent>]) " + "| ([auto-delete <enable|disable>])" + "| ([activate-on-create <enable|disable>])", + cli_cmd_snapshot_cbk, "Snapshot Config."}, + {"snapshot delete (all | snapname | volume <volname>)", + cli_cmd_snapshot_cbk, "Snapshot Delete."}, + {"snapshot activate <snapname> [force]", cli_cmd_snapshot_cbk, + "Activate snapshot volume."}, + {"snapshot deactivate <snapname>", cli_cmd_snapshot_cbk, + "Deactivate snapshot volume."}, + {NULL, NULL, NULL}}; int -cli_cmd_snapshot_help_cbk (struct cli_state *state, - struct cli_cmd_word *in_word, - const char **words, - int wordcount) +cli_cmd_snapshot_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount) { - struct cli_cmd *cmd = NULL; - struct cli_cmd *snap_cmd = NULL; - int count = 0; + struct cli_cmd *cmd = NULL; + struct cli_cmd *snap_cmd = NULL; + int count = 0; - cmd = GF_MALLOC (sizeof (snapshot_cmds), cli_mt_cli_cmd); - memcpy (cmd, snapshot_cmds, sizeof (snapshot_cmds)); - count = (sizeof (snapshot_cmds) / sizeof (struct cli_cmd)); - cli_cmd_sort (cmd, count); + cmd = GF_MALLOC(sizeof(snapshot_cmds), cli_mt_cli_cmd); + memcpy(cmd, snapshot_cmds, sizeof(snapshot_cmds)); + count = (sizeof(snapshot_cmds) / sizeof(struct cli_cmd)); + cli_cmd_sort(cmd, count); - cli_out ("\ngluster snapshot commands"); - cli_out ("=========================\n"); + cli_out("\ngluster snapshot commands"); + cli_out("=========================\n"); - for (snap_cmd = cmd; snap_cmd->pattern; snap_cmd++) - if (_gf_false == snap_cmd->disable) - cli_out ("%s - %s", snap_cmd->pattern, snap_cmd->desc); - cli_out ("\n"); + for (snap_cmd = cmd; snap_cmd->pattern; snap_cmd++) + if (_gf_false == snap_cmd->disable) + cli_out("%s - %s", snap_cmd->pattern, snap_cmd->desc); + cli_out("\n"); - GF_FREE (cmd); - return 0; + GF_FREE(cmd); + return 0; } int -cli_cmd_snapshot_register (struct cli_state *state) +cli_cmd_snapshot_register(struct cli_state *state) { - int ret = 0; - struct cli_cmd *cmd = NULL; - - for (cmd = snapshot_cmds; cmd->pattern; cmd++) { - - ret = cli_cmd_register (&state->tree, cmd); - if (ret) - goto out; - } + int ret = 0; + struct cli_cmd *cmd = NULL; + + for (cmd = snapshot_cmds; cmd->pattern; cmd++) { + ret = cli_cmd_register(&state->tree, cmd); + if (ret) + goto out; + } out: - return ret; + return ret; } diff --git a/cli/src/cli-cmd-system.c b/cli/src/cli-cmd-system.c index 995e1b1ad5c..96b229582fb 100644 --- a/cli/src/cli-cmd-system.c +++ b/cli/src/cli-cmd-system.c @@ -18,604 +18,587 @@ #include "cli-mem-types.h" #include "protocol-common.h" - extern struct rpc_clnt *global_rpc; extern rpc_clnt_prog_t *cli_rpc_prog; -int cli_cmd_system_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount); +int +cli_cmd_system_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount); -int cli_cmd_copy_file_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount); +int +cli_cmd_copy_file_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount); -int cli_cmd_sys_exec_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount); +int +cli_cmd_sys_exec_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount); int -cli_cmd_getspec_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_getspec_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *dict = NULL; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *dict = NULL; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - if (wordcount != 3) { - cli_usage_out (word->pattern); - goto out; - } + if (wordcount != 3) { + cli_usage_out(word->pattern); + goto out; + } - ret = dict_set_str (dict, "volid", (char *)words[2]); - if (ret) - goto out; + ret = dict_set_str(dict, "volid", (char *)words[2]); + if (ret) + goto out; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GETSPEC]; - if (proc->fn) { - ret = proc->fn (frame, THIS, dict); - } + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GETSPEC]; + if (proc->fn) { + ret = proc->fn(frame, THIS, dict); + } out: - if (!proc && ret) { - if (dict) - dict_unref (dict); - if (wordcount > 1) - cli_out ("Fetching spec for volume %s failed", - (char *)words[2]); - } + if (!proc && ret) { + if (dict) + dict_unref(dict); + if (wordcount > 1) + cli_out("Fetching spec for volume %s failed", (char *)words[2]); + } - return ret; + return ret; } int -cli_cmd_pmap_b2p_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_pmap_b2p_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *dict = NULL; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *dict = NULL; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - if (wordcount != 4) { - cli_usage_out (word->pattern); - goto out; - } + if (wordcount != 4) { + cli_usage_out(word->pattern); + goto out; + } - ret = dict_set_str (dict, "brick", (char *)words[3]); - if (ret) - goto out; + ret = dict_set_str(dict, "brick", (char *)words[3]); + if (ret) + goto out; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_PMAP_PORTBYBRICK]; - if (proc->fn) { - ret = proc->fn (frame, THIS, dict); - } + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_PMAP_PORTBYBRICK]; + if (proc->fn) { + ret = proc->fn(frame, THIS, dict); + } out: - if (!proc && ret) { - if (dict) - dict_unref (dict); - if (wordcount > 1) - cli_out ("Fetching spec for volume %s failed", - (char *)words[3]); - } + if (!proc && ret) { + if (dict) + dict_unref(dict); + if (wordcount > 1) + cli_out("Fetching spec for volume %s failed", (char *)words[3]); + } - return ret; + return ret; } int -cli_cmd_fsm_log_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_fsm_log_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - char *name = ""; - - if ((wordcount != 4) && (wordcount != 3)) { - cli_usage_out (word->pattern); - goto out; - } - - if (wordcount == 4) - name = (char*)words[3]; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_FSM_LOG]; - if (proc && proc->fn) { - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; - ret = proc->fn (frame, THIS, (void*)name); - } + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + char *name = ""; + + if ((wordcount != 4) && (wordcount != 3)) { + cli_usage_out(word->pattern); + goto out; + } + + if (wordcount == 4) + name = (char *)words[3]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_FSM_LOG]; + if (proc && proc->fn) { + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + ret = proc->fn(frame, THIS, (void *)name); + } out: - return ret; + return ret; } int -cli_cmd_getwd_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_getwd_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - - if (wordcount != 2) { - cli_usage_out (word->pattern); - goto out; - } - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GETWD]; - if (proc && proc->fn) { - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; - ret = proc->fn (frame, THIS, NULL); - } + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + + if (wordcount != 2) { + cli_usage_out(word->pattern); + goto out; + } + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GETWD]; + if (proc && proc->fn) { + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + ret = proc->fn(frame, THIS, NULL); + } out: - return ret; + return ret; } static dict_t * -make_seq_dict (int argc, char **argv) +make_seq_dict(int argc, char **argv) { - char index[] = "4294967296"; // 1<<32 - int i = 0; - int ret = 0; - dict_t *dict = dict_new (); - - if (!dict) - return NULL; - - for (i = 0; i < argc; i++) { - snprintf(index, sizeof(index), "%d", i); - ret = dict_set_str (dict, index, argv[i]); - if (ret == -1) - break; - } - - if (ret) { - dict_unref (dict); - dict = NULL; - } - - return dict; + char index[] = "4294967296"; // 1<<32 + int i = 0; + int ret = 0; + dict_t *dict = dict_new(); + + if (!dict) + return NULL; + + for (i = 0; i < argc; i++) { + snprintf(index, sizeof(index), "%d", i); + ret = dict_set_str(dict, index, argv[i]); + if (ret == -1) + break; + } + + if (ret) { + dict_unref(dict); + dict = NULL; + } + + return dict; } int -cli_cmd_mount_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_mount_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - int ret = -1; - dict_t *dict = NULL; - void *dataa[] = {NULL, NULL}; - - if (wordcount < 4) { - cli_usage_out (word->pattern); - goto out; - } - - dict = make_seq_dict (wordcount - 3, (char **)words + 3); - if (!dict) - goto out; - - dataa[0] = (void *)words[2]; - dataa[1] = dict; - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_MOUNT]; - if (proc && proc->fn) { - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; - ret = proc->fn (frame, THIS, dataa); - } + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + int ret = -1; + dict_t *dict = NULL; + void *dataa[] = {NULL, NULL}; + + if (wordcount < 4) { + cli_usage_out(word->pattern); + goto out; + } + + dict = make_seq_dict(wordcount - 3, (char **)words + 3); + if (!dict) + goto out; + + dataa[0] = (void *)words[2]; + dataa[1] = dict; + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_MOUNT]; + if (proc && proc->fn) { + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + ret = proc->fn(frame, THIS, dataa); + } - out: - if (dict) - dict_unref (dict); +out: + if (dict) + dict_unref(dict); - if (!proc && ret) - cli_out ("Mount command failed"); + if (!proc && ret) + cli_out("Mount command failed"); - return ret; + return ret; } int -cli_cmd_umount_cbk (struct cli_state *state, struct cli_cmd_word *word, +cli_cmd_umount_cbk(struct cli_state *state, struct cli_cmd_word *word, const char **words, int wordcount) { - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - int ret = -1; - dict_t *dict = NULL; - - if (!(wordcount == 3 || - (wordcount == 4 && strcmp (words[3], "lazy") == 0))) { - cli_usage_out (word->pattern); - goto out; - } - - dict = dict_new (); - if (!dict) - goto out; - - ret = dict_set_str (dict, "path", (char *)words[2]); - if (ret != 0) - goto out; - ret = dict_set_int32 (dict, "lazy", wordcount == 4); - if (ret != 0) - goto out; - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_UMOUNT]; - if (proc && proc->fn) { - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; - ret = proc->fn (frame, THIS, dict); - } + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + int ret = -1; + dict_t *dict = NULL; + + if (!(wordcount == 3 || + (wordcount == 4 && strcmp(words[3], "lazy") == 0))) { + cli_usage_out(word->pattern); + goto out; + } + + dict = dict_new(); + if (!dict) + goto out; + + ret = dict_set_str(dict, "path", (char *)words[2]); + if (ret != 0) + goto out; + ret = dict_set_int32(dict, "lazy", wordcount == 4); + if (ret != 0) + goto out; + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_UMOUNT]; + if (proc && proc->fn) { + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + ret = proc->fn(frame, THIS, dict); + } - out: - if (dict) - dict_unref (dict); +out: + if (dict) + dict_unref(dict); - if (!proc && ret) - cli_out ("Umount command failed"); + if (!proc && ret) + cli_out("Umount command failed"); - return ret; + return ret; } int -cli_cmd_uuid_get_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_uuid_get_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - int sent = 0; - int parse_error = 0; - dict_t *dict = NULL; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - cli_local_t *local = NULL; - xlator_t *this = NULL; - - this = THIS; - if (wordcount != 3) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_UUID_GET]; - frame = create_frame (this, this->ctx->pool); - if (!frame) - goto out; - - dict = dict_new (); - if (!dict) - goto out; - - CLI_LOCAL_INIT (local, words, frame, dict); - if (proc->fn) - ret = proc->fn (frame, this, dict); + int ret = -1; + int sent = 0; + int parse_error = 0; + dict_t *dict = NULL; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + cli_local_t *local = NULL; + xlator_t *this = NULL; + + this = THIS; + if (wordcount != 3) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_UUID_GET]; + frame = create_frame(this, this->ctx->pool); + if (!frame) + goto out; + + dict = dict_new(); + if (!dict) + goto out; + + CLI_LOCAL_INIT(local, words, frame, dict); + if (proc->fn) + ret = proc->fn(frame, this, dict); out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("uuid get failed"); - } - - CLI_STACK_DESTROY (frame); - return ret; + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("uuid get failed"); + } + + CLI_STACK_DESTROY(frame); + return ret; } int -cli_cmd_uuid_reset_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_uuid_reset_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - int sent = 0; - int parse_error = 0; - gf_answer_t answer = GF_ANSWER_NO; - char *question = NULL; - cli_local_t *local = NULL; - dict_t *dict = NULL; - xlator_t *this = NULL; - - question = "Resetting uuid changes the uuid of local glusterd. " - "Do you want to continue?"; - - if (wordcount != 3) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_UUID_RESET]; - - this = THIS; - frame = create_frame (this, this->ctx->pool); - if (!frame) - goto out; - - dict = dict_new (); - if (!dict) { - ret = -1; - goto out; - } - CLI_LOCAL_INIT (local, words, frame, dict); - answer = cli_cmd_get_confirmation (state, question); - - if (GF_ANSWER_NO == answer) { - ret = 0; - goto out; - } - - //send NULL as argument since no dictionary is sent to glusterd - if (proc->fn) { - ret = proc->fn (frame, this, dict); - } + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + int sent = 0; + int parse_error = 0; + gf_answer_t answer = GF_ANSWER_NO; + char *question = NULL; + cli_local_t *local = NULL; + dict_t *dict = NULL; + xlator_t *this = NULL; + + question = + "Resetting uuid changes the uuid of local glusterd. " + "Do you want to continue?"; + + if (wordcount != 3) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_UUID_RESET]; + + this = THIS; + frame = create_frame(this, this->ctx->pool); + if (!frame) + goto out; + + dict = dict_new(); + if (!dict) { + ret = -1; + goto out; + } + CLI_LOCAL_INIT(local, words, frame, dict); + answer = cli_cmd_get_confirmation(state, question); + + if (GF_ANSWER_NO == answer) { + ret = 0; + goto out; + } + + // send NULL as argument since no dictionary is sent to glusterd + if (proc->fn) { + ret = proc->fn(frame, this, dict); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("uuid reset failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("uuid reset failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } struct cli_cmd cli_system_cmds[] = { - { "system:: getspec <VOLNAME>", - cli_cmd_getspec_cbk, - "fetch the volume file for the volume <VOLNAME>"}, + {"system:: getspec <VOLNAME>", cli_cmd_getspec_cbk, + "fetch the volume file for the volume <VOLNAME>"}, - { "system:: portmap brick2port <BRICK>", - cli_cmd_pmap_b2p_cbk, - "query which port <BRICK> listens on"}, + {"system:: portmap brick2port <BRICK>", cli_cmd_pmap_b2p_cbk, + "query which port <BRICK> listens on"}, - { "system:: fsm log [<peer-name>]", - cli_cmd_fsm_log_cbk, - "display fsm transitions"}, + {"system:: fsm log [<peer-name>]", cli_cmd_fsm_log_cbk, + "display fsm transitions"}, - { "system:: getwd", - cli_cmd_getwd_cbk, - "query glusterd work directory"}, + {"system:: getwd", cli_cmd_getwd_cbk, "query glusterd work directory"}, - { "system:: mount <label> <args...>", - cli_cmd_mount_cbk, - "request a mount"}, + {"system:: mount <label> <args...>", cli_cmd_mount_cbk, "request a mount"}, - { "system:: umount <path> [lazy]", - cli_cmd_umount_cbk, - "request an umount"}, + {"system:: umount <path> [lazy]", cli_cmd_umount_cbk, "request an umount"}, - { "system:: uuid get", - cli_cmd_uuid_get_cbk, - "get uuid of glusterd"}, + {"system:: uuid get", cli_cmd_uuid_get_cbk, "get uuid of glusterd"}, - { "system:: uuid reset", - cli_cmd_uuid_reset_cbk, - "reset the uuid of glusterd"}, + {"system:: uuid reset", cli_cmd_uuid_reset_cbk, + "reset the uuid of glusterd"}, - { "system:: help", - cli_cmd_system_help_cbk, - "display help for system commands"}, + {"system:: help", cli_cmd_system_help_cbk, + "display help for system commands"}, - { "system:: copy file [<filename>]", - cli_cmd_copy_file_cbk, - "Copy file from current node's $working_dir to " - "$working_dir of all cluster nodes"}, + {"system:: copy file [<filename>]", cli_cmd_copy_file_cbk, + "Copy file from current node's $working_dir to " + "$working_dir of all cluster nodes"}, - { "system:: execute <command> <args>", - cli_cmd_sys_exec_cbk, - "Execute the command on all the nodes " - "in the cluster and display their output."}, + {"system:: execute <command> <args>", cli_cmd_sys_exec_cbk, + "Execute the command on all the nodes " + "in the cluster and display their output."}, - { NULL, NULL, NULL } -}; + {NULL, NULL, NULL}}; int -cli_cmd_sys_exec_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_sys_exec_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - char cmd_arg_name[PATH_MAX] = ""; - char *command = NULL; - char *saveptr = NULL; - char *tmp = NULL; - int ret = -1; - int i = -1; - int cmd_args_count = 0; - int in_cmd_args_count = 0; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *dict = NULL; - cli_local_t *local = NULL; - - if (wordcount < 3) { - cli_usage_out (word->pattern); + char cmd_arg_name[PATH_MAX] = ""; + char *command = NULL; + char *saveptr = NULL; + char *tmp = NULL; + int ret = -1; + int i = -1; + int cmd_args_count = 0; + int in_cmd_args_count = 0; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *dict = NULL; + cli_local_t *local = NULL; + + if (wordcount < 3) { + cli_usage_out(word->pattern); + goto out; + } + + dict = dict_new(); + if (!dict) + goto out; + + command = strtok_r((char *)words[2], " ", &saveptr); + if (command == NULL) { + gf_log("cli", GF_LOG_ERROR, "Failed to parse command"); + goto out; + } + do { + tmp = strtok_r(NULL, " ", &saveptr); + if (tmp) { + in_cmd_args_count++; + snprintf(cmd_arg_name, sizeof(cmd_arg_name), "cmd_arg_%d", + in_cmd_args_count); + ret = dict_set_str(dict, cmd_arg_name, tmp); + if (ret) { + gf_log("", GF_LOG_ERROR, + "Unable to set " + "%s in dict", + cmd_arg_name); goto out; + } } + } while (tmp); - dict = dict_new (); - if (!dict) - goto out; + cmd_args_count = wordcount - 3; - command = strtok_r ((char *)words[2], " ", &saveptr); - if (command == NULL) { - gf_log("cli", GF_LOG_ERROR, "Failed to parse command"); - goto out; - } - do { - tmp = strtok_r (NULL, " ", &saveptr); - if (tmp) { - in_cmd_args_count++; - snprintf (cmd_arg_name, sizeof(cmd_arg_name), - "cmd_arg_%d", in_cmd_args_count); - ret = dict_set_str (dict, cmd_arg_name, tmp); - if (ret) { - gf_log ("", GF_LOG_ERROR, "Unable to set " - "%s in dict", cmd_arg_name); - goto out; - } - } - } while (tmp); - - cmd_args_count = wordcount - 3; - - ret = dict_set_str (dict, "command", command); - if (ret) { - gf_log ("", GF_LOG_ERROR, "Unable to set command in dict"); - goto out; - } + ret = dict_set_str(dict, "command", command); + if (ret) { + gf_log("", GF_LOG_ERROR, "Unable to set command in dict"); + goto out; + } - for (i=1; i <= cmd_args_count; i++) { - in_cmd_args_count++; - snprintf (cmd_arg_name, sizeof(cmd_arg_name), - "cmd_arg_%d", in_cmd_args_count); - ret = dict_set_str (dict, cmd_arg_name, - (char *)words[2+i]); - if (ret) { - gf_log ("", GF_LOG_ERROR, "Unable to set %s in dict", - cmd_arg_name); - goto out; - } - } - - ret = dict_set_int32 (dict, "cmd_args_count", in_cmd_args_count); + for (i = 1; i <= cmd_args_count; i++) { + in_cmd_args_count++; + snprintf(cmd_arg_name, sizeof(cmd_arg_name), "cmd_arg_%d", + in_cmd_args_count); + ret = dict_set_str(dict, cmd_arg_name, (char *)words[2 + i]); if (ret) { - gf_log ("", GF_LOG_ERROR, - "Unable to set cmd_args_count in dict"); - goto out; - } - - ret = dict_set_str (dict, "volname", "N/A"); - if (ret) { - gf_log ("", GF_LOG_ERROR, "Unable to set volname in dict"); - goto out; - } - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_SYS_EXEC]; - if (proc->fn) { - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; - CLI_LOCAL_INIT (local, words, frame, dict); - ret = proc->fn (frame, THIS, (void*)dict); - - /* proc->fn is processed synchronously, which means that the - * execution flow won't return here until the operation is - * fully processed, including any related callback. For this - * reason, it's safe to destroy the stack here, since no one - * can still be using it. Additionally, it's not easy to move - * the stack destroy to the callback executed after completion - * of the operation because there are multiple things than can - * fail even before having queued the callback, so we would - * still need to destroy the stack if proc->fn returns an - * error. */ - CLI_STACK_DESTROY(frame); - dict = NULL; - } + gf_log("", GF_LOG_ERROR, "Unable to set %s in dict", cmd_arg_name); + goto out; + } + } + + ret = dict_set_int32(dict, "cmd_args_count", in_cmd_args_count); + if (ret) { + gf_log("", GF_LOG_ERROR, "Unable to set cmd_args_count in dict"); + goto out; + } + + ret = dict_set_str(dict, "volname", "N/A"); + if (ret) { + gf_log("", GF_LOG_ERROR, "Unable to set volname in dict"); + goto out; + } + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_SYS_EXEC]; + if (proc->fn) { + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + CLI_LOCAL_INIT(local, words, frame, dict); + ret = proc->fn(frame, THIS, (void *)dict); + + /* proc->fn is processed synchronously, which means that the + * execution flow won't return here until the operation is + * fully processed, including any related callback. For this + * reason, it's safe to destroy the stack here, since no one + * can still be using it. Additionally, it's not easy to move + * the stack destroy to the callback executed after completion + * of the operation because there are multiple things than can + * fail even before having queued the callback, so we would + * still need to destroy the stack if proc->fn returns an + * error. */ + CLI_STACK_DESTROY(frame); + dict = NULL; + } out: - if (dict != NULL) { - dict_unref(dict); - } + if (dict != NULL) { + dict_unref(dict); + } - return ret; + return ret; } int -cli_cmd_copy_file_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_copy_file_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - char *filename = ""; - dict_t *dict = NULL; - cli_local_t *local = NULL; - - if (wordcount != 4) { - cli_usage_out (word->pattern); - goto out; - } - - dict = dict_new (); - if (!dict) - goto out; - - filename = (char*)words[3]; - ret = dict_set_str (dict, "source", filename); - if (ret) - gf_log ("", GF_LOG_ERROR, "Unable to set filename in dict"); - - ret = dict_set_str (dict, "volname", "N/A"); - if (ret) - gf_log ("", GF_LOG_ERROR, "Unable to set volname in dict"); - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_COPY_FILE]; - if (proc && proc->fn) { - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; - CLI_LOCAL_INIT (local, words, frame, dict); - ret = proc->fn (frame, THIS, (void*)dict); - } + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + char *filename = ""; + dict_t *dict = NULL; + cli_local_t *local = NULL; + + if (wordcount != 4) { + cli_usage_out(word->pattern); + goto out; + } + + dict = dict_new(); + if (!dict) + goto out; + + filename = (char *)words[3]; + ret = dict_set_str(dict, "source", filename); + if (ret) + gf_log("", GF_LOG_ERROR, "Unable to set filename in dict"); + + ret = dict_set_str(dict, "volname", "N/A"); + if (ret) + gf_log("", GF_LOG_ERROR, "Unable to set volname in dict"); + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_COPY_FILE]; + if (proc && proc->fn) { + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + CLI_LOCAL_INIT(local, words, frame, dict); + ret = proc->fn(frame, THIS, (void *)dict); + } out: - return ret; + return ret; } int -cli_cmd_system_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount) +cli_cmd_system_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount) { - struct cli_cmd *cmd = NULL; - struct cli_cmd *system_cmd = NULL; - int count = 0; + struct cli_cmd *cmd = NULL; + struct cli_cmd *system_cmd = NULL; + int count = 0; - cmd = GF_MALLOC (sizeof (cli_system_cmds), cli_mt_cli_cmd); - memcpy (cmd, cli_system_cmds, sizeof (cli_system_cmds)); - count = (sizeof (cli_system_cmds) / sizeof (struct cli_cmd)); - cli_cmd_sort (cmd, count); + cmd = GF_MALLOC(sizeof(cli_system_cmds), cli_mt_cli_cmd); + memcpy(cmd, cli_system_cmds, sizeof(cli_system_cmds)); + count = (sizeof(cli_system_cmds) / sizeof(struct cli_cmd)); + cli_cmd_sort(cmd, count); - for (system_cmd = cmd; system_cmd->pattern; system_cmd++) - cli_out ("%s - %s", system_cmd->pattern, system_cmd->desc); + for (system_cmd = cmd; system_cmd->pattern; system_cmd++) + cli_out("%s - %s", system_cmd->pattern, system_cmd->desc); - GF_FREE (cmd); - return 0; + GF_FREE(cmd); + return 0; } int -cli_cmd_system_register (struct cli_state *state) +cli_cmd_system_register(struct cli_state *state) { - int ret = 0; - struct cli_cmd *cmd = NULL; - - for (cmd = cli_system_cmds; cmd->pattern; cmd++) { + int ret = 0; + struct cli_cmd *cmd = NULL; - ret = cli_cmd_register (&state->tree, cmd); - if (ret) - goto out; - } + for (cmd = cli_system_cmds; cmd->pattern; cmd++) { + ret = cli_cmd_register(&state->tree, cmd); + if (ret) + goto out; + } out: - return ret; + return ret; } diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index 3d075a326bf..ab17729d182 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -35,1433 +35,1431 @@ extern rpc_clnt_prog_t *cli_rpc_prog; extern rpc_clnt_prog_t cli_quotad_clnt; int -cli_cmd_volume_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount); - -int -cli_cmd_bitrot_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount); +cli_cmd_volume_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount); int -cli_cmd_quota_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, +cli_cmd_bitrot_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, const char **words, int wordcount); int -cli_cmd_tier_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, +cli_cmd_quota_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, const char **words, int wordcount); int -cli_cmd_volume_info_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) -{ - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - cli_cmd_volume_get_ctx_t ctx = {0,}; - cli_local_t *local = NULL; - int sent = 0; - int parse_error = 0; - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GET_VOLUME]; +cli_cmd_tier_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount); - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; +int +cli_cmd_volume_info_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) +{ + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + cli_cmd_volume_get_ctx_t ctx = { + 0, + }; + cli_local_t *local = NULL; + int sent = 0; + int parse_error = 0; + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GET_VOLUME]; + + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - if ((wordcount == 2) || (wordcount == 3 && - !strcmp (words[2], "all"))) { - ctx.flags = GF_CLI_GET_NEXT_VOLUME; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GET_NEXT_VOLUME]; - } else if (wordcount == 3) { - ctx.flags = GF_CLI_GET_VOLUME; - ctx.volname = (char *)words[2]; - if (strlen (ctx.volname) > GD_VOLUME_NAME_MAX) { - cli_out ("Invalid volume name"); - goto out; - } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GET_VOLUME]; - } else { - cli_usage_out (word->pattern); - parse_error = 1; - return -1; + if ((wordcount == 2) || (wordcount == 3 && !strcmp(words[2], "all"))) { + ctx.flags = GF_CLI_GET_NEXT_VOLUME; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GET_NEXT_VOLUME]; + } else if (wordcount == 3) { + ctx.flags = GF_CLI_GET_VOLUME; + ctx.volname = (char *)words[2]; + if (strlen(ctx.volname) > GD_VOLUME_NAME_MAX) { + cli_out("Invalid volume name"); + goto out; } + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GET_VOLUME]; + } else { + cli_usage_out(word->pattern); + parse_error = 1; + return -1; + } - local = cli_local_get (); + local = cli_local_get(); - if (!local) - goto out; + if (!local) + goto out; - local->get_vol.flags = ctx.flags; - if (ctx.volname) - local->get_vol.volname = gf_strdup (ctx.volname); + local->get_vol.flags = ctx.flags; + if (ctx.volname) + local->get_vol.volname = gf_strdup(ctx.volname); - frame->local = local; + frame->local = local; - if (proc->fn) { - ret = proc->fn (frame, THIS, &ctx); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, &ctx); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Getting Volume information failed!"); - } - - CLI_STACK_DESTROY (frame); + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Getting Volume information failed!"); + } - return ret; + CLI_STACK_DESTROY(frame); + return ret; } int -cli_cmd_sync_volume_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_sync_volume_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - int sent = 0; - int parse_error = 0; - dict_t *dict = NULL; - cli_local_t *local = NULL; - gf_answer_t answer = GF_ANSWER_NO; - const char *question = "Sync volume may make data " - "inaccessible while the sync " - "is in progress. Do you want " - "to continue?"; - - if ((wordcount < 3) || (wordcount > 4)) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + int sent = 0; + int parse_error = 0; + dict_t *dict = NULL; + cli_local_t *local = NULL; + gf_answer_t answer = GF_ANSWER_NO; + const char *question = + "Sync volume may make data " + "inaccessible while the sync " + "is in progress. Do you want " + "to continue?"; + + if ((wordcount < 3) || (wordcount > 4)) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - if ((wordcount == 3) || !strcmp(words[3], "all")) { - ret = dict_set_int32 (dict, "flags", (int32_t) - GF_CLI_SYNC_ALL); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "failed to set" - "flag"); - goto out; - } - } else { - ret = dict_set_str (dict, "volname", (char *) words[3]); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "failed to set " - "volume"); - goto out; - } + if ((wordcount == 3) || !strcmp(words[3], "all")) { + ret = dict_set_int32(dict, "flags", (int32_t)GF_CLI_SYNC_ALL); + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, + "failed to set" + "flag"); + goto out; } - - ret = dict_set_str (dict, "hostname", (char *) words[2]); + } else { + ret = dict_set_str(dict, "volname", (char *)words[3]); if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "failed to set hostname"); - goto out; + gf_log(THIS->name, GF_LOG_ERROR, + "failed to set " + "volume"); + goto out; } + } - if (!(state->mode & GLUSTER_MODE_SCRIPT)) { - answer = cli_cmd_get_confirmation (state, question); - if (GF_ANSWER_NO == answer) { - ret = 0; - goto out; - } + ret = dict_set_str(dict, "hostname", (char *)words[2]); + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, "failed to set hostname"); + goto out; + } + + if (!(state->mode & GLUSTER_MODE_SCRIPT)) { + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + ret = 0; + goto out; } + } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_SYNC_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_SYNC_VOLUME]; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - CLI_LOCAL_INIT (local, words, frame, dict); + CLI_LOCAL_INIT(local, words, frame, dict); - if (proc->fn) { - ret = proc->fn (frame, THIS, dict); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, dict); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume sync failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume sync failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } int -cli_cmd_volume_create_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_create_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - int sent = 0; - int parse_error = 0; - cli_local_t *local = NULL; - char *trans_type = NULL; - char *bricks = NULL; - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_CREATE_VOLUME]; - - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *options = NULL; + int sent = 0; + int parse_error = 0; + cli_local_t *local = NULL; + char *trans_type = NULL; + char *bricks = NULL; + + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_CREATE_VOLUME]; + + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - ret = cli_cmd_volume_create_parse (state, words, wordcount, &options, - &bricks); + ret = cli_cmd_volume_create_parse(state, words, wordcount, &options, + &bricks); - if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + if (ret) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - ret = dict_get_str (options, "transport", &trans_type); - if (ret) { - gf_log("cli", GF_LOG_ERROR, "Unable to get transport type"); - goto out; - } + ret = dict_get_str(options, "transport", &trans_type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get transport type"); + goto out; + } - if (state->mode & GLUSTER_MODE_WIGNORE) { - ret = dict_set_int32 (options, "force", _gf_true); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set force " - "option"); - goto out; - } + if (state->mode & GLUSTER_MODE_WIGNORE) { + ret = dict_set_int32(options, "force", _gf_true); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to set force " + "option"); + goto out; } + } - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume create failed"); - } - - if (ret == 0) { - gf_event (EVENT_VOLUME_CREATE, "name=%s;bricks=%s", - (char *)words[2], bricks); - } - - CLI_STACK_DESTROY (frame); - return ret; + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume create failed"); + } + + if (ret == 0) { + gf_event(EVENT_VOLUME_CREATE, "name=%s;bricks=%s", (char *)words[2], + bricks); + } + + CLI_STACK_DESTROY(frame); + return ret; } - int -cli_cmd_volume_delete_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_delete_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - char *volname = NULL; - gf_answer_t answer = GF_ANSWER_NO; - const char *question = NULL; - 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?"; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_DELETE_VOLUME]; - - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; - - dict = dict_new (); - if (!dict) - goto out; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + char *volname = NULL; + gf_answer_t answer = GF_ANSWER_NO; + const char *question = NULL; + 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?"; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_DELETE_VOLUME]; + + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - if (wordcount != 3) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + dict = dict_new(); + if (!dict) + goto out; - volname = (char *)words[2]; + if (wordcount != 3) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - ret = dict_set_str (dict, "volname", volname); - if (ret) { - gf_log (THIS->name, GF_LOG_WARNING, "dict set failed"); - goto out; - } + volname = (char *)words[2]; - if (!strcmp (volname, GLUSTER_SHARED_STORAGE)) { - question = "Deleting the shared storage volume" - "(gluster_shared_storage), will affect features " - "like snapshot scheduler, geo-replication " - "and NFS-Ganesha. Do you still want to " - "continue?"; - } + ret = dict_set_str(dict, "volname", volname); + if (ret) { + gf_log(THIS->name, GF_LOG_WARNING, "dict set failed"); + goto out; + } + + if (!strcmp(volname, GLUSTER_SHARED_STORAGE)) { + question = + "Deleting the shared storage volume" + "(gluster_shared_storage), will affect features " + "like snapshot scheduler, geo-replication " + "and NFS-Ganesha. Do you still want to " + "continue?"; + } + + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + ret = 0; + goto out; + } - answer = cli_cmd_get_confirmation (state, question); - if (GF_ANSWER_NO == answer) { - ret = 0; - goto out; - } + CLI_LOCAL_INIT(local, words, frame, dict); - CLI_LOCAL_INIT (local, words, frame, dict); - - if (proc->fn) { - ret = proc->fn (frame, THIS, dict); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, dict); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume delete failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume delete failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - if (ret == 0 && GF_ANSWER_YES == answer) { - gf_event (EVENT_VOLUME_DELETE, "name=%s", (char *)words[2]); - } + if (ret == 0 && GF_ANSWER_YES == answer) { + gf_event(EVENT_VOLUME_DELETE, "name=%s", (char *)words[2]); + } - return ret; + return ret; } int -cli_cmd_volume_start_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_start_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - int sent = 0; - 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) - goto out; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + int sent = 0; + 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) + goto out; - if (wordcount < 3 || wordcount > 4) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + if (wordcount < 3 || wordcount > 4) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - dict = dict_new (); - if (!dict) { - goto out; - } + dict = dict_new(); + if (!dict) { + goto out; + } - if (!words[2]) - goto out; + if (!words[2]) + goto out; - ret = dict_set_str (dict, "volname", (char *)words[2]); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "dict set failed"); - goto out; - } + ret = dict_set_str(dict, "volname", (char *)words[2]); + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, "dict set failed"); + goto out; + } - if (wordcount == 4) { - if (!strcmp("force", words[3])) { - flags |= GF_CLI_FLAG_OP_FORCE; - } else { - ret = -1; - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } - } - ret = dict_set_int32 (dict, "flags", flags); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, - "dict set failed"); - goto out; - } + if (wordcount == 4) { + if (!strcmp("force", words[3])) { + flags |= GF_CLI_FLAG_OP_FORCE; + } else { + ret = -1; + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } + } + ret = dict_set_int32(dict, "flags", flags); + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, "dict set failed"); + goto out; + } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_START_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_START_VOLUME]; - CLI_LOCAL_INIT (local, words, frame, dict); + CLI_LOCAL_INIT(local, words, frame, dict); - if (proc->fn) { - ret = proc->fn (frame, THIS, dict); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, dict); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume start failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume start failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - if (ret == 0) { - gf_event (EVENT_VOLUME_START, "name=%s;force=%d", - (char *)words[2], (flags & GF_CLI_FLAG_OP_FORCE)); - } + if (ret == 0) { + gf_event(EVENT_VOLUME_START, "name=%s;force=%d", (char *)words[2], + (flags & GF_CLI_FLAG_OP_FORCE)); + } - return ret; + return ret; } gf_answer_t -cli_cmd_get_confirmation (struct cli_state *state, const char *question) +cli_cmd_get_confirmation(struct cli_state *state, const char *question) { - char answer[5] = {'\0', }; - int flush = '\0'; - size_t len; + char answer[5] = { + '\0', + }; + int flush = '\0'; + size_t len; - if (state->mode & GLUSTER_MODE_SCRIPT) - return GF_ANSWER_YES; + if (state->mode & GLUSTER_MODE_SCRIPT) + return GF_ANSWER_YES; - printf ("%s (y/n) ", question); + printf("%s (y/n) ", question); - if (fgets (answer, 4, stdin) == NULL) { - cli_out("gluster cli read error"); - goto out; - } + if (fgets(answer, 4, stdin) == NULL) { + cli_out("gluster cli read error"); + goto out; + } - len = strlen (answer); + len = strlen(answer); - if (len && answer [len - 1] == '\n'){ - answer [--len] = '\0'; - } else { - do{ - flush = getchar (); - }while (flush != '\n'); - } + if (len && answer[len - 1] == '\n') { + answer[--len] = '\0'; + } else { + do { + flush = getchar(); + } while (flush != '\n'); + } - if (len > 3) - goto out; + if (len > 3) + goto out; - if (!strcasecmp (answer, "y") || !strcasecmp (answer, "yes")) - return GF_ANSWER_YES; + if (!strcasecmp(answer, "y") || !strcasecmp(answer, "yes")) + return GF_ANSWER_YES; - else if (!strcasecmp (answer, "n") || !strcasecmp (answer, "no")) - return GF_ANSWER_NO; + else if (!strcasecmp(answer, "n") || !strcasecmp(answer, "no")) + return GF_ANSWER_NO; out: - cli_out ("Invalid input, please enter y/n"); + cli_out("Invalid input, please enter y/n"); - return GF_ANSWER_NO; + return GF_ANSWER_NO; } int -cli_cmd_volume_stop_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_stop_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - int flags = 0; - gf_answer_t answer = GF_ANSWER_NO; - int sent = 0; - 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?"; - - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; - - if (wordcount < 3 || wordcount > 4) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } - - volname = (char*) words[2]; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + int flags = 0; + gf_answer_t answer = GF_ANSWER_NO; + int sent = 0; + 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?"; + + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - dict = dict_new (); - ret = dict_set_str (dict, "volname", volname); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "dict set failed"); - goto out; - } + if (wordcount < 3 || wordcount > 4) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - if (!strcmp (volname, GLUSTER_SHARED_STORAGE)) { - question = "Stopping the shared storage volume" - "(gluster_shared_storage), will affect features " - "like snapshot scheduler, geo-replication " - "and NFS-Ganesha. Do you still want to " - "continue?"; - } + volname = (char *)words[2]; - if (wordcount == 4) { - if (!strcmp("force", words[3])) { - flags |= GF_CLI_FLAG_OP_FORCE; - } else { - ret = -1; - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + dict = dict_new(); + ret = dict_set_str(dict, "volname", volname); + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, "dict set failed"); + goto out; + } + + if (!strcmp(volname, GLUSTER_SHARED_STORAGE)) { + question = + "Stopping the shared storage volume" + "(gluster_shared_storage), will affect features " + "like snapshot scheduler, geo-replication " + "and NFS-Ganesha. Do you still want to " + "continue?"; + } + + if (wordcount == 4) { + if (!strcmp("force", words[3])) { + flags |= GF_CLI_FLAG_OP_FORCE; + } else { + ret = -1; + cli_usage_out(word->pattern); + parse_error = 1; + goto out; } + } - ret = dict_set_int32 (dict, "flags", flags); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, - "dict set failed"); - goto out; - } + ret = dict_set_int32(dict, "flags", flags); + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, "dict set failed"); + goto out; + } - answer = cli_cmd_get_confirmation (state, question); + answer = cli_cmd_get_confirmation(state, question); - if (GF_ANSWER_NO == answer) { - ret = 0; - goto out; - } + if (GF_ANSWER_NO == answer) { + ret = 0; + goto out; + } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_STOP_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_STOP_VOLUME]; - CLI_LOCAL_INIT (local, words, frame, dict); + CLI_LOCAL_INIT(local, words, frame, dict); - if (proc->fn) { - ret = proc->fn (frame, THIS, dict); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, dict); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume stop on '%s' failed", volname); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume stop on '%s' failed", volname); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - if (ret == 0 && GF_ANSWER_YES == answer) { - gf_event (EVENT_VOLUME_STOP, "name=%s;force=%d", - (char *)words[2], (flags & GF_CLI_FLAG_OP_FORCE)); - } + if (ret == 0 && GF_ANSWER_YES == answer) { + gf_event(EVENT_VOLUME_STOP, "name=%s;force=%d", (char *)words[2], + (flags & GF_CLI_FLAG_OP_FORCE)); + } - return ret; + return ret; } - int -cli_cmd_volume_rename_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_rename_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *dict = NULL; - int sent = 0; - int parse_error = 0; - - - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *dict = NULL; + int sent = 0; + int parse_error = 0; + + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - if (wordcount != 4) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + if (wordcount != 4) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - ret = dict_set_str (dict, "old-volname", (char *)words[2]); + ret = dict_set_str(dict, "old-volname", (char *)words[2]); - if (ret) - goto out; + if (ret) + goto out; - ret = dict_set_str (dict, "new-volname", (char *)words[3]); + ret = dict_set_str(dict, "new-volname", (char *)words[3]); - if (ret) - goto out; + if (ret) + goto out; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_RENAME_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_RENAME_VOLUME]; - if (proc->fn) { - ret = proc->fn (frame, THIS, dict); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, dict); + } out: - if (dict) - dict_unref (dict); + if (dict) + dict_unref(dict); - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume rename on '%s' failed", (char *)words[2]); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume rename on '%s' failed", (char *)words[2]); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } int -cli_cmd_volume_defrag_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_defrag_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *dict = NULL; - int sent = 0; - int parse_error = 0; - cli_local_t *local = NULL; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *dict = NULL; + int sent = 0; + int parse_error = 0; + cli_local_t *local = NULL; #if (USE_EVENTS) - eventtypes_t event = EVENT_LAST; + eventtypes_t event = EVENT_LAST; #endif #ifdef GF_SOLARIS_HOST_OS - cli_out ("Command not supported on Solaris"); - goto out; + cli_out("Command not supported on Solaris"); + goto out; #endif - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - ret = cli_cmd_volume_defrag_parse (words, wordcount, &dict); + ret = cli_cmd_volume_defrag_parse(words, wordcount, &dict); - if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - } + if (ret) { + cli_usage_out(word->pattern); + parse_error = 1; + } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_DEFRAG_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_DEFRAG_VOLUME]; - CLI_LOCAL_INIT (local, words, frame, dict); + CLI_LOCAL_INIT(local, words, frame, dict); - if (proc->fn) { - ret = proc->fn (frame, THIS, dict); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, dict); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume rebalance failed"); - } else { - + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume rebalance failed"); + } else { #if (USE_EVENTS) - if (!(strcmp (words[wordcount-1], "start")) || - !(strcmp (words[wordcount-1], "force"))) { - event = EVENT_VOLUME_REBALANCE_START; - } else if (!strcmp (words[wordcount-1], "stop")) { - event = EVENT_VOLUME_REBALANCE_STOP; - } + if (!(strcmp(words[wordcount - 1], "start")) || + !(strcmp(words[wordcount - 1], "force"))) { + event = EVENT_VOLUME_REBALANCE_START; + } else if (!strcmp(words[wordcount - 1], "stop")) { + event = EVENT_VOLUME_REBALANCE_STOP; + } - if (event != EVENT_LAST) - gf_event (event, "volume=%s", (char *)words[2]); + if (event != EVENT_LAST) + gf_event(event, "volume=%s", (char *)words[2]); #endif - } + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } int -cli_cmd_volume_reset_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_reset_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int sent = 0; - int parse_error = 0; - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - cli_local_t *local = NULL; + int sent = 0; + int parse_error = 0; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *options = NULL; + cli_local_t *local = NULL; #if (USE_EVENTS) - int ret1 = -1; - char *tmp_opt = NULL; + int ret1 = -1; + char *tmp_opt = NULL; #endif - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_RESET_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_RESET_VOLUME]; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - ret = cli_cmd_volume_reset_parse (words, wordcount, &options); - if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + 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); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume reset failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume reset failed"); + } #if (USE_EVENTS) - if (ret == 0) { - ret1 = dict_get_str (options, "key", &tmp_opt); - if (ret1) - tmp_opt = ""; - - gf_event (EVENT_VOLUME_RESET, "name=%s;option=%s", - (char *)words[2], - tmp_opt); - } + if (ret == 0) { + ret1 = dict_get_str(options, "key", &tmp_opt); + if (ret1) + tmp_opt = ""; + + gf_event(EVENT_VOLUME_RESET, "name=%s;option=%s", (char *)words[2], + tmp_opt); + } #endif - CLI_STACK_DESTROY (frame); - - return ret; + CLI_STACK_DESTROY(frame); + return ret; } int -cli_cmd_volume_profile_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_profile_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int sent = 0; - int parse_error = 0; + int sent = 0; + int parse_error = 0; - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - cli_local_t *local = NULL; + int ret = -1; + 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); + ret = cli_cmd_volume_profile_parse(words, wordcount, &options); - if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + if (ret) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_PROFILE_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_PROFILE_VOLUME]; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume profile failed"); - } - - CLI_STACK_DESTROY (frame); + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume profile failed"); + } - return ret; + CLI_STACK_DESTROY(frame); + return ret; } int -cli_cmd_volume_set_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_set_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int sent = 0; - int parse_error = 0; + int sent = 0; + int parse_error = 0; - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - cli_local_t *local = NULL; - char *op_errstr = NULL; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *options = NULL; + cli_local_t *local = NULL; + char *op_errstr = NULL; #if (USE_EVENTS) - int ret1 = -1; - int i = 1; - char dict_key[50] = {0,}; - char *tmp_opt = NULL; - char *opts_str = NULL; - int num_options = 0; + int ret1 = -1; + int i = 1; + char dict_key[50] = { + 0, + }; + char *tmp_opt = NULL; + char *opts_str = NULL; + int num_options = 0; #endif - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_SET_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_SET_VOLUME]; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - ret = cli_cmd_volume_set_parse (state, words, wordcount, - &options, &op_errstr); - if (ret) { - if (op_errstr) { - cli_err ("%s", op_errstr); - GF_FREE (op_errstr); - } else - cli_usage_out (word->pattern); + ret = cli_cmd_volume_set_parse(state, words, wordcount, &options, + &op_errstr); + if (ret) { + if (op_errstr) { + cli_err("%s", op_errstr); + GF_FREE(op_errstr); + } else + cli_usage_out(word->pattern); - parse_error = 1; - goto out; - } + parse_error = 1; + goto out; + } - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume set failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume set failed"); + } #if (USE_EVENTS) - if (ret == 0 && strcmp(words[2], "help") != 0) { - ret1 = dict_get_int32 (options, "count", &num_options); - if (ret1) - num_options = 0; - else - num_options = num_options/2; + if (ret == 0 && strcmp(words[2], "help") != 0) { + ret1 = dict_get_int32(options, "count", &num_options); + if (ret1) + num_options = 0; + else + num_options = num_options / 2; - /* Initialize opts_str */ - opts_str = gf_strdup (""); + /* Initialize opts_str */ + opts_str = gf_strdup(""); - /* Prepare String in format options=KEY1,VALUE1,KEY2,VALUE2 */ - for (i = 1; i <= num_options; i++) { - sprintf (dict_key, "key%d", i); - ret1 = dict_get_str (options, dict_key, &tmp_opt); - if (ret1) - tmp_opt = ""; + /* Prepare String in format options=KEY1,VALUE1,KEY2,VALUE2 */ + for (i = 1; i <= num_options; i++) { + sprintf(dict_key, "key%d", i); + ret1 = dict_get_str(options, dict_key, &tmp_opt); + if (ret1) + tmp_opt = ""; - gf_asprintf (&opts_str, "%s,%s", opts_str, tmp_opt); + gf_asprintf(&opts_str, "%s,%s", opts_str, tmp_opt); - sprintf (dict_key, "value%d", i); - ret1 = dict_get_str (options, dict_key, &tmp_opt); - if (ret1) - tmp_opt = ""; + sprintf(dict_key, "value%d", i); + ret1 = dict_get_str(options, dict_key, &tmp_opt); + if (ret1) + tmp_opt = ""; - gf_asprintf (&opts_str, "%s,%s", opts_str, tmp_opt); - } + gf_asprintf(&opts_str, "%s,%s", opts_str, tmp_opt); + } - gf_event (EVENT_VOLUME_SET, "name=%s;options=%s", - (char *)words[2], - opts_str); + gf_event(EVENT_VOLUME_SET, "name=%s;options=%s", (char *)words[2], + opts_str); - /* Allocated by gf_strdup and gf_asprintf */ - GF_FREE (opts_str); - } + /* Allocated by gf_strdup and gf_asprintf */ + GF_FREE(opts_str); + } #endif - CLI_STACK_DESTROY (frame); - - return ret; + CLI_STACK_DESTROY(frame); + return ret; } -static -int -cli_event_remove_brick_str (dict_t *options, char **event_str, - eventtypes_t *event) +static int +cli_event_remove_brick_str(dict_t *options, char **event_str, + eventtypes_t *event) { - int ret = -1; - char *bricklist = NULL; - char *brick = NULL; - char *volname = NULL; - char key[256] = {0,}; - const char *eventstrformat = "volume=%s;bricks=%s"; - int32_t command = 0; - int32_t i = 1; - int32_t count = 0; - int32_t eventstrlen = 1; - int bricklen = 0; - char *tmp_ptr = NULL; - - if (!options || !event_str || !event) - goto out; + int ret = -1; + char *bricklist = NULL; + char *brick = NULL; + char *volname = NULL; + char key[256] = { + 0, + }; + const char *eventstrformat = "volume=%s;bricks=%s"; + int32_t command = 0; + int32_t i = 1; + int32_t count = 0; + int32_t eventstrlen = 1; + int bricklen = 0; + char *tmp_ptr = NULL; + + if (!options || !event_str || !event) + goto out; - ret = dict_get_str (options, "volname", &volname); - if (ret || !volname) { - gf_log ("cli", GF_LOG_ERROR, "Failed to fetch volname"); - ret = -1; - goto out; - } - /* Get the list of bricks for the event */ - ret = dict_get_int32 (options, "command", &command); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to fetch command"); - ret = -1; - goto out; - } + ret = dict_get_str(options, "volname", &volname); + if (ret || !volname) { + gf_log("cli", GF_LOG_ERROR, "Failed to fetch volname"); + ret = -1; + goto out; + } + /* Get the list of bricks for the event */ + ret = dict_get_int32(options, "command", &command); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to fetch command"); + ret = -1; + goto out; + } - switch (command) { + switch (command) { case GF_OP_CMD_START: - *event = EVENT_VOLUME_REMOVE_BRICK_START; - break; + *event = EVENT_VOLUME_REMOVE_BRICK_START; + break; case GF_OP_CMD_COMMIT: - *event = EVENT_VOLUME_REMOVE_BRICK_COMMIT; - break; + *event = EVENT_VOLUME_REMOVE_BRICK_COMMIT; + break; case GF_OP_CMD_COMMIT_FORCE: - *event = EVENT_VOLUME_REMOVE_BRICK_FORCE; - break; + *event = EVENT_VOLUME_REMOVE_BRICK_FORCE; + break; case GF_OP_CMD_STOP: - *event = EVENT_VOLUME_REMOVE_BRICK_STOP; - break; + *event = EVENT_VOLUME_REMOVE_BRICK_STOP; + break; default: - *event = EVENT_LAST; - break; - } + *event = EVENT_LAST; + break; + } - ret = -1; + ret = -1; - if (*event == EVENT_LAST) { - goto out; - } + if (*event == EVENT_LAST) { + goto out; + } - /* I could just get this from words[] but this is cleaner in case the - * format changes */ - while (i) { - snprintf (key, sizeof (key), "brick%d", i); - ret = dict_get_str (options, key, &brick); - if (ret) { - break; - } - eventstrlen += strlen (brick) + 1; - i++; + /* I could just get this from words[] but this is cleaner in case the + * format changes */ + while (i) { + snprintf(key, sizeof(key), "brick%d", i); + ret = dict_get_str(options, key, &brick); + if (ret) { + break; } + eventstrlen += strlen(brick) + 1; + i++; + } - count = --i; + count = --i; - eventstrlen += 1; + eventstrlen += 1; - bricklist = GF_CALLOC (eventstrlen, sizeof (char), gf_common_mt_char); - if (!bricklist) { - goto out; - } + bricklist = GF_CALLOC(eventstrlen, sizeof(char), gf_common_mt_char); + if (!bricklist) { + goto out; + } - tmp_ptr = bricklist; + tmp_ptr = bricklist; - i = 1; - while (i <= count) { - snprintf (key, sizeof (key), "brick%d", i); - ret = dict_get_str (options, key, &brick); - if (ret) { - break; - } - snprintf (tmp_ptr, eventstrlen, "%s ", brick); - bricklen = strlen (brick); - eventstrlen -= (bricklen + 1); - tmp_ptr += (bricklen + 1); - i++; + i = 1; + while (i <= count) { + snprintf(key, sizeof(key), "brick%d", i); + ret = dict_get_str(options, key, &brick); + if (ret) { + break; } + snprintf(tmp_ptr, eventstrlen, "%s ", brick); + bricklen = strlen(brick); + eventstrlen -= (bricklen + 1); + tmp_ptr += (bricklen + 1); + i++; + } - if (!ret) { - gf_asprintf (event_str, eventstrformat, volname, - bricklist); - } else { - gf_asprintf (event_str, eventstrformat, volname, - "<unavailable>"); - } + if (!ret) { + gf_asprintf(event_str, eventstrformat, volname, bricklist); + } else { + gf_asprintf(event_str, eventstrformat, volname, "<unavailable>"); + } - ret = 0; + ret = 0; out: - GF_FREE (bricklist); - return ret; + GF_FREE(bricklist); + return ret; } - int -cli_cmd_volume_add_brick_cbk (struct cli_state *state, - struct cli_cmd_word *word, const char **words, - int wordcount) +cli_cmd_volume_add_brick_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - int sent = 0; - int parse_error = 0; - gf_answer_t answer = GF_ANSWER_NO; - cli_local_t *local = NULL; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *options = NULL; + int sent = 0; + int parse_error = 0; + gf_answer_t answer = GF_ANSWER_NO; + cli_local_t *local = NULL; #if (USE_EVENTS) - char *event_str = NULL; - char *bricks = NULL; - const char *eventstrformat = "volume=%s;bricks=%s"; + char *event_str = NULL; + char *bricks = NULL; + const char *eventstrformat = "volume=%s;bricks=%s"; #endif - const char *question = "Changing the 'stripe count' of the volume is " - "not a supported feature. In some cases it may result in data " - "loss on the volume. Also there may be issues with regular " - "filesystem operations on the volume after the change. Do you " - "really want to continue with 'stripe' count option ? "; + const char *question = + "Changing the 'stripe count' of the volume is " + "not a supported feature. In some cases it may result in data " + "loss on the volume. Also there may be issues with regular " + "filesystem operations on the volume after the change. Do you " + "really want to continue with 'stripe' count option ? "; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - ret = cli_cmd_volume_add_brick_parse (state, words, wordcount, &options, - 0); - if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + ret = cli_cmd_volume_add_brick_parse(state, words, wordcount, &options, 0); + if (ret) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - /* TODO: there are challenges in supporting changing of - stripe-count, until it is properly supported give warning to user */ - if (dict_get (options, "stripe-count")) { - answer = cli_cmd_get_confirmation (state, question); + /* TODO: there are challenges in supporting changing of + stripe-count, until it is properly supported give warning to user */ + if (dict_get(options, "stripe-count")) { + answer = cli_cmd_get_confirmation(state, question); - if (GF_ANSWER_NO == answer) { - ret = 0; - goto out; - } + if (GF_ANSWER_NO == answer) { + ret = 0; + goto out; } + } #if (USE_EVENTS) - /* Get the list of bricks for the event */ + /* Get the list of bricks for the event */ - ret = dict_get_str (options, "bricks", &bricks); + ret = dict_get_str(options, "bricks", &bricks); - if (!ret) { - gf_asprintf (&event_str, eventstrformat, (char *)words[2], - &bricks[1] /*Skip leading space*/); - } else { - gf_asprintf (&event_str, eventstrformat, (char *)words[2], - "<unavailable>"); - } + if (!ret) { + gf_asprintf(&event_str, eventstrformat, (char *)words[2], + &bricks[1] /*Skip leading space*/); + } else { + gf_asprintf(&event_str, eventstrformat, (char *)words[2], + "<unavailable>"); + } #endif - if (state->mode & GLUSTER_MODE_WIGNORE) { - ret = dict_set_int32 (options, "force", _gf_true); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set force " - "option"); - goto out; - } + if (state->mode & GLUSTER_MODE_WIGNORE) { + ret = dict_set_int32(options, "force", _gf_true); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to set force " + "option"); + goto out; } + } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_ADD_BRICK]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_ADD_BRICK]; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume add-brick failed"); - } else { + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume add-brick failed"); + } else { #if (USE_EVENTS) - gf_event (EVENT_VOLUME_ADD_BRICK, "%s", event_str); + gf_event(EVENT_VOLUME_ADD_BRICK, "%s", event_str); #endif - } + } #if (USE_EVENTS) - GF_FREE(event_str); + GF_FREE(event_str); #endif - CLI_STACK_DESTROY (frame); - return ret; + CLI_STACK_DESTROY(frame); + return ret; } int -cli_tier_validate_replica_type (dict_t *dict, int type) +cli_tier_validate_replica_type(dict_t *dict, int type) { + int brick_count = -1; + int replica_count = 1; + int ret = -1; - int brick_count = -1; - int replica_count = 1; - int ret = -1; - - ret = dict_get_int32 (dict, "count", &brick_count); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get brick count"); - goto out; - } - - ret = dict_get_int32 (dict, "replica-count", &replica_count); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, "Failed to get replica count. " - "Defaulting to one"); - replica_count = 1; - } + ret = dict_get_int32(dict, "count", &brick_count); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get brick count"); + goto out; + } + + ret = dict_get_int32(dict, "replica-count", &replica_count); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, + "Failed to get replica count. " + "Defaulting to one"); + replica_count = 1; + } + + /* + * Change the calculation of sub_count once attach-tier support + * disperse volume. + * sub_count = disperse_count for disperse volume + * */ + + if (brick_count % replica_count) { + if (type == GF_CLUSTER_TYPE_REPLICATE) + cli_err( + "number of bricks is not a multiple of " + "replica count"); + else if (type == GF_CLUSTER_TYPE_DISPERSE) + cli_err( + "number of bricks is not a multiple of " + "disperse count"); + else + cli_err( + "number of bricks given doesn't match " + "required count"); - /* - * Change the calculation of sub_count once attach-tier support - * disperse volume. - * sub_count = disperse_count for disperse volume - * */ - - - if (brick_count % replica_count) { - if (type == GF_CLUSTER_TYPE_REPLICATE) - cli_err ("number of bricks is not a multiple of " - "replica count"); - else if (type == GF_CLUSTER_TYPE_DISPERSE) - cli_err ("number of bricks is not a multiple of " - "disperse count"); - else - cli_err ("number of bricks given doesn't match " - "required count"); - - ret = -1; - goto out; - } - ret = 0; + ret = -1; + goto out; + } + ret = 0; out: - return ret; + return ret; } int -do_cli_cmd_volume_attach_tier (struct cli_state *state, - struct cli_cmd_word *word, const char **words, - int wordcount) +do_cli_cmd_volume_attach_tier(struct cli_state *state, + struct cli_cmd_word *word, const char **words, + int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - int sent = 0; - int parse_error = 0; - cli_local_t *local = NULL; - int type = 0; - - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *options = NULL; + int sent = 0; + int parse_error = 0; + cli_local_t *local = NULL; + int type = 0; + + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - ret = cli_cmd_volume_add_brick_parse (state, words, wordcount, &options, - &type); - if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + ret = cli_cmd_volume_add_brick_parse(state, words, wordcount, &options, + &type); + if (ret) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } + + /* + * Merge this check when attach-tier has it's own cli parse function. + */ + ret = cli_tier_validate_replica_type(options, type); + if (ret) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - /* - * Merge this check when attach-tier has it's own cli parse function. - */ - ret = cli_tier_validate_replica_type (options, type); + if (state->mode & GLUSTER_MODE_WIGNORE) { + ret = dict_set_int32(options, "force", _gf_true); if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; + gf_log("cli", GF_LOG_ERROR, + "Failed to set force " + "option"); + goto out; } + } - if (state->mode & GLUSTER_MODE_WIGNORE) { - ret = dict_set_int32 (options, "force", _gf_true); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set force " - "option"); - goto out; - } - } - - ret = dict_set_int32 (options, "attach-tier", 1); - if (ret) - goto out; + ret = dict_set_int32(options, "attach-tier", 1); + if (ret) + goto out; - ret = dict_set_int32 (options, "hot-type", type); - if (ret) - goto out; + ret = dict_set_int32(options, "hot-type", type); + if (ret) + goto out; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_ADD_TIER_BRICK]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_ADD_TIER_BRICK]; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("attach-tier failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("attach-tier failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } int -do_cli_cmd_volume_detach_tier (struct cli_state *state, +do_cli_cmd_volume_detach_tier(struct cli_state *state, struct cli_cmd_word *word, const char **words, int wordcount, gf_boolean_t *aborted) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - int sent = 0; - int parse_error = 0; - gf_answer_t answer = GF_ANSWER_NO; - cli_local_t *local = NULL; - int need_question = 0; - - const char *question = "Removing tier can result in data loss. " - "Do you want to Continue?"; - - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *options = NULL; + int sent = 0; + int parse_error = 0; + gf_answer_t answer = GF_ANSWER_NO; + cli_local_t *local = NULL; + int need_question = 0; + + const char *question = + "Removing tier can result in data loss. " + "Do you want to Continue?"; + + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - ret = cli_cmd_volume_detach_tier_parse(words, wordcount, &options, - &need_question); - if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + ret = cli_cmd_volume_detach_tier_parse(words, wordcount, &options, + &need_question); + if (ret) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - ret = dict_set_int32 (options, "force", 1); - if (ret) - goto out; + ret = dict_set_int32(options, "force", 1); + if (ret) + goto out; - ret = dict_set_int32 (options, "count", 0); - if (ret) - goto out; + ret = dict_set_int32(options, "count", 0); + if (ret) + goto out; - *aborted = _gf_false; + *aborted = _gf_false; - if (!(state->mode & GLUSTER_MODE_SCRIPT) && need_question) { - /* we need to ask question only in case of 'commit or force' */ - answer = cli_cmd_get_confirmation (state, question); - if (GF_ANSWER_NO == answer) { - ret = 0; - *aborted = _gf_true; - goto out; - } + if (!(state->mode & GLUSTER_MODE_SCRIPT) && need_question) { + /* we need to ask question only in case of 'commit or force' */ + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + ret = 0; + *aborted = _gf_true; + goto out; } + } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_REMOVE_TIER_BRICK]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_REMOVE_TIER_BRICK]; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume detach tier failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume detach tier failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } int -cli_cmd_volume_tier_cbk (struct cli_state *state, - struct cli_cmd_word *word, const char **words, - int wordcount) +cli_cmd_volume_tier_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - call_frame_t *frame = NULL; - dict_t *options = NULL; - rpc_clnt_procedure_t *proc = NULL; - cli_local_t *local = NULL; - int i = 0; - eventtypes_t event = EVENT_LAST; - gf_boolean_t aborted = _gf_false; - gf_answer_t answer = GF_ANSWER_NO; - - const char *detach_question = "gluster volume detach-tier <VOLNAME> " - "<start|stop|status|commit|force> is " - "deprecated. Use the new command \'" - "gluster volume tier <VOLNAME> detach <start|" - "stop|status|commit|force>\'\n" - "Do you want to Continue?"; - - const char *attach_question = "gluster volume attach-tier <VOLNAME> " - "[<replica COUNT>] <NEW-BRICK>... is " - "deprecated. Use the new command \'" - "gluster volume tier <VOLNAME> attach [<replica" - " COUNT>] <NEW-BRICK>... [force]\'\n" - "Do you want to Continue?"; - - - if (wordcount < 4) { - if (wordcount == 3 && !strcmp(words[2], "help")) { - cli_cmd_tier_help_cbk (state, word, words, wordcount); - ret = 0; - } else { - cli_usage_out (word->pattern); - } - goto out; + int ret = -1; + call_frame_t *frame = NULL; + dict_t *options = NULL; + rpc_clnt_procedure_t *proc = NULL; + cli_local_t *local = NULL; + int i = 0; + eventtypes_t event = EVENT_LAST; + gf_boolean_t aborted = _gf_false; + gf_answer_t answer = GF_ANSWER_NO; + + const char *detach_question = + "gluster volume detach-tier <VOLNAME> " + "<start|stop|status|commit|force> is " + "deprecated. Use the new command \'" + "gluster volume tier <VOLNAME> detach <start|" + "stop|status|commit|force>\'\n" + "Do you want to Continue?"; + + const char *attach_question = + "gluster volume attach-tier <VOLNAME> " + "[<replica COUNT>] <NEW-BRICK>... is " + "deprecated. Use the new command \'" + "gluster volume tier <VOLNAME> attach [<replica" + " COUNT>] <NEW-BRICK>... [force]\'\n" + "Do you want to Continue?"; + + if (wordcount < 4) { + if (wordcount == 3 && !strcmp(words[2], "help")) { + cli_cmd_tier_help_cbk(state, word, words, wordcount); + ret = 0; + } else { + cli_usage_out(word->pattern); } + goto out; + } - if (!strcmp(words[1], "detach-tier")) { - /* we need to ask question when older command is used */ - answer = cli_cmd_get_confirmation (state, detach_question); - if (GF_ANSWER_NO == answer) { - ret = 0; - goto out; - } - ret = do_cli_cmd_volume_detach_tier (state, word, - words, wordcount, - &aborted); - goto out; - } else if (!strcmp(words[3], "detach")) { - for (i = 3; i < wordcount; i++) - words[i] = words[i+1]; - - ret = do_cli_cmd_volume_detach_tier (state, word, - words, wordcount-1, - &aborted); - if (!aborted) { - if (!strcmp (words[wordcount-2], "commit")) { - event = EVENT_TIER_DETACH_COMMIT; - } else if (!strcmp (words[wordcount-2], "start")) { - event = EVENT_TIER_DETACH_START; - } else if (!strcmp (words[wordcount-2], "stop")) { - event = EVENT_TIER_DETACH_STOP; - } else if (!strcmp (words[wordcount-2], "force")) { - event = EVENT_TIER_DETACH_FORCE; - } - } - goto out; - - } else if (!strcmp(words[1], "attach-tier")) { - /* we need to ask question when the older command is used */ - answer = cli_cmd_get_confirmation (state, attach_question); - if (GF_ANSWER_NO == answer) { - ret = 0; - goto out; - } - ret = do_cli_cmd_volume_attach_tier (state, word, - words, wordcount); - goto out; - } else if (!strcmp(words[3], "attach")) { - for (i = 3; i < wordcount; i++) - words[i] = words[i+1]; - - ret = do_cli_cmd_volume_attach_tier (state, word, - words, wordcount-1); - if (!strcmp (words[wordcount-2], "force")) { - event = EVENT_TIER_ATTACH_FORCE; - } else { - event = EVENT_TIER_ATTACH; - } - goto out; + if (!strcmp(words[1], "detach-tier")) { + /* we need to ask question when older command is used */ + answer = cli_cmd_get_confirmation(state, detach_question); + if (GF_ANSWER_NO == answer) { + ret = 0; + goto out; } + ret = do_cli_cmd_volume_detach_tier(state, word, words, wordcount, + &aborted); + goto out; + } else if (!strcmp(words[3], "detach")) { + for (i = 3; i < wordcount; i++) + words[i] = words[i + 1]; + + ret = do_cli_cmd_volume_detach_tier(state, word, words, wordcount - 1, + &aborted); + if (!aborted) { + if (!strcmp(words[wordcount - 2], "commit")) { + event = EVENT_TIER_DETACH_COMMIT; + } else if (!strcmp(words[wordcount - 2], "start")) { + event = EVENT_TIER_DETACH_START; + } else if (!strcmp(words[wordcount - 2], "stop")) { + event = EVENT_TIER_DETACH_STOP; + } else if (!strcmp(words[wordcount - 2], "force")) { + event = EVENT_TIER_DETACH_FORCE; + } + } + goto out; - ret = cli_cmd_volume_tier_parse (words, wordcount, &options); - if (ret) { - cli_usage_out (word->pattern); - goto out; + } else if (!strcmp(words[1], "attach-tier")) { + /* we need to ask question when the older command is used */ + answer = cli_cmd_get_confirmation(state, attach_question); + if (GF_ANSWER_NO == answer) { + ret = 0; + goto out; } + ret = do_cli_cmd_volume_attach_tier(state, word, words, wordcount); + goto out; + } else if (!strcmp(words[3], "attach")) { + for (i = 3; i < wordcount; i++) + words[i] = words[i + 1]; - if (!strcmp (words[wordcount-1], "start")) { - event = EVENT_TIER_START; + ret = do_cli_cmd_volume_attach_tier(state, word, words, wordcount - 1); + if (!strcmp(words[wordcount - 2], "force")) { + event = EVENT_TIER_ATTACH_FORCE; } else { - if (!strcmp (words[wordcount-2], "start") && - !strcmp (words[wordcount-1], "force")) { - event = EVENT_TIER_START_FORCE; - } + event = EVENT_TIER_ATTACH; } + goto out; + } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_TIER]; + ret = cli_cmd_volume_tier_parse(words, wordcount, &options); + if (ret) { + cli_usage_out(word->pattern); + goto out; + } - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + if (!strcmp(words[wordcount - 1], "start")) { + event = EVENT_TIER_START; + } else { + if (!strcmp(words[wordcount - 2], "start") && + !strcmp(words[wordcount - 1], "force")) { + event = EVENT_TIER_START_FORCE; + } + } - CLI_LOCAL_INIT (local, words, frame, options); + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_TIER]; - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + + CLI_LOCAL_INIT(local, words, frame, options); + + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_out ("Tier command failed"); - } else { - if (event != EVENT_LAST) { - gf_event (event, "vol=%s", words[2]); - } + if (ret) { + cli_out("Tier command failed"); + } else { + if (event != EVENT_LAST) { + gf_event(event, "vol=%s", words[2]); } - if (options) - dict_unref (options); + } + if (options) + dict_unref(options); - return ret; + return ret; } int -cli_get_soft_limit (dict_t *options, const char **words, dict_t *xdata) +cli_get_soft_limit(dict_t *options, const char **words, dict_t *xdata) { - call_frame_t *frame = NULL; - cli_local_t *local = NULL; - rpc_clnt_procedure_t *proc = NULL; - char *default_sl = NULL; - char *default_sl_dup = NULL; - int ret = -1; - - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) { - ret = -1; - goto out; - } - - //We need a ref on @options to prevent CLI_STACK_DESTROY - //from destroying it prematurely. - dict_ref (options); - CLI_LOCAL_INIT (local, words, frame, options); - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_QUOTA]; - ret = proc->fn (frame, THIS, options); - - ret = dict_get_str (options, "default-soft-limit", &default_sl); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get default soft limit"); - goto out; - } + call_frame_t *frame = NULL; + cli_local_t *local = NULL; + rpc_clnt_procedure_t *proc = NULL; + char *default_sl = NULL; + char *default_sl_dup = NULL; + int ret = -1; + + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) { + ret = -1; + goto out; + } + + // We need a ref on @options to prevent CLI_STACK_DESTROY + // from destroying it prematurely. + dict_ref(options); + CLI_LOCAL_INIT(local, words, frame, options); + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_QUOTA]; + ret = proc->fn(frame, THIS, options); + + ret = dict_get_str(options, "default-soft-limit", &default_sl); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get default soft limit"); + goto out; + } - default_sl_dup = gf_strdup (default_sl); - if (!default_sl_dup) { - ret = -1; - goto out; - } + default_sl_dup = gf_strdup(default_sl); + if (!default_sl_dup) { + ret = -1; + goto out; + } - ret = dict_set_dynstr (xdata, "default-soft-limit", default_sl_dup); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set default soft limit"); - GF_FREE (default_sl_dup); - goto out; - } + ret = dict_set_dynstr(xdata, "default-soft-limit", default_sl_dup); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to set default soft limit"); + GF_FREE(default_sl_dup); + goto out; + } out: - CLI_STACK_DESTROY (frame); - return ret; + CLI_STACK_DESTROY(frame); + return ret; } /* Checks if at least one limit has been set on the volume @@ -1469,1743 +1467,1728 @@ out: * Returns true if at least one limit is set. Returns false otherwise. */ gf_boolean_t -_limits_set_on_volume (char *volname, int type) { - gf_boolean_t limits_set = _gf_false; - int ret = -1; - char quota_conf_file[PATH_MAX] = {0,}; - int fd = -1; - char buf[16] = {0,}; - float version = 0.0f; - char gfid_type_stored = 0; - char gfid_type = 0; - - /* TODO: fix hardcoding; Need to perform an RPC call to glusterd - * to fetch working directory - */ - snprintf (quota_conf_file, sizeof quota_conf_file, - "%s/vols/%s/quota.conf", - GLUSTERD_DEFAULT_WORKDIR, - volname); - fd = open (quota_conf_file, O_RDONLY); - if (fd == -1) - goto out; +_limits_set_on_volume(char *volname, int type) +{ + gf_boolean_t limits_set = _gf_false; + int ret = -1; + char quota_conf_file[PATH_MAX] = { + 0, + }; + int fd = -1; + char buf[16] = { + 0, + }; + float version = 0.0f; + char gfid_type_stored = 0; + char gfid_type = 0; + + /* TODO: fix hardcoding; Need to perform an RPC call to glusterd + * to fetch working directory + */ + snprintf(quota_conf_file, sizeof quota_conf_file, "%s/vols/%s/quota.conf", + GLUSTERD_DEFAULT_WORKDIR, volname); + fd = open(quota_conf_file, O_RDONLY); + if (fd == -1) + goto out; - ret = quota_conf_read_version (fd, &version); - if (ret) - goto out; + ret = quota_conf_read_version(fd, &version); + if (ret) + goto out; - if (type == GF_QUOTA_OPTION_TYPE_LIST) - gfid_type = GF_QUOTA_CONF_TYPE_USAGE; - else - gfid_type = GF_QUOTA_CONF_TYPE_OBJECTS; - - /* Try to read at least one gfid of type 'gfid_type' */ - while (1) { - ret = quota_conf_read_gfid (fd, buf, &gfid_type_stored, - version); - if (ret <= 0) - break; - - if (gfid_type_stored == gfid_type) { - limits_set = _gf_true; - break; - } + if (type == GF_QUOTA_OPTION_TYPE_LIST) + gfid_type = GF_QUOTA_CONF_TYPE_USAGE; + else + gfid_type = GF_QUOTA_CONF_TYPE_OBJECTS; + + /* Try to read at least one gfid of type 'gfid_type' */ + while (1) { + ret = quota_conf_read_gfid(fd, buf, &gfid_type_stored, version); + if (ret <= 0) + break; + + if (gfid_type_stored == gfid_type) { + limits_set = _gf_true; + break; } + } out: - if (fd != -1) - sys_close (fd); + if (fd != -1) + sys_close(fd); - return limits_set; + return limits_set; } int -cli_cmd_quota_handle_list_all (const char **words, dict_t *options) +cli_cmd_quota_handle_list_all(const char **words, dict_t *options) { - int all_failed = 1; - int count = 0; - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - cli_local_t *local = NULL; - call_frame_t *frame = NULL; - dict_t *xdata = NULL; - char *gfid_str = NULL; - char *volname = NULL; - char *volname_dup = NULL; - unsigned char buf[16] = {0}; - int fd = -1; - char quota_conf_file[PATH_MAX] = {0}; - gf_boolean_t xml_err_flag = _gf_false; - char err_str[NAME_MAX] = {0,}; - int32_t type = 0; - char gfid_type = 0; - float version = 0.0f; - int32_t max_count = 0; - - xdata = dict_new (); - if (!xdata) { - ret = -1; - goto out; - } + int all_failed = 1; + int count = 0; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + cli_local_t *local = NULL; + call_frame_t *frame = NULL; + dict_t *xdata = NULL; + char *gfid_str = NULL; + char *volname = NULL; + char *volname_dup = NULL; + unsigned char buf[16] = {0}; + int fd = -1; + char quota_conf_file[PATH_MAX] = {0}; + gf_boolean_t xml_err_flag = _gf_false; + char err_str[NAME_MAX] = { + 0, + }; + int32_t type = 0; + char gfid_type = 0; + float version = 0.0f; + int32_t max_count = 0; + + xdata = dict_new(); + if (!xdata) { + ret = -1; + goto out; + } - ret = dict_get_str (options, "volname", &volname); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get volume name"); - goto out; - } + ret = dict_get_str(options, "volname", &volname); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get volume name"); + goto out; + } - ret = dict_get_int32 (options, "type", &type); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get quota option type"); - goto out; - } + ret = dict_get_int32(options, "type", &type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get quota option type"); + goto out; + } - ret = dict_set_int32 (xdata, "type", type); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set type in xdata"); - goto out; - } + ret = dict_set_int32(xdata, "type", type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to set type in xdata"); + goto out; + } - ret = cli_get_soft_limit (options, words, xdata); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to fetch default " - "soft-limit"); - goto out; + ret = cli_get_soft_limit(options, words, xdata); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to fetch default " + "soft-limit"); + goto out; + } + + /* Check if at least one limit is set on volume. No need to check for + * quota enabled as cli_get_soft_limit() handles that + */ + if (!_limits_set_on_volume(volname, type)) { + snprintf(err_str, sizeof(err_str), + "No%s quota configured on" + " volume %s", + (type == GF_QUOTA_OPTION_TYPE_LIST) ? "" : " inode", volname); + if (global_state->mode & GLUSTER_MODE_XML) { + xml_err_flag = _gf_true; + } else { + cli_out("quota: %s", err_str); } + ret = 0; + goto out; + } - /* Check if at least one limit is set on volume. No need to check for - * quota enabled as cli_get_soft_limit() handles that - */ - if (!_limits_set_on_volume (volname, type)) { - snprintf (err_str, sizeof (err_str), "No%s quota configured on" - " volume %s", - (type == GF_QUOTA_OPTION_TYPE_LIST) ? "" : " inode", - volname); - if (global_state->mode & GLUSTER_MODE_XML) { - xml_err_flag = _gf_true; - } else { - cli_out ("quota: %s", err_str); - } - ret = 0; - goto out; - } + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) { + ret = -1; + goto out; + } - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) { - ret = -1; - goto out; - } + volname_dup = gf_strdup(volname); + if (!volname_dup) { + ret = -1; + goto out; + } - volname_dup = gf_strdup (volname); - if (!volname_dup) { - ret = -1; - goto out; - } + ret = dict_set_dynstr(xdata, "volume-uuid", volname_dup); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to set volume-uuid"); + GF_FREE(volname_dup); + goto out; + } + + // TODO: fix hardcoding; Need to perform an RPC call to glusterd + // to fetch working directory + snprintf(quota_conf_file, sizeof quota_conf_file, "%s/vols/%s/quota.conf", + GLUSTERD_DEFAULT_WORKDIR, volname); + fd = open(quota_conf_file, O_RDONLY); + if (fd == -1) { + // This may because no limits were yet set on the volume + gf_log("cli", GF_LOG_TRACE, + "Unable to open " + "quota.conf"); + ret = 0; + goto out; + } - ret = dict_set_dynstr (xdata, "volume-uuid", volname_dup); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set volume-uuid"); - GF_FREE (volname_dup); - goto out; - } + ret = quota_conf_read_version(fd, &version); + if (ret) + goto out; - //TODO: fix hardcoding; Need to perform an RPC call to glusterd - //to fetch working directory - snprintf (quota_conf_file, sizeof quota_conf_file, - "%s/vols/%s/quota.conf", - GLUSTERD_DEFAULT_WORKDIR, - volname); - fd = open (quota_conf_file, O_RDONLY); - if (fd == -1) { - //This may because no limits were yet set on the volume - gf_log ("cli", GF_LOG_TRACE, "Unable to open " - "quota.conf"); - ret = 0; - goto out; - } + CLI_LOCAL_INIT(local, words, frame, xdata); + proc = &cli_quotad_clnt.proctable[GF_AGGREGATOR_GETLIMIT]; - ret = quota_conf_read_version (fd, &version); - if (ret) - goto out; + gfid_str = GF_CALLOC(1, gf_common_mt_char, 64); + if (!gfid_str) { + ret = -1; + goto out; + } - CLI_LOCAL_INIT (local, words, frame, xdata); - proc = &cli_quotad_clnt.proctable[GF_AGGREGATOR_GETLIMIT]; + for (count = 0;; count++) { + ret = quota_conf_read_gfid(fd, buf, &gfid_type, version); + if (ret == 0) { + break; + } else if (ret < 0) { + gf_log(THIS->name, GF_LOG_CRITICAL, + "Quota " + "configuration store may be corrupt."); + goto out; + } + + if ((type == GF_QUOTA_OPTION_TYPE_LIST && + gfid_type == GF_QUOTA_CONF_TYPE_OBJECTS) || + (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS && + gfid_type == GF_QUOTA_CONF_TYPE_USAGE)) + continue; + + max_count++; + } + ret = dict_set_int32(xdata, "max_count", max_count); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to set max_count"); + goto out; + } + + ret = sys_lseek(fd, 0L, SEEK_SET); + if (ret < 0) { + gf_log(THIS->name, GF_LOG_ERROR, + "failed to move offset to " + "the beginning: %s", + strerror(errno)); + goto out; + } + ret = quota_conf_read_version(fd, &version); + if (ret) + goto out; - gfid_str = GF_CALLOC (1, gf_common_mt_char, 64); - if (!gfid_str) { - ret = -1; - goto out; + for (count = 0;; count++) { + ret = quota_conf_read_gfid(fd, buf, &gfid_type, version); + if (ret == 0) { + break; + } else if (ret < 0) { + gf_log(THIS->name, GF_LOG_CRITICAL, + "Quota " + "configuration store may be corrupt."); + goto out; } - for (count = 0;; count++) { - ret = quota_conf_read_gfid (fd, buf, &gfid_type, version); - if (ret == 0) { - break; - } else if (ret < 0) { - gf_log (THIS->name, GF_LOG_CRITICAL, "Quota " - "configuration store may be corrupt."); - goto out; - } - - if ((type == GF_QUOTA_OPTION_TYPE_LIST && - gfid_type == GF_QUOTA_CONF_TYPE_OBJECTS) || - (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS && - gfid_type == GF_QUOTA_CONF_TYPE_USAGE)) - continue; + if ((type == GF_QUOTA_OPTION_TYPE_LIST && + gfid_type == GF_QUOTA_CONF_TYPE_OBJECTS) || + (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS && + gfid_type == GF_QUOTA_CONF_TYPE_USAGE)) + continue; - max_count++; - } - ret = dict_set_int32 (xdata, "max_count", max_count); + uuid_utoa_r(buf, gfid_str); + ret = dict_set_str(xdata, "gfid", gfid_str); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set max_count"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Failed to set gfid"); + goto out; } - ret = sys_lseek (fd, 0L, SEEK_SET); - if (ret < 0) { - gf_log (THIS->name, GF_LOG_ERROR, "failed to move offset to " - "the beginning: %s", strerror (errno)); - goto out; + ret = proc->fn(frame, THIS, xdata); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to get quota " + "limits for %s", + uuid_utoa((unsigned char *)buf)); } - ret = quota_conf_read_version (fd, &version); - if (ret) - goto out; - for (count = 0;; count++) { - ret = quota_conf_read_gfid (fd, buf, &gfid_type, version); - if (ret == 0) { - break; - } else if (ret < 0) { - gf_log (THIS->name, GF_LOG_CRITICAL, "Quota " - "configuration store may be corrupt."); - goto out; - } + dict_del(xdata, "gfid"); + all_failed = all_failed && ret; + } - if ((type == GF_QUOTA_OPTION_TYPE_LIST && - gfid_type == GF_QUOTA_CONF_TYPE_OBJECTS) || - (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS && - gfid_type == GF_QUOTA_CONF_TYPE_USAGE)) - continue; - - uuid_utoa_r (buf, gfid_str); - ret = dict_set_str (xdata, "gfid", gfid_str); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set gfid"); - goto out; - } - - ret = proc->fn (frame, THIS, xdata); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get quota " - "limits for %s", uuid_utoa ((unsigned char*)buf)); - } - - dict_del (xdata, "gfid"); - all_failed = all_failed && ret; - } - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_quota_limit_list_end (local); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Error in printing " - "xml output"); - goto out; - } - } - - if (count > 0) { - ret = all_failed? -1: 0; - } else { - ret = 0; + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_quota_limit_list_end(local); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Error in printing " + "xml output"); + goto out; } + } + if (count > 0) { + ret = all_failed ? -1 : 0; + } else { + ret = 0; + } out: - if (xml_err_flag) { - ret = cli_xml_output_str ("volQuota", NULL, -1, 0, err_str); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Error outputting in " - "xml format"); - } - } - - if (fd != -1) { - sys_close (fd); - } - - GF_FREE (gfid_str); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch and display quota" - " limits"); - } - CLI_STACK_DESTROY (frame); - return ret; + if (xml_err_flag) { + ret = cli_xml_output_str("volQuota", NULL, -1, 0, err_str); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Error outputting in " + "xml format"); + } + } + + if (fd != -1) { + sys_close(fd); + } + + GF_FREE(gfid_str); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not fetch and display quota" + " limits"); + } + CLI_STACK_DESTROY(frame); + return ret; } - - int -cli_cmd_bitrot_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_bitrot_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - - int ret = -1; - int parse_err = 0; - call_frame_t *frame = NULL; - dict_t *options = NULL; - cli_local_t *local = NULL; - rpc_clnt_procedure_t *proc = NULL; - int sent = 0; + int ret = -1; + int parse_err = 0; + call_frame_t *frame = NULL; + dict_t *options = NULL; + cli_local_t *local = NULL; + rpc_clnt_procedure_t *proc = NULL; + int sent = 0; #if (USE_EVENTS) - int cmd_type = -1; - int ret1 = -1; - int event_type = -1; - char *tmp = NULL; - char *events_str = NULL; + int cmd_type = -1; + int ret1 = -1; + int event_type = -1; + char *tmp = NULL; + char *events_str = NULL; #endif - ret = cli_cmd_bitrot_parse (words, wordcount, &options); - if (ret < 0) { - cli_usage_out (word->pattern); - parse_err = 1; - goto out; - } + ret = cli_cmd_bitrot_parse(words, wordcount, &options); + if (ret < 0) { + cli_usage_out(word->pattern); + parse_err = 1; + goto out; + } - if (ret == 1) { - /* this is 'volume bitrot help' */ - cli_cmd_bitrot_help_cbk (state, word, words, wordcount); - ret = 0; - goto out2; - } + if (ret == 1) { + /* this is 'volume bitrot help' */ + cli_cmd_bitrot_help_cbk(state, word, words, wordcount); + ret = 0; + goto out2; + } - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) { - ret = -1; - goto out; - } + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) { + ret = -1; + goto out; + } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_BITROT]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_BITROT]; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_err == 0)) - cli_err ("Bit rot command failed. Please check the cli " - "logs for more details"); - - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_err == 0)) + cli_err( + "Bit rot command failed. Please check the cli " + "logs for more details"); + } #if (USE_EVENTS) - if (ret == 0) { - ret1 = dict_get_int32 (options, "type", &cmd_type); + if (ret == 0) { + ret1 = dict_get_int32(options, "type", &cmd_type); + if (ret1) + cmd_type = -1; + else { + ret1 = dict_get_str(options, "volname", &tmp); + if (ret1) + tmp = ""; + gf_asprintf(&events_str, "name=%s", tmp); + } + + switch (cmd_type) { + case GF_BITROT_OPTION_TYPE_ENABLE: + event_type = EVENT_BITROT_ENABLE; + break; + case GF_BITROT_OPTION_TYPE_DISABLE: + event_type = EVENT_BITROT_DISABLE; + break; + case GF_BITROT_CMD_SCRUB_ONDEMAND: + event_type = EVENT_BITROT_SCRUB_ONDEMAND; + break; + case GF_BITROT_OPTION_TYPE_SCRUB_THROTTLE: + event_type = EVENT_BITROT_SCRUB_THROTTLE; + ret1 = dict_get_str(options, "scrub-throttle-value", &tmp); if (ret1) - cmd_type = -1; - else { - ret1 = dict_get_str (options, "volname", &tmp); - if (ret1) - tmp = ""; - gf_asprintf (&events_str, "name=%s", tmp); - } - - switch (cmd_type) { - case GF_BITROT_OPTION_TYPE_ENABLE: - event_type = EVENT_BITROT_ENABLE; - break; - case GF_BITROT_OPTION_TYPE_DISABLE: - event_type = EVENT_BITROT_DISABLE; - break; - case GF_BITROT_CMD_SCRUB_ONDEMAND: - event_type = EVENT_BITROT_SCRUB_ONDEMAND; - break; - case GF_BITROT_OPTION_TYPE_SCRUB_THROTTLE: - event_type = EVENT_BITROT_SCRUB_THROTTLE; - ret1 = dict_get_str (options, "scrub-throttle-value", - &tmp); - if (ret1) - tmp = ""; - gf_asprintf (&events_str, "%s;value=%s", events_str, - tmp); - break; - case GF_BITROT_OPTION_TYPE_SCRUB_FREQ: - event_type = EVENT_BITROT_SCRUB_FREQ; - ret1 = dict_get_str (options, "scrub-frequency-value", - &tmp); - if (ret1) - tmp = ""; - gf_asprintf (&events_str, "%s;value=%s", events_str, - tmp); - break; - case GF_BITROT_OPTION_TYPE_SCRUB: - event_type = EVENT_BITROT_SCRUB_OPTION; - ret1 = dict_get_str (options, "scrub-value", &tmp); - if (ret1) - tmp = ""; - gf_asprintf (&events_str, "%s;value=%s", events_str, - tmp); - break; - default: - break; - } + tmp = ""; + gf_asprintf(&events_str, "%s;value=%s", events_str, tmp); + break; + case GF_BITROT_OPTION_TYPE_SCRUB_FREQ: + event_type = EVENT_BITROT_SCRUB_FREQ; + ret1 = dict_get_str(options, "scrub-frequency-value", &tmp); + if (ret1) + tmp = ""; + gf_asprintf(&events_str, "%s;value=%s", events_str, tmp); + break; + case GF_BITROT_OPTION_TYPE_SCRUB: + event_type = EVENT_BITROT_SCRUB_OPTION; + ret1 = dict_get_str(options, "scrub-value", &tmp); + if (ret1) + tmp = ""; + gf_asprintf(&events_str, "%s;value=%s", events_str, tmp); + break; + default: + break; + } - if (event_type > -1) - gf_event (event_type, "%s", events_str); + if (event_type > -1) + gf_event(event_type, "%s", events_str); - if (events_str) - GF_FREE (events_str); - } + if (events_str) + GF_FREE(events_str); + } #endif - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); out2: - return ret; + return ret; } int -cli_cmd_quota_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_quota_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - - int ret = 0; - int parse_err = 0; - int32_t type = 0; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - gf_answer_t answer = GF_ANSWER_NO; - cli_local_t *local = NULL; - int sent = 0; - char *volname = NULL; - const char *question = "Disabling quota will delete all the quota " - "configuration. Do you want to continue?"; - - //parse **words into options dictionary - if (strcmp (words[1], "inode-quota") == 0) { - ret = cli_cmd_inode_quota_parse (words, wordcount, &options); - if (ret < 0) { - cli_usage_out (word->pattern); - parse_err = 1; - goto out; - } - } else { - ret = cli_cmd_quota_parse (words, wordcount, &options); - - if (ret == 1) { - cli_cmd_quota_help_cbk (state, word, words, wordcount); - ret = 0; - goto out; - } - if (ret < 0) { - cli_usage_out (word->pattern); - parse_err = 1; - goto out; - } + int ret = 0; + int parse_err = 0; + int32_t type = 0; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *options = NULL; + gf_answer_t answer = GF_ANSWER_NO; + cli_local_t *local = NULL; + int sent = 0; + char *volname = NULL; + const char *question = + "Disabling quota will delete all the quota " + "configuration. Do you want to continue?"; + + // parse **words into options dictionary + if (strcmp(words[1], "inode-quota") == 0) { + ret = cli_cmd_inode_quota_parse(words, wordcount, &options); + if (ret < 0) { + cli_usage_out(word->pattern); + parse_err = 1; + goto out; } + } else { + ret = cli_cmd_quota_parse(words, wordcount, &options); - ret = dict_get_int32 (options, "type", &type); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get opcode"); - goto out; + if (ret == 1) { + cli_cmd_quota_help_cbk(state, word, words, wordcount); + ret = 0; + goto out; + } + if (ret < 0) { + cli_usage_out(word->pattern); + parse_err = 1; + goto out; } + } - //handle quota-disable and quota-list-all different from others - switch (type) { + ret = dict_get_int32(options, "type", &type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get opcode"); + goto out; + } + + // handle quota-disable and quota-list-all different from others + switch (type) { case GF_QUOTA_OPTION_TYPE_DISABLE: - answer = cli_cmd_get_confirmation (state, question); - if (answer == GF_ANSWER_NO) - goto out; - break; + answer = cli_cmd_get_confirmation(state, question); + if (answer == GF_ANSWER_NO) + goto out; + break; case GF_QUOTA_OPTION_TYPE_LIST: case GF_QUOTA_OPTION_TYPE_LIST_OBJECTS: - if (wordcount != 4) - break; - ret = cli_cmd_quota_handle_list_all (words, options); - goto out; - default: + if (wordcount != 4) break; - } + ret = cli_cmd_quota_handle_list_all(words, options); + goto out; + default: + break; + } - ret = dict_get_str (options, "volname", &volname); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get volume name"); - goto out; - } + ret = dict_get_str(options, "volname", &volname); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get volume name"); + goto out; + } - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) { - ret = -1; - goto out; - } + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) { + ret = -1; + goto out; + } - CLI_LOCAL_INIT (local, words, frame, options); - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_QUOTA]; + CLI_LOCAL_INIT(local, words, frame, options); + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_QUOTA]; - if (proc->fn) - ret = proc->fn (frame, THIS, options); + if (proc->fn) + ret = proc->fn(frame, THIS, options); out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if (sent == 0 && parse_err == 0) - cli_out ("Quota command failed. Please check the cli " - "logs for more details"); - } - - /* Events for Quota */ - if (ret == 0) { - switch (type) { - case GF_QUOTA_OPTION_TYPE_ENABLE: - gf_event (EVENT_QUOTA_ENABLE, "volume=%s", volname); - break; - case GF_QUOTA_OPTION_TYPE_DISABLE: - gf_event (EVENT_QUOTA_DISABLE, "volume=%s", volname); - break; - case GF_QUOTA_OPTION_TYPE_LIMIT_USAGE: - gf_event (EVENT_QUOTA_SET_USAGE_LIMIT, "volume=%s;" - "path=%s;limit=%s", volname, words[4], - words[5]); - break; - case GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS: - gf_event (EVENT_QUOTA_SET_OBJECTS_LIMIT, "volume=%s;" - "path=%s;limit=%s", volname, words[4], - words[5]); - break; - case GF_QUOTA_OPTION_TYPE_REMOVE: - gf_event (EVENT_QUOTA_REMOVE_USAGE_LIMIT, "volume=%s;" - "path=%s", volname, words[4]); - break; - case GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS: - gf_event (EVENT_QUOTA_REMOVE_OBJECTS_LIMIT, - "volume=%s;" "path=%s", volname, words[4]); - break; - case GF_QUOTA_OPTION_TYPE_ALERT_TIME: - gf_event (EVENT_QUOTA_ALERT_TIME, "volume=%s;time=%s", - volname, words[4]); - break; - case GF_QUOTA_OPTION_TYPE_SOFT_TIMEOUT: - gf_event (EVENT_QUOTA_SOFT_TIMEOUT, "volume=%s;" - "soft-timeout=%s", volname, words[4]); - break; - case GF_QUOTA_OPTION_TYPE_HARD_TIMEOUT: - gf_event (EVENT_QUOTA_HARD_TIMEOUT, "volume=%s;" - "hard-timeout=%s", volname, words[4]); - break; - case GF_QUOTA_OPTION_TYPE_DEFAULT_SOFT_LIMIT: - gf_event (EVENT_QUOTA_DEFAULT_SOFT_LIMIT, "volume=%s;" - "default-soft-limit=%s", volname, words[4]); - break; - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if (sent == 0 && parse_err == 0) + cli_out( + "Quota command failed. Please check the cli " + "logs for more details"); + } + + /* Events for Quota */ + if (ret == 0) { + switch (type) { + case GF_QUOTA_OPTION_TYPE_ENABLE: + gf_event(EVENT_QUOTA_ENABLE, "volume=%s", volname); + break; + case GF_QUOTA_OPTION_TYPE_DISABLE: + gf_event(EVENT_QUOTA_DISABLE, "volume=%s", volname); + break; + case GF_QUOTA_OPTION_TYPE_LIMIT_USAGE: + gf_event(EVENT_QUOTA_SET_USAGE_LIMIT, + "volume=%s;" + "path=%s;limit=%s", + volname, words[4], words[5]); + break; + case GF_QUOTA_OPTION_TYPE_LIMIT_OBJECTS: + gf_event(EVENT_QUOTA_SET_OBJECTS_LIMIT, + "volume=%s;" + "path=%s;limit=%s", + volname, words[4], words[5]); + break; + case GF_QUOTA_OPTION_TYPE_REMOVE: + gf_event(EVENT_QUOTA_REMOVE_USAGE_LIMIT, + "volume=%s;" + "path=%s", + volname, words[4]); + break; + case GF_QUOTA_OPTION_TYPE_REMOVE_OBJECTS: + gf_event(EVENT_QUOTA_REMOVE_OBJECTS_LIMIT, + "volume=%s;" + "path=%s", + volname, words[4]); + break; + case GF_QUOTA_OPTION_TYPE_ALERT_TIME: + gf_event(EVENT_QUOTA_ALERT_TIME, "volume=%s;time=%s", volname, + words[4]); + break; + case GF_QUOTA_OPTION_TYPE_SOFT_TIMEOUT: + gf_event(EVENT_QUOTA_SOFT_TIMEOUT, + "volume=%s;" + "soft-timeout=%s", + volname, words[4]); + break; + case GF_QUOTA_OPTION_TYPE_HARD_TIMEOUT: + gf_event(EVENT_QUOTA_HARD_TIMEOUT, + "volume=%s;" + "hard-timeout=%s", + volname, words[4]); + break; + case GF_QUOTA_OPTION_TYPE_DEFAULT_SOFT_LIMIT: + gf_event(EVENT_QUOTA_DEFAULT_SOFT_LIMIT, + "volume=%s;" + "default-soft-limit=%s", + volname, words[4]); + break; } + } - - CLI_STACK_DESTROY (frame); - return ret; + CLI_STACK_DESTROY(frame); + return ret; } int -cli_cmd_volume_remove_brick_cbk (struct cli_state *state, - struct cli_cmd_word *word, const char **words, - int wordcount) +cli_cmd_volume_remove_brick_cbk(struct cli_state *state, + struct cli_cmd_word *word, const char **words, + int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - gf_answer_t answer = GF_ANSWER_NO; - int brick_count = 0; - int sent = 0; - int parse_error = 0; - int need_question = 0; - cli_local_t *local = NULL; - char *volname = NULL; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *options = NULL; + gf_answer_t answer = GF_ANSWER_NO; + int brick_count = 0; + int sent = 0; + int parse_error = 0; + int need_question = 0; + cli_local_t *local = NULL; + char *volname = NULL; #if (USE_EVENTS) - eventtypes_t event = EVENT_LAST; - char *event_str = NULL; - int event_ret = -1; + eventtypes_t event = EVENT_LAST; + char *event_str = NULL; + int event_ret = -1; #endif - int32_t command = GF_OP_CMD_NONE; - char *question = NULL; - - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + int32_t command = GF_OP_CMD_NONE; + char *question = NULL; - ret = cli_cmd_volume_remove_brick_parse (state, words, wordcount, - &options, &need_question, - &brick_count, &command); - if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } - - if (command == GF_OP_CMD_COMMIT_FORCE) { - question = "Remove-brick force will not migrate files from the " - "removed bricks, so they will no longer be available" - " on the volume.\nDo you want to continue?"; - } else if (command == GF_OP_CMD_START) { - question = "Running remove-brick with cluster.force-migration" - " enabled can result in data corruption. It is safer" - " to disable this option so that files that receive " - "writes during migration are not migrated.\nFiles " - "that are not migrated can then be manually copied " - "after the remove-brick commit operation.\nDo you " - "want to continue with your current " - "cluster.force-migration settings?"; - } + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - if (!brick_count) { - cli_err ("No bricks specified"); - cli_usage_out (word->pattern); - parse_error = 1; - ret = -1; - goto out; - } - ret = dict_get_str (options, "volname", &volname); - if (ret || !volname) { - gf_log ("cli", GF_LOG_ERROR, "Failed to fetch volname"); - ret = -1; - goto out; - } + ret = cli_cmd_volume_remove_brick_parse(state, words, wordcount, &options, + &need_question, &brick_count, + &command); + if (ret) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } + + if (command == GF_OP_CMD_COMMIT_FORCE) { + question = + "Remove-brick force will not migrate files from the " + "removed bricks, so they will no longer be available" + " on the volume.\nDo you want to continue?"; + } else if (command == GF_OP_CMD_START) { + question = + "Running remove-brick with cluster.force-migration" + " enabled can result in data corruption. It is safer" + " to disable this option so that files that receive " + "writes during migration are not migrated.\nFiles " + "that are not migrated can then be manually copied " + "after the remove-brick commit operation.\nDo you " + "want to continue with your current " + "cluster.force-migration settings?"; + } + + if (!brick_count) { + cli_err("No bricks specified"); + cli_usage_out(word->pattern); + parse_error = 1; + ret = -1; + goto out; + } + ret = dict_get_str(options, "volname", &volname); + if (ret || !volname) { + gf_log("cli", GF_LOG_ERROR, "Failed to fetch volname"); + ret = -1; + goto out; + } #if (USE_EVENTS) - event_ret = cli_event_remove_brick_str (options, &event_str, &event); + event_ret = cli_event_remove_brick_str(options, &event_str, &event); #endif - if (!strcmp (volname, GLUSTER_SHARED_STORAGE)) { - question = "Removing brick from the shared storage volume" - "(gluster_shared_storage), will affect features " - "like snapshot scheduler, geo-replication " - "and NFS-Ganesha. Do you still want to " - "continue?"; - need_question = _gf_true; + if (!strcmp(volname, GLUSTER_SHARED_STORAGE)) { + question = + "Removing brick from the shared storage volume" + "(gluster_shared_storage), will affect features " + "like snapshot scheduler, geo-replication " + "and NFS-Ganesha. Do you still want to " + "continue?"; + need_question = _gf_true; + } + + if (!(state->mode & GLUSTER_MODE_SCRIPT) && need_question) { + answer = cli_cmd_get_confirmation(state, question); + if (GF_ANSWER_NO == answer) { + ret = 0; + goto out; } + } - if (!(state->mode & GLUSTER_MODE_SCRIPT) && need_question) { - answer = cli_cmd_get_confirmation (state, question); - if (GF_ANSWER_NO == answer) { - ret = 0; - goto out; - } - } + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_REMOVE_BRICK]; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_REMOVE_BRICK]; + CLI_LOCAL_INIT(local, words, frame, options); - CLI_LOCAL_INIT (local, words, frame, options); - - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume remove-brick failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume remove-brick failed"); + } #if (USE_EVENTS) - if (!ret && !event_ret) - gf_event (event, "%s", event_str); - if (event_str) - GF_FREE (event_str); + if (!ret && !event_ret) + gf_event(event, "%s", event_str); + if (event_str) + GF_FREE(event_str); #endif - CLI_STACK_DESTROY (frame); - - - return ret; + CLI_STACK_DESTROY(frame); + return ret; } int -cli_cmd_volume_reset_brick_cbk (struct cli_state *state, - struct cli_cmd_word *word, - const char **words, - int wordcount) +cli_cmd_volume_reset_brick_cbk(struct cli_state *state, + struct cli_cmd_word *word, const char **words, + int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - int sent = 0; - int parse_error = 0; - cli_local_t *local = NULL; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + 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"); - goto out; + cli_out("Command not supported on Solaris"); + goto out; #endif - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_RESET_BRICK]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_RESET_BRICK]; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; + ret = cli_cmd_volume_reset_brick_parse(words, wordcount, &options); - ret = cli_cmd_volume_reset_brick_parse (words, wordcount, &options); + if (ret) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } + if (state->mode & GLUSTER_MODE_WIGNORE_PARTITION) { + ret = dict_set_int32(options, "ignore-partition", _gf_true); if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; + gf_log("cli", GF_LOG_ERROR, + "Failed to set ignore-" + "partition option"); + goto out; } + } - if (state->mode & GLUSTER_MODE_WIGNORE_PARTITION) { - ret = dict_set_int32 (options, "ignore-partition", _gf_true); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set ignore-" - "partition option"); - goto out; - } - } + CLI_LOCAL_INIT(local, words, frame, options); - CLI_LOCAL_INIT (local, words, frame, options); - - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume reset-brick failed"); + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume reset-brick failed"); + } else { + if (wordcount > 5) { + gf_event(EVENT_BRICK_RESET_COMMIT, + "Volume=%s;source-brick=%s;" + "destination-brick=%s", + (char *)words[2], (char *)words[3], (char *)words[4]); } else { - if (wordcount > 5) { - gf_event (EVENT_BRICK_RESET_COMMIT, - "Volume=%s;source-brick=%s;" - "destination-brick=%s", - (char *)words[2], (char *)words[3], - (char *)words[4]); - } else { - gf_event (EVENT_BRICK_RESET_START, - "Volume=%s;source-brick=%s", - (char *)words[2], (char *)words[3]); - } + gf_event(EVENT_BRICK_RESET_START, "Volume=%s;source-brick=%s", + (char *)words[2], (char *)words[3]); } - CLI_STACK_DESTROY (frame); + } + CLI_STACK_DESTROY(frame); - return ret; + return ret; } int -cli_cmd_volume_replace_brick_cbk (struct cli_state *state, - struct cli_cmd_word *word, - const char **words, - int wordcount) +cli_cmd_volume_replace_brick_cbk(struct cli_state *state, + struct cli_cmd_word *word, const char **words, + int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - int sent = 0; - int parse_error = 0; - cli_local_t *local = NULL; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + 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"); - goto out; + cli_out("Command not supported on Solaris"); + goto out; #endif - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_REPLACE_BRICK]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_REPLACE_BRICK]; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - ret = cli_cmd_volume_replace_brick_parse (words, wordcount, &options); + ret = cli_cmd_volume_replace_brick_parse(words, wordcount, &options); - if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + if (ret) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume replace-brick failed"); - } else { - gf_event (EVENT_BRICK_REPLACE, - "Volume=%s;source-brick=%s;destination-brick=%s", - (char *)words[2], (char *)words[3], (char *)words[4]); - } - CLI_STACK_DESTROY (frame); - - return ret; + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume replace-brick failed"); + } else { + gf_event(EVENT_BRICK_REPLACE, + "Volume=%s;source-brick=%s;destination-brick=%s", + (char *)words[2], (char *)words[3], (char *)words[4]); + } + CLI_STACK_DESTROY(frame); + + return ret; } - int -cli_cmd_volume_set_transport_cbk (struct cli_state *state, - struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_set_transport_cbk(struct cli_state *state, + struct cli_cmd_word *word, const char **words, + int wordcount) { - cli_cmd_broadcast_response (0); - return 0; + cli_cmd_broadcast_response(0); + return 0; } int -cli_cmd_volume_top_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_top_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + 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); + + if (ret) { + parse_error = 1; + cli_usage_out(word->pattern); + goto out; + } - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - 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); - - if (ret) { - parse_error = 1; - cli_usage_out (word->pattern); - goto out; - } - - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_TOP_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_TOP_VOLUME]; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume top failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume top failed"); + } - CLI_STACK_DESTROY (frame); - - return ret; + CLI_STACK_DESTROY(frame); + return ret; } - int -cli_cmd_log_rotate_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_log_rotate_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - 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); - parse_error = 1; - goto out; - } + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + 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); + parse_error = 1; + goto out; + } - if (!((strcmp ("rotate", words[2]) == 0) || - (strcmp ("rotate", words[3]) == 0))) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + if (!((strcmp("rotate", words[2]) == 0) || + (strcmp("rotate", words[3]) == 0))) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_LOG_ROTATE]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_LOG_ROTATE]; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - ret = cli_cmd_log_rotate_parse (words, wordcount, &options); - if (ret) - goto out; + ret = cli_cmd_log_rotate_parse(words, wordcount, &options); + if (ret) + goto out; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - 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; + 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; } #if (SYNCDAEMON_COMPILE) static int -cli_check_gsync_present () +cli_check_gsync_present() { - char buff[PATH_MAX] = {0, }; - runner_t runner = {0,}; - char *ptr = NULL; - int ret = 0; - - ret = setenv ("_GLUSTERD_CALLED_", "1", 1); - if (-1 == ret) { - gf_log ("", GF_LOG_WARNING, "setenv syscall failed, hence could" - "not assert if geo-replication is installed"); - goto out; - } - - runinit (&runner); - runner_add_args (&runner, GSYNCD_PREFIX"/gsyncd", "--version", NULL); - runner_redir (&runner, STDOUT_FILENO, RUN_PIPE); - ret = runner_start (&runner); - if (ret == -1) { - gf_log ("", GF_LOG_INFO, "geo-replication not installed"); - goto out; - } + char buff[PATH_MAX] = { + 0, + }; + runner_t runner = { + 0, + }; + char *ptr = NULL; + int ret = 0; + + ret = setenv("_GLUSTERD_CALLED_", "1", 1); + if (-1 == ret) { + gf_log("", GF_LOG_WARNING, + "setenv syscall failed, hence could" + "not assert if geo-replication is installed"); + goto out; + } + + runinit(&runner); + runner_add_args(&runner, GSYNCD_PREFIX "/gsyncd", "--version", NULL); + runner_redir(&runner, STDOUT_FILENO, RUN_PIPE); + ret = runner_start(&runner); + if (ret == -1) { + gf_log("", GF_LOG_INFO, "geo-replication not installed"); + goto out; + } - ptr = fgets(buff, sizeof(buff), runner_chio (&runner, STDOUT_FILENO)); - if (ptr) { - if (!strstr (buff, "gsyncd")) { - ret = -1; - goto out; - } - } else { - ret = -1; - goto out; + ptr = fgets(buff, sizeof(buff), runner_chio(&runner, STDOUT_FILENO)); + if (ptr) { + if (!strstr(buff, "gsyncd")) { + ret = -1; + goto out; } + } else { + ret = -1; + goto out; + } - ret = runner_end (&runner); + ret = runner_end(&runner); - if (ret) - gf_log ("", GF_LOG_ERROR, "geo-replication not installed"); + if (ret) + gf_log("", GF_LOG_ERROR, "geo-replication not installed"); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret ? -1 : 0; - + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret ? -1 : 0; } void -cli_cmd_check_gsync_exists_cbk (struct cli_cmd *this) +cli_cmd_check_gsync_exists_cbk(struct cli_cmd *this) { + int ret = 0; - int ret = 0; - - ret = cli_check_gsync_present (); - if (ret) - this->disable = _gf_true; - + ret = cli_check_gsync_present(); + if (ret) + this->disable = _gf_true; } #endif int -cli_cmd_volume_gsync_set_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_gsync_set_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = 0; - int parse_err = 0; - dict_t *options = NULL; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - cli_local_t *local = NULL; + int ret = 0; + int parse_err = 0; + dict_t *options = NULL; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + cli_local_t *local = NULL; #if (USE_EVENTS) - int ret1 = -1; - int cmd_type = -1; - int tmpi = 0; - char *tmp = NULL; - char *events_str = NULL; - int event_type = -1; + int ret1 = -1; + int cmd_type = -1; + int tmpi = 0; + char *tmp = NULL; + char *events_str = NULL; + int event_type = -1; #endif - proc = &cli_rpc_prog->proctable [GLUSTER_CLI_GSYNC_SET]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GSYNC_SET]; - frame = create_frame (THIS, THIS->ctx->pool); - if (frame == NULL) { - ret = -1; - goto out; - } + frame = create_frame(THIS, THIS->ctx->pool); + if (frame == NULL) { + ret = -1; + goto out; + } - ret = cli_cmd_gsync_set_parse (words, wordcount, &options); - if (ret) { - cli_usage_out (word->pattern); - parse_err = 1; - goto out; - } + ret = cli_cmd_gsync_set_parse(words, wordcount, &options); + if (ret) { + cli_usage_out(word->pattern); + parse_err = 1; + goto out; + } - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) - ret = proc->fn (frame, THIS, options); + if (proc->fn) + ret = proc->fn(frame, THIS, options); out: - if (ret && parse_err == 0) - cli_out (GEOREP" command failed"); + if (ret && parse_err == 0) + cli_out(GEOREP " command failed"); #if (USE_EVENTS) - if (ret == 0) { - events_str = gf_strdup (""); - - /* Type of Geo-rep Action - Create, Start etc */ - ret1 = dict_get_int32 (options, "type", &cmd_type); + if (ret == 0) { + events_str = gf_strdup(""); + + /* Type of Geo-rep Action - Create, Start etc */ + ret1 = dict_get_int32(options, "type", &cmd_type); + if (ret1) + cmd_type = -1; + + /* Only capture Events for modification commands */ + switch (cmd_type) { + case GF_GSYNC_OPTION_TYPE_CREATE: + event_type = EVENT_GEOREP_CREATE; + break; + case GF_GSYNC_OPTION_TYPE_START: + event_type = EVENT_GEOREP_START; + break; + case GF_GSYNC_OPTION_TYPE_STOP: + event_type = EVENT_GEOREP_STOP; + break; + case GF_GSYNC_OPTION_TYPE_PAUSE: + event_type = EVENT_GEOREP_PAUSE; + break; + case GF_GSYNC_OPTION_TYPE_RESUME: + event_type = EVENT_GEOREP_RESUME; + break; + case GF_GSYNC_OPTION_TYPE_DELETE: + event_type = EVENT_GEOREP_DELETE; + break; + case GF_GSYNC_OPTION_TYPE_CONFIG: + ret1 = dict_get_str(options, "subop", &tmp); if (ret1) - cmd_type = -1; - - /* Only capture Events for modification commands */ - switch (cmd_type) { - case GF_GSYNC_OPTION_TYPE_CREATE: - event_type = EVENT_GEOREP_CREATE; - break; - case GF_GSYNC_OPTION_TYPE_START: - event_type = EVENT_GEOREP_START; - break; - case GF_GSYNC_OPTION_TYPE_STOP: - event_type = EVENT_GEOREP_STOP; - break; - case GF_GSYNC_OPTION_TYPE_PAUSE: - event_type = EVENT_GEOREP_PAUSE; - break; - case GF_GSYNC_OPTION_TYPE_RESUME: - event_type = EVENT_GEOREP_RESUME; - break; - case GF_GSYNC_OPTION_TYPE_DELETE: - event_type = EVENT_GEOREP_DELETE; - break; - case GF_GSYNC_OPTION_TYPE_CONFIG: - ret1 = dict_get_str (options, "subop", &tmp); - if (ret1) - tmp = ""; - - /* For Config Set additionally capture key and value */ - /* For Config Reset capture key */ - if (strcmp (tmp, "set") == 0) { - event_type = EVENT_GEOREP_CONFIG_SET; - - ret1 = dict_get_str (options, "op_name", &tmp); - if (ret1) - tmp = ""; - - gf_asprintf (&events_str, "%soption=%s;", - events_str, tmp); - - ret1 = dict_get_str (options, "op_value", &tmp); - if (ret1) - tmp = ""; - - gf_asprintf (&events_str, "%svalue=%s;", - events_str, tmp); - } else if (strcmp (tmp, "del") == 0) { - event_type = EVENT_GEOREP_CONFIG_RESET; - - ret1 = dict_get_str (options, "op_name", &tmp); - if (ret1) - tmp = ""; - - gf_asprintf (&events_str, "%soption=%s;", - events_str, tmp); - } - break; - default: - break; - } + tmp = ""; - if (event_type > -1) { - /* Capture all optional arguments used */ - ret1 = dict_get_int32 (options, "force", &tmpi); - if (ret1 == 0) - gf_asprintf (&events_str, "%sforce=%d;", - events_str, tmpi); - - ret1 = dict_get_int32 (options, "push_pem", &tmpi); - if (ret1 == 0) - gf_asprintf (&events_str, "%spush_pem=%d;", - events_str, tmpi); - - ret1 = dict_get_int32 (options, "no_verify", &tmpi); - if (ret1 == 0) - gf_asprintf (&events_str, "%sno_verify=%d;", - events_str, tmpi); - - ret1 = dict_get_int32 (options, "ssh_port", &tmpi); - if (ret1 == 0) - gf_asprintf (&events_str, "%sssh_port=%d;", - events_str, tmpi); - - ret1 = dict_get_int32 (options, "reset-sync-time", - &tmpi); - if (ret1 == 0) - gf_asprintf (&events_str, - "%sreset_sync_time=%d;", - events_str, tmpi); - - /* Capture Master and Slave Info */ - ret1 = dict_get_str (options, "master", &tmp); - if (ret1) - tmp = ""; - gf_asprintf (&events_str, "%smaster=%s;", - events_str, tmp); - - ret1 = dict_get_str (options, "slave", &tmp); - if (ret1) - tmp = ""; - gf_asprintf (&events_str, "%sslave=%s", - events_str, tmp); - - gf_event (event_type, "%s", events_str); - } + /* For Config Set additionally capture key and value */ + /* For Config Reset capture key */ + if (strcmp(tmp, "set") == 0) { + event_type = EVENT_GEOREP_CONFIG_SET; - /* Allocated by gf_strdup and gf_asprintf */ - GF_FREE (events_str); - } -#endif + ret1 = dict_get_str(options, "op_name", &tmp); + if (ret1) + tmp = ""; - CLI_STACK_DESTROY (frame); + gf_asprintf(&events_str, "%soption=%s;", events_str, tmp); - return ret; -} + ret1 = dict_get_str(options, "op_value", &tmp); + if (ret1) + tmp = ""; -int -cli_cmd_volume_status_cbk (struct cli_state *state, - struct cli_cmd_word *word, - const char **words, int wordcount) -{ - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *dict = NULL; - uint32_t cmd = 0; - cli_local_t *local = NULL; + gf_asprintf(&events_str, "%svalue=%s;", events_str, tmp); + } else if (strcmp(tmp, "del") == 0) { + event_type = EVENT_GEOREP_CONFIG_RESET; - ret = cli_cmd_volume_status_parse (words, wordcount, &dict); + ret1 = dict_get_str(options, "op_name", &tmp); + if (ret1) + tmp = ""; - if (ret) { - cli_usage_out (word->pattern); - goto out; + gf_asprintf(&events_str, "%soption=%s;", events_str, tmp); + } + break; + default: + break; } - ret = dict_get_uint32 (dict, "cmd", &cmd); - if (ret) - goto out; - - if (!(cmd & GF_CLI_STATUS_ALL)) { - /* for one volume or brick */ - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_STATUS_VOLUME]; - } else { - /* volume status all or all detail */ - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_STATUS_ALL]; - } + if (event_type > -1) { + /* Capture all optional arguments used */ + ret1 = dict_get_int32(options, "force", &tmpi); + if (ret1 == 0) + gf_asprintf(&events_str, "%sforce=%d;", events_str, tmpi); - if (!proc->fn) - goto out; + ret1 = dict_get_int32(options, "push_pem", &tmpi); + if (ret1 == 0) + gf_asprintf(&events_str, "%spush_pem=%d;", events_str, tmpi); - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + ret1 = dict_get_int32(options, "no_verify", &tmpi); + if (ret1 == 0) + gf_asprintf(&events_str, "%sno_verify=%d;", events_str, tmpi); - CLI_LOCAL_INIT (local, words, frame, dict); + ret1 = dict_get_int32(options, "ssh_port", &tmpi); + if (ret1 == 0) + gf_asprintf(&events_str, "%sssh_port=%d;", events_str, tmpi); - ret = proc->fn (frame, THIS, dict); + ret1 = dict_get_int32(options, "reset-sync-time", &tmpi); + if (ret1 == 0) + gf_asprintf(&events_str, "%sreset_sync_time=%d;", events_str, + tmpi); -out: - CLI_STACK_DESTROY (frame); + /* Capture Master and Slave Info */ + ret1 = dict_get_str(options, "master", &tmp); + if (ret1) + tmp = ""; + gf_asprintf(&events_str, "%smaster=%s;", events_str, tmp); - return ret; -} + ret1 = dict_get_str(options, "slave", &tmp); + if (ret1) + tmp = ""; + gf_asprintf(&events_str, "%sslave=%s", events_str, tmp); + gf_event(event_type, "%s", events_str); + } -int -cli_get_detail_status (dict_t *dict, int i, cli_volume_status_t *status) -{ - uint64_t free = 0; - uint64_t total = 0; - char key[1024] = {0}; - int ret = 0; + /* Allocated by gf_strdup and gf_asprintf */ + GF_FREE(events_str); + } +#endif - snprintf (key, sizeof (key), "brick%d.free", i); - ret = dict_get_uint64 (dict, key, &free); + CLI_STACK_DESTROY(frame); - status->free = gf_uint64_2human_readable (free); - if (!status->free) - goto out; + return ret; +} - snprintf (key, sizeof (key), "brick%d.total", i); - ret = dict_get_uint64 (dict, key, &total); +int +cli_cmd_volume_status_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) +{ + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *dict = NULL; + uint32_t cmd = 0; + cli_local_t *local = NULL; - status->total = gf_uint64_2human_readable (total); - if (!status->total) - goto out; + ret = cli_cmd_volume_status_parse(words, wordcount, &dict); - snprintf (key, sizeof (key), "brick%d.device", i); - ret = dict_get_str (dict, key, &(status->device)); - if (ret) - status->device = NULL; + if (ret) { + cli_usage_out(word->pattern); + goto out; + } - snprintf (key, sizeof (key), "brick%d.block_size", i); - ret = dict_get_uint64 (dict, key, &(status->block_size)); - if (ret) { - ret = 0; - status->block_size = 0; - } + ret = dict_get_uint32(dict, "cmd", &cmd); + if (ret) + goto out; - snprintf (key, sizeof (key), "brick%d.mnt_options", i); - ret = dict_get_str (dict, key, &(status->mount_options)); - if (ret) - status->mount_options = NULL; + if (!(cmd & GF_CLI_STATUS_ALL)) { + /* for one volume or brick */ + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_STATUS_VOLUME]; + } else { + /* volume status all or all detail */ + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_STATUS_ALL]; + } - snprintf (key, sizeof (key), "brick%d.fs_name", i); - ret = dict_get_str (dict, key, &(status->fs_name)); - if (ret) { - ret = 0; - status->fs_name = NULL; - } + if (!proc->fn) + goto out; - snprintf (key, sizeof (key), "brick%d.inode_size", i); - ret = dict_get_str (dict, key, &(status->inode_size)); - if (ret) - status->inode_size = NULL; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - snprintf (key, sizeof (key), "brick%d.total_inodes", i); - ret = dict_get_uint64 (dict, key, - &(status->total_inodes)); - if (ret) - status->total_inodes = 0; + CLI_LOCAL_INIT(local, words, frame, dict); - snprintf (key, sizeof (key), "brick%d.free_inodes", i); - ret = dict_get_uint64 (dict, key, &(status->free_inodes)); - if (ret) { - ret = 0; - status->free_inodes = 0; - } + ret = proc->fn(frame, THIS, dict); +out: + CLI_STACK_DESTROY(frame); - out: - return ret; + return ret; } -void -cli_print_detailed_status (cli_volume_status_t *status) +int +cli_get_detail_status(dict_t *dict, int i, cli_volume_status_t *status) { - cli_out ("%-20s : %-20s", "Brick", status->brick); + uint64_t free = 0; + uint64_t total = 0; + char key[1024] = {0}; + int ret = 0; - if (status->online) { - cli_out ("%-20s : %-20d", "TCP Port", status->port); - cli_out ("%-20s : %-20d", "RDMA Port", status->rdma_port); - } else { - cli_out ("%-20s : %-20s", "TCP Port", "N/A"); - cli_out ("%-20s : %-20s", "RDMA Port", "N/A"); - } + snprintf(key, sizeof(key), "brick%d.free", i); + ret = dict_get_uint64(dict, key, &free); - cli_out ("%-20s : %-20c", "Online", (status->online) ? 'Y' : 'N'); - cli_out ("%-20s : %-20s", "Pid", status->pid_str); + status->free = gf_uint64_2human_readable(free); + if (!status->free) + goto out; - if (status->fs_name) - cli_out ("%-20s : %-20s", "File System", status->fs_name); - else - cli_out ("%-20s : %-20s", "File System", "N/A"); + snprintf(key, sizeof(key), "brick%d.total", i); + ret = dict_get_uint64(dict, key, &total); - if (status->device) - cli_out ("%-20s : %-20s", "Device", status->device); - else - cli_out ("%-20s : %-20s", "Device", "N/A"); + status->total = gf_uint64_2human_readable(total); + if (!status->total) + goto out; - if (status->mount_options) { - cli_out ("%-20s : %-20s", "Mount Options", - status->mount_options); - } else { - cli_out ("%-20s : %-20s", "Mount Options", "N/A"); - } + snprintf(key, sizeof(key), "brick%d.device", i); + ret = dict_get_str(dict, key, &(status->device)); + if (ret) + status->device = NULL; - if (status->inode_size) { - cli_out ("%-20s : %-20s", "Inode Size", - status->inode_size); - } else { - cli_out ("%-20s : %-20s", "Inode Size", "N/A"); - } - if (status->free) - cli_out ("%-20s : %-20s", "Disk Space Free", status->free); - else - cli_out ("%-20s : %-20s", "Disk Space Free", "N/A"); + snprintf(key, sizeof(key), "brick%d.block_size", i); + ret = dict_get_uint64(dict, key, &(status->block_size)); + if (ret) { + ret = 0; + status->block_size = 0; + } - if (status->total) - cli_out ("%-20s : %-20s", "Total Disk Space", status->total); - else - cli_out ("%-20s : %-20s", "Total Disk Space", "N/A"); + snprintf(key, sizeof(key), "brick%d.mnt_options", i); + ret = dict_get_str(dict, key, &(status->mount_options)); + if (ret) + status->mount_options = NULL; + snprintf(key, sizeof(key), "brick%d.fs_name", i); + ret = dict_get_str(dict, key, &(status->fs_name)); + if (ret) { + ret = 0; + status->fs_name = NULL; + } + + snprintf(key, sizeof(key), "brick%d.inode_size", i); + ret = dict_get_str(dict, key, &(status->inode_size)); + if (ret) + status->inode_size = NULL; + + snprintf(key, sizeof(key), "brick%d.total_inodes", i); + ret = dict_get_uint64(dict, key, &(status->total_inodes)); + if (ret) + status->total_inodes = 0; + + snprintf(key, sizeof(key), "brick%d.free_inodes", i); + ret = dict_get_uint64(dict, key, &(status->free_inodes)); + if (ret) { + ret = 0; + status->free_inodes = 0; + } - if (status->total_inodes) { - cli_out ("%-20s : %-20"GF_PRI_INODE, "Inode Count", - status->total_inodes); - } else { - cli_out ("%-20s : %-20s", "Inode Count", "N/A"); - } +out: + return ret; +} - if (status->free_inodes) { - cli_out ("%-20s : %-20"GF_PRI_INODE, "Free Inodes", - status->free_inodes); - } else { - cli_out ("%-20s : %-20s", "Free Inodes", "N/A"); - } +void +cli_print_detailed_status(cli_volume_status_t *status) +{ + cli_out("%-20s : %-20s", "Brick", status->brick); + + if (status->online) { + cli_out("%-20s : %-20d", "TCP Port", status->port); + cli_out("%-20s : %-20d", "RDMA Port", status->rdma_port); + } else { + cli_out("%-20s : %-20s", "TCP Port", "N/A"); + cli_out("%-20s : %-20s", "RDMA Port", "N/A"); + } + + cli_out("%-20s : %-20c", "Online", (status->online) ? 'Y' : 'N'); + cli_out("%-20s : %-20s", "Pid", status->pid_str); + + if (status->fs_name) + cli_out("%-20s : %-20s", "File System", status->fs_name); + else + cli_out("%-20s : %-20s", "File System", "N/A"); + + if (status->device) + cli_out("%-20s : %-20s", "Device", status->device); + else + cli_out("%-20s : %-20s", "Device", "N/A"); + + if (status->mount_options) { + cli_out("%-20s : %-20s", "Mount Options", status->mount_options); + } else { + cli_out("%-20s : %-20s", "Mount Options", "N/A"); + } + + if (status->inode_size) { + cli_out("%-20s : %-20s", "Inode Size", status->inode_size); + } else { + cli_out("%-20s : %-20s", "Inode Size", "N/A"); + } + if (status->free) + cli_out("%-20s : %-20s", "Disk Space Free", status->free); + else + cli_out("%-20s : %-20s", "Disk Space Free", "N/A"); + + if (status->total) + cli_out("%-20s : %-20s", "Total Disk Space", status->total); + else + cli_out("%-20s : %-20s", "Total Disk Space", "N/A"); + + if (status->total_inodes) { + cli_out("%-20s : %-20" GF_PRI_INODE, "Inode Count", + status->total_inodes); + } else { + cli_out("%-20s : %-20s", "Inode Count", "N/A"); + } + + if (status->free_inodes) { + cli_out("%-20s : %-20" GF_PRI_INODE, "Free Inodes", + status->free_inodes); + } else { + cli_out("%-20s : %-20s", "Free Inodes", "N/A"); + } } int -cli_print_brick_status (cli_volume_status_t *status) +cli_print_brick_status(cli_volume_status_t *status) { - int fieldlen = CLI_VOL_STATUS_BRICK_LEN; - int bricklen = 0; - char *p = NULL; - int num_spaces = 0; - - p = status->brick; - bricklen = strlen (p); - while (bricklen > 0) { - if (bricklen > fieldlen) { - cli_out ("%.*s", fieldlen, p); - p += fieldlen; - bricklen -= fieldlen; - } else { - num_spaces = (fieldlen - bricklen) + 1; - printf ("%s", p); - while (num_spaces-- != 0) - printf (" "); - if (status->port || status->rdma_port) { - if (status->online) - cli_out ("%-10d%-11d%-8c%-5s", - status->port, - status->rdma_port, - status->online?'Y':'N', - status->pid_str); - else - cli_out ("%-10s%-11s%-8c%-5s", - "N/A", - "N/A", - status->online?'Y':'N', - status->pid_str); - } - else - cli_out ("%-10s%-11s%-8c%-5s", - "N/A", "N/A", status->online?'Y':'N', - status->pid_str); - bricklen = 0; - } + int fieldlen = CLI_VOL_STATUS_BRICK_LEN; + int bricklen = 0; + char *p = NULL; + int num_spaces = 0; + + p = status->brick; + bricklen = strlen(p); + while (bricklen > 0) { + if (bricklen > fieldlen) { + cli_out("%.*s", fieldlen, p); + p += fieldlen; + bricklen -= fieldlen; + } else { + num_spaces = (fieldlen - bricklen) + 1; + printf("%s", p); + while (num_spaces-- != 0) + printf(" "); + if (status->port || status->rdma_port) { + if (status->online) + cli_out("%-10d%-11d%-8c%-5s", status->port, + status->rdma_port, status->online ? 'Y' : 'N', + status->pid_str); + else + cli_out("%-10s%-11s%-8c%-5s", "N/A", "N/A", + status->online ? 'Y' : 'N', status->pid_str); + } else + cli_out("%-10s%-11s%-8c%-5s", "N/A", "N/A", + status->online ? 'Y' : 'N', status->pid_str); + bricklen = 0; } + } - return 0; + return 0; } -#define NEEDS_GLFS_HEAL(op) ((op == GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE) || \ - (op == GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME) ||\ - (op == GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK) || \ - (op == GF_SHD_OP_INDEX_SUMMARY) || \ - (op == GF_SHD_OP_SPLIT_BRAIN_FILES) || \ - (op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE) || \ - (op == GF_SHD_OP_HEAL_SUMMARY)) +#define NEEDS_GLFS_HEAL(op) \ + ((op == GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE) || \ + (op == GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME) || \ + (op == GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK) || \ + (op == GF_SHD_OP_INDEX_SUMMARY) || (op == GF_SHD_OP_SPLIT_BRAIN_FILES) || \ + (op == GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE) || \ + (op == GF_SHD_OP_HEAL_SUMMARY)) int -cli_launch_glfs_heal (int heal_op, dict_t *options) +cli_launch_glfs_heal(int heal_op, dict_t *options) { - char buff[PATH_MAX] = {0}; - runner_t runner = {0}; - char *filename = NULL; - char *hostname = NULL; - char *path = NULL; - char *volname = NULL; - char *out = NULL; - int ret = 0; - - runinit (&runner); - ret = dict_get_str (options, "volname", &volname); - runner_add_args (&runner, SBIN_DIR"/glfsheal", volname, NULL); - runner_redir (&runner, STDOUT_FILENO, RUN_PIPE); - - switch (heal_op) { + char buff[PATH_MAX] = {0}; + runner_t runner = {0}; + char *filename = NULL; + char *hostname = NULL; + char *path = NULL; + char *volname = NULL; + char *out = NULL; + int ret = 0; + + runinit(&runner); + ret = dict_get_str(options, "volname", &volname); + runner_add_args(&runner, SBIN_DIR "/glfsheal", volname, NULL); + runner_redir(&runner, STDOUT_FILENO, RUN_PIPE); + + switch (heal_op) { case GF_SHD_OP_INDEX_SUMMARY: - if (global_state->mode & GLUSTER_MODE_XML) { - runner_add_args (&runner, "xml", NULL); - } - break; + if (global_state->mode & GLUSTER_MODE_XML) { + runner_add_args(&runner, "xml", NULL); + } + break; case GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE: - ret = dict_get_str (options, "file", &filename); - runner_add_args (&runner, "bigger-file", filename, NULL); - break; + ret = dict_get_str(options, "file", &filename); + runner_add_args(&runner, "bigger-file", filename, NULL); + break; case GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME: - ret = dict_get_str (options, "file", &filename); - runner_add_args (&runner, "latest-mtime", filename, NULL); - break; + ret = dict_get_str(options, "file", &filename); + runner_add_args(&runner, "latest-mtime", filename, NULL); + break; case GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK: - ret = dict_get_str (options, "heal-source-hostname", - &hostname); - ret = dict_get_str (options, "heal-source-brickpath", - &path); - runner_add_args (&runner, "source-brick", NULL); - runner_argprintf (&runner, "%s:%s", hostname, path); - if (dict_get_str (options, "file", &filename) == 0) - runner_argprintf (&runner, filename); - break; + ret = dict_get_str(options, "heal-source-hostname", &hostname); + ret = dict_get_str(options, "heal-source-brickpath", &path); + runner_add_args(&runner, "source-brick", NULL); + runner_argprintf(&runner, "%s:%s", hostname, path); + if (dict_get_str(options, "file", &filename) == 0) + runner_argprintf(&runner, filename); + break; case GF_SHD_OP_SPLIT_BRAIN_FILES: - runner_add_args (&runner, "split-brain-info", NULL); - if (global_state->mode & GLUSTER_MODE_XML) { - runner_add_args (&runner, "xml", NULL); - } - break; + runner_add_args(&runner, "split-brain-info", NULL); + if (global_state->mode & GLUSTER_MODE_XML) { + runner_add_args(&runner, "xml", NULL); + } + break; case GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE: case GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE: - runner_add_args (&runner, "granular-entry-heal-op", NULL); - break; + runner_add_args(&runner, "granular-entry-heal-op", NULL); + break; case GF_SHD_OP_HEAL_SUMMARY: - runner_add_args (&runner, "info-summary", NULL); - if (global_state->mode & GLUSTER_MODE_XML) { - runner_add_args (&runner, "xml", NULL); - } - break; + runner_add_args(&runner, "info-summary", NULL); + if (global_state->mode & GLUSTER_MODE_XML) { + runner_add_args(&runner, "xml", NULL); + } + break; default: - ret = -1; - goto out; - } - ret = runner_start (&runner); - if (ret == -1) - goto out; - while ((out = fgets (buff, sizeof(buff), - runner_chio (&runner, STDOUT_FILENO)))) { - printf ("%s", out); - } - ret = runner_end (&runner); + ret = -1; + goto out; + } + ret = runner_start(&runner); + if (ret == -1) + goto out; + while (( + out = fgets(buff, sizeof(buff), runner_chio(&runner, STDOUT_FILENO)))) { + printf("%s", out); + } + ret = runner_end(&runner); out: - return ret; + return ret; } int -cli_cmd_volume_heal_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_heal_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - int sent = 0; - int parse_error = 0; - dict_t *options = NULL; - xlator_t *this = NULL; - cli_local_t *local = NULL; - int heal_op = 0; - - this = THIS; - frame = create_frame (this, this->ctx->pool); - if (!frame) - goto out; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + int sent = 0; + int parse_error = 0; + dict_t *options = NULL; + xlator_t *this = NULL; + cli_local_t *local = NULL; + int heal_op = 0; + + this = THIS; + frame = create_frame(this, this->ctx->pool); + if (!frame) + goto out; - if (wordcount < 3) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + if (wordcount < 3) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - ret = cli_cmd_volume_heal_options_parse (words, wordcount, &options); - if (ret) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } - ret = dict_get_int32 (options, "heal-op", &heal_op); + ret = cli_cmd_volume_heal_options_parse(words, wordcount, &options); + if (ret) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } + ret = dict_get_int32(options, "heal-op", &heal_op); + if (ret < 0) + goto out; + if (NEEDS_GLFS_HEAL(heal_op)) { + ret = cli_launch_glfs_heal(heal_op, options); if (ret < 0) - goto out; - if (NEEDS_GLFS_HEAL (heal_op)) { - ret = cli_launch_glfs_heal (heal_op, options); - if (ret < 0) - goto out; - if (heal_op != GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE) - goto out; - } + goto out; + if (heal_op != GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE) + goto out; + } - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_HEAL_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_HEAL_VOLUME]; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0) && - !(global_state->mode & GLUSTER_MODE_XML)) { - cli_out ("Volume heal failed."); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0) && + !(global_state->mode & GLUSTER_MODE_XML)) { + cli_out("Volume heal failed."); } + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } int -cli_cmd_volume_statedump_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_statedump_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - 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; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + 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; - if (wordcount < 3) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + if (wordcount < 3) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - if (wordcount >= 3) { - ret = cli_cmd_volume_statedump_options_parse (words, wordcount, - &options); - if (ret) { - parse_error = 1; - gf_log ("cli", GF_LOG_ERROR, "Error parsing " - "statedump options"); - cli_out ("Error parsing options"); - cli_usage_out (word->pattern); - } + if (wordcount >= 3) { + ret = cli_cmd_volume_statedump_options_parse(words, wordcount, + &options); + if (ret) { + parse_error = 1; + gf_log("cli", GF_LOG_ERROR, + "Error parsing " + "statedump options"); + cli_out("Error parsing options"); + cli_usage_out(word->pattern); } + } - ret = dict_set_str (options, "volname", (char *)words[2]); - if (ret) - goto out; + ret = dict_set_str(options, "volname", (char *)words[2]); + if (ret) + goto out; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_STATEDUMP_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_STATEDUMP_VOLUME]; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume statedump failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume statedump failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } int -cli_cmd_volume_list_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_list_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - call_frame_t *frame = NULL; - rpc_clnt_procedure_t *proc = NULL; - int sent = 0; + int ret = -1; + call_frame_t *frame = NULL; + rpc_clnt_procedure_t *proc = NULL; + int sent = 0; - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_LIST_VOLUME]; - if (proc->fn) { - ret = proc->fn (frame, THIS, NULL); - } + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_LIST_VOLUME]; + if (proc->fn) { + ret = proc->fn(frame, THIS, NULL); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if (sent == 0) - cli_out ("Volume list failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if (sent == 0) + cli_out("Volume list failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } int -cli_cmd_volume_clearlocks_cbk (struct cli_state *state, - struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_clearlocks_cbk(struct cli_state *state, + struct cli_cmd_word *word, const char **words, + int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - 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; - - if (wordcount < 7 || wordcount > 8) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } - - ret = cli_cmd_volume_clrlks_opts_parse (words, wordcount, &options); - if (ret) { - parse_error = 1; - gf_log ("cli", GF_LOG_ERROR, "Error parsing " - "clear-locks options"); - cli_out ("Error parsing options"); - cli_usage_out (word->pattern); - } + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + 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; - ret = dict_set_str (options, "volname", (char *)words[2]); - if (ret) - goto out; + if (wordcount < 7 || wordcount > 8) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } + + ret = cli_cmd_volume_clrlks_opts_parse(words, wordcount, &options); + if (ret) { + parse_error = 1; + gf_log("cli", GF_LOG_ERROR, + "Error parsing " + "clear-locks options"); + cli_out("Error parsing options"); + cli_usage_out(word->pattern); + } + + ret = dict_set_str(options, "volname", (char *)words[2]); + if (ret) + goto out; - ret = dict_set_str (options, "path", (char *)words[3]); - if (ret) - goto out; + ret = dict_set_str(options, "path", (char *)words[3]); + if (ret) + goto out; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_CLRLOCKS_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_CLRLOCKS_VOLUME]; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) { - ret = proc->fn (frame, THIS, options); - } + if (proc->fn) { + ret = proc->fn(frame, THIS, options); + } out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_out ("Volume clear-locks failed"); - } + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_out("Volume clear-locks failed"); + } - CLI_STACK_DESTROY (frame); + CLI_STACK_DESTROY(frame); - return ret; + return ret; } int -cli_cmd_volume_barrier_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_barrier_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - 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; + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + 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; - if (wordcount != 4) { - cli_usage_out (word->pattern); - parse_error = 1; - goto out; - } + if (wordcount != 4) { + cli_usage_out(word->pattern); + parse_error = 1; + goto out; + } - options = dict_new(); - if (!options) { - ret = -1; - goto out; - } - ret = dict_set_str(options, "volname", (char *)words[2]); - if (ret) - goto out; + options = dict_new(); + if (!options) { + ret = -1; + goto out; + } + ret = dict_set_str(options, "volname", (char *)words[2]); + if (ret) + goto out; - ret = dict_set_str (options, "barrier", (char *)words[3]); - if (ret) - goto out; + ret = dict_set_str(options, "barrier", (char *)words[3]); + if (ret) + goto out; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_BARRIER_VOLUME]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_BARRIER_VOLUME]; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) - ret = proc->fn (frame, THIS, options); + if (proc->fn) + ret = proc->fn(frame, THIS, options); out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_error == 0)) - cli_err ("Volume barrier failed"); - } - CLI_STACK_DESTROY (frame); - - return ret; + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_error == 0)) + cli_err("Volume barrier failed"); + } + CLI_STACK_DESTROY(frame); + + return ret; } int -cli_cmd_volume_getopt_cbk (struct cli_state *state, struct cli_cmd_word *word, - const char **words, int wordcount) +cli_cmd_volume_getopt_cbk(struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) { - int ret = -1; - rpc_clnt_procedure_t *proc = NULL; - call_frame_t *frame = NULL; - dict_t *options = NULL; - int sent = 0; - int parse_err = 0; - cli_local_t *local = NULL; - - if (wordcount != 4) { - cli_usage_out (word->pattern); - parse_err = 1; - goto out; - } + int ret = -1; + rpc_clnt_procedure_t *proc = NULL; + call_frame_t *frame = NULL; + dict_t *options = NULL; + int sent = 0; + int parse_err = 0; + cli_local_t *local = NULL; + + if (wordcount != 4) { + cli_usage_out(word->pattern); + parse_err = 1; + goto out; + } - frame = create_frame (THIS, THIS->ctx->pool); - if (!frame) - goto out; + frame = create_frame(THIS, THIS->ctx->pool); + if (!frame) + goto out; - options = dict_new (); - if (!options) - goto out; + options = dict_new(); + if (!options) + goto out; - ret = dict_set_str (options, "volname", (char *)words[2]); - if (ret) - goto out; + ret = dict_set_str(options, "volname", (char *)words[2]); + if (ret) + goto out; - ret = dict_set_str (options, "key", (char *)words[3]); - if (ret) - goto out; + ret = dict_set_str(options, "key", (char *)words[3]); + if (ret) + goto out; - proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GET_VOL_OPT]; + proc = &cli_rpc_prog->proctable[GLUSTER_CLI_GET_VOL_OPT]; - CLI_LOCAL_INIT (local, words, frame, options); + CLI_LOCAL_INIT(local, words, frame, options); - if (proc->fn) - ret = proc->fn (frame, THIS, options); + if (proc->fn) + ret = proc->fn(frame, THIS, options); out: - if (ret) { - cli_cmd_sent_status_get (&sent); - if ((sent == 0) && (parse_err == 0)) - cli_err ("Volume get option failed"); - } - CLI_STACK_DESTROY (frame); - return ret; + if (ret) { + cli_cmd_sent_status_get(&sent); + if ((sent == 0) && (parse_err == 0)) + cli_err("Volume get option failed"); + } + CLI_STACK_DESTROY(frame); + return ret; } - /* This is a bit of a hack to display the help. The current bitrot cmd * format does not work well when registering the cmds. * Ideally the should have been of the form @@ -3214,430 +3197,372 @@ out: struct cli_cmd bitrot_cmds[] = { - {"volume bitrot help", - cli_cmd_bitrot_help_cbk, - "display help for volume bitrot commands" - }, - - {"volume bitrot <VOLNAME> {enable|disable}", - NULL, /*cli_cmd_bitrot_cbk,*/ - "Enable/disable bitrot for volume <VOLNAME>" - }, - - {"volume bitrot <VOLNAME> scrub-throttle {lazy|normal|aggressive}", - NULL, /*cli_cmd_bitrot_cbk,*/ - "Set the speed of the scrubber for volume <VOLNAME>" - }, - - {"volume bitrot <VOLNAME> scrub-frequency {hourly|daily|weekly|biweekly" - "|monthly}", - NULL, /*cli_cmd_bitrot_cbk,*/ - "Set the frequency of the scrubber for volume <VOLNAME>" - }, - - {"volume bitrot <VOLNAME> scrub {pause|resume|status|ondemand}", - NULL, /*cli_cmd_bitrot_cbk,*/ - "Pause/resume the scrubber for <VOLNAME>. Status displays the status of " - "the scrubber. ondemand starts the scrubber immediately." - }, - - {"volume bitrot <VOLNAME> {enable|disable}\n" - "volume bitrot <volname> scrub-throttle {lazy|normal|aggressive}\n" - "volume bitrot <volname> scrub-frequency {hourly|daily|weekly|biweekly" - "|monthly}\n" - "volume bitrot <volname> scrub {pause|resume|status|ondemand}", - cli_cmd_bitrot_cbk, - NULL - }, - - { NULL, NULL, NULL } -}; + {"volume bitrot help", cli_cmd_bitrot_help_cbk, + "display help for volume bitrot commands"}, + + {"volume bitrot <VOLNAME> {enable|disable}", NULL, /*cli_cmd_bitrot_cbk,*/ + "Enable/disable bitrot for volume <VOLNAME>"}, + + {"volume bitrot <VOLNAME> scrub-throttle {lazy|normal|aggressive}", + NULL, /*cli_cmd_bitrot_cbk,*/ + "Set the speed of the scrubber for volume <VOLNAME>"}, + + {"volume bitrot <VOLNAME> scrub-frequency {hourly|daily|weekly|biweekly" + "|monthly}", + NULL, /*cli_cmd_bitrot_cbk,*/ + "Set the frequency of the scrubber for volume <VOLNAME>"}, + {"volume bitrot <VOLNAME> scrub {pause|resume|status|ondemand}", + NULL, /*cli_cmd_bitrot_cbk,*/ + "Pause/resume the scrubber for <VOLNAME>. Status displays the status of " + "the scrubber. ondemand starts the scrubber immediately."}, + + {"volume bitrot <VOLNAME> {enable|disable}\n" + "volume bitrot <volname> scrub-throttle {lazy|normal|aggressive}\n" + "volume bitrot <volname> scrub-frequency {hourly|daily|weekly|biweekly" + "|monthly}\n" + "volume bitrot <volname> scrub {pause|resume|status|ondemand}", + cli_cmd_bitrot_cbk, NULL}, + + {NULL, NULL, NULL}}; struct cli_cmd quota_cmds[] = { - /* Quota commands */ - {"volume quota help", - cli_cmd_quota_help_cbk, - "display help for volume quota commands" - }, - - {"volume quota <VOLNAME> {enable|disable|list [<path> ...]| " - "list-objects [<path> ...] | remove <path>| remove-objects <path> | " - "default-soft-limit <percent>}", - cli_cmd_quota_cbk, - "Enable/disable and configure quota for <VOLNAME>" - }, - - {"volume quota <VOLNAME> {limit-usage <path> <size> [<percent>]}", - cli_cmd_quota_cbk, - "Set maximum size for <path> for <VOLNAME>" - }, - - {"volume quota <VOLNAME> {limit-objects <path> <number> [<percent>]}", - cli_cmd_quota_cbk, - "Set the maximum number of entries allowed in <path> for <VOLNAME>" - }, - - {"volume quota <VOLNAME> {alert-time|soft-timeout|hard-timeout} {<time>}", - cli_cmd_quota_cbk, - "Set quota timeout for <VOLNAME>" - }, - - { "volume inode-quota <VOLNAME> enable", - cli_cmd_quota_cbk, - "Enable/disable inode-quota for <VOLNAME>" - }, - - { "volume quota <VOLNAME> {enable|disable|list [<path> ...]| " - "list-objects [<path> ...] | remove <path>| remove-objects <path> | " - "default-soft-limit <percent>}\n" - "volume quota <VOLNAME> {limit-usage <path> <size> [<percent>]}\n" - "volume quota <VOLNAME> {limit-objects <path> <number> [<percent>]}\n" - "volume quota <VOLNAME> {alert-time|soft-timeout|hard-timeout} {<time>}", - cli_cmd_quota_cbk, - NULL - }, - - { NULL, NULL, NULL } -}; + /* Quota commands */ + {"volume quota help", cli_cmd_quota_help_cbk, + "display help for volume quota commands"}, + + {"volume quota <VOLNAME> {enable|disable|list [<path> ...]| " + "list-objects [<path> ...] | remove <path>| remove-objects <path> | " + "default-soft-limit <percent>}", + cli_cmd_quota_cbk, "Enable/disable and configure quota for <VOLNAME>"}, + + {"volume quota <VOLNAME> {limit-usage <path> <size> [<percent>]}", + cli_cmd_quota_cbk, "Set maximum size for <path> for <VOLNAME>"}, + + {"volume quota <VOLNAME> {limit-objects <path> <number> [<percent>]}", + cli_cmd_quota_cbk, + "Set the maximum number of entries allowed in <path> for <VOLNAME>"}, + + {"volume quota <VOLNAME> {alert-time|soft-timeout|hard-timeout} {<time>}", + cli_cmd_quota_cbk, "Set quota timeout for <VOLNAME>"}, + + {"volume inode-quota <VOLNAME> enable", cli_cmd_quota_cbk, + "Enable/disable inode-quota for <VOLNAME>"}, + + {"volume quota <VOLNAME> {enable|disable|list [<path> ...]| " + "list-objects [<path> ...] | remove <path>| remove-objects <path> | " + "default-soft-limit <percent>}\n" + "volume quota <VOLNAME> {limit-usage <path> <size> [<percent>]}\n" + "volume quota <VOLNAME> {limit-objects <path> <number> [<percent>]}\n" + "volume quota <VOLNAME> {alert-time|soft-timeout|hard-timeout} {<time>}", + cli_cmd_quota_cbk, NULL}, + + {NULL, NULL, NULL}}; struct cli_cmd tier_cmds[] = { - { "volume tier help", - cli_cmd_tier_help_cbk, - "display help for volume tier commands"}, + {"volume tier help", cli_cmd_tier_help_cbk, + "display help for volume tier commands"}, - { "volume tier <VOLNAME> status", - cli_cmd_volume_tier_cbk, - "Display tier status for <VOLNAME>"}, + {"volume tier <VOLNAME> status", cli_cmd_volume_tier_cbk, + "Display tier status for <VOLNAME>"}, - { "volume tier <VOLNAME> start [force]", - cli_cmd_volume_tier_cbk, - "Start the tier service for <VOLNAME>"}, + {"volume tier <VOLNAME> start [force]", cli_cmd_volume_tier_cbk, + "Start the tier service for <VOLNAME>"}, - { "volume tier <VOLNAME> stop [force]", - cli_cmd_volume_tier_cbk, - "Stop the tier service for <VOLNAME>"}, + {"volume tier <VOLNAME> stop [force]", cli_cmd_volume_tier_cbk, + "Stop the tier service for <VOLNAME>"}, - { "volume tier <VOLNAME> attach [<replica COUNT>] <NEW-BRICK>... [force]", - cli_cmd_volume_tier_cbk, - "Attach a hot tier to <VOLNAME>"}, + {"volume tier <VOLNAME> attach [<replica COUNT>] <NEW-BRICK>... [force]", + cli_cmd_volume_tier_cbk, "Attach a hot tier to <VOLNAME>"}, - { "volume tier <VOLNAME> detach <start|stop|status|commit|[force]>", - cli_cmd_volume_tier_cbk, - "Detach the hot tier from <VOLNAME>"}, + {"volume tier <VOLNAME> detach <start|stop|status|commit|[force]>", + cli_cmd_volume_tier_cbk, "Detach the hot tier from <VOLNAME>"}, - { "volume attach-tier <VOLNAME> [<replica COUNT>] <NEW-BRICK>...", - cli_cmd_volume_tier_cbk, - "NOTE: this is old syntax, will be deprecated in next release. " - "Please use gluster volume tier <vol> attach " - "[<replica COUNT>] <NEW-BRICK>..."}, + {"volume attach-tier <VOLNAME> [<replica COUNT>] <NEW-BRICK>...", + cli_cmd_volume_tier_cbk, + "NOTE: this is old syntax, will be deprecated in next release. " + "Please use gluster volume tier <vol> attach " + "[<replica COUNT>] <NEW-BRICK>..."}, - { "volume detach-tier <VOLNAME> " - "<start|stop|status|commit|force>", - cli_cmd_volume_tier_cbk, - "NOTE: this is old syntax, will be deprecated in next release. " - "Please use gluster volume tier <vol> detach " - "{start|stop|commit} [force]"}, + {"volume detach-tier <VOLNAME> " + "<start|stop|status|commit|force>", + cli_cmd_volume_tier_cbk, + "NOTE: this is old syntax, will be deprecated in next release. " + "Please use gluster volume tier <vol> detach " + "{start|stop|commit} [force]"}, - { "volume tier <VOLNAME> status\n" - "volume tier <VOLNAME> start [force]\n" - "volume tier <VOLNAME> stop\n" - "volume tier <VOLNAME> attach [<replica COUNT>] <NEW-BRICK>... [force]\n" - "volume tier <VOLNAME> detach <start|stop|status|commit|[force]>\n", - cli_cmd_volume_tier_cbk, - NULL }, + {"volume tier <VOLNAME> status\n" + "volume tier <VOLNAME> start [force]\n" + "volume tier <VOLNAME> stop\n" + "volume tier <VOLNAME> attach [<replica COUNT>] <NEW-BRICK>... [force]\n" + "volume tier <VOLNAME> detach <start|stop|status|commit|[force]>\n", + cli_cmd_volume_tier_cbk, NULL}, - {NULL, NULL, NULL} + {NULL, NULL, NULL} - }; +}; struct cli_cmd volume_cmds[] = { - { "volume help", - cli_cmd_volume_help_cbk, - "display help for volume commands"}, - - { "volume info [all|<VOLNAME>]", - cli_cmd_volume_info_cbk, - "list information of all volumes"}, - - { "volume create <NEW-VOLNAME> [stripe <COUNT>] " - "[replica <COUNT> [arbiter <COUNT>]] " - "[disperse [<COUNT>]] [disperse-data <COUNT>] [redundancy <COUNT>] " - "[transport <tcp|rdma|tcp,rdma>] <NEW-BRICK>" + {"volume help", cli_cmd_volume_help_cbk, + "display help for volume commands"}, + + {"volume info [all|<VOLNAME>]", cli_cmd_volume_info_cbk, + "list information of all volumes"}, + + {"volume create <NEW-VOLNAME> [stripe <COUNT>] " + "[replica <COUNT> [arbiter <COUNT>]] " + "[disperse [<COUNT>]] [disperse-data <COUNT>] [redundancy <COUNT>] " + "[transport <tcp|rdma|tcp,rdma>] <NEW-BRICK>" #ifdef HAVE_BD_XLATOR - "?<vg_name>" + "?<vg_name>" #endif - "... [force]", - - cli_cmd_volume_create_cbk, - "create a new volume of specified type with mentioned bricks"}, + "... [force]", - { "volume delete <VOLNAME>", - cli_cmd_volume_delete_cbk, - "delete volume specified by <VOLNAME>"}, + cli_cmd_volume_create_cbk, + "create a new volume of specified type with mentioned bricks"}, - { "volume start <VOLNAME> [force]", - cli_cmd_volume_start_cbk, - "start volume specified by <VOLNAME>"}, + {"volume delete <VOLNAME>", cli_cmd_volume_delete_cbk, + "delete volume specified by <VOLNAME>"}, - { "volume stop <VOLNAME> [force]", - cli_cmd_volume_stop_cbk, - "stop volume specified by <VOLNAME>"}, + {"volume start <VOLNAME> [force]", cli_cmd_volume_start_cbk, + "start volume specified by <VOLNAME>"}, - /*{ "volume rename <VOLNAME> <NEW-VOLNAME>", - cli_cmd_volume_rename_cbk, - "rename volume <VOLNAME> to <NEW-VOLNAME>"},*/ + {"volume stop <VOLNAME> [force]", cli_cmd_volume_stop_cbk, + "stop volume specified by <VOLNAME>"}, - { "volume add-brick <VOLNAME> [<stripe|replica> <COUNT> " - "[arbiter <COUNT>]] <NEW-BRICK> ... [force]", - cli_cmd_volume_add_brick_cbk, - "add brick to volume <VOLNAME>"}, + /*{ "volume rename <VOLNAME> <NEW-VOLNAME>", + cli_cmd_volume_rename_cbk, + "rename volume <VOLNAME> to <NEW-VOLNAME>"},*/ - { "volume remove-brick <VOLNAME> [replica <COUNT>] <BRICK> ..." - " <start|stop|status|commit|force>", - cli_cmd_volume_remove_brick_cbk, - "remove brick from volume <VOLNAME>"}, + {"volume add-brick <VOLNAME> [<stripe|replica> <COUNT> " + "[arbiter <COUNT>]] <NEW-BRICK> ... [force]", + cli_cmd_volume_add_brick_cbk, "add brick to volume <VOLNAME>"}, - { "volume rebalance <VOLNAME> {{fix-layout start} | {start [force]|stop|status}}", - cli_cmd_volume_defrag_cbk, - "rebalance operations"}, + {"volume remove-brick <VOLNAME> [replica <COUNT>] <BRICK> ..." + " <start|stop|status|commit|force>", + cli_cmd_volume_remove_brick_cbk, "remove brick from volume <VOLNAME>"}, - { "volume replace-brick <VOLNAME> <SOURCE-BRICK> <NEW-BRICK> " - "{commit force}", - cli_cmd_volume_replace_brick_cbk, - "replace-brick operations"}, + {"volume rebalance <VOLNAME> {{fix-layout start} | {start " + "[force]|stop|status}}", + cli_cmd_volume_defrag_cbk, "rebalance operations"}, - /*{ "volume set-transport <VOLNAME> <TRANSPORT-TYPE> [<TRANSPORT-TYPE>] ...", - cli_cmd_volume_set_transport_cbk, - "set transport type for volume <VOLNAME>"},*/ + {"volume replace-brick <VOLNAME> <SOURCE-BRICK> <NEW-BRICK> " + "{commit force}", + cli_cmd_volume_replace_brick_cbk, "replace-brick operations"}, - { "volume set <VOLNAME> <KEY> <VALUE>", - cli_cmd_volume_set_cbk, - "set options for volume <VOLNAME>"}, + /*{ "volume set-transport <VOLNAME> <TRANSPORT-TYPE> [<TRANSPORT-TYPE>] + ...", cli_cmd_volume_set_transport_cbk, "set transport type for volume + <VOLNAME>"},*/ + {"volume set <VOLNAME> <KEY> <VALUE>", cli_cmd_volume_set_cbk, + "set options for volume <VOLNAME>"}, - { "volume log <VOLNAME> rotate [BRICK]", - cli_cmd_log_rotate_cbk, - "rotate the log file for corresponding volume/brick"}, + {"volume log <VOLNAME> rotate [BRICK]", cli_cmd_log_rotate_cbk, + "rotate the log file for corresponding volume/brick"}, - { "volume log rotate <VOLNAME> [BRICK]", - cli_cmd_log_rotate_cbk, - "rotate the log file for corresponding volume/brick" - " NOTE: This is an old syntax, will be deprecated from next release."}, + {"volume log rotate <VOLNAME> [BRICK]", cli_cmd_log_rotate_cbk, + "rotate the log file for corresponding volume/brick" + " NOTE: This is an old syntax, will be deprecated from next release."}, - { "volume sync <HOSTNAME> [all|<VOLNAME>]", - cli_cmd_sync_volume_cbk, - "sync the volume information from a peer"}, + {"volume sync <HOSTNAME> [all|<VOLNAME>]", cli_cmd_sync_volume_cbk, + "sync the volume information from a peer"}, - { "volume reset <VOLNAME> [option] [force]", - cli_cmd_volume_reset_cbk, - "reset all the reconfigured options"}, + {"volume reset <VOLNAME> [option] [force]", cli_cmd_volume_reset_cbk, + "reset all the reconfigured options"}, #if (SYNCDAEMON_COMPILE) - {"volume "GEOREP" [<VOLNAME>] [<SLAVE-URL>] {create [[ssh-port n] [[no-verify]|[push-pem]]] [force]" - "|start [force]|stop [force]|pause [force]|resume [force]|config|status [detail]|delete [reset-sync-time]} [options...]", - cli_cmd_volume_gsync_set_cbk, - "Geo-sync operations", - cli_cmd_check_gsync_exists_cbk}, + {"volume " GEOREP " [<VOLNAME>] [<SLAVE-URL>] {create [[ssh-port n] " + "[[no-verify]|[push-pem]]] [force]" + "|start [force]|stop [force]|pause [force]|resume [force]|config|status " + "[detail]|delete [reset-sync-time]} [options...]", + cli_cmd_volume_gsync_set_cbk, "Geo-sync operations", + cli_cmd_check_gsync_exists_cbk}, #endif - { "volume profile <VOLNAME> {start|info [peek|incremental [peek]|cumulative|clear]|stop} [nfs]", - cli_cmd_volume_profile_cbk, - "volume profile operations"}, - - { "volume top <VOLNAME> {open|read|write|opendir|readdir|clear} [nfs|brick <brick>] [list-cnt <value>] |\n" - "volume top <VOLNAME> {read-perf|write-perf} [bs <size> count <count>] [brick <brick>] [list-cnt <value>]", - cli_cmd_volume_top_cbk, - "volume top operations"}, - - { "volume status [all | <VOLNAME> [nfs|shd|<BRICK>|quotad|tierd]]" - " [detail|clients|mem|inode|fd|callpool|tasks|client-list]", - cli_cmd_volume_status_cbk, - "display status of all or specified volume(s)/brick"}, - - { "volume heal <VOLNAME> [enable | disable | full |" - "statistics [heal-count [replica <HOSTNAME:BRICKNAME>]] |" - "info [summary | split-brain] |" - "split-brain {bigger-file <FILE> | latest-mtime <FILE> |" - "source-brick <HOSTNAME:BRICKNAME> [<FILE>]} |" - "granular-entry-heal {enable | disable}]", - cli_cmd_volume_heal_cbk, - "self-heal commands on volume specified by <VOLNAME>"}, - - {"volume statedump <VOLNAME> [[nfs|quotad] [all|mem|iobuf|callpool|" - "priv|fd|inode|history]... | [client <hostname:process-id>]]", - cli_cmd_volume_statedump_cbk, - "perform statedump on bricks"}, - - {"volume list", - cli_cmd_volume_list_cbk, - "list all volumes in cluster"}, - - {"volume clear-locks <VOLNAME> <path> kind {blocked|granted|all}" - "{inode [range]|entry [basename]|posix [range]}", - cli_cmd_volume_clearlocks_cbk, - "Clear locks held on path" - }, - {"volume barrier <VOLNAME> {enable|disable}", - cli_cmd_volume_barrier_cbk, - "Barrier/unbarrier file operations on a volume" - }, - {"volume get <VOLNAME|all> <key|all>", - cli_cmd_volume_getopt_cbk, - "Get the value of the all options or given option for volume <VOLNAME>" - " or all option. gluster volume get all all is to get all global " - "options" - }, - - { "volume reset-brick <VOLNAME> <SOURCE-BRICK> {{start} |" - " {<NEW-BRICK> commit}}", - cli_cmd_volume_reset_brick_cbk, - "reset-brick operations"}, - - - { NULL, NULL, NULL } -}; + {"volume profile <VOLNAME> {start|info [peek|incremental " + "[peek]|cumulative|clear]|stop} [nfs]", + cli_cmd_volume_profile_cbk, "volume profile operations"}, + + {"volume top <VOLNAME> {open|read|write|opendir|readdir|clear} [nfs|brick " + "<brick>] [list-cnt <value>] |\n" + "volume top <VOLNAME> {read-perf|write-perf} [bs <size> count <count>] " + "[brick <brick>] [list-cnt <value>]", + cli_cmd_volume_top_cbk, "volume top operations"}, + + {"volume status [all | <VOLNAME> [nfs|shd|<BRICK>|quotad|tierd]]" + " [detail|clients|mem|inode|fd|callpool|tasks|client-list]", + cli_cmd_volume_status_cbk, + "display status of all or specified volume(s)/brick"}, + + {"volume heal <VOLNAME> [enable | disable | full |" + "statistics [heal-count [replica <HOSTNAME:BRICKNAME>]] |" + "info [summary | split-brain] |" + "split-brain {bigger-file <FILE> | latest-mtime <FILE> |" + "source-brick <HOSTNAME:BRICKNAME> [<FILE>]} |" + "granular-entry-heal {enable | disable}]", + cli_cmd_volume_heal_cbk, + "self-heal commands on volume specified by <VOLNAME>"}, + + {"volume statedump <VOLNAME> [[nfs|quotad] [all|mem|iobuf|callpool|" + "priv|fd|inode|history]... | [client <hostname:process-id>]]", + cli_cmd_volume_statedump_cbk, "perform statedump on bricks"}, + + {"volume list", cli_cmd_volume_list_cbk, "list all volumes in cluster"}, + + {"volume clear-locks <VOLNAME> <path> kind {blocked|granted|all}" + "{inode [range]|entry [basename]|posix [range]}", + cli_cmd_volume_clearlocks_cbk, "Clear locks held on path"}, + {"volume barrier <VOLNAME> {enable|disable}", cli_cmd_volume_barrier_cbk, + "Barrier/unbarrier file operations on a volume"}, + {"volume get <VOLNAME|all> <key|all>", cli_cmd_volume_getopt_cbk, + "Get the value of the all options or given option for volume <VOLNAME>" + " or all option. gluster volume get all all is to get all global " + "options"}, + + {"volume reset-brick <VOLNAME> <SOURCE-BRICK> {{start} |" + " {<NEW-BRICK> commit}}", + cli_cmd_volume_reset_brick_cbk, "reset-brick operations"}, + + {NULL, NULL, NULL}}; int -cli_cmd_quota_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount) +cli_cmd_quota_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount) { - struct cli_cmd *cmd = NULL; - struct cli_cmd *quota_cmd = NULL; - int count = 0; + struct cli_cmd *cmd = NULL; + struct cli_cmd *quota_cmd = NULL; + int count = 0; - cmd = GF_MALLOC (sizeof (quota_cmds), cli_mt_cli_cmd); - memcpy (cmd, quota_cmds, sizeof (quota_cmds)); - count = (sizeof (quota_cmds) / sizeof (struct cli_cmd)); - cli_cmd_sort (cmd, count); + cmd = GF_MALLOC(sizeof(quota_cmds), cli_mt_cli_cmd); + memcpy(cmd, quota_cmds, sizeof(quota_cmds)); + count = (sizeof(quota_cmds) / sizeof(struct cli_cmd)); + cli_cmd_sort(cmd, count); - cli_out ("\ngluster quota commands"); - cli_out ("=======================\n"); + cli_out("\ngluster quota commands"); + cli_out("=======================\n"); - for (quota_cmd = cmd; quota_cmd->pattern; quota_cmd++) - if ((_gf_false == quota_cmd->disable) && (quota_cmd->desc)) - cli_out ("%s - %s", quota_cmd->pattern, - quota_cmd->desc); + for (quota_cmd = cmd; quota_cmd->pattern; quota_cmd++) + if ((_gf_false == quota_cmd->disable) && (quota_cmd->desc)) + cli_out("%s - %s", quota_cmd->pattern, quota_cmd->desc); - cli_out ("\n"); - GF_FREE (cmd); + cli_out("\n"); + GF_FREE(cmd); - return 0; + return 0; } int -cli_cmd_bitrot_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount) +cli_cmd_bitrot_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount) { - struct cli_cmd *cmd = NULL; - struct cli_cmd *bitrot_cmd = NULL; - int count = 0; + struct cli_cmd *cmd = NULL; + struct cli_cmd *bitrot_cmd = NULL; + int count = 0; - cmd = GF_MALLOC (sizeof (bitrot_cmds), cli_mt_cli_cmd); - memcpy (cmd, bitrot_cmds, sizeof (bitrot_cmds)); - count = (sizeof (bitrot_cmds) / sizeof (struct cli_cmd)); - cli_cmd_sort (cmd, count); + cmd = GF_MALLOC(sizeof(bitrot_cmds), cli_mt_cli_cmd); + memcpy(cmd, bitrot_cmds, sizeof(bitrot_cmds)); + count = (sizeof(bitrot_cmds) / sizeof(struct cli_cmd)); + cli_cmd_sort(cmd, count); - cli_out ("\ngluster bitrot commands"); - cli_out ("========================\n"); + cli_out("\ngluster bitrot commands"); + cli_out("========================\n"); - for (bitrot_cmd = cmd; bitrot_cmd->pattern; bitrot_cmd++) - if ((_gf_false == bitrot_cmd->disable) && (bitrot_cmd->desc)) - cli_out ("%s - %s", bitrot_cmd->pattern, - bitrot_cmd->desc); + for (bitrot_cmd = cmd; bitrot_cmd->pattern; bitrot_cmd++) + if ((_gf_false == bitrot_cmd->disable) && (bitrot_cmd->desc)) + cli_out("%s - %s", bitrot_cmd->pattern, bitrot_cmd->desc); - cli_out ("\n"); - GF_FREE (cmd); + cli_out("\n"); + GF_FREE(cmd); - return 0; + return 0; } int -cli_cmd_tier_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount) +cli_cmd_tier_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount) { - struct cli_cmd *cmd = NULL; - struct cli_cmd *tier_cmd = NULL; - int count = 0; - - cmd = GF_MALLOC (sizeof (tier_cmds), cli_mt_cli_cmd); - memcpy (cmd, tier_cmds, sizeof (tier_cmds)); - count = (sizeof (tier_cmds) / sizeof (struct cli_cmd)); - cli_cmd_sort (cmd, count); - - cli_out ("\ngluster tier commands"); - cli_out ("======================\n"); - - for (tier_cmd = cmd; tier_cmd->pattern; tier_cmd++) { - if ((_gf_false == tier_cmd->disable) && tier_cmd->desc) { - cli_out ("%s - %s", tier_cmd->pattern, tier_cmd->desc); - } - } - cli_out ("\n"); - GF_FREE (cmd); - return 0; + struct cli_cmd *cmd = NULL; + struct cli_cmd *tier_cmd = NULL; + int count = 0; + + cmd = GF_MALLOC(sizeof(tier_cmds), cli_mt_cli_cmd); + memcpy(cmd, tier_cmds, sizeof(tier_cmds)); + count = (sizeof(tier_cmds) / sizeof(struct cli_cmd)); + cli_cmd_sort(cmd, count); + + cli_out("\ngluster tier commands"); + cli_out("======================\n"); + + for (tier_cmd = cmd; tier_cmd->pattern; tier_cmd++) { + if ((_gf_false == tier_cmd->disable) && tier_cmd->desc) { + cli_out("%s - %s", tier_cmd->pattern, tier_cmd->desc); + } + } + cli_out("\n"); + GF_FREE(cmd); + return 0; } int -cli_cmd_volume_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount) +cli_cmd_volume_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount) { - struct cli_cmd *cmd = NULL; - struct cli_cmd *vol_cmd = NULL; - int count = 0; + struct cli_cmd *cmd = NULL; + struct cli_cmd *vol_cmd = NULL; + int count = 0; - cmd = GF_MALLOC (sizeof (volume_cmds), cli_mt_cli_cmd); - memcpy (cmd, volume_cmds, sizeof (volume_cmds)); - count = (sizeof (volume_cmds) / sizeof (struct cli_cmd)); - cli_cmd_sort (cmd, count); + cmd = GF_MALLOC(sizeof(volume_cmds), cli_mt_cli_cmd); + memcpy(cmd, volume_cmds, sizeof(volume_cmds)); + count = (sizeof(volume_cmds) / sizeof(struct cli_cmd)); + cli_cmd_sort(cmd, count); - cli_out ("\ngluster volume commands"); - cli_out ("========================\n"); + cli_out("\ngluster volume commands"); + cli_out("========================\n"); - for (vol_cmd = cmd; vol_cmd->pattern; vol_cmd++) - if (_gf_false == vol_cmd->disable) - cli_out ("%s - %s", vol_cmd->pattern, vol_cmd->desc); + for (vol_cmd = cmd; vol_cmd->pattern; vol_cmd++) + if (_gf_false == vol_cmd->disable) + cli_out("%s - %s", vol_cmd->pattern, vol_cmd->desc); - cli_out ("\n"); - GF_FREE (cmd); - return 0; + cli_out("\n"); + GF_FREE(cmd); + return 0; } int -cli_cmd_volume_register (struct cli_state *state) +cli_cmd_volume_register(struct cli_state *state) { - int ret = 0; - struct cli_cmd *cmd = NULL; + int ret = 0; + struct cli_cmd *cmd = NULL; - for (cmd = volume_cmds; cmd->pattern; cmd++) { - ret = cli_cmd_register (&state->tree, cmd); - if (ret) - goto out; - } + for (cmd = volume_cmds; cmd->pattern; cmd++) { + ret = cli_cmd_register(&state->tree, cmd); + if (ret) + goto out; + } - for (cmd = bitrot_cmds; cmd->pattern; cmd++) { - ret = cli_cmd_register (&state->tree, cmd); - if (ret) - goto out; - } + for (cmd = bitrot_cmds; cmd->pattern; cmd++) { + ret = cli_cmd_register(&state->tree, cmd); + if (ret) + goto out; + } - for (cmd = quota_cmds; cmd->pattern; cmd++) { - ret = cli_cmd_register (&state->tree, cmd); - if (ret) - goto out; - } + for (cmd = quota_cmds; cmd->pattern; cmd++) { + ret = cli_cmd_register(&state->tree, cmd); + if (ret) + goto out; + } #if !defined(__NetBSD__) - for (cmd = tier_cmds; cmd->pattern; cmd++) { - ret = cli_cmd_register (&state->tree, cmd); - if (ret) - goto out; - } + for (cmd = tier_cmds; cmd->pattern; cmd++) { + ret = cli_cmd_register(&state->tree, cmd); + if (ret) + goto out; + } #endif out: - return ret; + return ret; } diff --git a/cli/src/cli-cmd.c b/cli/src/cli-cmd.c index 236009b449e..396cabebbbe 100644 --- a/cli/src/cli-cmd.c +++ b/cli/src/cli-cmd.c @@ -22,395 +22,390 @@ static int cmd_done; static int cmd_sent; -static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t cond_mutex = PTHREAD_MUTEX_INITIALIZER; -static pthread_cond_t conn = PTHREAD_COND_INITIALIZER; -static pthread_mutex_t conn_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t cond = PTHREAD_COND_INITIALIZER; +static pthread_mutex_t cond_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_cond_t conn = PTHREAD_COND_INITIALIZER; +static pthread_mutex_t conn_mutex = PTHREAD_MUTEX_INITIALIZER; -int cli_op_ret = 0; -int connected = 0; +int cli_op_ret = 0; +int connected = 0; -int cli_cmd_log_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, - const char **words, int wordcount); +int +cli_cmd_log_help_cbk(struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount); static unsigned -cli_cmd_needs_connection (struct cli_cmd_word *word) +cli_cmd_needs_connection(struct cli_cmd_word *word) { - if (!strcasecmp ("quit", word->word)) - return 0; + if (!strcasecmp("quit", word->word)) + return 0; - if (!strcasecmp ("help", word->word)) - return 0; + if (!strcasecmp("help", word->word)) + return 0; - if (!strcasecmp ("getwd", word->word)) - return 1; + if (!strcasecmp("getwd", word->word)) + return 1; - if (!strcasecmp ("exit", word->word)) - return 0; + if (!strcasecmp("exit", word->word)) + return 0; - return cli_default_conn_timeout; + return cli_default_conn_timeout; } int -cli_cmd_status_reset (void) +cli_cmd_status_reset(void) { - int ret = 0; - - ret = cli_cmd_lock (); - { - if (ret == 0) { - cmd_sent = 0; - cmd_done = 0; - } - } - ret = cli_cmd_unlock (); - return ret; + int ret = 0; + ret = cli_cmd_lock(); + { + if (ret == 0) { + cmd_sent = 0; + cmd_done = 0; + } + } + ret = cli_cmd_unlock(); + return ret; } int -cli_cmd_sent_status_get (int *status) +cli_cmd_sent_status_get(int *status) { - int ret = 0; - GF_ASSERT (status); - - ret = cli_cmd_lock (); - { - if (ret == 0) - *status = cmd_sent; - } - ret = cli_cmd_unlock (); - return ret; + int ret = 0; + GF_ASSERT(status); + + ret = cli_cmd_lock(); + { + if (ret == 0) + *status = cmd_sent; + } + ret = cli_cmd_unlock(); + return ret; } int -cli_cmd_process (struct cli_state *state, int argc, char **argv) +cli_cmd_process(struct cli_state *state, int argc, char **argv) { - int ret = 0; - struct cli_cmd_word *word = NULL; - struct cli_cmd_word *next = NULL; - int i = 0; + int ret = 0; + struct cli_cmd_word *word = NULL; + struct cli_cmd_word *next = NULL; + int i = 0; - word = &state->tree.root; + word = &state->tree.root; - if (!argc) - return 0; + if (!argc) + return 0; - for (i = 0; i < argc; i++) { - next = cli_cmd_nextword (word, argv[i]); + for (i = 0; i < argc; i++) { + next = cli_cmd_nextword(word, argv[i]); - word = next; - if (!word) - break; + word = next; + if (!word) + break; - if (word->cbkfn) - break; - } + if (word->cbkfn) + break; + } - if (!word) { - cli_out ("unrecognized word: %s (position %d)", - argv[i], i); - return -1; - } + if (!word) { + cli_out("unrecognized word: %s (position %d)", argv[i], i); + return -1; + } - if (!word->cbkfn) { - cli_out ("unrecognized command"); - return -1; - } + if (!word->cbkfn) { + cli_out("unrecognized command"); + return -1; + } - if ( strcmp (word->word,"help")==0 ) - goto callback; + if (strcmp(word->word, "help") == 0) + goto callback; - state->await_connected = cli_cmd_needs_connection (word); + state->await_connected = cli_cmd_needs_connection(word); - ret = cli_cmd_await_connected (state->await_connected); - if (ret) { - cli_out ("Connection failed. Please check if gluster " - "daemon is operational."); - gf_log ("", GF_LOG_INFO, "Exiting with: %d", ret); - exit (ret); - } + ret = cli_cmd_await_connected(state->await_connected); + if (ret) { + cli_out( + "Connection failed. Please check if gluster " + "daemon is operational."); + gf_log("", GF_LOG_INFO, "Exiting with: %d", ret); + exit(ret); + } callback: - ret = word->cbkfn (state, word, (const char **)argv, argc); - (void) cli_cmd_status_reset (); - return ret; + ret = word->cbkfn(state, word, (const char **)argv, argc); + (void)cli_cmd_status_reset(); + return ret; } int -cli_cmd_input_token_count (const char *text) +cli_cmd_input_token_count(const char *text) { - int count = 0; - const char *trav = NULL; - int is_spc = 1; - - for (trav = text; *trav; trav++) { - if (*trav == ' ') { - is_spc = 1; - } else { - if (is_spc) { - count++; - is_spc = 0; - } - } + int count = 0; + const char *trav = NULL; + int is_spc = 1; + + for (trav = text; *trav; trav++) { + if (*trav == ' ') { + is_spc = 1; + } else { + if (is_spc) { + count++; + is_spc = 0; + } } + } - return count; + return count; } - int -cli_cmd_process_line (struct cli_state *state, const char *text) +cli_cmd_process_line(struct cli_state *state, const char *text) { - int count = 0; - char **tokens = NULL; - char **tokenp = NULL; - char *token = NULL; - char *copy = NULL; - char *saveptr = NULL; - int i = 0; - int ret = -1; - - count = cli_cmd_input_token_count (text); - - tokens = calloc (count + 1, sizeof (*tokens)); - if (!tokens) - return -1; - - copy = strdup (text); - if (!copy) - goto out; - - tokenp = tokens; - - for (token = strtok_r (copy, " \t\r\n", &saveptr); token; - token = strtok_r (NULL, " \t\r\n", &saveptr)) { - *tokenp = strdup (token); - - if (!*tokenp) - goto out; - tokenp++; - i++; - - } - - ret = cli_cmd_process (state, count, tokens); + int count = 0; + char **tokens = NULL; + char **tokenp = NULL; + char *token = NULL; + char *copy = NULL; + char *saveptr = NULL; + int i = 0; + int ret = -1; + + count = cli_cmd_input_token_count(text); + + tokens = calloc(count + 1, sizeof(*tokens)); + if (!tokens) + return -1; + + copy = strdup(text); + if (!copy) + goto out; + + tokenp = tokens; + + for (token = strtok_r(copy, " \t\r\n", &saveptr); token; + token = strtok_r(NULL, " \t\r\n", &saveptr)) { + *tokenp = strdup(token); + + if (!*tokenp) + goto out; + tokenp++; + i++; + } + + ret = cli_cmd_process(state, count, tokens); out: - free (copy); + free(copy); - if (tokens) - cli_cmd_tokens_destroy (tokens); + if (tokens) + cli_cmd_tokens_destroy(tokens); - return ret; + return ret; } - int -cli_cmds_register (struct cli_state *state) +cli_cmds_register(struct cli_state *state) { - int ret = 0; - - ret = cli_cmd_volume_register (state); - if (ret) - goto out; - - ret = cli_cmd_probe_register (state); - if (ret) - goto out; - - ret = cli_cmd_system_register (state); - if (ret) - goto out; - - ret = cli_cmd_misc_register (state); - if (ret) - goto out; - - ret = cli_cmd_snapshot_register (state); - if (ret) - goto out; - ret = cli_cmd_global_register (state); - if (ret) - goto out; + int ret = 0; + + ret = cli_cmd_volume_register(state); + if (ret) + goto out; + + ret = cli_cmd_probe_register(state); + if (ret) + goto out; + + ret = cli_cmd_system_register(state); + if (ret) + goto out; + + ret = cli_cmd_misc_register(state); + if (ret) + goto out; + + ret = cli_cmd_snapshot_register(state); + if (ret) + goto out; + ret = cli_cmd_global_register(state); + if (ret) + goto out; out: - return ret; + return ret; } int -cli_cmd_cond_init () +cli_cmd_cond_init() { + pthread_mutex_init(&cond_mutex, NULL); + pthread_cond_init(&cond, NULL); - pthread_mutex_init (&cond_mutex, NULL); - pthread_cond_init (&cond, NULL); + pthread_mutex_init(&conn_mutex, NULL); + pthread_cond_init(&conn, NULL); - pthread_mutex_init (&conn_mutex, NULL); - pthread_cond_init (&conn, NULL); - - return 0; + return 0; } int -cli_cmd_lock () +cli_cmd_lock() { - pthread_mutex_lock (&cond_mutex); - return 0; + pthread_mutex_lock(&cond_mutex); + return 0; } int -cli_cmd_unlock () +cli_cmd_unlock() { - pthread_mutex_unlock (&cond_mutex); - return 0; + pthread_mutex_unlock(&cond_mutex); + return 0; } static void -seconds_from_now (unsigned secs, struct timespec *ts) +seconds_from_now(unsigned secs, struct timespec *ts) { - struct timeval tv = {0,}; + struct timeval tv = { + 0, + }; - gettimeofday (&tv, NULL); + gettimeofday(&tv, NULL); - ts->tv_sec = tv.tv_sec + secs; - ts->tv_nsec = tv.tv_usec * 1000; + ts->tv_sec = tv.tv_sec + secs; + ts->tv_nsec = tv.tv_usec * 1000; } int -cli_cmd_await_response (unsigned time) +cli_cmd_await_response(unsigned time) { - struct timespec ts = {0,}; - int ret = 0; + struct timespec ts = { + 0, + }; + int ret = 0; - cli_op_ret = -1; + cli_op_ret = -1; - seconds_from_now (time, &ts); - while (!cmd_done && !ret) { - ret = pthread_cond_timedwait (&cond, &cond_mutex, - &ts); - } + seconds_from_now(time, &ts); + while (!cmd_done && !ret) { + ret = pthread_cond_timedwait(&cond, &cond_mutex, &ts); + } - if (!cmd_done) { - if (ret == ETIMEDOUT) - cli_out ("Error : Request timed out"); - else - cli_out ("Error : Command returned with error code:%d", - ret); - } - cmd_done = 0; + if (!cmd_done) { + if (ret == ETIMEDOUT) + cli_out("Error : Request timed out"); + else + cli_out("Error : Command returned with error code:%d", ret); + } + cmd_done = 0; - return cli_op_ret; + return cli_op_ret; } /* This function must be called _only_ after all actions associated with * command processing is complete. Otherwise, gluster process may exit before * reporting results to stdout/stderr. */ int -cli_cmd_broadcast_response (int32_t status) +cli_cmd_broadcast_response(int32_t status) { - - pthread_mutex_lock (&cond_mutex); - { - if (!cmd_sent) - goto out; - cmd_done = 1; - cli_op_ret = status; - pthread_cond_broadcast (&cond); - } - + pthread_mutex_lock(&cond_mutex); + { + if (!cmd_sent) + goto out; + cmd_done = 1; + cli_op_ret = status; + pthread_cond_broadcast(&cond); + } out: - pthread_mutex_unlock (&cond_mutex); - return 0; + pthread_mutex_unlock(&cond_mutex); + return 0; } int32_t -cli_cmd_await_connected (unsigned conn_timo) +cli_cmd_await_connected(unsigned conn_timo) { - int32_t ret = 0; - struct timespec ts = {0,}; - - if (!conn_timo) - return 0; - - pthread_mutex_lock (&conn_mutex); - { - seconds_from_now (conn_timo, &ts); - while (!connected && !ret) { - ret = pthread_cond_timedwait (&conn, &conn_mutex, - &ts); - } - } - pthread_mutex_unlock (&conn_mutex); + int32_t ret = 0; + struct timespec ts = { + 0, + }; + if (!conn_timo) + return 0; + + pthread_mutex_lock(&conn_mutex); + { + seconds_from_now(conn_timo, &ts); + while (!connected && !ret) { + ret = pthread_cond_timedwait(&conn, &conn_mutex, &ts); + } + } + pthread_mutex_unlock(&conn_mutex); - return ret; + return ret; } int32_t -cli_cmd_broadcast_connected () +cli_cmd_broadcast_connected() { - pthread_mutex_lock (&conn_mutex); - { - connected = 1; - pthread_cond_broadcast (&conn); - } + pthread_mutex_lock(&conn_mutex); + { + connected = 1; + pthread_cond_broadcast(&conn); + } - pthread_mutex_unlock (&conn_mutex); + pthread_mutex_unlock(&conn_mutex); - return 0; + return 0; } int -cli_cmd_submit (struct rpc_clnt* rpc, void *req, call_frame_t *frame, - rpc_clnt_prog_t *prog, - int procnum, struct iobref *iobref, - xlator_t *this, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc) +cli_cmd_submit(struct rpc_clnt *rpc, void *req, call_frame_t *frame, + rpc_clnt_prog_t *prog, int procnum, struct iobref *iobref, + xlator_t *this, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc) { - int ret = -1; - unsigned timeout = 0; + int ret = -1; + unsigned timeout = 0; - if ((GLUSTER_CLI_PROFILE_VOLUME == procnum) || - (GLUSTER_CLI_HEAL_VOLUME == procnum)) - timeout = cli_ten_minutes_timeout; - else - timeout = cli_default_conn_timeout; + if ((GLUSTER_CLI_PROFILE_VOLUME == procnum) || + (GLUSTER_CLI_HEAL_VOLUME == procnum)) + timeout = cli_ten_minutes_timeout; + else + timeout = cli_default_conn_timeout; - cli_cmd_lock (); - cmd_sent = 0; - ret = cli_submit_request (rpc, req, frame, prog, - procnum, NULL, this, cbkfn, xdrproc); + cli_cmd_lock(); + cmd_sent = 0; + ret = cli_submit_request(rpc, req, frame, prog, procnum, NULL, this, cbkfn, + xdrproc); - if (!ret) { - cmd_sent = 1; - ret = cli_cmd_await_response (timeout); - } + if (!ret) { + cmd_sent = 1; + ret = cli_cmd_await_response(timeout); + } - cli_cmd_unlock (); + cli_cmd_unlock(); - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_cmd_pattern_cmp (void *a, void *b) +cli_cmd_pattern_cmp(void *a, void *b) { - struct cli_cmd *ia = NULL; - struct cli_cmd *ib = NULL; - int ret = 0; - - ia = a; - ib = b; - if (strcmp (ia->pattern, ib->pattern) > 0) - ret = 1; - else if (strcmp (ia->pattern, ib->pattern) < 0) - ret = -1; - else - ret = 0; - return ret; + struct cli_cmd *ia = NULL; + struct cli_cmd *ib = NULL; + int ret = 0; + + ia = a; + ib = b; + if (strcmp(ia->pattern, ib->pattern) > 0) + ret = 1; + else if (strcmp(ia->pattern, ib->pattern) < 0) + ret = -1; + else + ret = 0; + return ret; } void -cli_cmd_sort (struct cli_cmd *cmd, int count) +cli_cmd_sort(struct cli_cmd *cmd, int count) { - gf_array_insertionsort (cmd, 1, count - 2, sizeof(struct cli_cmd), - cli_cmd_pattern_cmp); + gf_array_insertionsort(cmd, 1, count - 2, sizeof(struct cli_cmd), + cli_cmd_pattern_cmp); } diff --git a/cli/src/cli-quotad-client.c b/cli/src/cli-quotad-client.c index 5be9c80c858..fbd2c0391ab 100644 --- a/cli/src/cli-quotad-client.c +++ b/cli/src/cli-quotad-client.c @@ -14,136 +14,131 @@ extern struct rpc_clnt global_quotad_rpc; extern struct rpc_clnt_program cli_quotad_clnt; int -cli_quotad_submit_request (void *req, call_frame_t *frame, - rpc_clnt_prog_t *prog, - int procnum, struct iobref *iobref, - xlator_t *this, fop_cbk_fn_t cbkfn, - xdrproc_t xdrproc) +cli_quotad_submit_request(void *req, call_frame_t *frame, rpc_clnt_prog_t *prog, + int procnum, struct iobref *iobref, xlator_t *this, + fop_cbk_fn_t cbkfn, xdrproc_t xdrproc) { - int ret = -1; - int count = 0; - struct iovec iov = {0, }; - struct iobuf *iobuf = NULL; - char new_iobref = 0; - ssize_t xdr_size = 0; - - GF_ASSERT (this); - - if (req) { - xdr_size = xdr_sizeof (xdrproc, req); - iobuf = iobuf_get2 (this->ctx->iobuf_pool, xdr_size); - if (!iobuf) { - goto out; - }; - - if (!iobref) { - iobref = iobref_new (); - if (!iobref) { - goto out; - } - - new_iobref = 1; - } - - iobref_add (iobref, iobuf); - - iov.iov_base = iobuf->ptr; - iov.iov_len = iobuf_size (iobuf); - - /* Create the xdr payload */ - ret = xdr_serialize_generic (iov, req, xdrproc); - if (ret == -1) { - goto out; - } - iov.iov_len = ret; - count = 1; + int ret = -1; + int count = 0; + struct iovec iov = { + 0, + }; + struct iobuf *iobuf = NULL; + char new_iobref = 0; + ssize_t xdr_size = 0; + + GF_ASSERT(this); + + if (req) { + xdr_size = xdr_sizeof(xdrproc, req); + iobuf = iobuf_get2(this->ctx->iobuf_pool, xdr_size); + if (!iobuf) { + goto out; + }; + + if (!iobref) { + iobref = iobref_new(); + if (!iobref) { + goto out; + } + + new_iobref = 1; + } + + iobref_add(iobref, iobuf); + + iov.iov_base = iobuf->ptr; + iov.iov_len = iobuf_size(iobuf); + + /* Create the xdr payload */ + ret = xdr_serialize_generic(iov, req, xdrproc); + if (ret == -1) { + goto out; } + iov.iov_len = ret; + count = 1; + } - /* Send the msg */ - ret = rpc_clnt_submit (&global_quotad_rpc, prog, procnum, cbkfn, - &iov, count, - NULL, 0, iobref, frame, NULL, 0, NULL, 0, NULL); - ret = 0; + /* Send the msg */ + ret = rpc_clnt_submit(&global_quotad_rpc, prog, procnum, cbkfn, &iov, count, + NULL, 0, iobref, frame, NULL, 0, NULL, 0, NULL); + ret = 0; out: - if (new_iobref) - iobref_unref (iobref); - if (iobuf) - iobuf_unref (iobuf); + if (new_iobref) + iobref_unref(iobref); + if (iobuf) + iobuf_unref(iobuf); - return ret; + return ret; } int -cli_quotad_notify (struct rpc_clnt *rpc, void *mydata, - rpc_clnt_event_t event, void *data) +cli_quotad_notify(struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event, + void *data) { - xlator_t *this = NULL; - int ret = 0; + xlator_t *this = NULL; + int ret = 0; - this = mydata; + this = mydata; - switch (event) { - case RPC_CLNT_CONNECT: - { - gf_log (this->name, GF_LOG_TRACE, "got RPC_CLNT_CONNECT"); - break; + switch (event) { + case RPC_CLNT_CONNECT: { + gf_log(this->name, GF_LOG_TRACE, "got RPC_CLNT_CONNECT"); + break; } - case RPC_CLNT_DISCONNECT: - { - gf_log (this->name, GF_LOG_TRACE, "got RPC_CLNT_DISCONNECT"); - break; + case RPC_CLNT_DISCONNECT: { + gf_log(this->name, GF_LOG_TRACE, "got RPC_CLNT_DISCONNECT"); + break; } default: - gf_log (this->name, GF_LOG_TRACE, - "got some other RPC event %d", event); - ret = 0; - break; - } + gf_log(this->name, GF_LOG_TRACE, "got some other RPC event %d", + event); + ret = 0; + break; + } - return ret; + return ret; } struct rpc_clnt * -cli_quotad_clnt_init (xlator_t *this, dict_t *options) +cli_quotad_clnt_init(xlator_t *this, dict_t *options) { - struct rpc_clnt *rpc = NULL; - int ret = -1; - + struct rpc_clnt *rpc = NULL; + int ret = -1; - ret = dict_set_str (options, "transport.address-family", "unix"); - if (ret) - goto out; + ret = dict_set_str(options, "transport.address-family", "unix"); + if (ret) + goto out; - ret = dict_set_str (options, "transport-type", "socket"); - if (ret) - goto out; + ret = dict_set_str(options, "transport-type", "socket"); + if (ret) + goto out; - ret = dict_set_str (options, "transport.socket.connect-path", - "/var/run/gluster/quotad.socket"); - if (ret) - goto out; + ret = dict_set_str(options, "transport.socket.connect-path", + "/var/run/gluster/quotad.socket"); + if (ret) + goto out; - rpc = rpc_clnt_new (options, this, this->name, 16); - if (!rpc) - goto out; + rpc = rpc_clnt_new(options, this, this->name, 16); + if (!rpc) + goto out; - ret = rpc_clnt_register_notify (rpc, cli_quotad_notify, this); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "failed to register notify"); - goto out; - } + ret = rpc_clnt_register_notify(rpc, cli_quotad_notify, this); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "failed to register notify"); + goto out; + } - rpc_clnt_start (rpc); + rpc_clnt_start(rpc); out: - if (ret) { - if (rpc) - rpc_clnt_unref (rpc); - rpc = NULL; - } + if (ret) { + if (rpc) + rpc_clnt_unref(rpc); + rpc = NULL; + } - return rpc; + return rpc; } - diff --git a/cli/src/cli-rl.c b/cli/src/cli-rl.c index 4ddb2ab149f..dd0993b8646 100644 --- a/cli/src/cli-rl.c +++ b/cli/src/cli-rl.c @@ -27,392 +27,374 @@ #include <readline/readline.h> #include <readline/history.h> - int -cli_rl_out (struct cli_state *state, const char *fmt, va_list ap) +cli_rl_out(struct cli_state *state, const char *fmt, va_list ap) { - int tmp_rl_point = rl_point; - int n = rl_end; - int ret = 0; + int tmp_rl_point = rl_point; + int n = rl_end; + int ret = 0; - if (rl_end >= 0 ) { - rl_kill_text (0, rl_end); - rl_redisplay (); - } + if (rl_end >= 0) { + rl_kill_text(0, rl_end); + rl_redisplay(); + } - printf ("\r%*s\r", (int)strlen (state->prompt), ""); + printf("\r%*s\r", (int)strlen(state->prompt), ""); - ret = vprintf (fmt, ap); + ret = vprintf(fmt, ap); - printf ("\n"); - fflush(stdout); + printf("\n"); + fflush(stdout); - if (n) { - rl_do_undo (); - rl_point = tmp_rl_point; - rl_reset_line_state (); - } + if (n) { + rl_do_undo(); + rl_point = tmp_rl_point; + rl_reset_line_state(); + } - return ret; + return ret; } int -cli_rl_err (struct cli_state *state, const char *fmt, va_list ap) +cli_rl_err(struct cli_state *state, const char *fmt, va_list ap) { - int tmp_rl_point = rl_point; - int n = rl_end; - int ret = 0; + int tmp_rl_point = rl_point; + int n = rl_end; + int ret = 0; - if (rl_end >= 0 ) { - rl_kill_text (0, rl_end); - rl_redisplay (); - } + if (rl_end >= 0) { + rl_kill_text(0, rl_end); + rl_redisplay(); + } - fprintf (stderr, "\r%*s\r", (int)strlen (state->prompt), ""); + fprintf(stderr, "\r%*s\r", (int)strlen(state->prompt), ""); - ret = vfprintf (stderr, fmt, ap); + ret = vfprintf(stderr, fmt, ap); - fprintf (stderr, "\n"); - fflush(stderr); + fprintf(stderr, "\n"); + fflush(stderr); - if (n) { - rl_do_undo (); - rl_point = tmp_rl_point; - rl_reset_line_state (); - } + if (n) { + rl_do_undo(); + rl_point = tmp_rl_point; + rl_reset_line_state(); + } - return ret; + return ret; } - void -cli_rl_process_line (char *line) +cli_rl_process_line(char *line) { - struct cli_state *state = NULL; - int ret = 0; + struct cli_state *state = NULL; + int ret = 0; - state = global_state; + state = global_state; - state->rl_processing = 1; - { - ret = cli_cmd_process_line (state, line); - if (ret) - gf_log (THIS->name, GF_LOG_WARNING, - "failed to process line"); - - add_history (line); - } - state->rl_processing = 0; + state->rl_processing = 1; + { + ret = cli_cmd_process_line(state, line); + if (ret) + gf_log(THIS->name, GF_LOG_WARNING, "failed to process line"); + add_history(line); + } + state->rl_processing = 0; } - int -cli_rl_stdin (int fd, int idx, int gen, void *data, - int poll_out, int poll_in, int poll_err) +cli_rl_stdin(int fd, int idx, int gen, void *data, int poll_out, int poll_in, + int poll_err) { - struct cli_state *state = NULL; + struct cli_state *state = NULL; - state = data; + state = data; - rl_callback_read_char (); + rl_callback_read_char(); - event_handled (state->ctx->event_pool, fd, idx, gen); + event_handled(state->ctx->event_pool, fd, idx, gen); - return 0; + return 0; } - char * -cli_rl_autocomplete_entry (const char *text, int times) +cli_rl_autocomplete_entry(const char *text, int times) { - struct cli_state *state = NULL; - char *retp = NULL; + struct cli_state *state = NULL; + char *retp = NULL; - state = global_state; + state = global_state; - if (!state->matchesp) - return NULL; + if (!state->matchesp) + return NULL; - retp = *state->matchesp; + retp = *state->matchesp; - state->matchesp++; + state->matchesp++; - return retp ? strdup (retp) : NULL; + return retp ? strdup(retp) : NULL; } - int -cli_rl_token_count (const char *text) +cli_rl_token_count(const char *text) { - int count = 0; - const char *trav = NULL; - int is_spc = 1; - - for (trav = text; *trav; trav++) { - if (*trav == ' ') { - is_spc = 1; - } else { - if (is_spc) { - count++; - is_spc = 0; - } - } + int count = 0; + const char *trav = NULL; + int is_spc = 1; + + for (trav = text; *trav; trav++) { + if (*trav == ' ') { + is_spc = 1; + } else { + if (is_spc) { + count++; + is_spc = 0; + } } + } - if (is_spc) - /* what needs to be autocompleted is a full - new word, and not extend the last word - */ - count++; + if (is_spc) + /* what needs to be autocompleted is a full + new word, and not extend the last word + */ + count++; - return count; + return count; } - char ** -cli_rl_tokenize (const char *text) +cli_rl_tokenize(const char *text) { - int count = 0; - char **tokens = NULL; - char **tokenp = NULL; - char *token = NULL; - char *copy = NULL; - char *saveptr = NULL; - int i = 0; - - count = cli_rl_token_count (text); - - tokens = calloc (count + 1, sizeof (*tokens)); - if (!tokens) - return NULL; - - copy = strdup (text); - if (!copy) - goto out; - - tokenp = tokens; - - for (token = strtok_r (copy, " \t\r\n", &saveptr); token; - token = strtok_r (NULL, " \t\r\n", &saveptr)) { - *tokenp = strdup (token); - - if (!*tokenp) - goto out; - tokenp++; - i++; - - } + int count = 0; + char **tokens = NULL; + char **tokenp = NULL; + char *token = NULL; + char *copy = NULL; + char *saveptr = NULL; + int i = 0; + + count = cli_rl_token_count(text); + + tokens = calloc(count + 1, sizeof(*tokens)); + if (!tokens) + return NULL; - if (i < count) { - /* symbolize that what needs to be autocompleted is - the full set of possible nextwords, and not extend - the last word - */ - *tokenp = strdup (""); - if (!*tokenp) - goto out; - tokenp++; - i++; - } + copy = strdup(text); + if (!copy) + goto out; + + tokenp = tokens; + + for (token = strtok_r(copy, " \t\r\n", &saveptr); token; + token = strtok_r(NULL, " \t\r\n", &saveptr)) { + *tokenp = strdup(token); + + if (!*tokenp) + goto out; + tokenp++; + i++; + } + + if (i < count) { + /* symbolize that what needs to be autocompleted is + the full set of possible nextwords, and not extend + the last word + */ + *tokenp = strdup(""); + if (!*tokenp) + goto out; + tokenp++; + i++; + } out: - free (copy); + free(copy); - if (i < count) { - cli_cmd_tokens_destroy (tokens); - tokens = NULL; - } + if (i < count) { + cli_cmd_tokens_destroy(tokens); + tokens = NULL; + } - return tokens; + return tokens; } - char ** -cli_rl_get_matches (struct cli_state *state, struct cli_cmd_word *word, - const char *text) +cli_rl_get_matches(struct cli_state *state, struct cli_cmd_word *word, + const char *text) { - char **matches = NULL; - char **matchesp = NULL; - struct cli_cmd_word **next = NULL; - int count = 0; - int len = 0; + char **matches = NULL; + char **matchesp = NULL; + struct cli_cmd_word **next = NULL; + int count = 0; + int len = 0; - len = strlen (text); + len = strlen(text); - if (!word->nextwords) - return NULL; + if (!word->nextwords) + return NULL; - for (next = word->nextwords; *next; next++) - count++; + for (next = word->nextwords; *next; next++) + count++; - matches = calloc (count + 1, sizeof (*matches)); - matchesp = matches; + matches = calloc(count + 1, sizeof(*matches)); + matchesp = matches; - for (next = word->nextwords; *next; next++) { - if ((*next)->match) { - continue; - } + for (next = word->nextwords; *next; next++) { + if ((*next)->match) { + continue; + } - if (strncmp ((*next)->word, text, len) == 0) { - *matchesp = strdup ((*next)->word); - matchesp++; - } + if (strncmp((*next)->word, text, len) == 0) { + *matchesp = strdup((*next)->word); + matchesp++; } + } - return matches; + return matches; } - int -cli_rl_autocomplete_prepare (struct cli_state *state, const char *text) +cli_rl_autocomplete_prepare(struct cli_state *state, const char *text) { - struct cli_cmd_word *word = NULL; - struct cli_cmd_word *next = NULL; - char **tokens = NULL; - char **tokenp = NULL; - char *token = NULL; - char **matches = NULL; - - tokens = cli_rl_tokenize (text); - if (!tokens) - return 0; - - word = &state->tree.root; - - for (tokenp = tokens; (token = *tokenp); tokenp++) { - if (!*(tokenp+1)) { - /* last word */ - break; - } - - next = cli_cmd_nextword (word, token); - word = next; - if (!word) - break; + struct cli_cmd_word *word = NULL; + struct cli_cmd_word *next = NULL; + char **tokens = NULL; + char **tokenp = NULL; + char *token = NULL; + char **matches = NULL; + + tokens = cli_rl_tokenize(text); + if (!tokens) + return 0; + + word = &state->tree.root; + + for (tokenp = tokens; (token = *tokenp); tokenp++) { + if (!*(tokenp + 1)) { + /* last word */ + break; } + next = cli_cmd_nextword(word, token); + word = next; if (!word) - goto out; + break; + } + + if (!word) + goto out; - if (!token) - return 0; - matches = cli_rl_get_matches (state, word, token); + if (!token) + return 0; + matches = cli_rl_get_matches(state, word, token); - state->matches = matches; - state->matchesp = matches; + state->matches = matches; + state->matchesp = matches; out: - cli_cmd_tokens_destroy (tokens); - return 0; + cli_cmd_tokens_destroy(tokens); + return 0; } - int -cli_rl_autocomplete_cleanup (struct cli_state *state) +cli_rl_autocomplete_cleanup(struct cli_state *state) { - if (state->matches) - cli_cmd_tokens_destroy (state->matches); + if (state->matches) + cli_cmd_tokens_destroy(state->matches); - state->matches = NULL; - state->matchesp = NULL; + state->matches = NULL; + state->matchesp = NULL; - return 0; + return 0; } - char ** -cli_rl_autocomplete (const char *text, int start, int end) +cli_rl_autocomplete(const char *text, int start, int end) { - struct cli_state *state = NULL; - char **matches = NULL; - char save = 0; + struct cli_state *state = NULL; + char **matches = NULL; + char save = 0; - state = global_state; + state = global_state; - /* hack to make the autocompletion code neater */ - /* fake it as though the cursor is at the end of line */ + /* hack to make the autocompletion code neater */ + /* fake it as though the cursor is at the end of line */ - save = rl_line_buffer[rl_point]; - rl_line_buffer[rl_point] = 0; + save = rl_line_buffer[rl_point]; + rl_line_buffer[rl_point] = 0; - cli_rl_autocomplete_prepare (state, rl_line_buffer); + cli_rl_autocomplete_prepare(state, rl_line_buffer); - matches = rl_completion_matches (text, cli_rl_autocomplete_entry); + matches = rl_completion_matches(text, cli_rl_autocomplete_entry); - cli_rl_autocomplete_cleanup (state); + cli_rl_autocomplete_cleanup(state); - rl_line_buffer[rl_point] = save; + rl_line_buffer[rl_point] = save; - return matches; + return matches; } - static char * -complete_none (const char *txt, int times) +complete_none(const char *txt, int times) { - return NULL; + return NULL; } - void * -cli_rl_input (void *_data) +cli_rl_input(void *_data) { - struct cli_state *state = NULL; - char *line = NULL; + struct cli_state *state = NULL; + char *line = NULL; - state = _data; + state = _data; - for (;;) { - line = readline (state->prompt); - if (!line) - exit(0); //break; + for (;;) { + line = readline(state->prompt); + if (!line) + exit(0); // break; - if (*line) - cli_rl_process_line (line); + if (*line) + cli_rl_process_line(line); - free (line); - } + free(line); + } - return NULL; + return NULL; } - int -cli_rl_enable (struct cli_state *state) +cli_rl_enable(struct cli_state *state) { - int ret = 0; - - rl_pre_input_hook = NULL; - rl_attempted_completion_function = cli_rl_autocomplete; - rl_completion_entry_function = complete_none; - - if (!state->rl_async) { - ret = pthread_create (&state->input, NULL, - cli_rl_input, state); - if (ret == 0) - state->rl_enabled = 1; - goto out; - } + int ret = 0; - ret = event_register (state->ctx->event_pool, 0, cli_rl_stdin, state, - 1, 0); - if (ret == -1) - goto out; + rl_pre_input_hook = NULL; + rl_attempted_completion_function = cli_rl_autocomplete; + rl_completion_entry_function = complete_none; - state->rl_enabled = 1; - rl_callback_handler_install (state->prompt, cli_rl_process_line); + if (!state->rl_async) { + ret = pthread_create(&state->input, NULL, cli_rl_input, state); + if (ret == 0) + state->rl_enabled = 1; + goto out; + } + + ret = event_register(state->ctx->event_pool, 0, cli_rl_stdin, state, 1, 0); + if (ret == -1) + goto out; + + state->rl_enabled = 1; + rl_callback_handler_install(state->prompt, cli_rl_process_line); out: - return state->rl_enabled; + return state->rl_enabled; } #else /* HAVE_READLINE */ int -cli_rl_enable (struct cli_state *state) +cli_rl_enable(struct cli_state *state) { - return 0; + return 0; } #endif /* HAVE_READLINE */ diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 40bd64b983c..fea74667e05 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -14,14 +14,14 @@ */ #define VOL_TOP_PERF_FILENAME_DEF_WIDTH 47 #define VOL_TOP_PERF_FILENAME_ALT_WIDTH 44 -#define VOL_TOP_PERF_SPEED_WIDTH 4 -#define VOL_TOP_PERF_TIME_WIDTH 26 +#define VOL_TOP_PERF_SPEED_WIDTH 4 +#define VOL_TOP_PERF_TIME_WIDTH 26 #define INDENT_MAIN_HEAD "%-25s %s " /* Do not show estimates if greater than this number */ -#define REBAL_ESTIMATE_SEC_UPPER_LIMIT (60*24*3600) -#define REBAL_ESTIMATE_START_TIME 600 +#define REBAL_ESTIMATE_SEC_UPPER_LIMIT (60 * 24 * 3600) +#define REBAL_ESTIMATE_START_TIME 600 #include "cli.h" #include "compat-errno.h" @@ -46,26 +46,22 @@ #include "quota-common-utils.h" #include "events.h" -enum gf_task_types { - GF_TASK_TYPE_REBALANCE, - GF_TASK_TYPE_REMOVE_BRICK -}; +enum gf_task_types { GF_TASK_TYPE_REBALANCE, GF_TASK_TYPE_REMOVE_BRICK }; extern struct rpc_clnt *global_quotad_rpc; extern rpc_clnt_prog_t cli_quotad_clnt; extern rpc_clnt_prog_t *cli_rpc_prog; -extern int cli_op_ret; -extern int connected; +extern int cli_op_ret; +extern int connected; int32_t -gf_cli_remove_brick (call_frame_t *frame, xlator_t *this, - void *data); - +gf_cli_remove_brick(call_frame_t *frame, xlator_t *this, void *data); -char *cli_vol_status_str[] = {"Created", - "Started", - "Stopped", - }; +char *cli_vol_status_str[] = { + "Created", + "Started", + "Stopped", +}; char *cli_vol_task_status_str[] = {"not started", "in progress", @@ -76,9670 +72,9631 @@ char *cli_vol_task_status_str[] = {"not started", "fix-layout stopped", "fix-layout completed", "fix-layout failed", - "unknown" -}; + "unknown"}; int32_t -gf_cli_snapshot (call_frame_t *frame, xlator_t *this, void *data); +gf_cli_snapshot(call_frame_t *frame, xlator_t *this, void *data); int32_t -gf_cli_get_volume (call_frame_t *frame, xlator_t *this, - void *data); +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); +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 -add_cli_cmd_timeout_to_dict (dict_t *dict); +add_cli_cmd_timeout_to_dict(dict_t *dict); rpc_clnt_prog_t cli_handshake_prog = { - .progname = "cli handshake", - .prognum = GLUSTER_HNDSK_PROGRAM, - .progver = GLUSTER_HNDSK_VERSION, + .progname = "cli handshake", + .prognum = GLUSTER_HNDSK_PROGRAM, + .progver = GLUSTER_HNDSK_VERSION, }; rpc_clnt_prog_t cli_pmap_prog = { - .progname = "cli portmap", - .prognum = GLUSTER_PMAP_PROGRAM, - .progver = GLUSTER_PMAP_VERSION, + .progname = "cli portmap", + .prognum = GLUSTER_PMAP_PROGRAM, + .progver = GLUSTER_PMAP_VERSION, }; int -gf_cli_probe_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - //rsp.op_ret = -1; - //rsp.op_errno = EINVAL; - goto out; - } - - gf_log ("cli", GF_LOG_INFO, "Received resp to probe"); - - if (rsp.op_errstr && (strlen (rsp.op_errstr) > 0)) { - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - if (rsp.op_ret) - gf_log ("cli", GF_LOG_ERROR, "%s", msg); - } +gf_cli_probe_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + // rsp.op_ret = -1; + // rsp.op_errno = EINVAL; + goto out; + } + + gf_log("cli", GF_LOG_INFO, "Received resp to probe"); + + if (rsp.op_errstr && (strlen(rsp.op_errstr) > 0)) { + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + if (rsp.op_ret) + gf_log("cli", GF_LOG_ERROR, "%s", msg); + } - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str (NULL, - (rsp.op_ret)? NULL : msg, - rsp.op_ret, rsp.op_errno, - (rsp.op_ret)? msg : NULL); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str(NULL, (rsp.op_ret) ? NULL : msg, rsp.op_ret, + rsp.op_errno, (rsp.op_ret) ? msg : NULL); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (!rsp.op_ret) - cli_out ("peer probe: success. %s", msg); - else - cli_err ("peer probe: failed: %s", msg); + if (!rsp.op_ret) + cli_out("peer probe: success. %s", msg); + else + cli_err("peer probe: failed: %s", msg); - ret = rsp.op_ret; + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } int -gf_cli_deprobe_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - //rsp.op_ret = -1; - //rsp.op_errno = EINVAL; - goto out; - } - - gf_log ("cli", GF_LOG_INFO, "Received resp to deprobe"); - - if (rsp.op_ret) { - if (strlen (rsp.op_errstr) > 0) { - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - gf_log ("cli", GF_LOG_ERROR, "%s", rsp.op_errstr); - } - } else { - snprintf (msg, sizeof (msg), "success"); - } - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str (NULL, - (rsp.op_ret)? NULL : msg, - rsp.op_ret, rsp.op_errno, - (rsp.op_ret)? msg : NULL); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } +gf_cli_deprobe_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + // rsp.op_ret = -1; + // rsp.op_errno = EINVAL; + goto out; + } + + gf_log("cli", GF_LOG_INFO, "Received resp to deprobe"); + + if (rsp.op_ret) { + if (strlen(rsp.op_errstr) > 0) { + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + gf_log("cli", GF_LOG_ERROR, "%s", rsp.op_errstr); + } + } else { + snprintf(msg, sizeof(msg), "success"); + } + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str(NULL, (rsp.op_ret) ? NULL : msg, rsp.op_ret, + rsp.op_errno, (rsp.op_ret) ? msg : NULL); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (!rsp.op_ret) - cli_out ("peer detach: %s", msg); - else - cli_err ("peer detach: failed: %s", msg); + if (!rsp.op_ret) + cli_out("peer detach: %s", msg); + else + cli_err("peer detach: failed: %s", msg); - ret = rsp.op_ret; + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } int -gf_cli_output_peer_hostnames (dict_t *dict, int count, char *prefix) -{ - int ret = -1; - char key[256] = {0,}; - int i = 0; - char *hostname = NULL; - - cli_out ("Other names:"); - /* Starting from friend.hostname1, as friend.hostname0 will be the same - * as friend.hostname - */ - for (i = 1; i < count; i++) { - snprintf (key, sizeof (key), "%s.hostname%d", prefix, i); - ret = dict_get_str (dict, key, &hostname); - if (ret) - break; - cli_out ("%s", hostname); - hostname = NULL; - } +gf_cli_output_peer_hostnames(dict_t *dict, int count, char *prefix) +{ + int ret = -1; + char key[256] = { + 0, + }; + int i = 0; + char *hostname = NULL; + + cli_out("Other names:"); + /* Starting from friend.hostname1, as friend.hostname0 will be the same + * as friend.hostname + */ + for (i = 1; i < count; i++) { + snprintf(key, sizeof(key), "%s.hostname%d", prefix, i); + ret = dict_get_str(dict, key, &hostname); + if (ret) + break; + cli_out("%s", hostname); + hostname = NULL; + } - return ret; + return ret; } int -gf_cli_output_peer_status (dict_t *dict, int count) -{ - int ret = -1; - char *uuid_buf = NULL; - char *hostname_buf = NULL; - int32_t i = 1; - char key[256] = {0,}; - char *state = NULL; - int32_t connected = 0; - char *connected_str = NULL; - int hostname_count = 0; - - cli_out ("Number of Peers: %d", count); - i = 1; - while ( i <= count) { - snprintf (key, 256, "friend%d.uuid", i); - ret = dict_get_str (dict, key, &uuid_buf); - if (ret) - goto out; - - snprintf (key, 256, "friend%d.hostname", i); - ret = dict_get_str (dict, key, &hostname_buf); - if (ret) - goto out; +gf_cli_output_peer_status(dict_t *dict, int count) +{ + int ret = -1; + char *uuid_buf = NULL; + char *hostname_buf = NULL; + int32_t i = 1; + char key[256] = { + 0, + }; + char *state = NULL; + int32_t connected = 0; + char *connected_str = NULL; + int hostname_count = 0; + + cli_out("Number of Peers: %d", count); + i = 1; + while (i <= count) { + snprintf(key, 256, "friend%d.uuid", i); + ret = dict_get_str(dict, key, &uuid_buf); + if (ret) + goto out; - snprintf (key, 256, "friend%d.connected", i); - ret = dict_get_int32 (dict, key, &connected); - if (ret) - goto out; - if (connected) - connected_str = "Connected"; - else - connected_str = "Disconnected"; + snprintf(key, 256, "friend%d.hostname", i); + ret = dict_get_str(dict, key, &hostname_buf); + if (ret) + goto out; + snprintf(key, 256, "friend%d.connected", i); + ret = dict_get_int32(dict, key, &connected); + if (ret) + goto out; + if (connected) + connected_str = "Connected"; + else + connected_str = "Disconnected"; - snprintf (key, 256, "friend%d.state", i); - ret = dict_get_str (dict, key, &state); - if (ret) - goto out; + snprintf(key, 256, "friend%d.state", i); + ret = dict_get_str(dict, key, &state); + if (ret) + goto out; - cli_out ("\nHostname: %s\nUuid: %s\nState: %s (%s)", - hostname_buf, uuid_buf, state, connected_str); + cli_out("\nHostname: %s\nUuid: %s\nState: %s (%s)", hostname_buf, + uuid_buf, state, connected_str); - snprintf (key, sizeof (key), "friend%d.hostname_count", i); - ret = dict_get_int32 (dict, key, &hostname_count); - /* Print other addresses only if there are more than 1. - */ - if ((ret == 0) && (hostname_count > 1)) { - snprintf (key, sizeof (key), "friend%d", i); - ret = gf_cli_output_peer_hostnames (dict, - hostname_count, - key); - if (ret) { - gf_log ("cli", GF_LOG_WARNING, - "error outputting peer other names"); - goto out; - } - } - i++; + snprintf(key, sizeof(key), "friend%d.hostname_count", i); + ret = dict_get_int32(dict, key, &hostname_count); + /* Print other addresses only if there are more than 1. + */ + if ((ret == 0) && (hostname_count > 1)) { + snprintf(key, sizeof(key), "friend%d", i); + ret = gf_cli_output_peer_hostnames(dict, hostname_count, key); + if (ret) { + gf_log("cli", GF_LOG_WARNING, + "error outputting peer other names"); + goto out; + } } + i++; + } - ret = 0; + ret = 0; out: - return ret; + return ret; } int -gf_cli_output_pool_list (dict_t *dict, int count) -{ - int ret = -1; - char *uuid_buf = NULL; - char *hostname_buf = NULL; - int32_t hostname_len = 8; /*min len 8 chars*/ - int32_t i = 1; - char key[256] = {0,}; - int32_t connected = 0; - char *connected_str = NULL; - - if (count <= 0) - goto out; - - while (i <= count) { - snprintf (key, 256, "friend%d.hostname", i); - ret = dict_get_str (dict, key, &hostname_buf); - if (ret) - goto out; +gf_cli_output_pool_list(dict_t *dict, int count) +{ + int ret = -1; + char *uuid_buf = NULL; + char *hostname_buf = NULL; + int32_t hostname_len = 8; /*min len 8 chars*/ + int32_t i = 1; + char key[256] = { + 0, + }; + int32_t connected = 0; + char *connected_str = NULL; + + if (count <= 0) + goto out; + + while (i <= count) { + snprintf(key, 256, "friend%d.hostname", i); + ret = dict_get_str(dict, key, &hostname_buf); + if (ret) + goto out; - ret = strlen(hostname_buf); - if (ret > hostname_len) - hostname_len = ret; + ret = strlen(hostname_buf); + if (ret > hostname_len) + hostname_len = ret; - i++; - } + i++; + } - cli_out ("UUID\t\t\t\t\t%-*s\tState", hostname_len, "Hostname"); + cli_out("UUID\t\t\t\t\t%-*s\tState", hostname_len, "Hostname"); - i = 1; - while ( i <= count) { - snprintf (key, 256, "friend%d.uuid", i); - ret = dict_get_str (dict, key, &uuid_buf); - if (ret) - goto out; + i = 1; + while (i <= count) { + snprintf(key, 256, "friend%d.uuid", i); + ret = dict_get_str(dict, key, &uuid_buf); + if (ret) + goto out; - snprintf (key, 256, "friend%d.hostname", i); - ret = dict_get_str (dict, key, &hostname_buf); - if (ret) - goto out; + snprintf(key, 256, "friend%d.hostname", i); + ret = dict_get_str(dict, key, &hostname_buf); + if (ret) + goto out; - snprintf (key, 256, "friend%d.connected", i); - ret = dict_get_int32 (dict, key, &connected); - if (ret) - goto out; - if (connected) - connected_str = "Connected"; - else - connected_str = "Disconnected"; + snprintf(key, 256, "friend%d.connected", i); + ret = dict_get_int32(dict, key, &connected); + if (ret) + goto out; + if (connected) + connected_str = "Connected"; + else + connected_str = "Disconnected"; - cli_out ("%s\t%-*s\t%s ", uuid_buf, hostname_len, hostname_buf, - connected_str); - i++; - } + cli_out("%s\t%-*s\t%s ", uuid_buf, hostname_len, hostname_buf, + connected_str); + i++; + } - ret = 0; + ret = 0; out: - return ret; + return ret; } /* function pointer for gf_cli_output_{pool_list,peer_status} */ -typedef int (*cli_friend_output_fn) (dict_t*, int); +typedef int (*cli_friend_output_fn)(dict_t *, int); int -gf_cli_list_friends_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_list_friends_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - gf1_cli_peer_list_rsp rsp = {0,}; - int ret = -1; - dict_t *dict = NULL; - char msg[1024] = {0,}; - char *cmd = NULL; - cli_friend_output_fn friend_output_fn; - call_frame_t *frame = NULL; - unsigned long flags = 0; + gf1_cli_peer_list_rsp rsp = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; + char msg[1024] = { + 0, + }; + char *cmd = NULL; + cli_friend_output_fn friend_output_fn; + call_frame_t *frame = NULL; + unsigned long flags = 0; - GF_ASSERT (myframe); + GF_ASSERT(myframe); - frame = myframe; + frame = myframe; - flags = (long)frame->local; + flags = (long)frame->local; - if (flags == GF_CLI_LIST_POOL_NODES) { - cmd = "pool list"; - friend_output_fn = &gf_cli_output_pool_list; - } else { - cmd = "peer status"; - friend_output_fn = &gf_cli_output_peer_status; - } + if (flags == GF_CLI_LIST_POOL_NODES) { + cmd = "pool list"; + friend_output_fn = &gf_cli_output_pool_list; + } else { + cmd = "peer status"; + friend_output_fn = &gf_cli_output_peer_status; + } - /* 'free' the flags set by gf_cli_list_friends */ - frame->local = NULL; + /* 'free' the flags set by gf_cli_list_friends */ + frame->local = NULL; - if (-1 == req->rpc_status) { - goto out; - } + if (-1 == req->rpc_status) { + goto out; + } - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf1_cli_peer_list_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - //rsp.op_ret = -1; - //rsp.op_errno = EINVAL; + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf1_cli_peer_list_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + // rsp.op_ret = -1; + // rsp.op_errno = EINVAL; + goto out; + } + + gf_log("cli", GF_LOG_DEBUG, "Received resp to list: %d", rsp.op_ret); + + if (!rsp.op_ret) { + if (!rsp.friends.friends_len) { + snprintf(msg, sizeof(msg), "%s: No peers present", cmd); + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_peer_status(dict, rsp.op_ret, rsp.op_errno, + msg); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); goto out; + } + cli_err("%s", msg); + ret = 0; + goto out; } - gf_log ("cli", GF_LOG_DEBUG, "Received resp to list: %d", - rsp.op_ret); - - if (!rsp.op_ret) { - - if (!rsp.friends.friends_len) { - snprintf (msg, sizeof (msg), - "%s: No peers present", cmd); - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_peer_status (dict, - rsp.op_ret, - rsp.op_errno, - msg); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } - cli_err ("%s", msg); - ret = 0; - goto out; - } - - dict = dict_new (); + dict = dict_new(); - if (!dict) { - ret = -1; - goto out; - } + if (!dict) { + ret = -1; + goto out; + } - ret = dict_unserialize (rsp.friends.friends_val, - rsp.friends.friends_len, - &dict); + ret = dict_unserialize(rsp.friends.friends_val, rsp.friends.friends_len, + &dict); - if (ret) { - gf_log ("", GF_LOG_ERROR, - "Unable to allocate memory"); - goto out; - } + if (ret) { + gf_log("", GF_LOG_ERROR, "Unable to allocate memory"); + goto out; + } - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_peer_status (dict, rsp.op_ret, - rsp.op_errno, msg); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_peer_status(dict, rsp.op_ret, rsp.op_errno, + msg); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - ret = dict_get_int32 (dict, "count", &count); - if (ret) { - goto out; - } + ret = dict_get_int32(dict, "count", &count); + if (ret) { + goto out; + } - ret = friend_output_fn (dict, count); - if (ret) { - goto out; - } + ret = friend_output_fn(dict, count); + if (ret) { + goto out; + } + } else { + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_peer_status(dict, rsp.op_ret, rsp.op_errno, + NULL); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); } else { - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_peer_status (dict, rsp.op_ret, - rsp.op_errno, NULL); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - } else { - ret = -1; - } - goto out; + ret = -1; } + goto out; + } - - ret = 0; + ret = 0; out: - if (ret) - cli_err ("%s: failed", cmd); + if (ret) + cli_err("%s: failed", cmd); - cli_cmd_broadcast_response (ret); + cli_cmd_broadcast_response(ret); - if (dict) - dict_unref (dict); + if (dict) + dict_unref(dict); - return ret; + return ret; } int -gf_cli_get_state_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - dict_t *dict = NULL; - char *daemon_name = NULL; - char *ofilepath = NULL; - - GF_VALIDATE_OR_GOTO ("cli", myframe, out); - - if (-1 == req->rpc_status) { - goto out; - } - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - dict = dict_new (); - - if (!dict) { - ret = -1; - goto out; - } - - ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, &dict); +gf_cli_get_state_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; + char *daemon_name = NULL; + char *ofilepath = NULL; + + GF_VALIDATE_OR_GOTO("cli", myframe, out); + + if (-1 == req->rpc_status) { + goto out; + } + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + dict = dict_new(); + + if (!dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + if (ret) + goto out; + + if (rsp.op_ret) { + if (strcmp(rsp.op_errstr, "")) + cli_err("Failed to get daemon state: %s", rsp.op_errstr); + else + cli_err( + "Failed to get daemon state. Check glusterd" + " log file for more details"); + } else { + ret = dict_get_str(dict, "daemon", &daemon_name); if (ret) - goto out; + gf_log("cli", GF_LOG_ERROR, "Couldn't get daemon name"); - if (rsp.op_ret) { - if (strcmp (rsp.op_errstr, "")) - cli_err ("Failed to get daemon state: %s", rsp.op_errstr); - else - cli_err ("Failed to get daemon state. Check glusterd" - " log file for more details"); - } else { - ret = dict_get_str (dict, "daemon", &daemon_name); - if (ret) - gf_log ("cli", GF_LOG_ERROR, "Couldn't get daemon name"); - - ret = dict_get_str (dict, "ofilepath", &ofilepath); - if (ret) - gf_log ("cli", GF_LOG_ERROR, "Couldn't get filepath"); + ret = dict_get_str(dict, "ofilepath", &ofilepath); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Couldn't get filepath"); - if (daemon_name && ofilepath) - cli_out ("%s state dumped to %s", - daemon_name, ofilepath); - } + if (daemon_name && ofilepath) + cli_out("%s state dumped to %s", daemon_name, ofilepath); + } - ret = rsp.op_ret; + ret = rsp.op_ret; out: - free (rsp.dict.dict_val); - free (rsp.op_errstr); + free(rsp.dict.dict_val); + free(rsp.op_errstr); - if (dict) - dict_unref (dict); + if (dict) + dict_unref(dict); - cli_cmd_broadcast_response (ret); + cli_cmd_broadcast_response(ret); - return ret; + return ret; } void -cli_out_options ( char *substr, char *optstr, char *valstr) +cli_out_options(char *substr, char *optstr, char *valstr) { - char *ptr1 = NULL; - char *ptr2 = NULL; + char *ptr1 = NULL; + char *ptr2 = NULL; - ptr1 = substr; - ptr2 = optstr; + ptr1 = substr; + ptr2 = optstr; - while (ptr1) - { - /* Avoiding segmentation fault. */ - if (!ptr2) - return; - if (*ptr1 != *ptr2) - break; - ptr1++; - ptr2++; - } + while (ptr1) { + /* Avoiding segmentation fault. */ + if (!ptr2) + return; + if (*ptr1 != *ptr2) + break; + ptr1++; + ptr2++; + } - if (*ptr2 == '\0') - return; - cli_out ("%s: %s",ptr2 , valstr); + if (*ptr2 == '\0') + return; + cli_out("%s: %s", ptr2, valstr); } static int -_gf_cli_output_volinfo_opts (dict_t *d, char *k, - data_t *v, void *tmp) -{ - int ret = 0; - char *key = NULL; - char *ptr = NULL; - data_t *value = NULL; - - key = tmp; - - ptr = strstr (k, "option."); - if (ptr) { - value = v; - if (!value) { - ret = -1; - goto out; - } - cli_out_options (key, k, v->data); +_gf_cli_output_volinfo_opts(dict_t *d, char *k, data_t *v, void *tmp) +{ + int ret = 0; + char *key = NULL; + char *ptr = NULL; + data_t *value = NULL; + + key = tmp; + + ptr = strstr(k, "option."); + if (ptr) { + value = v; + if (!value) { + ret = -1; + goto out; } + cli_out_options(key, k, v->data); + } out: - return ret; + return ret; } static int -print_brick_details (dict_t *dict, int volcount, int start_index, - int end_index, int replica_count) -{ - char key[1024] = {0,}; - int index = start_index; - int isArbiter = 0; - int ret = -1; - char *brick = NULL; +print_brick_details(dict_t *dict, int volcount, int start_index, int end_index, + int replica_count) +{ + char key[1024] = { + 0, + }; + int index = start_index; + int isArbiter = 0; + int ret = -1; + char *brick = NULL; #ifdef HAVE_BD_XLATOR - char *caps = NULL; + char *caps = NULL; #endif - while (index <= end_index) { - snprintf (key, 1024, "volume%d.brick%d", volcount, index); - ret = dict_get_str (dict, key, &brick); - if (ret) - goto out; - snprintf (key, sizeof (key), "volume%d.brick%d.isArbiter", - volcount, index); - if (dict_get (dict, key)) - isArbiter = 1; - else - isArbiter = 0; + while (index <= end_index) { + snprintf(key, 1024, "volume%d.brick%d", volcount, index); + ret = dict_get_str(dict, key, &brick); + if (ret) + goto out; + snprintf(key, sizeof(key), "volume%d.brick%d.isArbiter", volcount, + index); + if (dict_get(dict, key)) + isArbiter = 1; + else + isArbiter = 0; - if (isArbiter) - cli_out ("Brick%d: %s (arbiter)", index, brick); - else - cli_out ("Brick%d: %s", index, brick); + if (isArbiter) + cli_out("Brick%d: %s (arbiter)", index, brick); + else + cli_out("Brick%d: %s", index, brick); #ifdef HAVE_BD_XLATOR - snprintf (key, 1024, "volume%d.vg%d", volcount, index); - ret = dict_get_str (dict, key, &caps); - if (!ret) - cli_out ("Brick%d VG: %s", index, caps); + snprintf(key, 1024, "volume%d.vg%d", volcount, index); + ret = dict_get_str(dict, key, &caps); + if (!ret) + cli_out("Brick%d VG: %s", index, caps); #endif - index++; - } - ret = 0; + index++; + } + ret = 0; out: - return ret; + return ret; } void -gf_cli_print_number_of_bricks (int type, int brick_count, int dist_count, - int stripe_count, int replica_count, - int disperse_count, int redundancy_count, - int arbiter_count) -{ - if (type == GF_CLUSTER_TYPE_STRIPE_REPLICATE) { - if (arbiter_count == 0) { - cli_out ("Number of Bricks: %d x %d x %d = %d", - (brick_count / dist_count), - stripe_count, - replica_count, - brick_count); - } else { - cli_out ("Number of Bricks: %d x %d x (%d + %d) = %d", - (brick_count / dist_count), - stripe_count, replica_count - arbiter_count, - arbiter_count, brick_count); - } - } else if (type == GF_CLUSTER_TYPE_NONE || - type == GF_CLUSTER_TYPE_TIER) { - cli_out ("Number of Bricks: %d", brick_count); - } else if (type == GF_CLUSTER_TYPE_DISPERSE) { - cli_out ("Number of Bricks: %d x (%d + %d) = %d", - (brick_count / dist_count), - disperse_count - redundancy_count, - redundancy_count, brick_count); - } else { - /* For both replicate and stripe, dist_count is - good enough */ - if (arbiter_count == 0) { - cli_out ("Number of Bricks: %d x %d = %d", - (brick_count / dist_count), - dist_count, brick_count); - } else { - cli_out ("Number of Bricks: %d x (%d + %d) = %d", - (brick_count / dist_count), - dist_count - arbiter_count, arbiter_count, - brick_count); - } - } - +gf_cli_print_number_of_bricks(int type, int brick_count, int dist_count, + int stripe_count, int replica_count, + int disperse_count, int redundancy_count, + int arbiter_count) +{ + if (type == GF_CLUSTER_TYPE_STRIPE_REPLICATE) { + if (arbiter_count == 0) { + cli_out("Number of Bricks: %d x %d x %d = %d", + (brick_count / dist_count), stripe_count, replica_count, + brick_count); + } else { + cli_out("Number of Bricks: %d x %d x (%d + %d) = %d", + (brick_count / dist_count), stripe_count, + replica_count - arbiter_count, arbiter_count, brick_count); + } + } else if (type == GF_CLUSTER_TYPE_NONE || type == GF_CLUSTER_TYPE_TIER) { + cli_out("Number of Bricks: %d", brick_count); + } else if (type == GF_CLUSTER_TYPE_DISPERSE) { + cli_out("Number of Bricks: %d x (%d + %d) = %d", + (brick_count / dist_count), disperse_count - redundancy_count, + redundancy_count, brick_count); + } else { + /* For both replicate and stripe, dist_count is + good enough */ + if (arbiter_count == 0) { + cli_out("Number of Bricks: %d x %d = %d", + (brick_count / dist_count), dist_count, brick_count); + } else { + cli_out("Number of Bricks: %d x (%d + %d) = %d", + (brick_count / dist_count), dist_count - arbiter_count, + arbiter_count, brick_count); + } + } } int -gf_cli_print_tier_info (dict_t *dict, int i, int brick_count) -{ - - int hot_brick_count = -1; - int cold_type = 0; - int cold_brick_count = 0; - int cold_replica_count = 0; - int cold_arbiter_count = 0; - int cold_disperse_count = 0; - int cold_redundancy_count = 0; - int cold_dist_count = 0; - int hot_type = 0; - int hot_replica_count = 0; - int hot_dist_count = 0; - int ret = -1; - int vol_type = -1; - char key[256] = {0,}; - - GF_ASSERT (dict); - - snprintf (key, sizeof (key), "volume%d.cold_brick_count", i); - ret = dict_get_int32 (dict, key, &cold_brick_count); - if (ret) - goto out; - - snprintf (key, sizeof (key), "volume%d.cold_type", i); - ret = dict_get_int32 (dict, key, &cold_type); - if (ret) - goto out; - - snprintf (key, sizeof (key), "volume%d.cold_dist_count", i); - ret = dict_get_int32 (dict, key, &cold_dist_count); - if (ret) - goto out; - - snprintf (key, sizeof (key), "volume%d.cold_replica_count", i); - ret = dict_get_int32 (dict, key, &cold_replica_count); - if (ret) - goto out; - - snprintf (key, sizeof (key), "volume%d.cold_arbiter_count", i); - ret = dict_get_int32 (dict, key, &cold_arbiter_count); - if (ret) - goto out; - - snprintf (key, sizeof (key), "volume%d.cold_disperse_count", i); - ret = dict_get_int32 (dict, key, &cold_disperse_count); - if (ret) - goto out; - - snprintf (key, sizeof (key), - "volume%d.cold_redundancy_count", i); - ret = dict_get_int32 (dict, key, - &cold_redundancy_count); - if (ret) - goto out; - - snprintf (key, sizeof (key), "volume%d.hot_brick_count", i); - ret = dict_get_int32 (dict, key, &hot_brick_count); - if (ret) - goto out; - - snprintf (key, sizeof (key), "volume%d.hot_type", i); - ret = dict_get_int32 (dict, key, &hot_type); - if (ret) - goto out; - snprintf (key, sizeof (key), "volume%d.hot_replica_count", i); - ret = dict_get_int32 (dict, key, &hot_replica_count); - if (ret) - goto out; - - cli_out ("Hot Tier :"); - hot_dist_count = (hot_replica_count ? - hot_replica_count : 1); - - vol_type = get_vol_type (hot_type, hot_dist_count, hot_brick_count); - cli_out ("Hot Tier Type : %s", - vol_type_str[vol_type]); - - gf_cli_print_number_of_bricks (hot_type, - hot_brick_count, hot_dist_count, 0, - hot_replica_count, 0, 0, 0); - - ret = print_brick_details (dict, i, 1, hot_brick_count, - hot_replica_count); - if (ret) - goto out; - - cli_out ("Cold Tier:"); - - vol_type = get_vol_type (cold_type, cold_dist_count, cold_brick_count); - cli_out ("Cold Tier Type : %s", - vol_type_str[vol_type]); - - gf_cli_print_number_of_bricks (cold_type, - cold_brick_count, - cold_dist_count, 0, cold_replica_count, - cold_disperse_count, cold_redundancy_count, cold_arbiter_count); - - ret = print_brick_details (dict, i, hot_brick_count+1, - brick_count, cold_replica_count); - if (ret) - goto out; -out: - return ret; +gf_cli_print_tier_info(dict_t *dict, int i, int brick_count) +{ + int hot_brick_count = -1; + int cold_type = 0; + int cold_brick_count = 0; + int cold_replica_count = 0; + int cold_arbiter_count = 0; + int cold_disperse_count = 0; + int cold_redundancy_count = 0; + int cold_dist_count = 0; + int hot_type = 0; + int hot_replica_count = 0; + int hot_dist_count = 0; + int ret = -1; + int vol_type = -1; + char key[256] = { + 0, + }; + + GF_ASSERT(dict); + + snprintf(key, sizeof(key), "volume%d.cold_brick_count", i); + ret = dict_get_int32(dict, key, &cold_brick_count); + if (ret) + goto out; + + snprintf(key, sizeof(key), "volume%d.cold_type", i); + ret = dict_get_int32(dict, key, &cold_type); + if (ret) + goto out; + + snprintf(key, sizeof(key), "volume%d.cold_dist_count", i); + ret = dict_get_int32(dict, key, &cold_dist_count); + if (ret) + goto out; + + snprintf(key, sizeof(key), "volume%d.cold_replica_count", i); + ret = dict_get_int32(dict, key, &cold_replica_count); + if (ret) + goto out; + + snprintf(key, sizeof(key), "volume%d.cold_arbiter_count", i); + ret = dict_get_int32(dict, key, &cold_arbiter_count); + if (ret) + goto out; + + snprintf(key, sizeof(key), "volume%d.cold_disperse_count", i); + ret = dict_get_int32(dict, key, &cold_disperse_count); + if (ret) + goto out; + + snprintf(key, sizeof(key), "volume%d.cold_redundancy_count", i); + ret = dict_get_int32(dict, key, &cold_redundancy_count); + if (ret) + goto out; + + snprintf(key, sizeof(key), "volume%d.hot_brick_count", i); + ret = dict_get_int32(dict, key, &hot_brick_count); + if (ret) + goto out; + + snprintf(key, sizeof(key), "volume%d.hot_type", i); + ret = dict_get_int32(dict, key, &hot_type); + if (ret) + goto out; + snprintf(key, sizeof(key), "volume%d.hot_replica_count", i); + ret = dict_get_int32(dict, key, &hot_replica_count); + if (ret) + goto out; + + cli_out("Hot Tier :"); + hot_dist_count = (hot_replica_count ? hot_replica_count : 1); + + vol_type = get_vol_type(hot_type, hot_dist_count, hot_brick_count); + cli_out("Hot Tier Type : %s", vol_type_str[vol_type]); + + gf_cli_print_number_of_bricks(hot_type, hot_brick_count, hot_dist_count, 0, + hot_replica_count, 0, 0, 0); + + ret = print_brick_details(dict, i, 1, hot_brick_count, hot_replica_count); + if (ret) + goto out; + + cli_out("Cold Tier:"); + + vol_type = get_vol_type(cold_type, cold_dist_count, cold_brick_count); + cli_out("Cold Tier Type : %s", vol_type_str[vol_type]); + + gf_cli_print_number_of_bricks(cold_type, cold_brick_count, cold_dist_count, + 0, cold_replica_count, cold_disperse_count, + cold_redundancy_count, cold_arbiter_count); + + ret = print_brick_details(dict, i, hot_brick_count + 1, brick_count, + cold_replica_count); + if (ret) + goto out; +out: + return ret; } int -gf_cli_get_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - int ret = -1; - int opt_count = 0; - int32_t i = 0; - int32_t j = 1; - int32_t status = 0; - int32_t type = 0; - int32_t brick_count = 0; - int32_t dist_count = 0; - int32_t stripe_count = 0; - int32_t replica_count = 0; - int32_t disperse_count = 0; - int32_t redundancy_count = 0; - int32_t arbiter_count = 0; - int32_t snap_count = 0; - int32_t vol_type = 0; - int32_t transport = 0; - char *volume_id_str = NULL; - char *volname = NULL; - dict_t *dict = NULL; - cli_local_t *local = NULL; - char key[1024] = {0}; - char err_str[2048] = {0}; - gf_cli_rsp rsp = {0}; - char *caps __attribute__((unused)) = NULL; - int k __attribute__((unused)) = 0; - call_frame_t *frame = NULL; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) - goto out; +gf_cli_get_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + int ret = -1; + int opt_count = 0; + int32_t i = 0; + int32_t j = 1; + int32_t status = 0; + int32_t type = 0; + int32_t brick_count = 0; + int32_t dist_count = 0; + int32_t stripe_count = 0; + int32_t replica_count = 0; + int32_t disperse_count = 0; + int32_t redundancy_count = 0; + int32_t arbiter_count = 0; + int32_t snap_count = 0; + int32_t vol_type = 0; + int32_t transport = 0; + char *volume_id_str = NULL; + char *volname = NULL; + dict_t *dict = NULL; + cli_local_t *local = NULL; + char key[1024] = {0}; + char err_str[2048] = {0}; + gf_cli_rsp rsp = {0}; + char *caps __attribute__((unused)) = NULL; + int k __attribute__((unused)) = 0; + call_frame_t *frame = NULL; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) + goto out; + + frame = myframe; + + GF_ASSERT(frame->local); + + local = frame->local; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + gf_log("cli", GF_LOG_INFO, "Received resp to get vol: %d", rsp.op_ret); + + if (!rsp.dict.dict_len) { + if (global_state->mode & GLUSTER_MODE_XML) + goto xml_output; + cli_err("No volumes present"); + ret = 0; + goto out; + } - frame = myframe; + dict = dict_new(); - GF_ASSERT (frame->local); + if (!dict) { + ret = -1; + goto out; + } - local = frame->local; + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to allocate memory"); + goto out; + } - gf_log ("cli", GF_LOG_INFO, "Received resp to get vol: %d", - rsp.op_ret); + ret = dict_get_int32(dict, "count", &count); + if (ret) + goto out; - if (!rsp.dict.dict_len) { - if (global_state->mode & GLUSTER_MODE_XML) - goto xml_output; - cli_err ("No volumes present"); + if (!count) { + switch (local->get_vol.flags) { + case GF_CLI_GET_NEXT_VOLUME: + GF_FREE(local->get_vol.volname); + local->get_vol.volname = NULL; ret = 0; goto out; - } - - dict = dict_new (); - if (!dict) { + case GF_CLI_GET_VOLUME: + snprintf(err_str, sizeof(err_str), "Volume %s does not exist", + local->get_vol.volname); ret = -1; - goto out; + if (!(global_state->mode & GLUSTER_MODE_XML)) + goto out; } + } - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); - - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Unable to allocate memory"); - goto out; - } + if (rsp.op_ret) { + if (global_state->mode & GLUSTER_MODE_XML) + goto xml_output; + ret = -1; + goto out; + } - ret = dict_get_int32 (dict, "count", &count); - if (ret) +xml_output: + if (global_state->mode & GLUSTER_MODE_XML) { + /* For GET_NEXT_VOLUME output is already begun in + * and will also end in gf_cli_get_next_volume() + */ + if (local->get_vol.flags == GF_CLI_GET_VOLUME) { + ret = cli_xml_output_vol_info_begin(local, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); goto out; - - if (!count) { - switch (local->get_vol.flags) { - - case GF_CLI_GET_NEXT_VOLUME: - GF_FREE (local->get_vol.volname); - local->get_vol.volname = NULL; - ret = 0; - goto out; - - case GF_CLI_GET_VOLUME: - snprintf (err_str, sizeof (err_str), - "Volume %s does not exist", - local->get_vol.volname); - ret = -1; - if (!(global_state->mode & GLUSTER_MODE_XML)) - goto out; - } + } } - if (rsp.op_ret) { - if (global_state->mode & GLUSTER_MODE_XML) - goto xml_output; - ret = -1; + if (dict) { + ret = cli_xml_output_vol_info(local, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); goto out; + } } -xml_output: - if (global_state->mode & GLUSTER_MODE_XML) { - /* For GET_NEXT_VOLUME output is already begun in - * and will also end in gf_cli_get_next_volume() - */ - if (local->get_vol.flags == GF_CLI_GET_VOLUME) { - ret = cli_xml_output_vol_info_begin - (local, rsp.op_ret, rsp.op_errno, - rsp.op_errstr); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } - } - - if (dict) { - ret = cli_xml_output_vol_info (local, dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } - } - - if (local->get_vol.flags == GF_CLI_GET_VOLUME) { - ret = cli_xml_output_vol_info_end (local); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - } - goto out; + if (local->get_vol.flags == GF_CLI_GET_VOLUME) { + ret = cli_xml_output_vol_info_end(local); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); } + goto out; + } - while ( i < count) { - cli_out (" "); - snprintf (key, 256, "volume%d.name", i); - ret = dict_get_str (dict, key, &volname); - if (ret) - goto out; + while (i < count) { + cli_out(" "); + snprintf(key, 256, "volume%d.name", i); + ret = dict_get_str(dict, key, &volname); + if (ret) + goto out; - snprintf (key, 256, "volume%d.type", i); - ret = dict_get_int32 (dict, key, &type); - if (ret) - goto out; + snprintf(key, 256, "volume%d.type", i); + ret = dict_get_int32(dict, key, &type); + if (ret) + goto out; - snprintf (key, 256, "volume%d.status", i); - ret = dict_get_int32 (dict, key, &status); - if (ret) - goto out; + snprintf(key, 256, "volume%d.status", i); + ret = dict_get_int32(dict, key, &status); + if (ret) + goto out; - snprintf (key, 256, "volume%d.brick_count", i); - ret = dict_get_int32 (dict, key, &brick_count); - if (ret) - goto out; + snprintf(key, 256, "volume%d.brick_count", i); + ret = dict_get_int32(dict, key, &brick_count); + if (ret) + goto out; - snprintf (key, 256, "volume%d.dist_count", i); - ret = dict_get_int32 (dict, key, &dist_count); - if (ret) - goto out; + snprintf(key, 256, "volume%d.dist_count", i); + ret = dict_get_int32(dict, key, &dist_count); + if (ret) + goto out; - snprintf (key, 256, "volume%d.stripe_count", i); - ret = dict_get_int32 (dict, key, &stripe_count); - if (ret) - goto out; + snprintf(key, 256, "volume%d.stripe_count", i); + ret = dict_get_int32(dict, key, &stripe_count); + if (ret) + goto out; - snprintf (key, 256, "volume%d.replica_count", i); - ret = dict_get_int32 (dict, key, &replica_count); - if (ret) - goto out; + snprintf(key, 256, "volume%d.replica_count", i); + ret = dict_get_int32(dict, key, &replica_count); + if (ret) + goto out; - snprintf (key, 256, "volume%d.disperse_count", i); - ret = dict_get_int32 (dict, key, &disperse_count); - if (ret) - goto out; + snprintf(key, 256, "volume%d.disperse_count", i); + ret = dict_get_int32(dict, key, &disperse_count); + if (ret) + goto out; - snprintf (key, 256, "volume%d.redundancy_count", i); - ret = dict_get_int32 (dict, key, &redundancy_count); - if (ret) - goto out; + snprintf(key, 256, "volume%d.redundancy_count", i); + ret = dict_get_int32(dict, key, &redundancy_count); + if (ret) + goto out; - snprintf (key, sizeof(key), "volume%d.arbiter_count", i); - ret = dict_get_int32 (dict, key, &arbiter_count); - if (ret) - goto out; + snprintf(key, sizeof(key), "volume%d.arbiter_count", i); + ret = dict_get_int32(dict, key, &arbiter_count); + if (ret) + goto out; - snprintf (key, 256, "volume%d.transport", i); - ret = dict_get_int32 (dict, key, &transport); - if (ret) - goto out; + snprintf(key, 256, "volume%d.transport", i); + ret = dict_get_int32(dict, key, &transport); + if (ret) + goto out; - snprintf (key, 256, "volume%d.volume_id", i); - ret = dict_get_str (dict, key, &volume_id_str); - if (ret) - goto out; + snprintf(key, 256, "volume%d.volume_id", i); + ret = dict_get_str(dict, key, &volume_id_str); + if (ret) + goto out; - snprintf (key, 256, "volume%d.snap_count", i); - ret = dict_get_int32 (dict, key, &snap_count); - if (ret) - goto out; + snprintf(key, 256, "volume%d.snap_count", i); + ret = dict_get_int32(dict, key, &snap_count); + if (ret) + goto out; - // Distributed (stripe/replicate/stripe-replica) setups - vol_type = get_vol_type (type, dist_count, brick_count); + // Distributed (stripe/replicate/stripe-replica) setups + vol_type = get_vol_type(type, dist_count, brick_count); - cli_out ("Volume Name: %s", volname); - cli_out ("Type: %s", vol_type_str[vol_type]); - cli_out ("Volume ID: %s", volume_id_str); - cli_out ("Status: %s", cli_vol_status_str[status]); - cli_out ("Snapshot Count: %d", snap_count); + cli_out("Volume Name: %s", volname); + cli_out("Type: %s", vol_type_str[vol_type]); + cli_out("Volume ID: %s", volume_id_str); + cli_out("Status: %s", cli_vol_status_str[status]); + cli_out("Snapshot Count: %d", snap_count); #ifdef HAVE_BD_XLATOR - k = 0; - snprintf (key, sizeof (key), "volume%d.xlator%d", i, k); - ret = dict_get_str (dict, key, &caps); - if (ret) - goto next; - do { - j = 0; - cli_out ("Xlator %d: %s", k + 1, caps); - do { - snprintf (key, sizeof (key), - "volume%d.xlator%d.caps%d", - i, k, j++); - ret = dict_get_str (dict, key, &caps); - if (ret) - break; - cli_out ("Capability %d: %s", j, caps); - } while (1); - - snprintf (key, sizeof (key), - "volume%d.xlator%d", i, ++k); - ret = dict_get_str (dict, key, &caps); - if (ret) - break; - } while (1); - -next: -#endif - gf_cli_print_number_of_bricks (type, brick_count, - dist_count, stripe_count, replica_count, - disperse_count, redundancy_count, - arbiter_count); + k = 0; + snprintf(key, sizeof(key), "volume%d.xlator%d", i, k); + ret = dict_get_str(dict, key, &caps); + if (ret) + goto next; + do { + j = 0; + cli_out("Xlator %d: %s", k + 1, caps); + do { + snprintf(key, sizeof(key), "volume%d.xlator%d.caps%d", i, k, + j++); + ret = dict_get_str(dict, key, &caps); + if (ret) + break; + cli_out("Capability %d: %s", j, caps); + } while (1); + + snprintf(key, sizeof(key), "volume%d.xlator%d", i, ++k); + ret = dict_get_str(dict, key, &caps); + if (ret) + break; + } while (1); - cli_out ("Transport-type: %s", - ((transport == 0)?"tcp": - (transport == 1)?"rdma": - "tcp,rdma")); - j = 1; + next: +#endif + gf_cli_print_number_of_bricks( + type, brick_count, dist_count, stripe_count, replica_count, + disperse_count, redundancy_count, arbiter_count); - GF_FREE (local->get_vol.volname); - local->get_vol.volname = gf_strdup (volname); + cli_out("Transport-type: %s", + ((transport == 0) ? "tcp" + : (transport == 1) ? "rdma" : "tcp,rdma")); + j = 1; - if (type == GF_CLUSTER_TYPE_TIER) { - ret = gf_cli_print_tier_info (dict, i, brick_count); - if (ret) - goto out; + GF_FREE(local->get_vol.volname); + local->get_vol.volname = gf_strdup(volname); - } else { - cli_out ("Bricks:"); - ret = print_brick_details (dict, i, j, brick_count, - replica_count); - if (ret) - goto out; - } + if (type == GF_CLUSTER_TYPE_TIER) { + ret = gf_cli_print_tier_info(dict, i, brick_count); + if (ret) + goto out; - snprintf (key, 256, "volume%d.opt_count",i); - ret = dict_get_int32 (dict, key, &opt_count); - if (ret) - goto out; + } else { + cli_out("Bricks:"); + ret = print_brick_details(dict, i, j, brick_count, replica_count); + if (ret) + goto out; + } - if (!opt_count) - goto out; + snprintf(key, 256, "volume%d.opt_count", i); + ret = dict_get_int32(dict, key, &opt_count); + if (ret) + goto out; - cli_out ("Options Reconfigured:"); + if (!opt_count) + goto out; - snprintf (key, 256, "volume%d.option.",i); + cli_out("Options Reconfigured:"); - ret = dict_foreach (dict, _gf_cli_output_volinfo_opts, key); - if (ret) - goto out; + snprintf(key, 256, "volume%d.option.", i); - i++; - } + ret = dict_foreach(dict, _gf_cli_output_volinfo_opts, key); + if (ret) + goto out; + i++; + } - ret = 0; + ret = 0; out: - if (ret) - cli_err ("%s", err_str); + if (ret) + cli_err("%s", err_str); - cli_cmd_broadcast_response (ret); + cli_cmd_broadcast_response(ret); - if (dict) - dict_unref (dict); + if (dict) + dict_unref(dict); - free (rsp.dict.dict_val); + free(rsp.dict.dict_val); - free (rsp.op_errstr); + free(rsp.op_errstr); - gf_log ("cli", GF_LOG_DEBUG, "Returning: %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning: %d", ret); + return ret; } int -gf_cli_create_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_create_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - gf_cli_rsp rsp = {0,}; - int ret = -1; - cli_local_t *local = NULL; - char *volname = NULL; - dict_t *rsp_dict = NULL; - call_frame_t *frame = NULL; - - GF_ASSERT (myframe); + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + cli_local_t *local = NULL; + char *volname = NULL; + dict_t *rsp_dict = NULL; + call_frame_t *frame = NULL; - if (-1 == req->rpc_status) { - goto out; - } + GF_ASSERT(myframe); - frame = myframe; + if (-1 == req->rpc_status) { + goto out; + } - GF_ASSERT (frame->local); + frame = myframe; - local = frame->local; + GF_ASSERT(frame->local); - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + local = frame->local; - gf_log ("cli", GF_LOG_INFO, "Received resp to create volume"); + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - ret = dict_get_str (local->dict, "volname", &volname); - if (ret) - goto out; + gf_log("cli", GF_LOG_INFO, "Received resp to create volume"); - if (global_state->mode & GLUSTER_MODE_XML) { - if (rsp.op_ret == 0) { - rsp_dict = dict_new (); - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &rsp_dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Failed rsp_dict unserialization"); - goto out; - } - } + ret = dict_get_str(local->dict, "volname", &volname); + if (ret) + goto out; - ret = cli_xml_output_vol_create (rsp_dict, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); + if (global_state->mode & GLUSTER_MODE_XML) { + if (rsp.op_ret == 0) { + rsp_dict = dict_new(); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, + &rsp_dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed rsp_dict unserialization"); goto out; + } } - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - cli_err ("volume create: %s: failed: %s", volname, - rsp.op_errstr); - else if (rsp.op_ret) - cli_err ("volume create: %s: failed", volname); - else - cli_out ("volume create: %s: success: " - "please start the volume to access data", volname); + ret = cli_xml_output_vol_create(rsp_dict, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - ret = rsp.op_ret; + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + cli_err("volume create: %s: failed: %s", volname, rsp.op_errstr); + else if (rsp.op_ret) + cli_err("volume create: %s: failed", volname); + else + cli_out( + "volume create: %s: success: " + "please start the volume to access data", + volname); + + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - free (rsp.dict.dict_val); - free (rsp.op_errstr); - return ret; + cli_cmd_broadcast_response(ret); + free(rsp.dict.dict_val); + free(rsp.op_errstr); + return ret; } int -gf_cli_delete_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_delete_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - gf_cli_rsp rsp = {0,}; - int ret = -1; - cli_local_t *local = NULL; - char *volname = NULL; - call_frame_t *frame = NULL; - dict_t *rsp_dict = NULL; + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + cli_local_t *local = NULL; + char *volname = NULL; + call_frame_t *frame = NULL; + dict_t *rsp_dict = NULL; - GF_ASSERT (myframe); + GF_ASSERT(myframe); - if (-1 == req->rpc_status) { - goto out; - } + if (-1 == req->rpc_status) { + goto out; + } - frame = myframe; + frame = myframe; - GF_ASSERT (frame->local); + GF_ASSERT(frame->local); - local = frame->local; + local = frame->local; - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - ret = dict_get_str (local->dict, "volname", &volname); - if (ret) { - gf_log (frame->this->name, GF_LOG_ERROR, - "dict get failed"); - goto out; - } + ret = dict_get_str(local->dict, "volname", &volname); + if (ret) { + gf_log(frame->this->name, GF_LOG_ERROR, "dict get failed"); + goto out; + } - gf_log ("cli", GF_LOG_INFO, "Received resp to delete volume"); + gf_log("cli", GF_LOG_INFO, "Received resp to delete volume"); - if (global_state->mode & GLUSTER_MODE_XML) { - if (rsp.op_ret == 0) { - rsp_dict = dict_new (); - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &rsp_dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Failed rsp_dict unserialization"); - goto out; - } - } - - ret = cli_xml_output_generic_volume ("volDelete", rsp_dict, - rsp.op_ret, rsp.op_errno, - rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); + if (global_state->mode & GLUSTER_MODE_XML) { + if (rsp.op_ret == 0) { + rsp_dict = dict_new(); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, + &rsp_dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed rsp_dict unserialization"); goto out; + } } - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - cli_err ("volume delete: %s: failed: %s", volname, - rsp.op_errstr); - else if (rsp.op_ret) - cli_err ("volume delete: %s: failed", volname); - else - cli_out ("volume delete: %s: success", volname); + ret = cli_xml_output_generic_volume("volDelete", rsp_dict, rsp.op_ret, + rsp.op_errno, rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - ret = rsp.op_ret; + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + cli_err("volume delete: %s: failed: %s", volname, rsp.op_errstr); + else if (rsp.op_ret) + cli_err("volume delete: %s: failed", volname); + else + cli_out("volume delete: %s: success", volname); + + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - free (rsp.dict.dict_val); + cli_cmd_broadcast_response(ret); + free(rsp.dict.dict_val); - gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret); - return ret; + gf_log("", GF_LOG_DEBUG, "Returning with %d", ret); + return ret; } int -gf_cli3_1_uuid_get_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - char *uuid_str = NULL; - gf_cli_rsp rsp = {0,}; - int ret = -1; - cli_local_t *local = NULL; - call_frame_t *frame = NULL; - dict_t *dict = NULL; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) - goto out; - - frame = myframe; - - GF_ASSERT (frame->local); - - local = frame->local; - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - frame->local = NULL; - - gf_log ("cli", GF_LOG_INFO, "Received resp to uuid get"); - - dict = dict_new (); - if (!dict) { - ret = -1; - goto out; - } - - ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, - &dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to unserialize " - "response for uuid get"); - goto out; - } - - ret = dict_get_str (dict, "uuid", &uuid_str); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get uuid " - "from dictionary"); - goto out; - } - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_dict ("uuidGenerate", dict, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } - - if (rsp.op_ret) { - if (strcmp (rsp.op_errstr, "") == 0) - cli_err ("Get uuid was unsuccessful"); - else - cli_err ("%s", rsp.op_errstr); +gf_cli3_1_uuid_get_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + char *uuid_str = NULL; + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + cli_local_t *local = NULL; + call_frame_t *frame = NULL; + dict_t *dict = NULL; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) + goto out; + + frame = myframe; + + GF_ASSERT(frame->local); + + local = frame->local; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + frame->local = NULL; + + gf_log("cli", GF_LOG_INFO, "Received resp to uuid get"); + + dict = dict_new(); + if (!dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to unserialize " + "response for uuid get"); + goto out; + } + + ret = dict_get_str(dict, "uuid", &uuid_str); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to get uuid " + "from dictionary"); + goto out; + } + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_dict("uuidGenerate", dict, rsp.op_ret, + rsp.op_errno, rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - } else { - cli_out ("UUID: %s", uuid_str); + if (rsp.op_ret) { + if (strcmp(rsp.op_errstr, "") == 0) + cli_err("Get uuid was unsuccessful"); + else + cli_err("%s", rsp.op_errstr); - } - ret = rsp.op_ret; + } else { + cli_out("UUID: %s", uuid_str); + } + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - cli_local_wipe (local); - if (rsp.dict.dict_val) - free (rsp.dict.dict_val); + cli_cmd_broadcast_response(ret); + cli_local_wipe(local); + if (rsp.dict.dict_val) + free(rsp.dict.dict_val); - gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret); - return ret; + gf_log("", GF_LOG_DEBUG, "Returning with %d", ret); + return ret; } int -gf_cli3_1_uuid_reset_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli3_1_uuid_reset_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - gf_cli_rsp rsp = {0,}; - int ret = -1; - cli_local_t *local = NULL; - call_frame_t *frame = NULL; + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + cli_local_t *local = NULL; + call_frame_t *frame = NULL; - GF_ASSERT (myframe); + GF_ASSERT(myframe); - if (-1 == req->rpc_status) { - goto out; - } + if (-1 == req->rpc_status) { + goto out; + } - frame = myframe; + frame = myframe; - GF_ASSERT (frame->local); + GF_ASSERT(frame->local); - local = frame->local; + local = frame->local; - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - frame->local = NULL; + frame->local = NULL; - gf_log ("cli", GF_LOG_INFO, "Received resp to uuid reset"); + gf_log("cli", GF_LOG_INFO, "Received resp to uuid reset"); - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_dict ("uuidReset", NULL, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_dict("uuidReset", NULL, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - cli_err ("%s", rsp.op_errstr); - else - cli_out ("resetting the peer uuid has been %s", - (rsp.op_ret) ? "unsuccessful": "successful"); - ret = rsp.op_ret; + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + cli_err("%s", rsp.op_errstr); + else + cli_out("resetting the peer uuid has been %s", + (rsp.op_ret) ? "unsuccessful" : "successful"); + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - cli_local_wipe (local); - if (rsp.dict.dict_val) - free (rsp.dict.dict_val); + cli_cmd_broadcast_response(ret); + cli_local_wipe(local); + if (rsp.dict.dict_val) + free(rsp.dict.dict_val); - gf_log ("", GF_LOG_DEBUG, "Returning with %d", ret); - return ret; + gf_log("", GF_LOG_DEBUG, "Returning with %d", ret); + return ret; } int -gf_cli_start_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_start_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - gf_cli_rsp rsp = {0,}; - int ret = -1; - cli_local_t *local = NULL; - char *volname = NULL; - call_frame_t *frame = NULL; - dict_t *rsp_dict = NULL; + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + cli_local_t *local = NULL; + char *volname = NULL; + call_frame_t *frame = NULL; + dict_t *rsp_dict = NULL; - GF_ASSERT (myframe); + GF_ASSERT(myframe); - if (-1 == req->rpc_status) { - goto out; - } + if (-1 == req->rpc_status) { + goto out; + } - frame = myframe; + frame = myframe; - GF_ASSERT (frame->local); + GF_ASSERT(frame->local); - local = frame->local; + local = frame->local; - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - ret = dict_get_str (local->dict, "volname", &volname); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "dict get failed"); - goto out; - } + ret = dict_get_str(local->dict, "volname", &volname); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "dict get failed"); + goto out; + } - gf_log ("cli", GF_LOG_INFO, "Received resp to start volume"); - - if (global_state->mode & GLUSTER_MODE_XML) { - if (rsp.op_ret == 0) { - rsp_dict = dict_new (); - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &rsp_dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Failed rsp_dict unserialization"); - goto out; - } - } + gf_log("cli", GF_LOG_INFO, "Received resp to start volume"); - ret = cli_xml_output_generic_volume ("volStart", rsp_dict, - rsp.op_ret, rsp.op_errno, - rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); + if (global_state->mode & GLUSTER_MODE_XML) { + if (rsp.op_ret == 0) { + rsp_dict = dict_new(); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, + &rsp_dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed rsp_dict unserialization"); goto out; + } } - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - cli_err ("volume start: %s: failed: %s", volname, - rsp.op_errstr); - else if (rsp.op_ret) - cli_err ("volume start: %s: failed", volname); - else - cli_out ("volume start: %s: success", volname); + ret = cli_xml_output_generic_volume("volStart", rsp_dict, rsp.op_ret, + rsp.op_errno, rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - ret = rsp.op_ret; + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + cli_err("volume start: %s: failed: %s", volname, rsp.op_errstr); + else if (rsp.op_ret) + cli_err("volume start: %s: failed", volname); + else + cli_out("volume start: %s: success", volname); + + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - free (rsp.dict.dict_val); - free (rsp.op_errstr); - return ret; + cli_cmd_broadcast_response(ret); + free(rsp.dict.dict_val); + free(rsp.op_errstr); + return ret; } int -gf_cli_stop_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_stop_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - gf_cli_rsp rsp = {0,}; - int ret = -1; - cli_local_t *local = NULL; - char *volname = NULL; - call_frame_t *frame = NULL; - dict_t *rsp_dict = NULL; + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + cli_local_t *local = NULL; + char *volname = NULL; + call_frame_t *frame = NULL; + dict_t *rsp_dict = NULL; - GF_ASSERT (myframe); + GF_ASSERT(myframe); - if (-1 == req->rpc_status) { - goto out; - } + if (-1 == req->rpc_status) { + goto out; + } - frame = myframe; + frame = myframe; - GF_ASSERT (frame->local); + GF_ASSERT(frame->local); - local = frame->local; + local = frame->local; - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - ret = dict_get_str (local->dict, "volname", &volname); - if (ret) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Unable to get volname from dict"); - goto out; - } + ret = dict_get_str(local->dict, "volname", &volname); + if (ret) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Unable to get volname from dict"); + goto out; + } - gf_log ("cli", GF_LOG_INFO, "Received resp to stop volume"); + gf_log("cli", GF_LOG_INFO, "Received resp to stop volume"); - if (global_state->mode & GLUSTER_MODE_XML) { - if (rsp.op_ret == 0) { - rsp_dict = dict_new (); - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &rsp_dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Failed rsp_dict unserialization"); - goto out; - } - } - - ret = cli_xml_output_generic_volume ("volStop", rsp_dict, - rsp.op_ret, rsp.op_errno, - rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); + if (global_state->mode & GLUSTER_MODE_XML) { + if (rsp.op_ret == 0) { + rsp_dict = dict_new(); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, + &rsp_dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed rsp_dict unserialization"); goto out; + } } - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - cli_err ("volume stop: %s: failed: %s", volname, rsp.op_errstr); - else if (rsp.op_ret) - cli_err ("volume stop: %s: failed", volname); - else - cli_out ("volume stop: %s: success", volname); + ret = cli_xml_output_generic_volume("volStop", rsp_dict, rsp.op_ret, + rsp.op_errno, rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - ret = rsp.op_ret; + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + cli_err("volume stop: %s: failed: %s", volname, rsp.op_errstr); + else if (rsp.op_ret) + cli_err("volume stop: %s: failed", volname); + else + cli_out("volume stop: %s: success", volname); + + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - free (rsp.op_errstr); - free (rsp.dict.dict_val); + cli_cmd_broadcast_response(ret); + free(rsp.op_errstr); + free(rsp.dict.dict_val); - return ret; + return ret; } int -gf_cli_print_rebalance_status (dict_t *dict, enum gf_task_types task_type, - gf_boolean_t is_tier) -{ - int ret = -1; - int count = 0; - int i = 1; - char key[256] = {0,}; - gf_defrag_status_t status_rcd = GF_DEFRAG_STATUS_NOT_STARTED; - uint64_t files = 0; - uint64_t size = 0; - uint64_t lookup = 0; - char *node_name = NULL; - uint64_t failures = 0; - uint64_t skipped = 0; - double elapsed = 0; - char *status_str = NULL; - char *size_str = NULL; - int32_t hrs = 0; - uint32_t min = 0; - uint32_t sec = 0; - gf_boolean_t down = _gf_false; - gf_boolean_t fix_layout = _gf_false; - uint64_t max_time = 0; - uint64_t max_elapsed = 0; - uint64_t time_left = 0; - gf_boolean_t show_estimates = _gf_false; - - - ret = dict_get_int32 (dict, "count", &count); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "count not set"); - goto out; - } - - snprintf (key, sizeof (key), "status-1"); - - ret = dict_get_int32 (dict, key, (int32_t *)&status_rcd); - if (ret) { - gf_log ("cli", GF_LOG_TRACE, "count %d %d", count, 1); - gf_log ("cli", GF_LOG_TRACE, "failed to get status"); - goto out; - } - - /* Fix layout will be sent to all nodes for the volume - so every status should be of type - GF_DEFRAG_STATUS_LAYOUT_FIX* - */ - - if ((task_type == GF_TASK_TYPE_REBALANCE) - && (status_rcd >= GF_DEFRAG_STATUS_LAYOUT_FIX_STARTED)) { - fix_layout = _gf_true; - } - - if (fix_layout) { - cli_out ("%35s %41s %27s", "Node", "status", - "run time in h:m:s"); - cli_out ("%35s %41s %27s", "---------", "-----------", - "------------"); - } else { - cli_out ("%40s %16s %13s %13s %13s %13s %20s %18s", - "Node", "Rebalanced-files", "size", "scanned", - "failures", "skipped", "status", "run time in" - " h:m:s"); - cli_out ("%40s %16s %13s %13s %13s %13s %20s %18s", - "---------", "-----------", "-----------", - "-----------", "-----------", "-----------", - "------------", "--------------"); - } - - for (i = 1; i <= count; i++) { - /* Reset the variables to prevent carryover of values */ - node_name = NULL; - files = 0; - size = 0; - lookup = 0; - skipped = 0; - status_str = NULL; - elapsed = 0; - time_left = 0; - - /* Check if status is NOT_STARTED, and continue early */ - snprintf (key, sizeof (key), "status-%d", i); - - ret = dict_get_int32 (dict, key, (int32_t *)&status_rcd); - if (ret == -ENOENT) { - gf_log ("cli", GF_LOG_TRACE, "count %d %d", count, i); - gf_log ("cli", GF_LOG_TRACE, "failed to get status"); - gf_log ("cli", GF_LOG_ERROR, "node down and has failed" - " to set dict"); - down = _gf_true; - continue; - /* skip this node if value not available*/ - } else if (ret) { - gf_log ("cli", GF_LOG_TRACE, "count %d %d", count, i); - gf_log ("cli", GF_LOG_TRACE, "failed to get status"); - continue; - /* skip this node if value not available*/ - } - - if (GF_DEFRAG_STATUS_NOT_STARTED == status_rcd) - continue; - - if (GF_DEFRAG_STATUS_STARTED == status_rcd) - show_estimates = _gf_true; - - snprintf (key, 256, "node-name-%d", i); - ret = dict_get_str (dict, key, &node_name); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get node-name"); +gf_cli_print_rebalance_status(dict_t *dict, enum gf_task_types task_type, + gf_boolean_t is_tier) +{ + int ret = -1; + int count = 0; + int i = 1; + char key[256] = { + 0, + }; + gf_defrag_status_t status_rcd = GF_DEFRAG_STATUS_NOT_STARTED; + uint64_t files = 0; + uint64_t size = 0; + uint64_t lookup = 0; + char *node_name = NULL; + uint64_t failures = 0; + uint64_t skipped = 0; + double elapsed = 0; + char *status_str = NULL; + char *size_str = NULL; + int32_t hrs = 0; + uint32_t min = 0; + uint32_t sec = 0; + gf_boolean_t down = _gf_false; + gf_boolean_t fix_layout = _gf_false; + uint64_t max_time = 0; + uint64_t max_elapsed = 0; + uint64_t time_left = 0; + gf_boolean_t show_estimates = _gf_false; + + ret = dict_get_int32(dict, "count", &count); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "count not set"); + goto out; + } + + snprintf(key, sizeof(key), "status-1"); + + ret = dict_get_int32(dict, key, (int32_t *)&status_rcd); + if (ret) { + gf_log("cli", GF_LOG_TRACE, "count %d %d", count, 1); + gf_log("cli", GF_LOG_TRACE, "failed to get status"); + goto out; + } + + /* Fix layout will be sent to all nodes for the volume + so every status should be of type + GF_DEFRAG_STATUS_LAYOUT_FIX* + */ + + if ((task_type == GF_TASK_TYPE_REBALANCE) && + (status_rcd >= GF_DEFRAG_STATUS_LAYOUT_FIX_STARTED)) { + fix_layout = _gf_true; + } + + if (fix_layout) { + cli_out("%35s %41s %27s", "Node", "status", "run time in h:m:s"); + cli_out("%35s %41s %27s", "---------", "-----------", "------------"); + } else { + cli_out("%40s %16s %13s %13s %13s %13s %20s %18s", "Node", + "Rebalanced-files", "size", "scanned", "failures", "skipped", + "status", + "run time in" + " h:m:s"); + cli_out("%40s %16s %13s %13s %13s %13s %20s %18s", "---------", + "-----------", "-----------", "-----------", "-----------", + "-----------", "------------", "--------------"); + } + + for (i = 1; i <= count; i++) { + /* Reset the variables to prevent carryover of values */ + node_name = NULL; + files = 0; + size = 0; + lookup = 0; + skipped = 0; + status_str = NULL; + elapsed = 0; + time_left = 0; + + /* Check if status is NOT_STARTED, and continue early */ + snprintf(key, sizeof(key), "status-%d", i); + + ret = dict_get_int32(dict, key, (int32_t *)&status_rcd); + if (ret == -ENOENT) { + gf_log("cli", GF_LOG_TRACE, "count %d %d", count, i); + gf_log("cli", GF_LOG_TRACE, "failed to get status"); + gf_log("cli", GF_LOG_ERROR, + "node down and has failed" + " to set dict"); + down = _gf_true; + continue; + /* skip this node if value not available*/ + } else if (ret) { + gf_log("cli", GF_LOG_TRACE, "count %d %d", count, i); + gf_log("cli", GF_LOG_TRACE, "failed to get status"); + continue; + /* skip this node if value not available*/ + } + + if (GF_DEFRAG_STATUS_NOT_STARTED == status_rcd) + continue; + + if (GF_DEFRAG_STATUS_STARTED == status_rcd) + show_estimates = _gf_true; + + snprintf(key, 256, "node-name-%d", i); + ret = dict_get_str(dict, key, &node_name); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get node-name"); - snprintf (key, sizeof (key), "files-%d", i); - ret = dict_get_uint64 (dict, key, &files); - if (ret) - gf_log ("cli", GF_LOG_TRACE, - "failed to get file count"); + snprintf(key, sizeof(key), "files-%d", i); + ret = dict_get_uint64(dict, key, &files); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get file count"); - snprintf (key, sizeof (key), "size-%d", i); - ret = dict_get_uint64 (dict, key, &size); - if (ret) - gf_log ("cli", GF_LOG_TRACE, - "failed to get size of xfer"); + snprintf(key, sizeof(key), "size-%d", i); + ret = dict_get_uint64(dict, key, &size); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get size of xfer"); - snprintf (key, sizeof (key), "lookups-%d", i); - ret = dict_get_uint64 (dict, key, &lookup); - if (ret) - gf_log ("cli", GF_LOG_TRACE, - "failed to get lookedup file count"); + snprintf(key, sizeof(key), "lookups-%d", i); + ret = dict_get_uint64(dict, key, &lookup); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get lookedup file count"); - snprintf (key, sizeof (key), "failures-%d", i); - ret = dict_get_uint64 (dict, key, &failures); - if (ret) - gf_log ("cli", GF_LOG_TRACE, - "failed to get failures count"); + snprintf(key, sizeof(key), "failures-%d", i); + ret = dict_get_uint64(dict, key, &failures); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get failures count"); - snprintf (key, sizeof (key), "skipped-%d", i); - ret = dict_get_uint64 (dict, key, &skipped); - if (ret) - gf_log ("cli", GF_LOG_TRACE, - "failed to get skipped count"); + snprintf(key, sizeof(key), "skipped-%d", i); + ret = dict_get_uint64(dict, key, &skipped); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get skipped count"); - /* For remove-brick include skipped count into failure count*/ - if (task_type != GF_TASK_TYPE_REBALANCE) { - failures += skipped; - skipped = 0; - } + /* For remove-brick include skipped count into failure count*/ + if (task_type != GF_TASK_TYPE_REBALANCE) { + failures += skipped; + skipped = 0; + } - snprintf (key, sizeof (key), "run-time-%d", i); - ret = dict_get_double (dict, key, &elapsed); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get run-time"); + snprintf(key, sizeof(key), "run-time-%d", i); + ret = dict_get_double(dict, key, &elapsed); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get run-time"); - snprintf (key, sizeof (key), "time-left-%d", i); - ret = dict_get_uint64 (dict, key, &time_left); - if (ret) - gf_log ("cli", GF_LOG_TRACE, - "failed to get time left"); + snprintf(key, sizeof(key), "time-left-%d", i); + ret = dict_get_uint64(dict, key, &time_left); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get time left"); - if (elapsed > max_elapsed) - max_elapsed = elapsed; + if (elapsed > max_elapsed) + max_elapsed = elapsed; - if (time_left > max_time) - max_time = time_left; + if (time_left > max_time) + max_time = time_left; - /* Check for array bound */ - if (status_rcd >= GF_DEFRAG_STATUS_MAX) - status_rcd = GF_DEFRAG_STATUS_MAX; + /* Check for array bound */ + if (status_rcd >= GF_DEFRAG_STATUS_MAX) + status_rcd = GF_DEFRAG_STATUS_MAX; - status_str = cli_vol_task_status_str[status_rcd]; - size_str = gf_uint64_2human_readable(size); - hrs = elapsed / 3600; - min = ((uint64_t) elapsed % 3600) / 60; - sec = ((uint64_t) elapsed % 3600) % 60; + status_str = cli_vol_task_status_str[status_rcd]; + size_str = gf_uint64_2human_readable(size); + hrs = elapsed / 3600; + min = ((uint64_t)elapsed % 3600) / 60; + sec = ((uint64_t)elapsed % 3600) % 60; - if (fix_layout) { - cli_out ("%35s %50s %8d:%d:%d", node_name, status_str, - hrs, min, sec); - } else { - if (size_str) { - cli_out ("%40s %16"PRIu64 " %13s" " %13"PRIu64 - " %13" PRIu64" %13"PRIu64 " %20s " - "%8d:%02d:%02d", node_name, files, - size_str, lookup, failures, skipped, - status_str, hrs, min, sec); - } else { - cli_out ("%40s %16"PRIu64 " %13"PRIu64 " %13" - PRIu64 " %13"PRIu64" %13"PRIu64 " %20s" - " %8d:%02d:%02d", node_name, files, - size, lookup, failures, skipped, - status_str, hrs, min, sec); - } - } - GF_FREE(size_str); - } - if (is_tier && down) - cli_out ("WARNING: glusterd might be down on one or more nodes." - " Please check the nodes that are down using \'gluster" - " peer status\' and start the glusterd on those nodes," - " else tier detach commit might fail!"); - - /* Max time will be non-zero if rebalance is still running */ - if (max_time) { - hrs = max_time / 3600; - min = (max_time % 3600) / 60; - sec = (max_time % 3600) % 60; - - if (hrs < REBAL_ESTIMATE_SEC_UPPER_LIMIT) { - cli_out ("Estimated time left for rebalance to " - "complete : %8d:%02d:%02d", hrs, min, sec); - } else { - cli_out ("Estimated time left for rebalance to " - "complete : > 2 months. Please try again " - "later."); - } + if (fix_layout) { + cli_out("%35s %50s %8d:%d:%d", node_name, status_str, hrs, min, + sec); } else { - /* Rebalance will return 0 if it could not calculate the - * estimates or if it is complete. - */ - if (!show_estimates) { - goto out; - } - if (max_elapsed <= REBAL_ESTIMATE_START_TIME) { - cli_out ("The estimated time for rebalance to complete " - "will be unavailable for the first 10 " - "minutes."); - } else { - cli_out ("Rebalance estimated time unavailable. Please " - "try again later."); - } + if (size_str) { + cli_out("%40s %16" PRIu64 + " %13s" + " %13" PRIu64 " %13" PRIu64 " %13" PRIu64 + " %20s " + "%8d:%02d:%02d", + node_name, files, size_str, lookup, failures, skipped, + status_str, hrs, min, sec); + } else { + cli_out("%40s %16" PRIu64 " %13" PRIu64 " %13" PRIu64 + " %13" PRIu64 " %13" PRIu64 + " %20s" + " %8d:%02d:%02d", + node_name, files, size, lookup, failures, skipped, + status_str, hrs, min, sec); + } + } + GF_FREE(size_str); + } + if (is_tier && down) + cli_out( + "WARNING: glusterd might be down on one or more nodes." + " Please check the nodes that are down using \'gluster" + " peer status\' and start the glusterd on those nodes," + " else tier detach commit might fail!"); + + /* Max time will be non-zero if rebalance is still running */ + if (max_time) { + hrs = max_time / 3600; + min = (max_time % 3600) / 60; + sec = (max_time % 3600) % 60; + + if (hrs < REBAL_ESTIMATE_SEC_UPPER_LIMIT) { + cli_out( + "Estimated time left for rebalance to " + "complete : %8d:%02d:%02d", + hrs, min, sec); + } else { + cli_out( + "Estimated time left for rebalance to " + "complete : > 2 months. Please try again " + "later."); + } + } else { + /* Rebalance will return 0 if it could not calculate the + * estimates or if it is complete. + */ + if (!show_estimates) { + goto out; + } + if (max_elapsed <= REBAL_ESTIMATE_START_TIME) { + cli_out( + "The estimated time for rebalance to complete " + "will be unavailable for the first 10 " + "minutes."); + } else { + cli_out( + "Rebalance estimated time unavailable. Please " + "try again later."); } + } out: - return ret; + return ret; } int -gf_cli_print_tier_status (dict_t *dict, enum gf_task_types task_type) -{ - int ret = -1; - int count = 0; - int i = 1; - uint64_t promoted = 0; - uint64_t demoted = 0; - char key[256] = {0,}; - char *node_name = NULL; - gf_defrag_status_t status_rcd = GF_DEFRAG_STATUS_NOT_STARTED; - char *status_str = NULL; - gf_boolean_t down = _gf_false; - double elapsed = 0; - int hrs = 0; - int min = 0; - int sec = 0; - - ret = dict_get_int32 (dict, "count", &count); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "count not set"); - goto out; - } - - cli_out ("%-20s %-20s %-20s %-20s %-20s", "Node", "Promoted files", - "Demoted files", "Status", "run time in h:m:s"); - cli_out ("%-20s %-20s %-20s %-20s %-20s", "---------", "---------", - "---------", "---------", "---------"); - - for (i = 1; i <= count; i++) { - /* Reset the variables to prevent carryover of values */ - node_name = NULL; - promoted = 0; - demoted = 0; - - /* Check if status is NOT_STARTED, and continue early */ - snprintf (key, sizeof (key), "status-%d", i); - - ret = dict_get_int32 (dict, key, (int32_t *)&status_rcd); - if (ret == -ENOENT) { - gf_log ("cli", GF_LOG_TRACE, "count: %d, %d," - "failed to get status", count, i); - gf_log ("cli", GF_LOG_ERROR, "node down and has failed" - " to set dict"); - down = _gf_true; - continue; - /*skipping this node as value unavailable*/ - } else if (ret) { - gf_log ("cli", GF_LOG_TRACE, "count: %d, %d," - "failed to get status", count, i); - continue; - } - - if (GF_DEFRAG_STATUS_NOT_STARTED == status_rcd) - continue; - - snprintf (key, sizeof (key), "node-name-%d", i); - ret = dict_get_str (dict, key, &node_name); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get node-name"); +gf_cli_print_tier_status(dict_t *dict, enum gf_task_types task_type) +{ + int ret = -1; + int count = 0; + int i = 1; + uint64_t promoted = 0; + uint64_t demoted = 0; + char key[256] = { + 0, + }; + char *node_name = NULL; + gf_defrag_status_t status_rcd = GF_DEFRAG_STATUS_NOT_STARTED; + char *status_str = NULL; + gf_boolean_t down = _gf_false; + double elapsed = 0; + int hrs = 0; + int min = 0; + int sec = 0; + + ret = dict_get_int32(dict, "count", &count); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "count not set"); + goto out; + } + + cli_out("%-20s %-20s %-20s %-20s %-20s", "Node", "Promoted files", + "Demoted files", "Status", "run time in h:m:s"); + cli_out("%-20s %-20s %-20s %-20s %-20s", "---------", "---------", + "---------", "---------", "---------"); + + for (i = 1; i <= count; i++) { + /* Reset the variables to prevent carryover of values */ + node_name = NULL; + promoted = 0; + demoted = 0; + + /* Check if status is NOT_STARTED, and continue early */ + snprintf(key, sizeof(key), "status-%d", i); + + ret = dict_get_int32(dict, key, (int32_t *)&status_rcd); + if (ret == -ENOENT) { + gf_log("cli", GF_LOG_TRACE, + "count: %d, %d," + "failed to get status", + count, i); + gf_log("cli", GF_LOG_ERROR, + "node down and has failed" + " to set dict"); + down = _gf_true; + continue; + /*skipping this node as value unavailable*/ + } else if (ret) { + gf_log("cli", GF_LOG_TRACE, + "count: %d, %d," + "failed to get status", + count, i); + continue; + } + + if (GF_DEFRAG_STATUS_NOT_STARTED == status_rcd) + continue; + + snprintf(key, sizeof(key), "node-name-%d", i); + ret = dict_get_str(dict, key, &node_name); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get node-name"); - snprintf (key, sizeof (key), "promoted-%d", i); - ret = dict_get_uint64 (dict, key, &promoted); - if (ret) - gf_log ("cli", GF_LOG_TRACE, - "failed to get promoted count"); + snprintf(key, sizeof(key), "promoted-%d", i); + ret = dict_get_uint64(dict, key, &promoted); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get promoted count"); - snprintf (key, sizeof (key), "demoted-%d", i); - ret = dict_get_uint64 (dict, key, &demoted); - if (ret) - gf_log ("cli", GF_LOG_TRACE, - "failed to get demoted count"); + snprintf(key, sizeof(key), "demoted-%d", i); + ret = dict_get_uint64(dict, key, &demoted); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get demoted count"); - snprintf (key, sizeof (key), "run-time-%d", i); - ret = dict_get_double (dict, key, &elapsed); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get run-time"); + snprintf(key, sizeof(key), "run-time-%d", i); + ret = dict_get_double(dict, key, &elapsed); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get run-time"); - /* Check for array bound */ - if (status_rcd >= GF_DEFRAG_STATUS_MAX) - status_rcd = GF_DEFRAG_STATUS_MAX; + /* Check for array bound */ + if (status_rcd >= GF_DEFRAG_STATUS_MAX) + status_rcd = GF_DEFRAG_STATUS_MAX; - hrs = elapsed / 3600; - min = ((int) elapsed % 3600) / 60; - sec = ((int) elapsed % 3600) % 60; + hrs = elapsed / 3600; + min = ((int)elapsed % 3600) / 60; + sec = ((int)elapsed % 3600) % 60; - status_str = cli_vol_task_status_str[status_rcd]; - cli_out ("%-20s %-20"PRIu64" %-20"PRIu64" %-20s" - " %d:%d:%d", node_name, promoted, demoted, - status_str, hrs, min, sec); - } - if (down) - cli_out ("WARNING: glusterd might be down on one or more nodes." - " Please check the nodes that are down using \'gluster" - " peer status\' and start the glusterd on those nodes."); + status_str = cli_vol_task_status_str[status_rcd]; + cli_out("%-20s %-20" PRIu64 " %-20" PRIu64 + " %-20s" + " %d:%d:%d", + node_name, promoted, demoted, status_str, hrs, min, sec); + } + if (down) + cli_out( + "WARNING: glusterd might be down on one or more nodes." + " Please check the nodes that are down using \'gluster" + " peer status\' and start the glusterd on those nodes."); out: - return ret; + return ret; } int -gf_cli_defrag_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - cli_local_t *local = NULL; - char *volname = NULL; - call_frame_t *frame = NULL; - int cmd = 0; - int ret = -1; - dict_t *dict = NULL; - char msg[1024] = {0,}; - char *task_id_str = NULL; - - if (-1 == req->rpc_status) { - goto out; - } - - GF_ASSERT (myframe); - - frame = myframe; - - GF_ASSERT (frame->local); - - local = frame->local; - - ret = xdr_to_generic (*iov, &rsp, - (xdrproc_t)xdr_gf_cli_rsp); +gf_cli_defrag_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + cli_local_t *local = NULL; + char *volname = NULL; + call_frame_t *frame = NULL; + int cmd = 0; + int ret = -1; + dict_t *dict = NULL; + char msg[1024] = { + 0, + }; + char *task_id_str = NULL; + + if (-1 == req->rpc_status) { + goto out; + } + + GF_ASSERT(myframe); + + frame = myframe; + + GF_ASSERT(frame->local); + + local = frame->local; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + ret = dict_get_str(local->dict, "volname", &volname); + if (ret) { + gf_log(frame->this->name, GF_LOG_ERROR, "Failed to get volname"); + goto out; + } + + ret = dict_get_int32(local->dict, "rebalance-command", (int32_t *)&cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get command"); + goto out; + } + + if (rsp.dict.dict_len) { + /* Unserialize the dictionary */ + dict = dict_new(); + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; + gf_log("glusterd", GF_LOG_ERROR, + "failed to " + "unserialize req-buffer to dictionary"); + goto out; } + } - ret = dict_get_str (local->dict, "volname", &volname); + if (!((cmd == GF_DEFRAG_CMD_STOP) || (cmd == GF_DEFRAG_CMD_STATUS) || + (cmd == GF_DEFRAG_CMD_STATUS_TIER)) && + !(global_state->mode & GLUSTER_MODE_XML)) { + ret = dict_get_str(dict, GF_REBALANCE_TID_KEY, &task_id_str); if (ret) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to get volname"); - goto out; - } - - ret = dict_get_int32 (local->dict, "rebalance-command", - (int32_t *)&cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get command"); - goto out; - } - - if (rsp.dict.dict_len) { - /* Unserialize the dictionary */ - dict = dict_new (); - - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); - if (ret < 0) { - gf_log ("glusterd", GF_LOG_ERROR, - "failed to " - "unserialize req-buffer to dictionary"); - goto out; - } - } - - if (!((cmd == GF_DEFRAG_CMD_STOP) || - (cmd == GF_DEFRAG_CMD_STATUS) || - (cmd == GF_DEFRAG_CMD_STATUS_TIER)) && - !(global_state->mode & GLUSTER_MODE_XML)) { - ret = dict_get_str (dict, GF_REBALANCE_TID_KEY, &task_id_str); - if (ret) { - gf_log ("cli", GF_LOG_WARNING, - "failed to get %s from dict", - GF_REBALANCE_TID_KEY); - goto out; - } - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) { - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - } else { - if (!rsp.op_ret) { - /* append errstr in the cli msg for successful - * case since unlock failures can be highlighted - * event though rebalance command was successful - */ - if (cmd == GF_DEFRAG_CMD_START_TIER) { - snprintf (msg, sizeof (msg), "Tier " - "start is successful on %s.", - volname); - } else if (cmd == GF_DEFRAG_CMD_STOP_TIER) { - snprintf (msg, sizeof (msg), "Tier " - "daemon stopped " - "on %s.", volname); - } else { - snprintf (msg, sizeof (msg), - "Rebalance on %s has been " - "started successfully. Use " - "rebalance status command to" - " check status of the " - "rebalance process.\nID: %s", - volname, task_id_str); - } - } else { - snprintf (msg, sizeof (msg), - "Starting rebalance on volume %s has " - "been unsuccessful.", volname); - } - } - goto done; - } - - if (cmd == GF_DEFRAG_CMD_STOP) { - if (rsp.op_ret == -1) { - if (strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), - "%s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), - "rebalance volume %s stop failed", - volname); - goto done; - } else { - /* append errstr in the cli msg for successful case - * since unlock failures can be highlighted event though - * rebalance command was successful */ - snprintf (msg, sizeof (msg), - "rebalance process may be in the middle of a " - "file migration.\nThe process will be fully " - "stopped once the migration of the file is " - "complete.\nPlease check rebalance process " - "for completion before doing any further " - "brick related tasks on the volume.\n%s", - rsp.op_errstr); - } + gf_log("cli", GF_LOG_WARNING, "failed to get %s from dict", + GF_REBALANCE_TID_KEY); + goto out; } - if (cmd == GF_DEFRAG_CMD_STATUS || cmd == GF_DEFRAG_CMD_STATUS_TIER) { - if (rsp.op_ret == -1) { - if (strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), - "%s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), - "Failed to get the status of " - "rebalance process"); - goto done; + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) { + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + } else { + if (!rsp.op_ret) { + /* append errstr in the cli msg for successful + * case since unlock failures can be highlighted + * event though rebalance command was successful + */ + if (cmd == GF_DEFRAG_CMD_START_TIER) { + snprintf(msg, sizeof(msg), + "Tier " + "start is successful on %s.", + volname); + } else if (cmd == GF_DEFRAG_CMD_STOP_TIER) { + snprintf(msg, sizeof(msg), + "Tier " + "daemon stopped " + "on %s.", + volname); } else { - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - } + snprintf(msg, sizeof(msg), + "Rebalance on %s has been " + "started successfully. Use " + "rebalance status command to" + " check status of the " + "rebalance process.\nID: %s", + volname, task_id_str); + } + } else { + snprintf(msg, sizeof(msg), + "Starting rebalance on volume %s has " + "been unsuccessful.", + volname); + } + } + goto done; + } + + if (cmd == GF_DEFRAG_CMD_STOP) { + if (rsp.op_ret == -1) { + if (strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), "rebalance volume %s stop failed", + volname); + goto done; + } else { + /* append errstr in the cli msg for successful case + * since unlock failures can be highlighted event though + * rebalance command was successful */ + snprintf(msg, sizeof(msg), + "rebalance process may be in the middle of a " + "file migration.\nThe process will be fully " + "stopped once the migration of the file is " + "complete.\nPlease check rebalance process " + "for completion before doing any further " + "brick related tasks on the volume.\n%s", + rsp.op_errstr); + } + } + if (cmd == GF_DEFRAG_CMD_STATUS || cmd == GF_DEFRAG_CMD_STATUS_TIER) { + if (rsp.op_ret == -1) { + if (strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), + "Failed to get the status of " + "rebalance process"); + goto done; + } else { + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); } + } - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_rebalance (cmd, dict, rsp.op_ret, - rsp.op_errno, - rsp.op_errstr); - goto out; - } + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_rebalance(cmd, dict, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + goto out; + } - if (cmd == GF_DEFRAG_CMD_STATUS_TIER) - ret = gf_cli_print_tier_status (dict, GF_TASK_TYPE_REBALANCE); - else if (cmd == GF_DEFRAG_CMD_DETACH_STATUS) - ret = gf_cli_print_rebalance_status (dict, - GF_TASK_TYPE_REBALANCE, - _gf_true); - else - ret = gf_cli_print_rebalance_status (dict, - GF_TASK_TYPE_REBALANCE, - _gf_false); + if (cmd == GF_DEFRAG_CMD_STATUS_TIER) + ret = gf_cli_print_tier_status(dict, GF_TASK_TYPE_REBALANCE); + else if (cmd == GF_DEFRAG_CMD_DETACH_STATUS) + ret = gf_cli_print_rebalance_status(dict, GF_TASK_TYPE_REBALANCE, + _gf_true); + else + ret = gf_cli_print_rebalance_status(dict, GF_TASK_TYPE_REBALANCE, + _gf_false); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Failed to print rebalance status"); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Failed to print rebalance status"); done: - if (global_state->mode & GLUSTER_MODE_XML) - cli_xml_output_str ("volRebalance", msg, - rsp.op_ret, rsp.op_errno, - rsp.op_errstr); - else { - if (rsp.op_ret) - - if (cmd == GF_DEFRAG_CMD_START_TIER || cmd == - GF_DEFRAG_CMD_STATUS_TIER) { - cli_err ("Tiering Migration Functionality: %s:" - " failed%s%s", volname, - strlen (msg) ? ": " : "", msg); - } else - cli_err ("volume rebalance: %s: failed%s%s", - volname, strlen (msg) ? ": " : "", - msg); - else - if (cmd == GF_DEFRAG_CMD_START_TIER || cmd == - GF_DEFRAG_CMD_STATUS_TIER) { - cli_out ("Tiering Migration Functionality: %s:" - " success%s%s", volname, - strlen (msg) ? ": " : "", msg); - } else - cli_out ("volume rebalance: %s: success%s%s", - volname, strlen (msg) ? ": " : "", - msg); - } - ret = rsp.op_ret; + if (global_state->mode & GLUSTER_MODE_XML) + cli_xml_output_str("volRebalance", msg, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + else { + if (rsp.op_ret) -out: - free (rsp.op_errstr); //malloced by xdr - free (rsp.dict.dict_val); //malloced by xdr - if (dict) - dict_unref (dict); - cli_cmd_broadcast_response (ret); - return ret; + if (cmd == GF_DEFRAG_CMD_START_TIER || + cmd == GF_DEFRAG_CMD_STATUS_TIER) { + cli_err( + "Tiering Migration Functionality: %s:" + " failed%s%s", + volname, strlen(msg) ? ": " : "", msg); + } else + cli_err("volume rebalance: %s: failed%s%s", volname, + strlen(msg) ? ": " : "", msg); + else if (cmd == GF_DEFRAG_CMD_START_TIER || + cmd == GF_DEFRAG_CMD_STATUS_TIER) { + cli_out( + "Tiering Migration Functionality: %s:" + " success%s%s", + volname, strlen(msg) ? ": " : "", msg); + } else + cli_out("volume rebalance: %s: success%s%s", volname, + strlen(msg) ? ": " : "", msg); + } + ret = rsp.op_ret; + +out: + free(rsp.op_errstr); // malloced by xdr + free(rsp.dict.dict_val); // malloced by xdr + if (dict) + dict_unref(dict); + cli_cmd_broadcast_response(ret); + return ret; } int -gf_cli_rename_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - +gf_cli_rename_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + gf_log("cli", GF_LOG_INFO, "Received resp to probe"); + snprintf(msg, sizeof(msg), "Rename volume %s", + (rsp.op_ret) ? "unsuccessful" : "successful"); + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str("volRename", msg, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - gf_log ("cli", GF_LOG_INFO, "Received resp to probe"); - snprintf (msg, sizeof (msg), "Rename volume %s", - (rsp.op_ret) ? "unsuccessful": "successful"); + if (rsp.op_ret) + cli_err("volume rename: failed"); + else + cli_out("volume rename: success"); - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str ("volRename", msg, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } - - if (rsp.op_ret) - cli_err ("volume rename: failed"); - else - cli_out ("volume rename: success"); - - ret = rsp.op_ret; + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } int -gf_cli_reset_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_reset_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - gf_log ("cli", GF_LOG_INFO, "Received resp to reset"); - - if (strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "reset volume %s", - (rsp.op_ret) ? "unsuccessful": "successful"); - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str ("volReset", msg, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + gf_log("cli", GF_LOG_INFO, "Received resp to reset"); + + if (strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), "reset volume %s", + (rsp.op_ret) ? "unsuccessful" : "successful"); + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str("volReset", msg, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (rsp.op_ret) - cli_err ("volume reset: failed: %s", msg); - else - cli_out ("volume reset: success: %s", msg); + if (rsp.op_ret) + cli_err("volume reset: failed: %s", msg); + else + cli_out("volume reset: success: %s", msg); - ret = rsp.op_ret; + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } char * -is_server_debug_xlator (void *myframe) -{ - call_frame_t *frame = NULL; - cli_local_t *local = NULL; - char **words = NULL; - char *key = NULL; - char *value = NULL; - char *debug_xlator = NULL; - - frame = myframe; - local = frame->local; - words = (char **)local->words; - - while (*words != NULL) { - if (strstr (*words, "trace") == NULL && - strstr (*words, "error-gen") == NULL) { - words++; - continue; - } - - key = *words; +is_server_debug_xlator(void *myframe) +{ + call_frame_t *frame = NULL; + cli_local_t *local = NULL; + char **words = NULL; + char *key = NULL; + char *value = NULL; + char *debug_xlator = NULL; + + frame = myframe; + local = frame->local; + words = (char **)local->words; + + while (*words != NULL) { + if (strstr(*words, "trace") == NULL && + strstr(*words, "error-gen") == NULL) { + words++; + continue; + } + + key = *words; + words++; + value = *words; + if (value == NULL) + break; + if (strstr(value, "client")) { + words++; + continue; + } else { + if (!(strstr(value, "posix") || strstr(value, "acl") || + strstr(value, "locks") || strstr(value, "io-threads") || + strstr(value, "marker") || strstr(value, "index"))) { words++; - value = *words; - if (value == NULL) - break; - if (strstr (value, "client")) { - words++; - continue; - } else { - if (!(strstr (value, "posix") || strstr (value, "acl") - || strstr (value, "locks") || - strstr (value, "io-threads") || - strstr (value, "marker") || - strstr (value, "index"))) { - words++; - continue; - } else { - debug_xlator = gf_strdup (key); - break; - } - } + continue; + } else { + debug_xlator = gf_strdup(key); + break; + } } + } - return debug_xlator; + return debug_xlator; } int -gf_cli_set_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - dict_t *dict = NULL; - char *help_str = NULL; - char msg[1024] = {0,}; - char *debug_xlator = NULL; - char tmp_str[512] = {0,}; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - gf_log ("cli", GF_LOG_INFO, "Received resp to set"); - - dict = dict_new (); - - if (!dict) { - ret = -1; - goto out; - } - - ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, &dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "failed to unserialize volume set respone dict"); - goto out; - } - - /* For brick processes graph change does not happen on the fly. - * The process has to be restarted. So this is a check from the - * volume set option such that if debug xlators such as trace/errorgen - * are provided in the set command, warn the user. - */ - debug_xlator = is_server_debug_xlator (myframe); - - if (dict_get_str (dict, "help-str", &help_str) && !msg[0]) - snprintf (msg, sizeof (msg), "Set volume %s", - (rsp.op_ret) ? "unsuccessful": "successful"); - if (rsp.op_ret == 0 && debug_xlator) { - snprintf (tmp_str, sizeof (tmp_str), "\n%s translator has been " - "added to the server volume file. Please restart the" - " volume for enabling the translator", debug_xlator); - } - - if ((global_state->mode & GLUSTER_MODE_XML) && (help_str == NULL)) { - ret = cli_xml_output_str ("volSet", msg, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } +gf_cli_set_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; + char *help_str = NULL; + char msg[1024] = { + 0, + }; + char *debug_xlator = NULL; + char tmp_str[512] = { + 0, + }; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + gf_log("cli", GF_LOG_INFO, "Received resp to set"); + + dict = dict_new(); + + if (!dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "failed to unserialize volume set respone dict"); + goto out; + } + + /* For brick processes graph change does not happen on the fly. + * The process has to be restarted. So this is a check from the + * volume set option such that if debug xlators such as trace/errorgen + * are provided in the set command, warn the user. + */ + debug_xlator = is_server_debug_xlator(myframe); + + if (dict_get_str(dict, "help-str", &help_str) && !msg[0]) + snprintf(msg, sizeof(msg), "Set volume %s", + (rsp.op_ret) ? "unsuccessful" : "successful"); + if (rsp.op_ret == 0 && debug_xlator) { + snprintf(tmp_str, sizeof(tmp_str), + "\n%s translator has been " + "added to the server volume file. Please restart the" + " volume for enabling the translator", + debug_xlator); + } + + if ((global_state->mode & GLUSTER_MODE_XML) && (help_str == NULL)) { + ret = cli_xml_output_str("volSet", msg, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (rsp.op_ret) { - if (strcmp (rsp.op_errstr, "")) - cli_err ("volume set: failed: %s", rsp.op_errstr); - else - cli_err ("volume set: failed"); + if (rsp.op_ret) { + if (strcmp(rsp.op_errstr, "")) + cli_err("volume set: failed: %s", rsp.op_errstr); + else + cli_err("volume set: failed"); + } else { + if (help_str == NULL) { + if (debug_xlator == NULL) + cli_out("volume set: success"); + else + cli_out("volume set: success%s", tmp_str); } else { - if (help_str == NULL) { - if (debug_xlator == NULL) - cli_out ("volume set: success"); - else - cli_out ("volume set: success%s", tmp_str); - }else { - cli_out ("%s", help_str); - } + cli_out("%s", help_str); } + } - ret = rsp.op_ret; + ret = rsp.op_ret; out: - if (dict) - dict_unref (dict); - GF_FREE (debug_xlator); - cli_cmd_broadcast_response (ret); - return ret; + if (dict) + dict_unref(dict); + GF_FREE(debug_xlator); + cli_cmd_broadcast_response(ret); + return ret; } int -gf_cli_add_tier_brick_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - - GF_VALIDATE_OR_GOTO ("cli", myframe, out); - - if (-1 == req->rpc_status) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - - gf_log ("cli", GF_LOG_INFO, "Received resp to attach tier"); - - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "Attach tier %s", - (rsp.op_ret) ? "unsuccessful" : "successful"); - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str ("volAttachTier", msg, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } +gf_cli_add_tier_brick_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + + GF_VALIDATE_OR_GOTO("cli", myframe, out); + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + gf_log("cli", GF_LOG_INFO, "Received resp to attach tier"); + + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), "Attach tier %s", + (rsp.op_ret) ? "unsuccessful" : "successful"); + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str("volAttachTier", msg, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (rsp.op_ret) - cli_err ("volume attach-tier: failed: %s", msg); - else - cli_out ("volume attach-tier: success"); - ret = rsp.op_ret; + if (rsp.op_ret) + cli_err("volume attach-tier: failed: %s", msg); + else + cli_out("volume attach-tier: success"); + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - free (rsp.dict.dict_val); - free (rsp.op_errstr); - return ret; + cli_cmd_broadcast_response(ret); + free(rsp.dict.dict_val); + free(rsp.op_errstr); + return ret; } int -gf_cli_attach_tier_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - - GF_VALIDATE_OR_GOTO ("cli", myframe, out); - - if (-1 == req->rpc_status) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - - gf_log ("cli", GF_LOG_INFO, "Received resp to attach tier"); - - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "Attach tier %s", - (rsp.op_ret) ? "unsuccessful" : "successful"); - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str ("volAttachTier", msg, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } +gf_cli_attach_tier_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + + GF_VALIDATE_OR_GOTO("cli", myframe, out); + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + gf_log("cli", GF_LOG_INFO, "Received resp to attach tier"); + + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), "Attach tier %s", + (rsp.op_ret) ? "unsuccessful" : "successful"); + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str("volAttachTier", msg, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (rsp.op_ret) - cli_err ("volume attach-tier: failed: %s", msg); - else - cli_out ("volume attach-tier: success"); - ret = rsp.op_ret; + if (rsp.op_ret) + cli_err("volume attach-tier: failed: %s", msg); + else + cli_out("volume attach-tier: success"); + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - free (rsp.dict.dict_val); - free (rsp.op_errstr); - return ret; + cli_cmd_broadcast_response(ret); + free(rsp.dict.dict_val); + free(rsp.op_errstr); + return ret; } int -gf_cli_remove_tier_brick_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - char *cmd_str = "unknown"; - cli_local_t *local = NULL; - call_frame_t *frame = NULL; - char *task_id_str = NULL; - dict_t *rsp_dict = NULL; - int32_t command = 0; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - frame = myframe; - - GF_ASSERT (frame->local); - - local = frame->local; - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - ret = dict_get_int32 (local->dict, "command", &command); +gf_cli_remove_tier_brick_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + char *cmd_str = "unknown"; + cli_local_t *local = NULL; + call_frame_t *frame = NULL; + char *task_id_str = NULL; + dict_t *rsp_dict = NULL; + int32_t command = 0; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + frame = myframe; + + GF_ASSERT(frame->local); + + local = frame->local; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + ret = dict_get_int32(local->dict, "command", &command); + if (ret) { + gf_log("", GF_LOG_ERROR, "failed to get command"); + goto out; + } + + if (rsp.dict.dict_len) { + rsp_dict = dict_new(); + if (!rsp_dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &rsp_dict); if (ret) { - gf_log ("", GF_LOG_ERROR, "failed to get command"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Failed to unserialize rsp_dict"); + goto out; } + } - - if (rsp.dict.dict_len) { - rsp_dict = dict_new (); - if (!rsp_dict) { - ret = -1; - goto out; - } - - ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, - &rsp_dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to unserialize rsp_dict"); - goto out; - } - } - - switch (command) { + switch (command) { case GF_DEFRAG_CMD_DETACH_START: - cmd_str = "start"; - - ret = dict_get_str (rsp_dict, GF_REMOVE_BRICK_TID_KEY, - &task_id_str); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "remove-brick-id is not present in dict"); - } - break; + cmd_str = "start"; + + ret = dict_get_str(rsp_dict, GF_REMOVE_BRICK_TID_KEY, &task_id_str); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "remove-brick-id is not present in dict"); + } + break; case GF_DEFRAG_CMD_DETACH_COMMIT: - cmd_str = "commit"; - break; + cmd_str = "commit"; + break; case GF_DEFRAG_CMD_DETACH_COMMIT_FORCE: - cmd_str = "commit force"; - break; + cmd_str = "commit force"; + break; case GF_DEFRAG_CMD_DETACH_STOP: - cmd_str = "stop"; - break; + cmd_str = "stop"; + break; case GF_DEFRAG_CMD_DETACH_STATUS: - cmd_str = "status"; - break; + cmd_str = "status"; + break; default: - cmd_str = "unknown"; - break; - } + cmd_str = "unknown"; + break; + } - gf_log ("cli", GF_LOG_INFO, "Received resp to detach tier"); + gf_log("cli", GF_LOG_INFO, "Received resp to detach tier"); - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "Detach tier %s %s", cmd_str, - (rsp.op_ret) ? "unsuccessful" : "successful"); + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), "Detach tier %s %s", cmd_str, + (rsp.op_ret) ? "unsuccessful" : "successful"); - ret = rsp.op_ret; - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_remove_brick_detach_tier ( - _gf_true, rsp_dict, - rsp.op_ret, rsp.op_errno, - msg, "volDetachTier"); + ret = rsp.op_ret; + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_remove_brick_detach_tier( + _gf_true, rsp_dict, rsp.op_ret, rsp.op_errno, msg, "volDetachTier"); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } else { - if (rsp.op_ret) { - if (strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "volume tier " - "detach %s: failed: %s", cmd_str, - rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "volume tier " - "detach %s: failed", cmd_str); - - cli_err ("%s", msg); - goto out; - - } else { - cli_out ("volume detach tier %s: success", cmd_str); - if (GF_DEFRAG_CMD_DETACH_START == command && - task_id_str != NULL) - cli_out ("ID: %s", task_id_str); - if (GF_DEFRAG_CMD_DETACH_COMMIT == command) - cli_out ("Check the detached bricks to ensure " - "all files are migrated.\nIf files " - "with data are found on the brick " - "path, copy them via a gluster mount " - "point before re-purposing the " - "removed brick. "); - } - } - if (command == GF_DEFRAG_CMD_DETACH_STOP || - command == GF_DEFRAG_CMD_DETACH_STATUS) - ret = gf_cli_print_rebalance_status (rsp_dict, - GF_TASK_TYPE_REMOVE_BRICK, _gf_true); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to print remove-brick " - "rebalance status"); - goto out; - } - - if ((command == GF_DEFRAG_CMD_DETACH_STOP) && (rsp.op_ret == 0)) { - cli_out ("'detach tier' process may be in the middle of a " - "file migration.\nThe process will be fully stopped " - "once the migration of the file is complete.\nPlease " - "check detach tier process for completion before " - "doing any further brick related tasks on the " - "volume."); - } - ret = rsp.op_ret; - -out: - cli_cmd_broadcast_response (ret); - free (rsp.dict.dict_val); - free (rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } else { + if (rsp.op_ret) { + if (strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), + "volume tier " + "detach %s: failed: %s", + cmd_str, rsp.op_errstr); + else + snprintf(msg, sizeof(msg), + "volume tier " + "detach %s: failed", + cmd_str); + + cli_err("%s", msg); + goto out; - return ret; + } else { + cli_out("volume detach tier %s: success", cmd_str); + if (GF_DEFRAG_CMD_DETACH_START == command && task_id_str != NULL) + cli_out("ID: %s", task_id_str); + if (GF_DEFRAG_CMD_DETACH_COMMIT == command) + cli_out( + "Check the detached bricks to ensure " + "all files are migrated.\nIf files " + "with data are found on the brick " + "path, copy them via a gluster mount " + "point before re-purposing the " + "removed brick. "); + } + } + if (command == GF_DEFRAG_CMD_DETACH_STOP || + command == GF_DEFRAG_CMD_DETACH_STATUS) + ret = gf_cli_print_rebalance_status(rsp_dict, GF_TASK_TYPE_REMOVE_BRICK, + _gf_true); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to print remove-brick " + "rebalance status"); + goto out; + } + + if ((command == GF_DEFRAG_CMD_DETACH_STOP) && (rsp.op_ret == 0)) { + cli_out( + "'detach tier' process may be in the middle of a " + "file migration.\nThe process will be fully stopped " + "once the migration of the file is complete.\nPlease " + "check detach tier process for completion before " + "doing any further brick related tasks on the " + "volume."); + } + ret = rsp.op_ret; + +out: + cli_cmd_broadcast_response(ret); + free(rsp.dict.dict_val); + free(rsp.op_errstr); + + return ret; } int -gf_cli_detach_tier_status_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - dict_t *dict = NULL; - char msg[1024] = {0,}; - int32_t command = 0; - gf1_op_commands cmd = GF_OP_CMD_NONE; - cli_local_t *local = NULL; - call_frame_t *frame = NULL; - char *cmd_str = "unknown"; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } +gf_cli_detach_tier_status_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; + char msg[1024] = { + 0, + }; + int32_t command = 0; + gf1_op_commands cmd = GF_OP_CMD_NONE; + cli_local_t *local = NULL; + call_frame_t *frame = NULL; + char *cmd_str = "unknown"; - frame = myframe; + GF_ASSERT(myframe); - GF_ASSERT (frame->local); + if (-1 == req->rpc_status) { + goto out; + } - local = frame->local; + frame = myframe; - ret = xdr_to_generic (*iov, &rsp, - (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + GF_ASSERT(frame->local); - ret = dict_get_int32 (local->dict, "command", &command); - if (ret) - goto out; + local = frame->local; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + ret = dict_get_int32(local->dict, "command", &command); + if (ret) + goto out; - cmd = command; + cmd = command; - switch (cmd) { + switch (cmd) { case GF_OP_CMD_STOP_DETACH_TIER: - cmd_str = "stop"; - break; + cmd_str = "stop"; + break; case GF_OP_CMD_STATUS: - cmd_str = "status"; - break; + cmd_str = "status"; + break; default: - break; - } - - ret = rsp.op_ret; - if (rsp.op_ret == -1) { - if (strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "volume tier detach %s: " - "failed: %s", cmd_str, rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "volume tier detach %s: " - "failed", cmd_str); + break; + } + + ret = rsp.op_ret; + if (rsp.op_ret == -1) { + if (strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), + "volume tier detach %s: " + "failed: %s", + cmd_str, rsp.op_errstr); + else + snprintf(msg, sizeof(msg), + "volume tier detach %s: " + "failed", + cmd_str); - if (global_state->mode & GLUSTER_MODE_XML) - goto xml_output; + if (global_state->mode & GLUSTER_MODE_XML) + goto xml_output; - cli_err ("%s", msg); - goto out; - } + cli_err("%s", msg); + goto out; + } - if (rsp.dict.dict_len) { - /* Unserialize the dictionary */ - dict = dict_new (); + if (rsp.dict.dict_len) { + /* Unserialize the dictionary */ + dict = dict_new(); - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); - if (ret < 0) { - strncpy (msg, "failed to unserialize req-buffer to " - "dictionary", sizeof (msg)); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + if (ret < 0) { + strncpy(msg, + "failed to unserialize req-buffer to " + "dictionary", + sizeof(msg)); - if (global_state->mode & GLUSTER_MODE_XML) { - rsp.op_ret = -1; - goto xml_output; - } + if (global_state->mode & GLUSTER_MODE_XML) { + rsp.op_ret = -1; + goto xml_output; + } - gf_log ("cli", GF_LOG_ERROR, "%s", msg); - goto out; - } + gf_log("cli", GF_LOG_ERROR, "%s", msg); + goto out; } + } xml_output: - if (global_state->mode & GLUSTER_MODE_XML) { - if (strcmp (rsp.op_errstr, "")) { - ret = cli_xml_output_vol_remove_brick_detach_tier ( - _gf_true, dict, - rsp.op_ret, - rsp.op_errno, - rsp.op_errstr, - "volDetachTier"); - } else { - ret = cli_xml_output_vol_remove_brick_detach_tier - (_gf_true, dict, - rsp.op_ret, - rsp.op_errno, - msg, - "volDetachTier"); - } - goto out; - } + if (global_state->mode & GLUSTER_MODE_XML) { + if (strcmp(rsp.op_errstr, "")) { + ret = cli_xml_output_vol_remove_brick_detach_tier( + _gf_true, dict, rsp.op_ret, rsp.op_errno, rsp.op_errstr, + "volDetachTier"); + } else { + ret = cli_xml_output_vol_remove_brick_detach_tier( + _gf_true, dict, rsp.op_ret, rsp.op_errno, msg, "volDetachTier"); + } + goto out; + } + + ret = gf_cli_print_rebalance_status(dict, GF_TASK_TYPE_REMOVE_BRICK, + _gf_true); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to print remove-brick " + "rebalance status"); + goto out; + } + + if ((cmd == GF_OP_CMD_STOP_DETACH_TIER) && (rsp.op_ret == 0)) { + cli_out( + "'detach tier' process may be in the middle of a " + "file migration.\nThe process will be fully stopped " + "once the migration of the file is complete.\nPlease " + "check detach tier process for completion before " + "doing any further brick related tasks on the " + "volume."); + } + +out: + free(rsp.dict.dict_val); /* malloced by xdr */ + if (dict) + dict_unref(dict); + cli_cmd_broadcast_response(ret); + return ret; +} - ret = gf_cli_print_rebalance_status (dict, GF_TASK_TYPE_REMOVE_BRICK, - _gf_true); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to print remove-brick " - "rebalance status"); - goto out; - } +int +gf_cli_add_brick_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + gf_log("cli", GF_LOG_INFO, "Received resp to add brick"); + + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), "Add Brick %s", + (rsp.op_ret) ? "unsuccessful" : "successful"); + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str("volAddBrick", msg, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if ((cmd == GF_OP_CMD_STOP_DETACH_TIER) && (rsp.op_ret == 0)) { - cli_out ("'detach tier' process may be in the middle of a " - "file migration.\nThe process will be fully stopped " - "once the migration of the file is complete.\nPlease " - "check detach tier process for completion before " - "doing any further brick related tasks on the " - "volume."); - } + if (rsp.op_ret) + cli_err("volume add-brick: failed: %s", rsp.op_errstr); + else + cli_out("volume add-brick: success"); + ret = rsp.op_ret; out: - free (rsp.dict.dict_val); /* malloced by xdr */ - if (dict) - dict_unref (dict); - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + free(rsp.dict.dict_val); + free(rsp.op_errstr); + return ret; } - int -gf_cli_add_brick_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli3_remove_brick_status_cbk(struct rpc_req *req, struct iovec *iov, + int count, void *myframe) { - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - - gf_log ("cli", GF_LOG_INFO, "Received resp to add brick"); + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; + char msg[1024] = { + 0, + }; + int32_t command = 0; + gf1_op_commands cmd = GF_OP_CMD_NONE; + cli_local_t *local = NULL; + call_frame_t *frame = NULL; + char *cmd_str = "unknown"; - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "Add Brick %s", - (rsp.op_ret) ? "unsuccessful": "successful"); + GF_ASSERT(myframe); - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str ("volAddBrick", msg, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } + if (-1 == req->rpc_status) { + goto out; + } - if (rsp.op_ret) - cli_err ("volume add-brick: failed: %s", rsp.op_errstr); - else - cli_out ("volume add-brick: success"); - ret = rsp.op_ret; + frame = myframe; -out: - cli_cmd_broadcast_response (ret); - free (rsp.dict.dict_val); - free (rsp.op_errstr); - return ret; -} + GF_ASSERT(frame->local); -int -gf_cli3_remove_brick_status_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - dict_t *dict = NULL; - char msg[1024] = {0,}; - int32_t command = 0; - gf1_op_commands cmd = GF_OP_CMD_NONE; - cli_local_t *local = NULL; - call_frame_t *frame = NULL; - char *cmd_str = "unknown"; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } + local = frame->local; - frame = myframe; + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - GF_ASSERT (frame->local); + ret = dict_get_int32(local->dict, "command", &command); + if (ret) + goto out; - local = frame->local; + cmd = command; - ret = xdr_to_generic (*iov, &rsp, - (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - ret = dict_get_int32 (local->dict, "command", &command); - if (ret) - goto out; - - cmd = command; - - switch (cmd) { + switch (cmd) { case GF_OP_CMD_STOP: - cmd_str = "stop"; - break; + cmd_str = "stop"; + break; case GF_OP_CMD_STATUS: - cmd_str = "status"; - break; + cmd_str = "status"; + break; default: - break; - } + break; + } + + ret = rsp.op_ret; + if (rsp.op_ret == -1) { + if (strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), + "volume remove-brick %s: " + "failed: %s", + cmd_str, rsp.op_errstr); + else + snprintf(msg, sizeof(msg), + "volume remove-brick %s: " + "failed", + cmd_str); - ret = rsp.op_ret; - if (rsp.op_ret == -1) { - if (strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "volume remove-brick %s: " - "failed: %s", cmd_str, rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "volume remove-brick %s: " - "failed", cmd_str); + if (global_state->mode & GLUSTER_MODE_XML) + goto xml_output; - if (global_state->mode & GLUSTER_MODE_XML) - goto xml_output; + cli_err("%s", msg); + goto out; + } - cli_err ("%s", msg); - goto out; - } + if (rsp.dict.dict_len) { + /* Unserialize the dictionary */ + dict = dict_new(); - if (rsp.dict.dict_len) { - /* Unserialize the dictionary */ - dict = dict_new (); - - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); - if (ret < 0) { - strncpy (msg, "failed to unserialize req-buffer to " - "dictionary", sizeof (msg)); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + if (ret < 0) { + strncpy(msg, + "failed to unserialize req-buffer to " + "dictionary", + sizeof(msg)); - if (global_state->mode & GLUSTER_MODE_XML) { - rsp.op_ret = -1; - goto xml_output; - } + if (global_state->mode & GLUSTER_MODE_XML) { + rsp.op_ret = -1; + goto xml_output; + } - gf_log ("cli", GF_LOG_ERROR, "%s", msg); - goto out; - } + gf_log("cli", GF_LOG_ERROR, "%s", msg); + goto out; } + } xml_output: - if (global_state->mode & GLUSTER_MODE_XML) { - if (strcmp (rsp.op_errstr, "")) { - ret = cli_xml_output_vol_remove_brick_detach_tier ( - _gf_true, dict, - rsp.op_ret, - rsp.op_errno, - rsp.op_errstr, - "volRemoveBrick"); - } else { - ret = cli_xml_output_vol_remove_brick_detach_tier ( - _gf_true, dict, - rsp.op_ret, - rsp.op_errno, - msg, - "volRemoveBrick"); - } - goto out; - } - - ret = gf_cli_print_rebalance_status (dict, GF_TASK_TYPE_REMOVE_BRICK, - _gf_false); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to print remove-brick " - "rebalance status"); - goto out; - } - - if ((cmd == GF_OP_CMD_STOP) && (rsp.op_ret == 0)) { - cli_out ("'remove-brick' process may be in the middle of a " - "file migration.\nThe process will be fully stopped " - "once the migration of the file is complete.\nPlease " - "check remove-brick process for completion before " - "doing any further brick related tasks on the " - "volume."); - } - -out: - free (rsp.dict.dict_val); //malloced by xdr - if (dict) - dict_unref (dict); - cli_cmd_broadcast_response (ret); - return ret; + if (global_state->mode & GLUSTER_MODE_XML) { + if (strcmp(rsp.op_errstr, "")) { + ret = cli_xml_output_vol_remove_brick_detach_tier( + _gf_true, dict, rsp.op_ret, rsp.op_errno, rsp.op_errstr, + "volRemoveBrick"); + } else { + ret = cli_xml_output_vol_remove_brick_detach_tier( + _gf_true, dict, rsp.op_ret, rsp.op_errno, msg, + "volRemoveBrick"); + } + goto out; + } + + ret = gf_cli_print_rebalance_status(dict, GF_TASK_TYPE_REMOVE_BRICK, + _gf_false); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to print remove-brick " + "rebalance status"); + goto out; + } + + if ((cmd == GF_OP_CMD_STOP) && (rsp.op_ret == 0)) { + cli_out( + "'remove-brick' process may be in the middle of a " + "file migration.\nThe process will be fully stopped " + "once the migration of the file is complete.\nPlease " + "check remove-brick process for completion before " + "doing any further brick related tasks on the " + "volume."); + } + +out: + free(rsp.dict.dict_val); // malloced by xdr + if (dict) + dict_unref(dict); + cli_cmd_broadcast_response(ret); + return ret; } - int -gf_cli_remove_brick_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - gf1_op_commands cmd = GF_OP_CMD_NONE; - char *cmd_str = "unknown"; - cli_local_t *local = NULL; - call_frame_t *frame = NULL; - char *task_id_str = NULL; - dict_t *rsp_dict = NULL; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - frame = myframe; - - GF_ASSERT (frame->local); - - local = frame->local; - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - ret = dict_get_int32 (local->dict, "command", (int32_t *)&cmd); +gf_cli_remove_brick_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + gf1_op_commands cmd = GF_OP_CMD_NONE; + char *cmd_str = "unknown"; + cli_local_t *local = NULL; + call_frame_t *frame = NULL; + char *task_id_str = NULL; + dict_t *rsp_dict = NULL; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + frame = myframe; + + GF_ASSERT(frame->local); + + local = frame->local; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + ret = dict_get_int32(local->dict, "command", (int32_t *)&cmd); + if (ret) { + gf_log("", GF_LOG_ERROR, "failed to get command"); + goto out; + } + + if (rsp.dict.dict_len) { + rsp_dict = dict_new(); + if (!rsp_dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &rsp_dict); if (ret) { - gf_log ("", GF_LOG_ERROR, "failed to get command"); - goto out; - } - - if (rsp.dict.dict_len) { - rsp_dict = dict_new (); - if (!rsp_dict) { - ret = -1; - goto out; - } - - ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, - &rsp_dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to unserialize rsp_dict"); - goto out; - } + gf_log("cli", GF_LOG_ERROR, "Failed to unserialize rsp_dict"); + goto out; } + } - switch (cmd) { + switch (cmd) { case GF_OP_CMD_DETACH_START: case GF_OP_CMD_START: - cmd_str = "start"; - - ret = dict_get_str (rsp_dict, GF_REMOVE_BRICK_TID_KEY, &task_id_str); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "remove-brick-id is not present in dict"); - } - break; + cmd_str = "start"; + + ret = dict_get_str(rsp_dict, GF_REMOVE_BRICK_TID_KEY, &task_id_str); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "remove-brick-id is not present in dict"); + } + break; case GF_OP_CMD_COMMIT: - cmd_str = "commit"; - break; + cmd_str = "commit"; + break; case GF_OP_CMD_COMMIT_FORCE: - cmd_str = "commit force"; - break; + cmd_str = "commit force"; + break; default: - cmd_str = "unknown"; - break; - } - - gf_log ("cli", GF_LOG_INFO, "Received resp to remove brick"); - - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "Remove Brick %s %s", cmd_str, - (rsp.op_ret) ? "unsuccessful": "successful"); - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_remove_brick_detach_tier ( - _gf_false, rsp_dict, - rsp.op_ret, rsp.op_errno, - msg, "volRemoveBrick"); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } + cmd_str = "unknown"; + break; + } + + gf_log("cli", GF_LOG_INFO, "Received resp to remove brick"); + + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), "Remove Brick %s %s", cmd_str, + (rsp.op_ret) ? "unsuccessful" : "successful"); + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_remove_brick_detach_tier( + _gf_false, rsp_dict, rsp.op_ret, rsp.op_errno, msg, + "volRemoveBrick"); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (rsp.op_ret) { - cli_err ("volume remove-brick %s: failed: %s", cmd_str, - msg); - } else { - cli_out ("volume remove-brick %s: success", cmd_str); - if (GF_OP_CMD_START == cmd && task_id_str != NULL) - cli_out ("ID: %s", task_id_str); - if (GF_OP_CMD_COMMIT == cmd) - cli_out ("Check the removed bricks to ensure all files " - "are migrated.\nIf files with data are " - "found on the brick path, copy them via a " - "gluster mount point before re-purposing the " - "removed brick. "); - } + if (rsp.op_ret) { + cli_err("volume remove-brick %s: failed: %s", cmd_str, msg); + } else { + cli_out("volume remove-brick %s: success", cmd_str); + if (GF_OP_CMD_START == cmd && task_id_str != NULL) + cli_out("ID: %s", task_id_str); + if (GF_OP_CMD_COMMIT == cmd) + cli_out( + "Check the removed bricks to ensure all files " + "are migrated.\nIf files with data are " + "found on the brick path, copy them via a " + "gluster mount point before re-purposing the " + "removed brick. "); + } - ret = rsp.op_ret; + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - free (rsp.dict.dict_val); - free (rsp.op_errstr); + cli_cmd_broadcast_response(ret); + free(rsp.dict.dict_val); + free(rsp.op_errstr); - return ret; + return ret; } int -gf_cli_reset_brick_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - cli_local_t *local = NULL; - call_frame_t *frame = NULL; - char *rb_operation_str = NULL; - dict_t *rsp_dict = NULL; - char msg[1024] = {0,}; - char *reset_op = NULL; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - frame = myframe; - - GF_ASSERT (frame->local); - - local = frame->local; - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); +gf_cli_reset_brick_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + cli_local_t *local = NULL; + call_frame_t *frame = NULL; + char *rb_operation_str = NULL; + dict_t *rsp_dict = NULL; + char msg[1024] = { + 0, + }; + char *reset_op = NULL; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + frame = myframe; + + GF_ASSERT(frame->local); + + local = frame->local; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + ret = dict_get_str(local->dict, "operation", &reset_op); + if (ret) { + gf_log(frame->this->name, GF_LOG_ERROR, "dict_get on operation failed"); + goto out; + } + + if (rsp.dict.dict_len) { + /* Unserialize the dictionary */ + rsp_dict = dict_new(); + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &rsp_dict); if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - ret = dict_get_str (local->dict, "operation", &reset_op); - if (ret) { - gf_log (frame->this->name, GF_LOG_ERROR, - "dict_get on operation failed"); - goto out; - } - - if (rsp.dict.dict_len) { - /* Unserialize the dictionary */ - rsp_dict = dict_new (); - - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &rsp_dict); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, "failed to " - "unserialize rsp buffer to dictionary"); - goto out; - } - } - - if (strcmp (reset_op, "GF_RESET_OP_START") && - strcmp (reset_op, "GF_RESET_OP_COMMIT") && - strcmp (reset_op, "GF_RESET_OP_COMMIT_FORCE")) { - rb_operation_str = gf_strdup ("Unknown operation"); - ret = -1; - goto out; - } - - if (rsp.op_ret && (strcmp (rsp.op_errstr, ""))) { - rb_operation_str = gf_strdup (rsp.op_errstr); - } else { - if (!strcmp (reset_op, "GF_RESET_OP_START")) { - if (rsp.op_ret) - rb_operation_str = gf_strdup ("reset-brick " - "start " - "operation " - "failed"); - else - rb_operation_str = gf_strdup ("reset-brick " - "start " - "operation " - "successful"); - } else if (!strcmp (reset_op, "GF_RESET_OP_COMMIT")) { - - if (rsp.op_ret) - rb_operation_str = gf_strdup ("reset-brick " - "commit " - "operation " - "failed"); - else - rb_operation_str = gf_strdup ("reset-brick " - "commit " - "operation " - "successful"); - } else if (!strcmp (reset_op, "GF_RESET_OP_COMMIT_FORCE")) { - - if (rsp.op_ret) - rb_operation_str = gf_strdup ("reset-brick " - "commit " - "force operation " - "failed"); - else - rb_operation_str = gf_strdup ("reset-brick " - "commit " - "force operation " - "successful"); - } - } - - gf_log ("cli", GF_LOG_INFO, "Received resp to reset brick"); - snprintf (msg, sizeof (msg), "%s", - rb_operation_str ? rb_operation_str : "Unknown operation"); - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_replace_brick (rsp_dict, - rsp.op_ret, - rsp.op_errno, msg); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } + gf_log(frame->this->name, GF_LOG_ERROR, + "failed to " + "unserialize rsp buffer to dictionary"); + goto out; + } + } + + if (strcmp(reset_op, "GF_RESET_OP_START") && + strcmp(reset_op, "GF_RESET_OP_COMMIT") && + strcmp(reset_op, "GF_RESET_OP_COMMIT_FORCE")) { + rb_operation_str = gf_strdup("Unknown operation"); + ret = -1; + goto out; + } + + if (rsp.op_ret && (strcmp(rsp.op_errstr, ""))) { + rb_operation_str = gf_strdup(rsp.op_errstr); + } else { + if (!strcmp(reset_op, "GF_RESET_OP_START")) { + if (rsp.op_ret) + rb_operation_str = gf_strdup( + "reset-brick " + "start " + "operation " + "failed"); + else + rb_operation_str = gf_strdup( + "reset-brick " + "start " + "operation " + "successful"); + } else if (!strcmp(reset_op, "GF_RESET_OP_COMMIT")) { + if (rsp.op_ret) + rb_operation_str = gf_strdup( + "reset-brick " + "commit " + "operation " + "failed"); + else + rb_operation_str = gf_strdup( + "reset-brick " + "commit " + "operation " + "successful"); + } else if (!strcmp(reset_op, "GF_RESET_OP_COMMIT_FORCE")) { + if (rsp.op_ret) + rb_operation_str = gf_strdup( + "reset-brick " + "commit " + "force operation " + "failed"); + else + rb_operation_str = gf_strdup( + "reset-brick " + "commit " + "force operation " + "successful"); + } + } + + gf_log("cli", GF_LOG_INFO, "Received resp to reset brick"); + snprintf(msg, sizeof(msg), "%s", + rb_operation_str ? rb_operation_str : "Unknown operation"); + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_replace_brick(rsp_dict, rsp.op_ret, + rsp.op_errno, msg); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (rsp.op_ret) - cli_err ("volume reset-brick: failed: %s", msg); - else - cli_out ("volume reset-brick: success: %s", msg); - ret = rsp.op_ret; + if (rsp.op_ret) + cli_err("volume reset-brick: failed: %s", msg); + else + cli_out("volume reset-brick: success: %s", msg); + ret = rsp.op_ret; out: - if (frame) - frame->local = NULL; + if (frame) + frame->local = NULL; - if (local) - cli_local_wipe (local); + if (local) + cli_local_wipe(local); - if (rb_operation_str) - GF_FREE (rb_operation_str); + if (rb_operation_str) + GF_FREE(rb_operation_str); - cli_cmd_broadcast_response (ret); - free (rsp.dict.dict_val); - if (rsp_dict) - dict_unref (rsp_dict); + cli_cmd_broadcast_response(ret); + free(rsp.dict.dict_val); + if (rsp_dict) + dict_unref(rsp_dict); - return ret; + return ret; } int -gf_cli_replace_brick_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - cli_local_t *local = NULL; - call_frame_t *frame = NULL; - char *rb_operation_str = NULL; - dict_t *rsp_dict = NULL; - char msg[1024] = {0,}; - char *replace_op = NULL; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - frame = myframe; - - GF_ASSERT (frame->local); - - local = frame->local; - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); +gf_cli_replace_brick_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + cli_local_t *local = NULL; + call_frame_t *frame = NULL; + char *rb_operation_str = NULL; + dict_t *rsp_dict = NULL; + char msg[1024] = { + 0, + }; + char *replace_op = NULL; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + frame = myframe; + + GF_ASSERT(frame->local); + + local = frame->local; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + ret = dict_get_str(local->dict, "operation", &replace_op); + if (ret) { + gf_log(frame->this->name, GF_LOG_ERROR, "dict_get on operation failed"); + goto out; + } + + if (rsp.dict.dict_len) { + /* Unserialize the dictionary */ + rsp_dict = dict_new(); + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &rsp_dict); if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - ret = dict_get_str (local->dict, "operation", &replace_op); - if (ret) { - gf_log (frame->this->name, GF_LOG_ERROR, - "dict_get on operation failed"); - goto out; - } - - if (rsp.dict.dict_len) { - /* Unserialize the dictionary */ - rsp_dict = dict_new (); - - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &rsp_dict); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, "failed to " - "unserialize rsp buffer to dictionary"); - goto out; - } - } - - if (!strcmp (replace_op, "GF_REPLACE_OP_COMMIT_FORCE")) { - - if (rsp.op_ret || ret) - rb_operation_str = gf_strdup ("replace-brick commit " - "force operation failed"); - else - rb_operation_str = gf_strdup ("replace-brick commit " - "force operation " - "successful"); - } else { - gf_log (frame->this->name, GF_LOG_DEBUG, "Unknown operation"); - } - - if (rsp.op_ret && (strcmp (rsp.op_errstr, ""))) { - rb_operation_str = gf_strdup (rsp.op_errstr); - } - - gf_log ("cli", GF_LOG_INFO, "Received resp to replace brick"); - snprintf (msg, sizeof (msg), "%s", - rb_operation_str ? rb_operation_str : "Unknown operation"); - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_replace_brick (rsp_dict, - rsp.op_ret, - rsp.op_errno, msg); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } - - if (rsp.op_ret) - cli_err ("volume replace-brick: failed: %s", msg); + gf_log(frame->this->name, GF_LOG_ERROR, + "failed to " + "unserialize rsp buffer to dictionary"); + goto out; + } + } + + if (!strcmp(replace_op, "GF_REPLACE_OP_COMMIT_FORCE")) { + if (rsp.op_ret || ret) + rb_operation_str = gf_strdup( + "replace-brick commit " + "force operation failed"); else - cli_out ("volume replace-brick: success: %s", msg); - ret = rsp.op_ret; + rb_operation_str = gf_strdup( + "replace-brick commit " + "force operation " + "successful"); + } else { + gf_log(frame->this->name, GF_LOG_DEBUG, "Unknown operation"); + } + + if (rsp.op_ret && (strcmp(rsp.op_errstr, ""))) { + rb_operation_str = gf_strdup(rsp.op_errstr); + } + + gf_log("cli", GF_LOG_INFO, "Received resp to replace brick"); + snprintf(msg, sizeof(msg), "%s", + rb_operation_str ? rb_operation_str : "Unknown operation"); + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_replace_brick(rsp_dict, rsp.op_ret, + rsp.op_errno, msg); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } + + if (rsp.op_ret) + cli_err("volume replace-brick: failed: %s", msg); + else + cli_out("volume replace-brick: success: %s", msg); + ret = rsp.op_ret; out: - if (frame) - frame->local = NULL; + if (frame) + frame->local = NULL; - if (local) - cli_local_wipe (local); + if (local) + cli_local_wipe(local); - if (rb_operation_str) - GF_FREE (rb_operation_str); + if (rb_operation_str) + GF_FREE(rb_operation_str); - cli_cmd_broadcast_response (ret); - free (rsp.dict.dict_val); - if (rsp_dict) - dict_unref (rsp_dict); + cli_cmd_broadcast_response(ret); + free(rsp.dict.dict_val); + if (rsp_dict) + dict_unref(rsp_dict); - return ret; + return ret; } - static int -gf_cli_log_rotate_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - gf_log ("cli", GF_LOG_DEBUG, "Received resp to log rotate"); - - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "log rotate %s", - (rsp.op_ret) ? "unsuccessful": "successful"); - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str ("volLogRotate", msg, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } +gf_cli_log_rotate_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + gf_log("cli", GF_LOG_DEBUG, "Received resp to log rotate"); + + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), "log rotate %s", + (rsp.op_ret) ? "unsuccessful" : "successful"); + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str("volLogRotate", msg, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (rsp.op_ret) - cli_err ("volume log-rotate: failed: %s", msg); - else - cli_out ("volume log-rotate: success"); - ret = rsp.op_ret; + if (rsp.op_ret) + cli_err("volume log-rotate: failed: %s", msg); + else + cli_out("volume log-rotate: success"); + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - free (rsp.dict.dict_val); + cli_cmd_broadcast_response(ret); + free(rsp.dict.dict_val); - return ret; + return ret; } static int -gf_cli_sync_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - gf_log ("cli", GF_LOG_DEBUG, "Received resp to sync"); - - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "volume sync: failed: %s", - rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "volume sync: %s", - (rsp.op_ret) ? "failed": "success"); - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str ("volSync", msg, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } +gf_cli_sync_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + gf_log("cli", GF_LOG_DEBUG, "Received resp to sync"); + + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), "volume sync: failed: %s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), "volume sync: %s", + (rsp.op_ret) ? "failed" : "success"); + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str("volSync", msg, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (rsp.op_ret) - cli_err ("%s", msg); - else - cli_out ("%s", msg); - ret = rsp.op_ret; + if (rsp.op_ret) + cli_err("%s", msg); + else + cli_out("%s", msg); + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } static int -print_quota_list_usage_output (cli_local_t *local, char *path, int64_t avail, - char *sl_str, quota_limits_t *limits, - quota_meta_t *used_space, gf_boolean_t sl, - gf_boolean_t hl, double sl_num, - gf_boolean_t limit_set) -{ - int32_t ret = -1; - char *used_str = NULL; - char *avail_str = NULL; - char *hl_str = NULL; - char *sl_val = NULL; - - used_str = gf_uint64_2human_readable (used_space->size); - - if (limit_set) { - hl_str = gf_uint64_2human_readable (limits->hl); - avail_str = gf_uint64_2human_readable (avail); - - sl_val = gf_uint64_2human_readable (sl_num); - } - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_quota_xml_output (local, path, limits->hl, - sl_str, sl_num, used_space->size, - avail, sl ? "Yes" : "No", - hl ? "Yes" : "No", limit_set); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to " - "output in xml format for quota " - "list command"); - } - goto out; - } - - if (limit_set) { - if (!used_str) { - cli_out ("%-40s %7s %7s(%s) %8"PRIu64 "%9"PRIu64"" - "%15s %18s", path, hl_str, sl_str, sl_val, - used_space->size, avail, - sl ? "Yes" : "No", hl ? "Yes" : "No"); - } else { - cli_out ("%-40s %7s %7s(%s) %8s %7s %15s %20s", - path, hl_str, sl_str, sl_val, used_str, - avail_str, sl ? "Yes" : "No", - hl ? "Yes" : "No"); - } +print_quota_list_usage_output(cli_local_t *local, char *path, int64_t avail, + char *sl_str, quota_limits_t *limits, + quota_meta_t *used_space, gf_boolean_t sl, + gf_boolean_t hl, double sl_num, + gf_boolean_t limit_set) +{ + int32_t ret = -1; + char *used_str = NULL; + char *avail_str = NULL; + char *hl_str = NULL; + char *sl_val = NULL; + + used_str = gf_uint64_2human_readable(used_space->size); + + if (limit_set) { + hl_str = gf_uint64_2human_readable(limits->hl); + avail_str = gf_uint64_2human_readable(avail); + + sl_val = gf_uint64_2human_readable(sl_num); + } + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_quota_xml_output(local, path, limits->hl, sl_str, sl_num, + used_space->size, avail, sl ? "Yes" : "No", + hl ? "Yes" : "No", limit_set); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to " + "output in xml format for quota " + "list command"); + } + goto out; + } + + if (limit_set) { + if (!used_str) { + cli_out("%-40s %7s %7s(%s) %8" PRIu64 "%9" PRIu64 + "" + "%15s %18s", + path, hl_str, sl_str, sl_val, used_space->size, avail, + sl ? "Yes" : "No", hl ? "Yes" : "No"); } else { - cli_out ("%-36s %10s %10s %14s %9s %15s %18s", - path, "N/A", "N/A", used_str, "N/A", - "N/A", "N/A"); + cli_out("%-40s %7s %7s(%s) %8s %7s %15s %20s", path, hl_str, sl_str, + sl_val, used_str, avail_str, sl ? "Yes" : "No", + hl ? "Yes" : "No"); } + } else { + cli_out("%-36s %10s %10s %14s %9s %15s %18s", path, "N/A", "N/A", + used_str, "N/A", "N/A", "N/A"); + } - ret = 0; + ret = 0; out: - GF_FREE (hl_str); - GF_FREE (used_str); - GF_FREE (avail_str); - GF_FREE (sl_val); + GF_FREE(hl_str); + GF_FREE(used_str); + GF_FREE(avail_str); + GF_FREE(sl_val); - return ret; + return ret; } static int -print_quota_list_object_output (cli_local_t *local, char *path, int64_t avail, +print_quota_list_object_output(cli_local_t *local, char *path, int64_t avail, char *sl_str, quota_limits_t *limits, quota_meta_t *used_space, gf_boolean_t sl, gf_boolean_t hl, double sl_num, gf_boolean_t limit_set) { - int32_t ret = -1; - int64_t sl_val = sl_num; + int32_t ret = -1; + int64_t sl_val = sl_num; - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_quota_object_xml_output (local, path, sl_str, sl_val, - limits, used_space, avail, - sl ? "Yes" : "No", - hl ? "Yes" : "No", - limit_set); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to " - "output in xml format for quota " - "list command"); - } - goto out; + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_quota_object_xml_output(local, path, sl_str, sl_val, limits, + used_space, avail, sl ? "Yes" : "No", + hl ? "Yes" : "No", limit_set); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to " + "output in xml format for quota " + "list command"); } + goto out; + } - if (limit_set) { - cli_out ("%-40s %9"PRIu64" %9s(%"PRId64") %10"PRIu64"" - "%10"PRIu64" %11"PRIu64" %15s %20s", - path, limits->hl, sl_str, sl_val, - used_space->file_count, used_space->dir_count, - avail, sl ? "Yes" : "No", hl ? "Yes" : "No"); - } else { - cli_out ("%-40s %9s %9s %10"PRIu64" %10"PRIu64" %11s %15s %20s", - path, "N/A", "N/A", used_space->file_count, - used_space->dir_count, "N/A", "N/A", "N/A"); - } - ret = 0; + if (limit_set) { + cli_out("%-40s %9" PRIu64 " %9s(%" PRId64 ") %10" PRIu64 + "" + "%10" PRIu64 " %11" PRIu64 " %15s %20s", + path, limits->hl, sl_str, sl_val, used_space->file_count, + used_space->dir_count, avail, sl ? "Yes" : "No", + hl ? "Yes" : "No"); + } else { + cli_out("%-40s %9s %9s %10" PRIu64 " %10" PRIu64 " %11s %15s %20s", + path, "N/A", "N/A", used_space->file_count, + used_space->dir_count, "N/A", "N/A", "N/A"); + } + ret = 0; out: - return ret; + return ret; } static int -print_quota_list_output (cli_local_t *local, char *path, char *default_sl, - quota_limits_t *limits, quota_meta_t *used_space, - int type, gf_boolean_t limit_set) -{ - int64_t avail = 0; - char percent_str[20] = {0}; - char *sl_final = NULL; - int ret = -1; - double sl_num = 0; - gf_boolean_t sl = _gf_false; - gf_boolean_t hl = _gf_false; - int64_t used_size = 0; - - GF_ASSERT (local); - GF_ASSERT (path); - - if (limit_set) { - if (limits->sl < 0) { - ret = gf_string2percent (default_sl, &sl_num); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "could not convert default soft limit" - " to percent"); - goto out; - } - sl_num = (sl_num * limits->hl) / 100; - sl_final = default_sl; - } else { - sl_num = (limits->sl * limits->hl) / 100; - snprintf (percent_str, sizeof (percent_str), "%"PRIu64"%%", - limits->sl); - sl_final = percent_str; - } - if (type == GF_QUOTA_OPTION_TYPE_LIST) - used_size = used_space->size; - else - used_size = used_space->file_count + used_space->dir_count; - - if (limits->hl > used_size) { - avail = limits->hl - used_size; - hl = _gf_false; - if (used_size > sl_num) - sl = _gf_true; - else - sl = _gf_false; - } else { - avail = 0; - hl = sl = _gf_true; - } +print_quota_list_output(cli_local_t *local, char *path, char *default_sl, + quota_limits_t *limits, quota_meta_t *used_space, + int type, gf_boolean_t limit_set) +{ + int64_t avail = 0; + char percent_str[20] = {0}; + char *sl_final = NULL; + int ret = -1; + double sl_num = 0; + gf_boolean_t sl = _gf_false; + gf_boolean_t hl = _gf_false; + int64_t used_size = 0; + + GF_ASSERT(local); + GF_ASSERT(path); + + if (limit_set) { + if (limits->sl < 0) { + ret = gf_string2percent(default_sl, &sl_num); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "could not convert default soft limit" + " to percent"); + goto out; + } + sl_num = (sl_num * limits->hl) / 100; + sl_final = default_sl; + } else { + sl_num = (limits->sl * limits->hl) / 100; + snprintf(percent_str, sizeof(percent_str), "%" PRIu64 "%%", + limits->sl); + sl_final = percent_str; } - if (type == GF_QUOTA_OPTION_TYPE_LIST) - ret = print_quota_list_usage_output (local, path, avail, - sl_final, limits, - used_space, sl, hl, - sl_num, limit_set); + used_size = used_space->size; else - ret = print_quota_list_object_output (local, path, avail, - sl_final, limits, - used_space, sl, hl, - sl_num, limit_set); + used_size = used_space->file_count + used_space->dir_count; + + if (limits->hl > used_size) { + avail = limits->hl - used_size; + hl = _gf_false; + if (used_size > sl_num) + sl = _gf_true; + else + sl = _gf_false; + } else { + avail = 0; + hl = sl = _gf_true; + } + } + + if (type == GF_QUOTA_OPTION_TYPE_LIST) + ret = print_quota_list_usage_output(local, path, avail, sl_final, + limits, used_space, sl, hl, sl_num, + limit_set); + else + ret = print_quota_list_object_output(local, path, avail, sl_final, + limits, used_space, sl, hl, sl_num, + limit_set); out: - return ret; + return ret; } static int -print_quota_list_from_mountdir (cli_local_t *local, char *mountdir, - char *default_sl, char *path, int type) -{ - int ret = -1; - ssize_t xattr_size = 0; - quota_limits_t limits = {0,}; - quota_meta_t used_space = {0,}; - char *key = NULL; - gf_boolean_t limit_set = _gf_true; - - GF_ASSERT (local); - GF_ASSERT (mountdir); - GF_ASSERT (path); - - if (type == GF_QUOTA_OPTION_TYPE_LIST) - key = QUOTA_LIMIT_KEY; - else - key = QUOTA_LIMIT_OBJECTS_KEY; - - - ret = sys_lgetxattr (mountdir, key, (void *)&limits, sizeof (limits)); - if (ret < 0) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get the xattr %s " - "on %s. Reason : %s", key, mountdir, strerror (errno)); - - switch (errno) { +print_quota_list_from_mountdir(cli_local_t *local, char *mountdir, + char *default_sl, char *path, int type) +{ + int ret = -1; + ssize_t xattr_size = 0; + quota_limits_t limits = { + 0, + }; + quota_meta_t used_space = { + 0, + }; + char *key = NULL; + gf_boolean_t limit_set = _gf_true; + + GF_ASSERT(local); + GF_ASSERT(mountdir); + GF_ASSERT(path); + + if (type == GF_QUOTA_OPTION_TYPE_LIST) + key = QUOTA_LIMIT_KEY; + else + key = QUOTA_LIMIT_OBJECTS_KEY; + + ret = sys_lgetxattr(mountdir, key, (void *)&limits, sizeof(limits)); + if (ret < 0) { + gf_log("cli", GF_LOG_ERROR, + "Failed to get the xattr %s " + "on %s. Reason : %s", + key, mountdir, strerror(errno)); + + switch (errno) { #if defined(ENODATA) - case ENODATA: + case ENODATA: #endif #if defined(ENOATTR) && (ENOATTR != ENODATA) - case ENOATTR: + case ENOATTR: #endif - /* If it's an ENOATTR, quota/inode-quota is - * configured(limit is set at least for one directory). - * The user is trying to issue 'list/list-objects' - * command for a directory on which quota limit is - * not set and we are showing the used-space in case - * of list-usage and showing (dir_count, file_count) - * in case of list-objects. Other labels are - * shown "N/A". - */ - - limit_set = _gf_false; - goto enoattr; - break; - - default: - cli_err ("%-40s %s", path, strerror (errno)); - break; - } + /* If it's an ENOATTR, quota/inode-quota is + * configured(limit is set at least for one directory). + * The user is trying to issue 'list/list-objects' + * command for a directory on which quota limit is + * not set and we are showing the used-space in case + * of list-usage and showing (dir_count, file_count) + * in case of list-objects. Other labels are + * shown "N/A". + */ - goto out; + limit_set = _gf_false; + goto enoattr; + break; + + default: + cli_err("%-40s %s", path, strerror(errno)); + break; } - limits.hl = ntoh64 (limits.hl); - limits.sl = ntoh64 (limits.sl); + goto out; + } + + limits.hl = ntoh64(limits.hl); + limits.sl = ntoh64(limits.sl); enoattr: - xattr_size = sys_lgetxattr (mountdir, QUOTA_SIZE_KEY, NULL, 0); - if (xattr_size < (sizeof (int64_t) * 2) && - type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS) { - ret = -1; + xattr_size = sys_lgetxattr(mountdir, QUOTA_SIZE_KEY, NULL, 0); + if (xattr_size < (sizeof(int64_t) * 2) && + type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS) { + ret = -1; - /* This can happen when glusterfs is upgraded from 3.6 to 3.7 - * and the xattr healing is not completed. - */ - } else if (xattr_size > (sizeof (int64_t) * 2)) { - ret = sys_lgetxattr (mountdir, QUOTA_SIZE_KEY, - &used_space, sizeof (used_space)); - } else if (xattr_size > 0) { - /* This is for compatibility. - * Older version had only file usage - */ - ret = sys_lgetxattr (mountdir, QUOTA_SIZE_KEY, - &(used_space.size), sizeof (used_space.size)); - used_space.file_count = 0; - used_space.dir_count = 0; - } else { - ret = -1; - } + /* This can happen when glusterfs is upgraded from 3.6 to 3.7 + * and the xattr healing is not completed. + */ + } else if (xattr_size > (sizeof(int64_t) * 2)) { + ret = sys_lgetxattr(mountdir, QUOTA_SIZE_KEY, &used_space, + sizeof(used_space)); + } else if (xattr_size > 0) { + /* This is for compatibility. + * Older version had only file usage + */ + ret = sys_lgetxattr(mountdir, QUOTA_SIZE_KEY, &(used_space.size), + sizeof(used_space.size)); + used_space.file_count = 0; + used_space.dir_count = 0; + } else { + ret = -1; + } - if (ret < 0) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get quota size " - "on path %s: %s", mountdir, strerror (errno)); - print_quota_list_empty (path, type); - goto out; - } + if (ret < 0) { + gf_log("cli", GF_LOG_ERROR, + "Failed to get quota size " + "on path %s: %s", + mountdir, strerror(errno)); + print_quota_list_empty(path, type); + goto out; + } - used_space.size = ntoh64 (used_space.size); - used_space.file_count = ntoh64 (used_space.file_count); - used_space.dir_count = ntoh64 (used_space.dir_count); + used_space.size = ntoh64(used_space.size); + used_space.file_count = ntoh64(used_space.file_count); + used_space.dir_count = ntoh64(used_space.dir_count); - ret = print_quota_list_output (local, path, default_sl, &limits, - &used_space, type, limit_set); + ret = print_quota_list_output(local, path, default_sl, &limits, &used_space, + type, limit_set); out: - return ret; + return ret; } int -gluster_remove_auxiliary_mount (char *volname) +gluster_remove_auxiliary_mount(char *volname) { - int ret = -1; - char mountdir[PATH_MAX] = {0,}; - xlator_t *this = NULL; + int ret = -1; + char mountdir[PATH_MAX] = { + 0, + }; + xlator_t *this = NULL; - this = THIS; - GF_ASSERT (this); + this = THIS; + GF_ASSERT(this); - GLUSTERD_GET_QUOTA_LIST_MOUNT_PATH (mountdir, volname, "/"); - ret = gf_umount_lazy (this->name, mountdir, 1); - if (ret) { - gf_log("cli", GF_LOG_ERROR, "umount on %s failed, " - "reason : %s", mountdir, strerror (errno)); - } + GLUSTERD_GET_QUOTA_LIST_MOUNT_PATH(mountdir, volname, "/"); + ret = gf_umount_lazy(this->name, mountdir, 1); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "umount on %s failed, " + "reason : %s", + mountdir, strerror(errno)); + } - return ret; + return ret; } int -gf_cli_print_limit_list_from_dict (cli_local_t *local, char *volname, - dict_t *dict, char *default_sl, int count, - int op_ret, int op_errno, char *op_errstr) -{ - int ret = -1; - int i = 0; - char key[1024] = {0,}; - char mountdir[PATH_MAX] = {0,}; - char *path = NULL; - int type = -1; - - if (!dict|| count <= 0) - goto out; - - ret = dict_get_int32 (dict, "type", &type); +gf_cli_print_limit_list_from_dict(cli_local_t *local, char *volname, + dict_t *dict, char *default_sl, int count, + int op_ret, int op_errno, char *op_errstr) +{ + int ret = -1; + int i = 0; + char key[1024] = { + 0, + }; + char mountdir[PATH_MAX] = { + 0, + }; + char *path = NULL; + int type = -1; + + if (!dict || count <= 0) + goto out; + + ret = dict_get_int32(dict, "type", &type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get quota type"); + goto out; + } + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_quota_limit_list_begin(local, op_ret, op_errno, + op_errstr); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get quota type"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Error outputting xml begin"); + goto out; } + } else { + print_quota_list_header(type); + } - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_quota_limit_list_begin - (local, op_ret, op_errno, op_errstr); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Error outputting xml begin"); - goto out; - } - } else { - print_quota_list_header (type); - } - - while (count--) { - snprintf (key, sizeof (key), "path%d", i++); - - ret = dict_get_str (dict, key, &path); - if (ret < 0) { - gf_log ("cli", GF_LOG_DEBUG, "Path not present in limit" - " list"); - continue; - } + while (count--) { + snprintf(key, sizeof(key), "path%d", i++); - ret = gf_canonicalize_path (path); - if (ret) - goto out; - GLUSTERD_GET_QUOTA_LIST_MOUNT_PATH (mountdir, volname, path); - ret = print_quota_list_from_mountdir (local, mountdir, - default_sl, path, type); + ret = dict_get_str(dict, key, &path); + if (ret < 0) { + gf_log("cli", GF_LOG_DEBUG, + "Path not present in limit" + " list"); + continue; } + ret = gf_canonicalize_path(path); + if (ret) + goto out; + GLUSTERD_GET_QUOTA_LIST_MOUNT_PATH(mountdir, volname, path); + ret = print_quota_list_from_mountdir(local, mountdir, default_sl, path, + type); + } + out: - return ret; + return ret; } int -print_quota_list_from_quotad (call_frame_t *frame, dict_t *rsp_dict) -{ - char *path = NULL; - char *default_sl = NULL; - int ret = -1; - cli_local_t *local = NULL; - dict_t *gd_rsp_dict = NULL; - quota_meta_t used_space = {0, }; - quota_limits_t limits = {0, }; - quota_limits_t *size_limits = NULL; - int32_t type = 0; - int32_t success_count = 0; - - GF_ASSERT (frame); - - local = frame->local; - gd_rsp_dict = local->dict; - - ret = dict_get_int32 (rsp_dict, "type", &type); +print_quota_list_from_quotad(call_frame_t *frame, dict_t *rsp_dict) +{ + char *path = NULL; + char *default_sl = NULL; + int ret = -1; + cli_local_t *local = NULL; + dict_t *gd_rsp_dict = NULL; + quota_meta_t used_space = { + 0, + }; + quota_limits_t limits = { + 0, + }; + quota_limits_t *size_limits = NULL; + int32_t type = 0; + int32_t success_count = 0; + + GF_ASSERT(frame); + + local = frame->local; + gd_rsp_dict = local->dict; + + ret = dict_get_int32(rsp_dict, "type", &type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get type"); + goto out; + } + + ret = dict_get_str(rsp_dict, GET_ANCESTRY_PATH_KEY, &path); + if (ret) { + gf_log("cli", GF_LOG_WARNING, + "path key is not present " + "in dict"); + goto out; + } + + ret = dict_get_str(gd_rsp_dict, "default-soft-limit", &default_sl); + if (ret) { + gf_log(frame->this->name, GF_LOG_ERROR, + "failed to " + "get default soft limit"); + goto out; + } + + if (type == GF_QUOTA_OPTION_TYPE_LIST) { + ret = dict_get_bin(rsp_dict, QUOTA_LIMIT_KEY, (void **)&size_limits); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get type"); - goto out; - } - - ret = dict_get_str (rsp_dict, GET_ANCESTRY_PATH_KEY, &path); - if (ret) { - gf_log ("cli", GF_LOG_WARNING, "path key is not present " - "in dict"); - goto out; + gf_log("cli", GF_LOG_WARNING, "limit key not present in dict on %s", + path); + goto out; } - - ret = dict_get_str (gd_rsp_dict, "default-soft-limit", &default_sl); + } else { + ret = dict_get_bin(rsp_dict, QUOTA_LIMIT_OBJECTS_KEY, + (void **)&size_limits); if (ret) { - gf_log (frame->this->name, GF_LOG_ERROR, "failed to " - "get default soft limit"); - goto out; - } - - if (type == GF_QUOTA_OPTION_TYPE_LIST) { - ret = dict_get_bin (rsp_dict, QUOTA_LIMIT_KEY, - (void **)&size_limits); - if (ret) { - gf_log ("cli", GF_LOG_WARNING, - "limit key not present in dict on %s", - path); - goto out; - } + gf_log("cli", GF_LOG_WARNING, + "object limit key not present in dict on %s", path); + goto out; + } + } + + limits.hl = ntoh64(size_limits->hl); + limits.sl = ntoh64(size_limits->sl); + + if (type == GF_QUOTA_OPTION_TYPE_LIST) + ret = quota_dict_get_meta(rsp_dict, QUOTA_SIZE_KEY, &used_space); + else + ret = quota_dict_get_inode_meta(rsp_dict, QUOTA_SIZE_KEY, &used_space); + + if (ret < 0) { + gf_log("cli", GF_LOG_WARNING, "size key not present in dict"); + print_quota_list_empty(path, type); + goto out; + } + + LOCK(&local->lock); + { + ret = dict_get_int32(gd_rsp_dict, "quota-list-success-count", + &success_count); + if (ret) + success_count = 0; + + ret = dict_set_int32(gd_rsp_dict, "quota-list-success-count", + success_count + 1); + } + UNLOCK(&local->lock); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to set " + "quota-list-success-count in dict"); + goto out; + } + + if (success_count == 0) { + if (!(global_state->mode & GLUSTER_MODE_XML)) { + print_quota_list_header(type); } else { - ret = dict_get_bin (rsp_dict, QUOTA_LIMIT_OBJECTS_KEY, - (void **)&size_limits); - if (ret) { - gf_log ("cli", GF_LOG_WARNING, - "object limit key not present in dict on %s", - path); - goto out; - } - } - - limits.hl = ntoh64 (size_limits->hl); - limits.sl = ntoh64 (size_limits->sl); - - if (type == GF_QUOTA_OPTION_TYPE_LIST) - ret = quota_dict_get_meta (rsp_dict, QUOTA_SIZE_KEY, - &used_space); - else - ret = quota_dict_get_inode_meta (rsp_dict, QUOTA_SIZE_KEY, - &used_space); - - if (ret < 0) { - gf_log ("cli", GF_LOG_WARNING, - "size key not present in dict"); - print_quota_list_empty (path, type); - goto out; - } - - LOCK (&local->lock); - { - ret = dict_get_int32 (gd_rsp_dict, "quota-list-success-count", - &success_count); - if (ret) - success_count = 0; - - ret = dict_set_int32 (gd_rsp_dict, - "quota-list-success-count", - success_count + 1); - } - UNLOCK (&local->lock); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set " - "quota-list-success-count in dict"); + ret = cli_xml_output_vol_quota_limit_list_begin(local, 0, 0, NULL); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Error in " + "printing xml output"); goto out; + } } + } - if (success_count == 0) { - if (!(global_state->mode & GLUSTER_MODE_XML)) { - print_quota_list_header (type); - } else { - ret = cli_xml_output_vol_quota_limit_list_begin - (local, 0, 0, NULL); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Error in " - "printing xml output"); - goto out; - } - } - } - - ret = print_quota_list_output (local, path, default_sl, &limits, - &used_space, type, _gf_true); + ret = print_quota_list_output(local, path, default_sl, &limits, &used_space, + type, _gf_true); out: - return ret; + return ret; } -void* -cli_cmd_broadcast_response_detached (void *opaque) +void * +cli_cmd_broadcast_response_detached(void *opaque) { - int32_t ret = 0; + int32_t ret = 0; - ret = (intptr_t) opaque; - cli_cmd_broadcast_response (ret); + ret = (intptr_t)opaque; + cli_cmd_broadcast_response(ret); - return NULL; + return NULL; } int32_t -cli_quota_compare_path (struct list_head *list1, - struct list_head *list2) +cli_quota_compare_path(struct list_head *list1, struct list_head *list2) { - struct list_node *node1 = NULL; - struct list_node *node2 = NULL; - dict_t *dict1 = NULL; - dict_t *dict2 = NULL; - char *path1 = NULL; - char *path2 = NULL; - int ret = 0; + struct list_node *node1 = NULL; + struct list_node *node2 = NULL; + dict_t *dict1 = NULL; + dict_t *dict2 = NULL; + char *path1 = NULL; + char *path2 = NULL; + int ret = 0; - node1 = list_entry (list1, struct list_node, list); - node2 = list_entry (list2, struct list_node, list); + node1 = list_entry(list1, struct list_node, list); + node2 = list_entry(list2, struct list_node, list); - dict1 = node1->ptr; - dict2 = node2->ptr; + dict1 = node1->ptr; + dict2 = node2->ptr; - ret = dict_get_str (dict1, GET_ANCESTRY_PATH_KEY, &path1); - if (ret < 0) - return 0; + ret = dict_get_str(dict1, GET_ANCESTRY_PATH_KEY, &path1); + if (ret < 0) + return 0; - ret = dict_get_str (dict2, GET_ANCESTRY_PATH_KEY, &path2); - if (ret < 0) - return 0; + ret = dict_get_str(dict2, GET_ANCESTRY_PATH_KEY, &path2); + if (ret < 0) + return 0; - return strcmp (path1, path2); + return strcmp(path1, path2); } int -cli_quotad_getlimit_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +cli_quotad_getlimit_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { /*TODO: we need to gather the path, hard-limit, soft-limit and used space*/ - gf_cli_rsp rsp = {0,}; - int ret = -1; - dict_t *dict = NULL; - struct list_node *node = NULL; - struct list_node *tmpnode = NULL; - call_frame_t *frame = NULL; - cli_local_t *local = NULL; - int32_t list_count = 0; - pthread_t th_id = {0, }; - int32_t max_count = 0; - - GF_ASSERT (myframe); - - frame = myframe; - - GF_ASSERT (frame->local); - - local = frame->local; - - LOCK (&local->lock); - { - ret = dict_get_int32 (local->dict, "quota-list-count", - &list_count); - if (ret) - list_count = 0; - - list_count++; - ret = dict_set_int32 (local->dict, "quota-list-count", - list_count); - } - UNLOCK (&local->lock); - - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set " - "quota-list-count in dict"); - goto out; - } - - if (-1 == req->rpc_status) { - if (list_count == 0) - cli_err ("Connection failed. Please check if quota " - "daemon is operational."); - ret = -1; - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - if (rsp.op_ret) { - ret = -1; - if (strcmp (rsp.op_errstr, "")) - cli_err ("quota command failed : %s", rsp.op_errstr); - else - cli_err ("quota command : failed"); - goto out; - } - - if (rsp.dict.dict_len) { - /* Unserialize the dictionary */ - dict = dict_new (); - - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); - if (ret < 0) { - gf_log ("cli", GF_LOG_ERROR, - "failed to " - "unserialize req-buffer to dictionary"); - goto out; - } - - node = list_node_add_order (dict, &local->dict_list, - cli_quota_compare_path); - if (node == NULL) { - gf_log ("cli", GF_LOG_ERROR, - "failed to add node to the list"); - dict_unref (dict); - goto out; - } + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; + struct list_node *node = NULL; + struct list_node *tmpnode = NULL; + call_frame_t *frame = NULL; + cli_local_t *local = NULL; + int32_t list_count = 0; + pthread_t th_id = { + 0, + }; + int32_t max_count = 0; + + GF_ASSERT(myframe); + + frame = myframe; + + GF_ASSERT(frame->local); + + local = frame->local; + + LOCK(&local->lock); + { + ret = dict_get_int32(local->dict, "quota-list-count", &list_count); + if (ret) + list_count = 0; + + list_count++; + ret = dict_set_int32(local->dict, "quota-list-count", list_count); + } + UNLOCK(&local->lock); + + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to set " + "quota-list-count in dict"); + goto out; + } + + if (-1 == req->rpc_status) { + if (list_count == 0) + cli_err( + "Connection failed. Please check if quota " + "daemon is operational."); + ret = -1; + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + if (rsp.op_ret) { + ret = -1; + if (strcmp(rsp.op_errstr, "")) + cli_err("quota command failed : %s", rsp.op_errstr); + else + cli_err("quota command : failed"); + goto out; + } - } + if (rsp.dict.dict_len) { + /* Unserialize the dictionary */ + dict = dict_new(); - ret = dict_get_int32 (local->dict, "max_count", - &max_count); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); if (ret < 0) { - gf_log ("cli", GF_LOG_ERROR, - "failed to get max_count"); - goto out; + gf_log("cli", GF_LOG_ERROR, + "failed to " + "unserialize req-buffer to dictionary"); + goto out; } - if (list_count == max_count) { - list_for_each_entry_safe (node, tmpnode, - &local->dict_list, list) { - dict = node->ptr; - print_quota_list_from_quotad (frame, dict); - list_node_del (node); - dict_unref (dict); - } + node = list_node_add_order(dict, &local->dict_list, + cli_quota_compare_path); + if (node == NULL) { + gf_log("cli", GF_LOG_ERROR, "failed to add node to the list"); + dict_unref(dict); + goto out; } + } + ret = dict_get_int32(local->dict, "max_count", &max_count); + if (ret < 0) { + gf_log("cli", GF_LOG_ERROR, "failed to get max_count"); + goto out; + } + if (list_count == max_count) { + list_for_each_entry_safe(node, tmpnode, &local->dict_list, list) + { + dict = node->ptr; + print_quota_list_from_quotad(frame, dict); + list_node_del(node); + dict_unref(dict); + } + } + +out: + /* Bad Fix: CLI holds the lock to process a command. + * When processing quota list command, below sequence of steps executed + * in the same thread and causing deadlock + * + * 1) CLI holds the lock + * 2) Send rpc_clnt_submit request to quotad for quota usage + * 3) If quotad is down, rpc_clnt_submit invokes cbk function with error + * 4) cbk function cli_quotad_getlimit_cbk invokes + * cli_cmd_broadcast_response which tries to hold lock to broadcast + * the results and hangs, because same thread has already holding + * the lock + * + * Broadcasting response in a separate thread which is not a + * good fix. This needs to be re-visted with better solution + */ + if (ret == -1) { + ret = pthread_create(&th_id, NULL, cli_cmd_broadcast_response_detached, + (void *)-1); + if (ret) + gf_log("cli", GF_LOG_ERROR, + "pthread_create failed: " + "%s", + strerror(errno)); + } else { + cli_cmd_broadcast_response(ret); + } -out: - /* Bad Fix: CLI holds the lock to process a command. - * When processing quota list command, below sequence of steps executed - * in the same thread and causing deadlock - * - * 1) CLI holds the lock - * 2) Send rpc_clnt_submit request to quotad for quota usage - * 3) If quotad is down, rpc_clnt_submit invokes cbk function with error - * 4) cbk function cli_quotad_getlimit_cbk invokes - * cli_cmd_broadcast_response which tries to hold lock to broadcast - * the results and hangs, because same thread has already holding - * the lock - * - * Broadcasting response in a separate thread which is not a - * good fix. This needs to be re-visted with better solution - */ - if (ret == -1) { - ret = pthread_create (&th_id, NULL, - cli_cmd_broadcast_response_detached, - (void *)-1); - if (ret) - gf_log ("cli", GF_LOG_ERROR, "pthread_create failed: " - "%s", strerror (errno)); - } else { - cli_cmd_broadcast_response (ret); - } - - free (rsp.dict.dict_val); - return ret; + free(rsp.dict.dict_val); + return ret; } int -cli_quotad_getlimit (call_frame_t *frame, xlator_t *this, void *data) +cli_quotad_getlimit(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; - ret = add_cli_cmd_timeout_to_dict (dict); + dict = data; + ret = add_cli_cmd_timeout_to_dict(dict); - 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"); + 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; - } + goto out; + } - ret = cli_cmd_submit (global_quotad_rpc, &req, frame, &cli_quotad_clnt, - GF_AGGREGATOR_GETLIMIT, NULL, - this, cli_quotad_getlimit_cbk, - (xdrproc_t) xdr_gf_cli_req); + ret = cli_cmd_submit(global_quotad_rpc, &req, frame, &cli_quotad_clnt, + GF_AGGREGATOR_GETLIMIT, NULL, this, + cli_quotad_getlimit_cbk, (xdrproc_t)xdr_gf_cli_req); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } void -gf_cli_quota_list (cli_local_t *local, char *volname, dict_t *dict, - char *default_sl, int count, int op_ret, - int op_errno, char *op_errstr) +gf_cli_quota_list(cli_local_t *local, char *volname, dict_t *dict, + char *default_sl, int count, int op_ret, int op_errno, + char *op_errstr) { - GF_VALIDATE_OR_GOTO ("cli", volname, out); + GF_VALIDATE_OR_GOTO("cli", volname, out); - if (!connected) - goto out; + if (!connected) + goto out; - if (count > 0) - gf_cli_print_limit_list_from_dict (local, volname, dict, - default_sl, count, op_ret, - op_errno, op_errstr); + if (count > 0) + gf_cli_print_limit_list_from_dict(local, volname, dict, default_sl, + count, op_ret, op_errno, op_errstr); out: - return; + return; } int -gf_cli_quota_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - dict_t *dict = NULL; - char *volname = NULL; - int32_t type = 0; - call_frame_t *frame = NULL; - char *default_sl = NULL; - cli_local_t *local = NULL; - char *default_sl_dup = NULL; - int32_t entry_count = 0; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; +gf_cli_quota_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; + char *volname = NULL; + int32_t type = 0; + call_frame_t *frame = NULL; + char *default_sl = NULL; + cli_local_t *local = NULL; + char *default_sl_dup = NULL; + int32_t entry_count = 0; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + frame = myframe; + + GF_ASSERT(frame->local); + + local = frame->local; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + if (rsp.op_ret) { + ret = -1; + if (global_state->mode & GLUSTER_MODE_XML) + goto xml_output; + + if (strcmp(rsp.op_errstr, "")) { + cli_err("quota command failed : %s", rsp.op_errstr); + if (rsp.op_ret == -ENOENT) + cli_err( + "please enter the path relative to " + "the volume"); + } else { + cli_err("quota command : failed"); } - frame = myframe; - - GF_ASSERT (frame->local); + goto out; + } - local = frame->local; + if (rsp.dict.dict_len) { + /* Unserialize the dictionary */ + dict = dict_new(); - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - if (rsp.op_ret) { - ret = -1; - if (global_state->mode & GLUSTER_MODE_XML) - goto xml_output; - - if (strcmp (rsp.op_errstr, "")) { - cli_err ("quota command failed : %s", rsp.op_errstr); - if (rsp.op_ret == -ENOENT) - cli_err ("please enter the path relative to " - "the volume"); - } else { - cli_err ("quota command : failed"); - } - - goto out; - } - - if (rsp.dict.dict_len) { - /* Unserialize the dictionary */ - dict = dict_new (); - - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); - if (ret < 0) { - gf_log ("cli", GF_LOG_ERROR, - "failed to " - "unserialize req-buffer to dictionary"); - goto out; - } + gf_log("cli", GF_LOG_ERROR, + "failed to " + "unserialize req-buffer to dictionary"); + goto out; + } + } + + gf_log("cli", GF_LOG_DEBUG, "Received resp to quota command"); + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + gf_log(frame->this->name, GF_LOG_ERROR, "failed to get volname"); + + ret = dict_get_str(dict, "default-soft-limit", &default_sl); + if (ret) + gf_log(frame->this->name, GF_LOG_TRACE, + "failed to get " + "default soft limit"); + + // default-soft-limit is part of rsp_dict only iff we sent + // GLUSTER_CLI_QUOTA with type being GF_QUOTA_OPTION_TYPE_LIST + if (default_sl) { + default_sl_dup = gf_strdup(default_sl); + if (!default_sl_dup) { + ret = -1; + goto out; + } + ret = dict_set_dynstr(local->dict, "default-soft-limit", + default_sl_dup); + if (ret) { + gf_log(frame->this->name, GF_LOG_TRACE, + "failed to set default soft limit"); + GF_FREE(default_sl_dup); } + } - gf_log ("cli", GF_LOG_DEBUG, "Received resp to quota command"); + ret = dict_get_int32(dict, "type", &type); + if (ret) + gf_log(frame->this->name, GF_LOG_TRACE, "failed to get type"); - ret = dict_get_str (dict, "volname", &volname); - if (ret) - gf_log (frame->this->name, GF_LOG_ERROR, - "failed to get volname"); + ret = dict_get_int32(dict, "count", &entry_count); + if (ret) + gf_log(frame->this->name, GF_LOG_TRACE, "failed to get count"); - ret = dict_get_str (dict, "default-soft-limit", &default_sl); - if (ret) - gf_log (frame->this->name, GF_LOG_TRACE, "failed to get " - "default soft limit"); - - // default-soft-limit is part of rsp_dict only iff we sent - // GLUSTER_CLI_QUOTA with type being GF_QUOTA_OPTION_TYPE_LIST - if (default_sl) { - default_sl_dup = gf_strdup (default_sl); - if (!default_sl_dup) { - ret = -1; - goto out; - } - ret = dict_set_dynstr (local->dict, "default-soft-limit", - default_sl_dup); - if (ret) { - gf_log (frame->this->name, GF_LOG_TRACE, - "failed to set default soft limit"); - GF_FREE (default_sl_dup); - } - } - - ret = dict_get_int32 (dict, "type", &type); - if (ret) - gf_log (frame->this->name, GF_LOG_TRACE, - "failed to get type"); - - ret = dict_get_int32 (dict, "count", &entry_count); - if (ret) - gf_log (frame->this->name, GF_LOG_TRACE, "failed to get count"); + if ((type == GF_QUOTA_OPTION_TYPE_LIST) || + (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS)) { + gf_cli_quota_list(local, volname, dict, default_sl, entry_count, + rsp.op_ret, rsp.op_errno, rsp.op_errstr); - if ((type == GF_QUOTA_OPTION_TYPE_LIST) - || (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS)) { - gf_cli_quota_list (local, volname, dict, default_sl, - entry_count, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_quota_limit_list_end (local); - if (ret < 0) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Error in printing" - " xml output"); - } - goto out; - } + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_quota_limit_list_end(local); + if (ret < 0) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, + "Error in printing" + " xml output"); + } + goto out; } + } xml_output: - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str ("volQuota", NULL, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str("volQuota", NULL, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (!rsp.op_ret && type != GF_QUOTA_OPTION_TYPE_LIST - && type != GF_QUOTA_OPTION_TYPE_LIST_OBJECTS) - cli_out ("volume quota : success"); + if (!rsp.op_ret && type != GF_QUOTA_OPTION_TYPE_LIST && + type != GF_QUOTA_OPTION_TYPE_LIST_OBJECTS) + cli_out("volume quota : success"); - ret = rsp.op_ret; + ret = rsp.op_ret; out: - if ((type == GF_QUOTA_OPTION_TYPE_LIST) - || (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS)) { - gluster_remove_auxiliary_mount (volname); - } + if ((type == GF_QUOTA_OPTION_TYPE_LIST) || + (type == GF_QUOTA_OPTION_TYPE_LIST_OBJECTS)) { + gluster_remove_auxiliary_mount(volname); + } - cli_cmd_broadcast_response (ret); - if (dict) - dict_unref (dict); + cli_cmd_broadcast_response(ret); + if (dict) + dict_unref(dict); - free (rsp.dict.dict_val); + free(rsp.dict.dict_val); - return ret; + return ret; } int -gf_cli_getspec_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_getspec_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - gf_getspec_rsp rsp = {0,}; - int ret = -1; - char *spec = NULL; + gf_getspec_rsp rsp = { + 0, + }; + int ret = -1; + char *spec = NULL; - GF_ASSERT (myframe); + GF_ASSERT(myframe); - if (-1 == req->rpc_status) { - goto out; - } + if (-1 == req->rpc_status) { + goto out; + } - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_getspec_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_getspec_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - if (rsp.op_ret == -1) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "getspec failed"); - goto out; - } + if (rsp.op_ret == -1) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "getspec failed"); + goto out; + } - gf_log ("cli", GF_LOG_INFO, "Received resp to getspec"); + gf_log("cli", GF_LOG_INFO, "Received resp to getspec"); - spec = GF_MALLOC (rsp.op_ret + 1, cli_mt_char); - if (!spec) { - gf_log("", GF_LOG_ERROR, "out of memory"); - goto out; - } - memcpy (spec, rsp.spec, rsp.op_ret); - spec[rsp.op_ret] = '\0'; - cli_out ("%s", spec); - GF_FREE (spec); + spec = GF_MALLOC(rsp.op_ret + 1, cli_mt_char); + if (!spec) { + gf_log("", GF_LOG_ERROR, "out of memory"); + goto out; + } + memcpy(spec, rsp.spec, rsp.op_ret); + spec[rsp.op_ret] = '\0'; + cli_out("%s", spec); + GF_FREE(spec); - ret = 0; + ret = 0; out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } int -gf_cli_pmap_b2p_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_pmap_b2p_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - pmap_port_by_brick_rsp rsp = {0,}; - int ret = -1; - char *spec = NULL; + pmap_port_by_brick_rsp rsp = { + 0, + }; + int ret = -1; + char *spec = NULL; - GF_ASSERT (myframe); + GF_ASSERT(myframe); - if (-1 == req->rpc_status) { - goto out; - } + if (-1 == req->rpc_status) { + goto out; + } - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_pmap_port_by_brick_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_pmap_port_by_brick_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - if (rsp.op_ret == -1) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "pump_b2p failed"); - goto out; - } + if (rsp.op_ret == -1) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "pump_b2p failed"); + goto out; + } - gf_log ("cli", GF_LOG_INFO, "Received resp to pmap b2p"); + gf_log("cli", GF_LOG_INFO, "Received resp to pmap b2p"); - cli_out ("%d", rsp.port); - GF_FREE (spec); + cli_out("%d", rsp.port); + GF_FREE(spec); - ret = rsp.op_ret; + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } - int32_t -gf_cli_probe (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_probe(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,},}; - int ret = 0; - dict_t *dict = NULL; - int port = 0; - - if (!frame || !this || !data) { - ret = -1; - goto out; - } - - dict = data; - - ret = dict_get_int32 (dict, "port", &port); - if (ret) { - ret = dict_set_int32 (dict, "port", CLI_GLUSTERD_PORT); - if (ret) - goto out; - } + gf_cli_req req = { + { + 0, + }, + }; + int ret = 0; + dict_t *dict = NULL; + int port = 0; + + if (!frame || !this || !data) { + ret = -1; + goto out; + } + + dict = data; + + ret = dict_get_int32(dict, "port", &port); + if (ret) { + ret = dict_set_int32(dict, "port", CLI_GLUSTERD_PORT); + if (ret) + goto out; + } - ret = cli_to_glusterd (&req, frame, gf_cli_probe_cbk, - (xdrproc_t) xdr_gf_cli_req, dict, - GLUSTER_CLI_PROBE, this, cli_rpc_prog, NULL); + ret = cli_to_glusterd(&req, frame, gf_cli_probe_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_PROBE, + this, cli_rpc_prog, NULL); out: - GF_FREE (req.dict.dict_val); - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + GF_FREE(req.dict.dict_val); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + return ret; } int32_t -gf_cli_deprobe (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_deprobe(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,},}; - int ret = 0; - dict_t *dict = NULL; - int port = 0; - int flags = 0; - - if (!frame || !this || !data) { - ret = -1; - goto out; - } - - dict = data; - ret = dict_get_int32 (dict, "port", &port); - if (ret) { - ret = dict_set_int32 (dict, "port", CLI_GLUSTERD_PORT); - if (ret) - goto out; - } + gf_cli_req req = { + { + 0, + }, + }; + int ret = 0; + dict_t *dict = NULL; + int port = 0; + int flags = 0; + + if (!frame || !this || !data) { + ret = -1; + goto out; + } + + dict = data; + ret = dict_get_int32(dict, "port", &port); + if (ret) { + ret = dict_set_int32(dict, "port", CLI_GLUSTERD_PORT); + if (ret) + goto out; + } - ret = dict_get_int32 (dict, "flags", &flags); - if (ret) { - ret = dict_set_int32 (dict, "flags", 0); - if (ret) - goto out; - } + ret = dict_get_int32(dict, "flags", &flags); + if (ret) { + ret = dict_set_int32(dict, "flags", 0); + if (ret) + goto out; + } - ret = cli_to_glusterd (&req, frame, gf_cli_deprobe_cbk, - (xdrproc_t)xdr_gf_cli_req, dict, - GLUSTER_CLI_DEPROBE, this, cli_rpc_prog, NULL); + ret = cli_to_glusterd(&req, frame, gf_cli_deprobe_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_DEPROBE, + this, cli_rpc_prog, NULL); out: - GF_FREE (req.dict.dict_val); - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + GF_FREE(req.dict.dict_val); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + return ret; } int32_t -gf_cli_list_friends (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_list_friends(call_frame_t *frame, xlator_t *this, void *data) { - gf1_cli_peer_list_req req = {0,}; - int ret = 0; - unsigned long flags = 0; + gf1_cli_peer_list_req req = { + 0, + }; + int ret = 0; + unsigned long flags = 0; - if (!frame || !this) { - ret = -1; - goto out; - } + if (!frame || !this) { + ret = -1; + goto out; + } - GF_ASSERT (frame->local == NULL); + GF_ASSERT(frame->local == NULL); - flags = (long)data; - req.flags = flags; - frame->local = (void*)flags; - ret = cli_cmd_submit (NULL, &req, frame, cli_rpc_prog, - GLUSTER_CLI_LIST_FRIENDS, NULL, - this, gf_cli_list_friends_cbk, - (xdrproc_t) xdr_gf1_cli_peer_list_req); + flags = (long)data; + req.flags = flags; + frame->local = (void *)flags; + ret = cli_cmd_submit( + NULL, &req, frame, cli_rpc_prog, GLUSTER_CLI_LIST_FRIENDS, NULL, this, + gf_cli_list_friends_cbk, (xdrproc_t)xdr_gf1_cli_peer_list_req); out: - if (ret && frame) { - /* - * If everything goes fine, gf_cli_list_friends_cbk() - * [invoked through cli_cmd_submit()]resets the - * frame->local to NULL. In case cli_cmd_submit() - * fails in between, RESET frame->local here. - */ - frame->local = NULL; - } - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + if (ret && frame) { + /* + * If everything goes fine, gf_cli_list_friends_cbk() + * [invoked through cli_cmd_submit()]resets the + * frame->local to NULL. In case cli_cmd_submit() + * fails in between, RESET frame->local here. + */ + frame->local = NULL; + } + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int32_t -gf_cli_get_state (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_get_state(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,},}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = { + { + 0, + }, + }; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - ret = cli_to_glusterd (&req, frame, gf_cli_get_state_cbk, - (xdrproc_t) xdr_gf_cli_req, dict, - GLUSTER_CLI_GET_STATE, this, cli_rpc_prog, - NULL); + ret = cli_to_glusterd(&req, frame, gf_cli_get_state_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, + GLUSTER_CLI_GET_STATE, 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; + return ret; } int32_t -gf_cli_get_next_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_get_next_volume(call_frame_t *frame, xlator_t *this, void *data) { + int ret = 0; + cli_cmd_volume_get_ctx_t *ctx = NULL; + cli_local_t *local = NULL; - int ret = 0; - cli_cmd_volume_get_ctx_t *ctx = NULL; - cli_local_t *local = NULL; + if (!frame || !this || !data) { + ret = -1; + goto out; + } - if (!frame || !this || !data) { - ret = -1; - goto out; - } + ctx = data; + local = frame->local; - ctx = data; - local = frame->local; - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_info_begin (local, 0, 0, ""); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Error outputting to xml"); - goto out; - } + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_info_begin(local, 0, 0, ""); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; } + } - ret = gf_cli_get_volume (frame, this, data); - + ret = gf_cli_get_volume(frame, this, data); - if (!local || !local->get_vol.volname) { - if ((global_state->mode & GLUSTER_MODE_XML)) - goto end_xml; + if (!local || !local->get_vol.volname) { + if ((global_state->mode & GLUSTER_MODE_XML)) + goto end_xml; - cli_err ("No volumes present"); - goto out; - } + cli_err("No volumes present"); + goto out; + } + ctx->volname = local->get_vol.volname; + while (ctx->volname) { + ret = gf_cli_get_volume(frame, this, ctx); + if (ret) + goto out; ctx->volname = local->get_vol.volname; - - while (ctx->volname) { - ret = gf_cli_get_volume (frame, this, ctx); - if (ret) - goto out; - ctx->volname = local->get_vol.volname; - } + } end_xml: - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_info_end (local); - if (ret) - gf_log ("cli", GF_LOG_ERROR, "Error outputting to xml"); - } + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_info_end(local); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + } out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int32_t -gf_cli_get_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_get_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - cli_cmd_volume_get_ctx_t *ctx = NULL; - dict_t *dict = NULL; - int32_t flags = 0; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + cli_cmd_volume_get_ctx_t *ctx = NULL; + dict_t *dict = NULL; + int32_t flags = 0; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - ctx = data; + ctx = data; - dict = dict_new (); - if (!dict) - goto out; + dict = dict_new(); + if (!dict) + goto out; - if (ctx->volname) { - ret = dict_set_str (dict, "volname", ctx->volname); - if (ret) - goto out; - } + if (ctx->volname) { + ret = dict_set_str(dict, "volname", ctx->volname); + if (ret) + goto out; + } - flags = ctx->flags; - ret = dict_set_int32 (dict, "flags", flags); - if (ret) { - gf_log (frame->this->name, GF_LOG_ERROR, "failed to set flags"); - goto out; - } + flags = ctx->flags; + ret = dict_set_int32(dict, "flags", flags); + if (ret) { + gf_log(frame->this->name, GF_LOG_ERROR, "failed to set flags"); + goto out; + } - ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, - &req.dict.dict_len); - if (ret) { - gf_log (frame->this->name, GF_LOG_ERROR, - "failed to serialize dict"); - goto out; - } + ret = dict_allocate_and_serialize(dict, &req.dict.dict_val, + &req.dict.dict_len); + if (ret) { + gf_log(frame->this->name, GF_LOG_ERROR, "failed to serialize dict"); + goto out; + } - ret = cli_cmd_submit (NULL, &req, frame, cli_rpc_prog, - GLUSTER_CLI_GET_VOLUME, NULL, - this, gf_cli_get_volume_cbk, - (xdrproc_t) xdr_gf_cli_req); + ret = cli_cmd_submit(NULL, &req, frame, cli_rpc_prog, + GLUSTER_CLI_GET_VOLUME, NULL, this, + gf_cli_get_volume_cbk, (xdrproc_t)xdr_gf_cli_req); out: - if (dict) - dict_unref (dict); + if (dict) + dict_unref(dict); - GF_FREE (req.dict.dict_val); + GF_FREE(req.dict.dict_val); - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int32_t -gf_cli3_1_uuid_get (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli3_1_uuid_get(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; - ret = cli_to_glusterd (&req, frame, gf_cli3_1_uuid_get_cbk, - (xdrproc_t)xdr_gf_cli_req, dict, - GLUSTER_CLI_UUID_GET, this, cli_rpc_prog, - NULL); + dict = data; + ret = cli_to_glusterd(&req, frame, gf_cli3_1_uuid_get_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_UUID_GET, + this, cli_rpc_prog, NULL); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int32_t -gf_cli3_1_uuid_reset (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli3_1_uuid_reset(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; - ret = cli_to_glusterd (&req, frame, gf_cli3_1_uuid_reset_cbk, - (xdrproc_t)xdr_gf_cli_req, dict, - GLUSTER_CLI_UUID_RESET, this, cli_rpc_prog, - NULL); + dict = data; + ret = cli_to_glusterd(&req, frame, gf_cli3_1_uuid_reset_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, + GLUSTER_CLI_UUID_RESET, this, cli_rpc_prog, NULL); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int32_t -gf_cli_create_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_create_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - 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); + 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); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); + GF_FREE(req.dict.dict_val); - return ret; + return ret; } int32_t -gf_cli_delete_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_delete_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - 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); + 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: - GF_FREE (req.dict.dict_val); - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + GF_FREE(req.dict.dict_val); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + return ret; } int32_t -gf_cli_start_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_start_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - 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); + 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); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + return ret; } int32_t -gf_cli_stop_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_stop_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = data; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = data; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - 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); + 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); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + return ret; } int32_t -gf_cli_defrag_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_defrag_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - ret = cli_to_glusterd (&req, frame, gf_cli_defrag_volume_cbk, - (xdrproc_t) xdr_gf_cli_req, dict, - GLUSTER_CLI_DEFRAG_VOLUME, this, cli_rpc_prog, - NULL); + ret = cli_to_glusterd(&req, frame, gf_cli_defrag_volume_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, + GLUSTER_CLI_DEFRAG_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; + return ret; } int32_t -gf_cli_rename_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_rename_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } - - dict = data; + if (!frame || !this || !data) { + ret = -1; + 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_ERROR, - "failed to serialize the data"); + dict = data; - 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_ERROR, "failed to serialize the data"); + goto out; + } - ret = cli_cmd_submit (NULL, &req, frame, cli_rpc_prog, - GLUSTER_CLI_RENAME_VOLUME, NULL, - this, gf_cli_rename_volume_cbk, - (xdrproc_t) xdr_gf_cli_req); + ret = cli_cmd_submit(NULL, &req, frame, cli_rpc_prog, + GLUSTER_CLI_RENAME_VOLUME, NULL, this, + gf_cli_rename_volume_cbk, (xdrproc_t)xdr_gf_cli_req); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + return ret; } int32_t -gf_cli_reset_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_reset_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,} }; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - 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); + 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); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int32_t -gf_cli_set_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_set_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,} }; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - 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); + 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); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + return ret; } int32_t -gf_cli_add_brick (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_add_brick(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,} }; - int ret = 0; - dict_t *dict = NULL; - char *volname = NULL; - int32_t count = 0; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; + char *volname = NULL; + int32_t count = 0; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - ret = dict_get_str (dict, "volname", &volname); + ret = dict_get_str(dict, "volname", &volname); - if (ret) - goto out; + if (ret) + goto out; - ret = dict_get_int32 (dict, "count", &count); - if (ret) - goto out; + ret = dict_get_int32(dict, "count", &count); + 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); + 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); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); + GF_FREE(req.dict.dict_val); - return ret; + return ret; } int32_t -gf_cli_tier (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_tier(call_frame_t *frame, xlator_t *this, void *data) { - int ret = 0; - int32_t command = 0; - gf_cli_req req = { {0,} }; - dict_t *dict = NULL; + int ret = 0; + int32_t command = 0; + gf_cli_req req = {{ + 0, + }}; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } - dict = data; + if (!frame || !this || !data) { + ret = -1; + goto out; + } + dict = data; - ret = dict_get_int32 (dict, "rebalance-command", &command); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get rebalance-command"); - goto out; - } + ret = dict_get_int32(dict, "rebalance-command", &command); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get rebalance-command"); + goto out; + } - ret = cli_to_glusterd (&req, frame, gf_cli_defrag_volume_cbk, - (xdrproc_t) xdr_gf_cli_req, dict, - GLUSTER_CLI_TIER, this, cli_rpc_prog, - NULL); + ret = cli_to_glusterd(&req, frame, gf_cli_defrag_volume_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_TIER, + this, cli_rpc_prog, NULL); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); + GF_FREE(req.dict.dict_val); - return ret; + return ret; } int32_t -gf_cli_add_tier_brick (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_add_tier_brick(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = { {0,} }; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - ret = cli_to_glusterd (&req, frame, gf_cli_add_tier_brick_cbk, - (xdrproc_t) xdr_gf_cli_req, dict, - GLUSTER_CLI_ADD_TIER_BRICK, this, - cli_rpc_prog, NULL); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to send request to " - "glusterd"); - goto out; - } + ret = cli_to_glusterd(&req, frame, gf_cli_add_tier_brick_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, + GLUSTER_CLI_ADD_TIER_BRICK, this, cli_rpc_prog, NULL); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to send request to " + "glusterd"); + goto out; + } out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); - return ret; + GF_FREE(req.dict.dict_val); + return ret; } - int32_t -gf_cli_attach_tier (call_frame_t *frame, xlator_t *this, - void *data) -{ - gf_cli_req req = {{0,} }; - int ret = 0; - dict_t *dict = NULL; - dict_t *newdict = NULL; - char *tierwords[] = {"volume", "tier", "", - "start", NULL}; - const char **words = (const char **)tierwords; - char *volname = NULL; - cli_local_t *local = NULL; - cli_local_t *oldlocal = NULL; - - if (!frame || !this || !data) { - ret = -1; - goto out; - } - - dict = data; - - ret = cli_to_glusterd (&req, frame, gf_cli_attach_tier_cbk, - (xdrproc_t) xdr_gf_cli_req, dict, - GLUSTER_CLI_ATTACH_TIER, this, - cli_rpc_prog, NULL); - if (ret) - goto out; - ret = dict_get_str (dict, "volname", &volname); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get volume name"); - goto notify_cli; - } - - words[2] = volname; - ret = cli_cmd_volume_old_tier_parse ((const char **)words, - 4, &newdict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to parse tier start " - "command"); - goto notify_cli; - } - - gf_log ("cli", GF_LOG_DEBUG, "Sending tier start"); - - oldlocal = frame->local; - CLI_LOCAL_INIT (local, words, frame, newdict); - ret = gf_cli_tier (frame, this, newdict); - frame->local = oldlocal; - cli_local_wipe (local); +gf_cli_attach_tier(call_frame_t *frame, xlator_t *this, void *data) +{ + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; + dict_t *newdict = NULL; + char *tierwords[] = {"volume", "tier", "", "start", NULL}; + const char **words = (const char **)tierwords; + char *volname = NULL; + cli_local_t *local = NULL; + cli_local_t *oldlocal = NULL; + + if (!frame || !this || !data) { + ret = -1; + goto out; + } + + dict = data; + + ret = cli_to_glusterd(&req, frame, gf_cli_attach_tier_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, + GLUSTER_CLI_ATTACH_TIER, this, cli_rpc_prog, NULL); + if (ret) + goto out; + ret = dict_get_str(dict, "volname", &volname); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get volume name"); + goto notify_cli; + } + + words[2] = volname; + ret = cli_cmd_volume_old_tier_parse((const char **)words, 4, &newdict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to parse tier start " + "command"); + goto notify_cli; + } + + gf_log("cli", GF_LOG_DEBUG, "Sending tier start"); + + oldlocal = frame->local; + CLI_LOCAL_INIT(local, words, frame, newdict); + ret = gf_cli_tier(frame, this, newdict); + frame->local = oldlocal; + cli_local_wipe(local); notify_cli: - if (ret) { - cli_out ("Failed to run tier start. Please execute tier start " - "command explicitly"); - cli_out ("Usage : gluster volume tier <volname> start"); - } + if (ret) { + cli_out( + "Failed to run tier start. Please execute tier start " + "command explicitly"); + cli_out("Usage : gluster volume tier <volname> start"); + } out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); - return ret; + GF_FREE(req.dict.dict_val); + return ret; } int32_t -gf_cli_remove_tier_brick (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_remove_tier_brick(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req status_req = { {0,} }; - int ret = 0; - dict_t *dict = NULL; - int32_t command = 0; - char *volname = NULL; + gf_cli_req status_req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; + int32_t command = 0; + char *volname = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; - ret = dict_get_int32 (dict, "command", &command); - if (ret) - goto out; + ret = dict_get_int32(dict, "command", &command); + if (ret) + goto out; - ret = dict_set_int32 (dict, "rebalance-command", (int32_t) command); - if (ret) { - gf_log (this->name, GF_LOG_ERROR, - "Failed to set dict"); - goto out; - } + ret = dict_set_int32(dict, "rebalance-command", (int32_t)command); + if (ret) { + gf_log(this->name, GF_LOG_ERROR, "Failed to set dict"); + goto out; + } - ret = cli_to_glusterd (&status_req, frame, - gf_cli_remove_tier_brick_cbk, - (xdrproc_t) xdr_gf_cli_req, dict, - GLUSTER_CLI_TIER, this, - cli_rpc_prog, NULL); + ret = cli_to_glusterd(&status_req, frame, gf_cli_remove_tier_brick_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_TIER, + this, cli_rpc_prog, NULL); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (status_req.dict.dict_val); + GF_FREE(status_req.dict.dict_val); - return ret; + return ret; } int32_t -gf_cli_remove_brick (call_frame_t *frame, xlator_t *this, - void *data) -{ - gf_cli_req req = {{0,}};; - gf_cli_req status_req = {{0,}};; - int ret = 0; - dict_t *dict = NULL; - int32_t command = 0; - char *volname = NULL; - int32_t cmd = 0; - - if (!frame || !this || !data) { - ret = -1; - goto out; - } - - dict = data; - - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; - - ret = dict_get_int32 (dict, "command", &command); - if (ret) - goto out; - - if ((command != GF_OP_CMD_STATUS) && - (command != GF_OP_CMD_STOP)) { - - - 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 be sent :-) */ - if (command == GF_OP_CMD_STATUS) - cmd |= GF_DEFRAG_CMD_STATUS; - else - cmd |= GF_DEFRAG_CMD_STOP; - - 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; - } +gf_cli_remove_brick(call_frame_t *frame, xlator_t *this, void *data) +{ + gf_cli_req req = {{ + 0, + }}; + ; + gf_cli_req status_req = {{ + 0, + }}; + ; + int ret = 0; + dict_t *dict = NULL; + int32_t command = 0; + char *volname = NULL; + int32_t cmd = 0; + + if (!frame || !this || !data) { + ret = -1; + goto out; + } + + dict = data; + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + + ret = dict_get_int32(dict, "command", &command); + if (ret) + goto out; + + if ((command != GF_OP_CMD_STATUS) && (command != GF_OP_CMD_STOP)) { + 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 be sent :-) */ + if (command == GF_OP_CMD_STATUS) + cmd |= GF_DEFRAG_CMD_STATUS; + else + cmd |= GF_DEFRAG_CMD_STOP; - ret = cli_to_glusterd (&status_req, frame, - gf_cli3_remove_brick_status_cbk, - (xdrproc_t) xdr_gf_cli_req, dict, - GLUSTER_CLI_DEFRAG_VOLUME, this, - cli_rpc_prog, NULL); + 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; + } - } + ret = cli_to_glusterd( + &status_req, frame, gf_cli3_remove_brick_status_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_DEFRAG_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); - GF_FREE (req.dict.dict_val); + GF_FREE(req.dict.dict_val); - GF_FREE (status_req.dict.dict_val); + GF_FREE(status_req.dict.dict_val); - return ret; + return ret; } int32_t -gf_cli_reset_brick (call_frame_t *frame, xlator_t *this, void *data) -{ - gf_cli_req req = { {0,} }; - int ret = 0; - dict_t *dict = NULL; - char *dst_brick = NULL; - char *src_brick = NULL; - char *volname = NULL; - char *op = NULL; - - if (!frame || !this || !data) { - ret = -1; - goto out; - } - - dict = data; - - ret = dict_get_str (dict, "operation", &op); - if (ret) { - gf_log (this->name, GF_LOG_DEBUG, - "dict_get on operation failed"); - goto out; - } - - ret = dict_get_str (dict, "volname", &volname); +gf_cli_reset_brick(call_frame_t *frame, xlator_t *this, void *data) +{ + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; + char *dst_brick = NULL; + char *src_brick = NULL; + char *volname = NULL; + char *op = NULL; + + if (!frame || !this || !data) { + ret = -1; + goto out; + } + + dict = data; + + ret = dict_get_str(dict, "operation", &op); + if (ret) { + gf_log(this->name, GF_LOG_DEBUG, "dict_get on operation failed"); + goto out; + } + + ret = dict_get_str(dict, "volname", &volname); + if (ret) { + gf_log(this->name, GF_LOG_DEBUG, "dict_get on volname failed"); + goto out; + } + + ret = dict_get_str(dict, "src-brick", &src_brick); + if (ret) { + gf_log(this->name, GF_LOG_DEBUG, "dict_get on src-brick failed"); + goto out; + } + + if (!strcmp(op, "GF_RESET_OP_COMMIT") || + !strcmp(op, "GF_RESET_OP_COMMIT_FORCE")) { + ret = dict_get_str(dict, "dst-brick", &dst_brick); if (ret) { - gf_log (this->name, GF_LOG_DEBUG, - "dict_get on volname failed"); - goto out; + gf_log(this->name, GF_LOG_DEBUG, "dict_get on dst-brick failed"); + goto out; } + } - ret = dict_get_str (dict, "src-brick", &src_brick); - if (ret) { - gf_log (this->name, GF_LOG_DEBUG, - "dict_get on src-brick failed"); - goto out; - } + gf_log(this->name, GF_LOG_DEBUG, "Received command reset-brick %s on %s.", + op, src_brick); - if (!strcmp (op, "GF_RESET_OP_COMMIT") || - !strcmp (op, "GF_RESET_OP_COMMIT_FORCE")) { - ret = dict_get_str (dict, "dst-brick", &dst_brick); - if (ret) { - gf_log (this->name, GF_LOG_DEBUG, - "dict_get on dst-brick failed"); - goto out; - } - } - - gf_log (this->name, GF_LOG_DEBUG, - "Received command reset-brick %s on %s.", op, src_brick); - - ret = cli_to_glusterd (&req, frame, gf_cli_reset_brick_cbk, - (xdrproc_t) xdr_gf_cli_req, dict, - GLUSTER_CLI_RESET_BRICK, this, cli_rpc_prog, - NULL); + ret = cli_to_glusterd(&req, frame, gf_cli_reset_brick_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, + GLUSTER_CLI_RESET_BRICK, this, cli_rpc_prog, NULL); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); + GF_FREE(req.dict.dict_val); - return ret; + return ret; } int32_t -gf_cli_replace_brick (call_frame_t *frame, xlator_t *this, - void *data) -{ - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; - char *src_brick = NULL; - char *dst_brick = NULL; - char *volname = NULL; - int32_t op = 0; - - if (!frame || !this || !data) { - ret = -1; - goto out; - } +gf_cli_replace_brick(call_frame_t *frame, xlator_t *this, void *data) +{ + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; + char *src_brick = NULL; + char *dst_brick = NULL; + char *volname = NULL; + int32_t op = 0; - dict = data; + if (!frame || !this || !data) { + ret = -1; + goto out; + } - ret = dict_get_int32 (dict, "operation", &op); - if (ret) { - gf_log (this->name, GF_LOG_DEBUG, - "dict_get on operation failed"); - goto out; - } - ret = dict_get_str (dict, "volname", &volname); - if (ret) { - gf_log (this->name, GF_LOG_DEBUG, - "dict_get on volname failed"); - goto out; - } + dict = data; - ret = dict_get_str (dict, "src-brick", &src_brick); - if (ret) { - gf_log (this->name, GF_LOG_DEBUG, - "dict_get on src-brick failed"); - goto out; - } + ret = dict_get_int32(dict, "operation", &op); + if (ret) { + gf_log(this->name, GF_LOG_DEBUG, "dict_get on operation failed"); + goto out; + } + ret = dict_get_str(dict, "volname", &volname); + if (ret) { + gf_log(this->name, GF_LOG_DEBUG, "dict_get on volname failed"); + goto out; + } - ret = dict_get_str (dict, "dst-brick", &dst_brick); - if (ret) { - gf_log (this->name, GF_LOG_DEBUG, - "dict_get on dst-brick failed"); - goto out; - } + ret = dict_get_str(dict, "src-brick", &src_brick); + if (ret) { + gf_log(this->name, GF_LOG_DEBUG, "dict_get on src-brick failed"); + goto out; + } + + ret = dict_get_str(dict, "dst-brick", &dst_brick); + if (ret) { + gf_log(this->name, GF_LOG_DEBUG, "dict_get on dst-brick failed"); + goto out; + } - gf_log (this->name, GF_LOG_DEBUG, - "Received command replace-brick %s with " - "%s with operation=%d", src_brick, - dst_brick, op); + gf_log(this->name, GF_LOG_DEBUG, + "Received command replace-brick %s with " + "%s with operation=%d", + src_brick, dst_brick, op); - 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); + 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); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); + GF_FREE(req.dict.dict_val); - return ret; + return ret; } - int32_t -gf_cli_log_rotate (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_log_rotate(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - 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); + 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: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); - return ret; + GF_FREE(req.dict.dict_val); + return ret; } int32_t -gf_cli_sync_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_sync_volume(call_frame_t *frame, xlator_t *this, void *data) { - int ret = 0; - gf_cli_req req = {{0,}}; - dict_t *dict = NULL; + int ret = 0; + gf_cli_req req = {{ + 0, + }}; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - 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); + 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); - GF_FREE (req.dict.dict_val); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + GF_FREE(req.dict.dict_val); - return ret; + return ret; } int32_t -gf_cli_getspec (call_frame_t *frame, xlator_t *this, - void *data) -{ - gf_getspec_req req = {0,}; - int ret = 0; - dict_t *dict = NULL; - dict_t *op_dict = NULL; - - if (!frame || !this || !data) { - ret = -1; - goto out; - } - - dict = data; - - ret = dict_get_str (dict, "volid", &req.key); - if (ret) - goto out; - - op_dict = dict_new (); - if (!op_dict) { - ret = -1; - goto out; - } - - // Set the supported min and max op-versions, so glusterd can make a - // decision - ret = dict_set_int32 (op_dict, "min-op-version", GD_OP_VERSION_MIN); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "Failed to set min-op-version" - " in request dict"); - goto out; - } - - ret = dict_set_int32 (op_dict, "max-op-version", GD_OP_VERSION_MAX); - if (ret) { - gf_log (THIS->name, GF_LOG_ERROR, "Failed to set max-op-version" - " in request dict"); - goto out; - } - - ret = dict_allocate_and_serialize (op_dict, &req.xdata.xdata_val, - &req.xdata.xdata_len); - if (ret < 0) { - gf_log (THIS->name, GF_LOG_ERROR, - "Failed to serialize dictionary"); - goto out; - } - - ret = cli_cmd_submit (NULL, &req, frame, &cli_handshake_prog, - GF_HNDSK_GETSPEC, NULL, - this, gf_cli_getspec_cbk, - (xdrproc_t) xdr_gf_getspec_req); - -out: - if (op_dict) { - dict_unref(op_dict); - } - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - - return ret; +gf_cli_getspec(call_frame_t *frame, xlator_t *this, void *data) +{ + gf_getspec_req req = { + 0, + }; + int ret = 0; + dict_t *dict = NULL; + dict_t *op_dict = NULL; + + if (!frame || !this || !data) { + ret = -1; + goto out; + } + + dict = data; + + ret = dict_get_str(dict, "volid", &req.key); + if (ret) + goto out; + + op_dict = dict_new(); + if (!op_dict) { + ret = -1; + goto out; + } + + // Set the supported min and max op-versions, so glusterd can make a + // decision + ret = dict_set_int32(op_dict, "min-op-version", GD_OP_VERSION_MIN); + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, + "Failed to set min-op-version" + " in request dict"); + goto out; + } + + ret = dict_set_int32(op_dict, "max-op-version", GD_OP_VERSION_MAX); + if (ret) { + gf_log(THIS->name, GF_LOG_ERROR, + "Failed to set max-op-version" + " in request dict"); + goto out; + } + + ret = dict_allocate_and_serialize(op_dict, &req.xdata.xdata_val, + &req.xdata.xdata_len); + if (ret < 0) { + gf_log(THIS->name, GF_LOG_ERROR, "Failed to serialize dictionary"); + goto out; + } + + ret = cli_cmd_submit(NULL, &req, frame, &cli_handshake_prog, + GF_HNDSK_GETSPEC, NULL, this, gf_cli_getspec_cbk, + (xdrproc_t)xdr_gf_getspec_req); + +out: + if (op_dict) { + dict_unref(op_dict); + } + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + + return ret; } int32_t -gf_cli_quota (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_quota(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - 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); + 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); out: - GF_FREE (req.dict.dict_val); + GF_FREE(req.dict.dict_val); - return ret; + return ret; } int32_t -gf_cli_pmap_b2p (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_pmap_b2p(call_frame_t *frame, xlator_t *this, void *data) { - pmap_port_by_brick_req req = {0,}; - int ret = 0; - dict_t *dict = NULL; + pmap_port_by_brick_req req = { + 0, + }; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - ret = dict_get_str (dict, "brick", &req.brick); - if (ret) - goto out; + ret = dict_get_str(dict, "brick", &req.brick); + if (ret) + goto out; - ret = cli_cmd_submit (NULL, &req, frame, &cli_pmap_prog, - GF_PMAP_PORTBYBRICK, NULL, - this, gf_cli_pmap_b2p_cbk, - (xdrproc_t) xdr_pmap_port_by_brick_req); + ret = cli_cmd_submit(NULL, &req, frame, &cli_pmap_prog, GF_PMAP_PORTBYBRICK, + NULL, this, gf_cli_pmap_b2p_cbk, + (xdrproc_t)xdr_pmap_port_by_brick_req); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + return ret; } static int -gf_cli_fsm_log_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf1_cli_fsm_log_rsp rsp = {0,}; - int ret = -1; - dict_t *dict = NULL; - int tr_count = 0; - char key[256] = {0}; - int i = 0; - char *old_state = NULL; - char *new_state = NULL; - char *event = NULL; - char *time = NULL; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf1_cli_fsm_log_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - if (rsp.op_ret) { - if (strcmp (rsp.op_errstr, "")) - cli_err ("%s", rsp.op_errstr); - cli_err ("fsm log unsuccessful"); - ret = rsp.op_ret; - goto out; - } - - dict = dict_new (); - if (!dict) { - ret = -1; - goto out; - } - - ret = dict_unserialize (rsp.fsm_log.fsm_log_val, - rsp.fsm_log.fsm_log_len, - &dict); - - if (ret) { - cli_err ("bad response"); - goto out; - } - - ret = dict_get_int32 (dict, "count", &tr_count); - if (tr_count) - cli_out("number of transitions: %d", tr_count); - else - cli_err("No transitions"); - for (i = 0; i < tr_count; i++) { - snprintf (key, sizeof (key), "log%d-old-state", i); - ret = dict_get_str (dict, key, &old_state); - if (ret) - goto out; +gf_cli_fsm_log_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf1_cli_fsm_log_rsp rsp = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; + int tr_count = 0; + char key[256] = {0}; + int i = 0; + char *old_state = NULL; + char *new_state = NULL; + char *event = NULL; + char *time = NULL; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf1_cli_fsm_log_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + if (rsp.op_ret) { + if (strcmp(rsp.op_errstr, "")) + cli_err("%s", rsp.op_errstr); + cli_err("fsm log unsuccessful"); + ret = rsp.op_ret; + goto out; + } + + dict = dict_new(); + if (!dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.fsm_log.fsm_log_val, rsp.fsm_log.fsm_log_len, + &dict); + + if (ret) { + cli_err("bad response"); + goto out; + } + + ret = dict_get_int32(dict, "count", &tr_count); + if (tr_count) + cli_out("number of transitions: %d", tr_count); + else + cli_err("No transitions"); + for (i = 0; i < tr_count; i++) { + snprintf(key, sizeof(key), "log%d-old-state", i); + ret = dict_get_str(dict, key, &old_state); + if (ret) + goto out; - snprintf (key, sizeof (key), "log%d-event", i); - ret = dict_get_str (dict, key, &event); - if (ret) - goto out; + snprintf(key, sizeof(key), "log%d-event", i); + ret = dict_get_str(dict, key, &event); + if (ret) + goto out; - snprintf (key, sizeof (key), "log%d-new-state", i); - ret = dict_get_str (dict, key, &new_state); - if (ret) - goto out; + snprintf(key, sizeof(key), "log%d-new-state", i); + ret = dict_get_str(dict, key, &new_state); + if (ret) + goto out; - snprintf (key, sizeof (key), "log%d-time", i); - ret = dict_get_str (dict, key, &time); - if (ret) - goto out; - cli_out ("Old State: [%s]\n" - "New State: [%s]\n" - "Event : [%s]\n" - "timestamp: [%s]\n", old_state, new_state, event, time); - } + snprintf(key, sizeof(key), "log%d-time", i); + ret = dict_get_str(dict, key, &time); + if (ret) + goto out; + cli_out( + "Old State: [%s]\n" + "New State: [%s]\n" + "Event : [%s]\n" + "timestamp: [%s]\n", + old_state, new_state, event, time); + } - ret = rsp.op_ret; + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } int32_t -gf_cli_fsm_log (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_fsm_log(call_frame_t *frame, xlator_t *this, void *data) { - int ret = -1; - gf1_cli_fsm_log_req req = {0,}; + int ret = -1; + gf1_cli_fsm_log_req req = { + 0, + }; - GF_ASSERT (frame); - GF_ASSERT (this); - GF_ASSERT (data); + GF_ASSERT(frame); + GF_ASSERT(this); + GF_ASSERT(data); - if (!frame || !this || !data) - goto out; - req.name = data; - ret = cli_cmd_submit (NULL, &req, frame, cli_rpc_prog, - GLUSTER_CLI_FSM_LOG, NULL, - this, gf_cli_fsm_log_cbk, - (xdrproc_t) xdr_gf1_cli_fsm_log_req); + if (!frame || !this || !data) + goto out; + req.name = data; + ret = cli_cmd_submit(NULL, &req, frame, cli_rpc_prog, GLUSTER_CLI_FSM_LOG, + NULL, this, gf_cli_fsm_log_cbk, + (xdrproc_t)xdr_gf1_cli_fsm_log_req); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + return ret; } int -gf_cli_gsync_config_command (dict_t *dict) -{ - runner_t runner = {0,}; - char *subop = NULL; - char *gwd = NULL; - char *slave = NULL; - char *confpath = NULL; - char *master = NULL; - char *op_name = NULL; - int ret = -1; - char conf_path[PATH_MAX] = ""; - - if (dict_get_str (dict, "subop", &subop) != 0) - return -1; - - if (strcmp (subop, "get") != 0 && strcmp (subop, "get-all") != 0) { - cli_out (GEOREP" config updated successfully"); - return 0; - } - - if (dict_get_str (dict, "glusterd_workdir", &gwd) != 0 || - dict_get_str (dict, "slave", &slave) != 0) - return -1; - - if (dict_get_str (dict, "master", &master) != 0) - master = NULL; - if (dict_get_str (dict, "op_name", &op_name) != 0) - op_name = NULL; - - ret = dict_get_str (dict, "conf_path", &confpath); - if (ret || !confpath) { - ret = snprintf (conf_path, sizeof(conf_path) - 1, - "%s/"GEOREP"/gsyncd_template.conf", gwd); - conf_path[ret] = '\0'; - confpath = conf_path; - } - - runinit (&runner); - runner_add_args (&runner, GSYNCD_PREFIX"/gsyncd", "-c", NULL); - runner_argprintf (&runner, "%s", confpath); - runner_argprintf (&runner, "--iprefix=%s", DATADIR); - if (master) - runner_argprintf (&runner, ":%s", master); - runner_add_arg (&runner, slave); - runner_argprintf (&runner, "--config-%s", subop); - if (op_name) - runner_add_arg (&runner, op_name); - - return runner_run (&runner); +gf_cli_gsync_config_command(dict_t *dict) +{ + runner_t runner = { + 0, + }; + char *subop = NULL; + char *gwd = NULL; + char *slave = NULL; + char *confpath = NULL; + char *master = NULL; + char *op_name = NULL; + int ret = -1; + char conf_path[PATH_MAX] = ""; + + if (dict_get_str(dict, "subop", &subop) != 0) + return -1; + + if (strcmp(subop, "get") != 0 && strcmp(subop, "get-all") != 0) { + cli_out(GEOREP " config updated successfully"); + return 0; + } + + if (dict_get_str(dict, "glusterd_workdir", &gwd) != 0 || + dict_get_str(dict, "slave", &slave) != 0) + return -1; + + if (dict_get_str(dict, "master", &master) != 0) + master = NULL; + if (dict_get_str(dict, "op_name", &op_name) != 0) + op_name = NULL; + + ret = dict_get_str(dict, "conf_path", &confpath); + if (ret || !confpath) { + ret = snprintf(conf_path, sizeof(conf_path) - 1, + "%s/" GEOREP "/gsyncd_template.conf", gwd); + conf_path[ret] = '\0'; + confpath = conf_path; + } + + runinit(&runner); + runner_add_args(&runner, GSYNCD_PREFIX "/gsyncd", "-c", NULL); + runner_argprintf(&runner, "%s", confpath); + runner_argprintf(&runner, "--iprefix=%s", DATADIR); + if (master) + runner_argprintf(&runner, ":%s", master); + runner_add_arg(&runner, slave); + runner_argprintf(&runner, "--config-%s", subop); + if (op_name) + runner_add_arg(&runner, op_name); + + return runner_run(&runner); } - int -gf_cli_print_status (char **title_values, - gf_gsync_status_t **sts_vals, - int *spacing, int gsync_count, - int number_of_fields, int is_detail) -{ - int i = 0; - int j = 0; - int ret = 0; - int status_fields = 8; /* Indexed at 0 */ - int total_spacing = 0; - char **output_values = NULL; - char *tmp = NULL; - char *hyphens = NULL; - - /* calculating spacing for hyphens */ - for (i = 0; i < number_of_fields; i++) { - /* Suppressing detail output for status */ - if ((!is_detail) && (i > status_fields)) { - /* Suppressing detailed output for - * status */ - continue; - } - spacing[i] += 3; /* Adding extra space to - distinguish between fields */ - total_spacing += spacing[i]; - } - total_spacing += 4; /* For the spacing between the fields */ - - /* char pointers for each field */ - output_values = GF_CALLOC (number_of_fields, sizeof (char *), - gf_common_mt_char); - if (!output_values) { - ret = -1; - goto out; - } - for (i = 0; i < number_of_fields; i++) { - output_values[i] = GF_CALLOC (spacing[i] + 1, sizeof (char), - gf_common_mt_char); - if (!output_values[i]) { - ret = -1; - goto out; - } - } - - hyphens = GF_CALLOC (total_spacing + 1, sizeof (char), - gf_common_mt_char); - if (!hyphens) { +gf_cli_print_status(char **title_values, gf_gsync_status_t **sts_vals, + int *spacing, int gsync_count, int number_of_fields, + int is_detail) +{ + int i = 0; + int j = 0; + int ret = 0; + int status_fields = 8; /* Indexed at 0 */ + int total_spacing = 0; + char **output_values = NULL; + char *tmp = NULL; + char *hyphens = NULL; + + /* calculating spacing for hyphens */ + for (i = 0; i < number_of_fields; i++) { + /* Suppressing detail output for status */ + if ((!is_detail) && (i > status_fields)) { + /* Suppressing detailed output for + * status */ + continue; + } + spacing[i] += 3; /* Adding extra space to + distinguish between fields */ + total_spacing += spacing[i]; + } + total_spacing += 4; /* For the spacing between the fields */ + + /* char pointers for each field */ + output_values = GF_CALLOC(number_of_fields, sizeof(char *), + gf_common_mt_char); + if (!output_values) { + ret = -1; + goto out; + } + for (i = 0; i < number_of_fields; i++) { + output_values[i] = GF_CALLOC(spacing[i] + 1, sizeof(char), + gf_common_mt_char); + if (!output_values[i]) { + ret = -1; + goto out; + } + } + + hyphens = GF_CALLOC(total_spacing + 1, sizeof(char), gf_common_mt_char); + if (!hyphens) { + ret = -1; + goto out; + } + + cli_out(" "); + + /* setting the title "NODE", "MASTER", etc. from title_values[] + and printing the same */ + for (j = 0; j < number_of_fields; j++) { + if ((!is_detail) && (j > status_fields)) { + /* Suppressing detailed output for + * status */ + output_values[j][0] = '\0'; + continue; + } + memset(output_values[j], ' ', spacing[j]); + memcpy(output_values[j], title_values[j], strlen(title_values[j])); + output_values[j][spacing[j]] = '\0'; + } + cli_out("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s", output_values[0], + output_values[1], output_values[2], output_values[3], + output_values[4], output_values[5], output_values[6], + output_values[7], output_values[8], output_values[9], + output_values[10], output_values[11], output_values[12], + output_values[13], output_values[14], output_values[15]); + + /* setting and printing the hyphens */ + memset(hyphens, '-', total_spacing); + hyphens[total_spacing] = '\0'; + cli_out("%s", hyphens); + + for (i = 0; i < gsync_count; i++) { + for (j = 0; j < number_of_fields; j++) { + if ((!is_detail) && (j > status_fields)) { + /* Suppressing detailed output for + * status */ + output_values[j][0] = '\0'; + continue; + } + tmp = get_struct_variable(j, sts_vals[i]); + if (!tmp) { + gf_log("", GF_LOG_ERROR, "struct member empty."); ret = -1; goto out; + } + memset(output_values[j], ' ', spacing[j]); + memcpy(output_values[j], tmp, strlen(tmp)); + output_values[j][spacing[j]] = '\0'; } - cli_out (" "); - - /* setting the title "NODE", "MASTER", etc. from title_values[] - and printing the same */ - for (j = 0; j < number_of_fields; j++) { - if ((!is_detail) && (j > status_fields)) { - /* Suppressing detailed output for - * status */ - output_values[j][0] = '\0'; - continue; - } - memset (output_values[j], ' ', spacing[j]); - memcpy (output_values[j], title_values[j], - strlen(title_values[j])); - output_values[j][spacing[j]] = '\0'; - } - cli_out ("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s", - output_values[0], output_values[1], - output_values[2], output_values[3], - output_values[4], output_values[5], - output_values[6], output_values[7], - output_values[8], output_values[9], - output_values[10], output_values[11], - output_values[12], output_values[13], - output_values[14], output_values[15]); - - /* setting and printing the hyphens */ - memset (hyphens, '-', total_spacing); - hyphens[total_spacing] = '\0'; - cli_out ("%s", hyphens); - - for (i = 0; i < gsync_count; i++) { - for (j = 0; j < number_of_fields; j++) { - if ((!is_detail) && (j > status_fields)) { - /* Suppressing detailed output for - * status */ - output_values[j][0] = '\0'; - continue; - } - tmp = get_struct_variable(j, sts_vals[i]); - if (!tmp) { - gf_log ("", GF_LOG_ERROR, - "struct member empty."); - ret = -1; - goto out; - } - memset (output_values[j], ' ', spacing[j]); - memcpy (output_values[j], tmp, strlen (tmp)); - output_values[j][spacing[j]] = '\0'; - } - - cli_out ("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s", - output_values[0], output_values[1], - output_values[2], output_values[3], - output_values[4], output_values[5], - output_values[6], output_values[7], - output_values[8], output_values[9], - output_values[10], output_values[11], - output_values[12], output_values[13], - output_values[14], output_values[15]); - } + cli_out("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s", + output_values[0], output_values[1], output_values[2], + output_values[3], output_values[4], output_values[5], + output_values[6], output_values[7], output_values[8], + output_values[9], output_values[10], output_values[11], + output_values[12], output_values[13], output_values[14], + output_values[15]); + } out: - if (output_values) { - for (i = 0; i < number_of_fields; i++) { - if (output_values[i]) - GF_FREE (output_values[i]); - } - GF_FREE (output_values); + if (output_values) { + for (i = 0; i < number_of_fields; i++) { + if (output_values[i]) + GF_FREE(output_values[i]); } + GF_FREE(output_values); + } - if (hyphens) - GF_FREE (hyphens); + if (hyphens) + GF_FREE(hyphens); - return ret; + return ret; } int -gf_gsync_status_t_comparator (const void *p, const void *q) +gf_gsync_status_t_comparator(const void *p, const void *q) { - char *slavekey1 = NULL; - char *slavekey2 = NULL; - - slavekey1 = get_struct_variable (20, (*(gf_gsync_status_t **)p)); - slavekey2 = get_struct_variable (20, (*(gf_gsync_status_t **)q)); - if (!slavekey1 || !slavekey2) { - gf_log ("cli", GF_LOG_ERROR, - "struct member empty."); - return 0; - } - - return strcmp (slavekey1, slavekey2); -} - -int -gf_cli_read_status_data (dict_t *dict, - gf_gsync_status_t **sts_vals, - int *spacing, int gsync_count, - int number_of_fields) -{ - char *tmp = NULL; - char sts_val_name[PATH_MAX] = ""; - int ret = 0; - int i = 0; - int j = 0; - - /* Storing per node status info in each object */ - for (i = 0; i < gsync_count; i++) { - snprintf (sts_val_name, sizeof(sts_val_name), "status_value%d", i); - - /* Fetching the values from dict, and calculating - the max length for each field */ - ret = dict_get_bin (dict, sts_val_name, (void **)&(sts_vals[i])); - if (ret) - goto out; - - for (j = 0; j < number_of_fields; j++) { - tmp = get_struct_variable(j, sts_vals[i]); - if (!tmp) { - gf_log ("", GF_LOG_ERROR, - "struct member empty."); - ret = -1; - goto out; - } - if (strlen (tmp) > spacing[j]) - spacing[j] = strlen (tmp); - } - } + char *slavekey1 = NULL; + char *slavekey2 = NULL; - /* Sort based on Session Slave */ - qsort(sts_vals, gsync_count, - sizeof(gf_gsync_status_t *), - gf_gsync_status_t_comparator); + slavekey1 = get_struct_variable(20, (*(gf_gsync_status_t **)p)); + slavekey2 = get_struct_variable(20, (*(gf_gsync_status_t **)q)); + if (!slavekey1 || !slavekey2) { + gf_log("cli", GF_LOG_ERROR, "struct member empty."); + return 0; + } -out: - return ret; + return strcmp(slavekey1, slavekey2); } int -gf_cli_gsync_status_output (dict_t *dict, gf_boolean_t is_detail) -{ - int gsync_count = 0; - int i = 0; - int ret = 0; - int spacing[16] = {0}; - int num_of_fields = 16; - char errmsg[1024] = ""; - char *master = NULL; - char *slave = NULL; - char *title_values[] = {"MASTER NODE", "MASTER VOL", - "MASTER BRICK", "SLAVE USER", - "SLAVE", "SLAVE NODE", - "STATUS", "CRAWL STATUS", - "LAST_SYNCED", "ENTRY", - "DATA", "META", "FAILURES", - "CHECKPOINT TIME", - "CHECKPOINT COMPLETED", - "CHECKPOINT COMPLETION TIME"}; - gf_gsync_status_t **sts_vals = NULL; - - /* Checks if any session is active or not */ - ret = dict_get_int32 (dict, "gsync-count", &gsync_count); - if (ret) { - ret = dict_get_str (dict, "master", &master); - - ret = dict_get_str (dict, "slave", &slave); - - if (master) { - if (slave) - snprintf (errmsg, sizeof(errmsg), "No active " - "geo-replication sessions between %s" - " and %s", master, slave); - else - snprintf (errmsg, sizeof(errmsg), "No active " - "geo-replication sessions for %s", - master); - } else - snprintf (errmsg, sizeof(errmsg), "No active " - "geo-replication sessions"); - - gf_log ("cli", GF_LOG_INFO, "%s", errmsg); - cli_out ("%s", errmsg); - ret = -1; - goto out; - } - - for (i = 0; i < num_of_fields; i++) - spacing[i] = strlen(title_values[i]); +gf_cli_read_status_data(dict_t *dict, gf_gsync_status_t **sts_vals, + int *spacing, int gsync_count, int number_of_fields) +{ + char *tmp = NULL; + char sts_val_name[PATH_MAX] = ""; + int ret = 0; + int i = 0; + int j = 0; + + /* Storing per node status info in each object */ + for (i = 0; i < gsync_count; i++) { + snprintf(sts_val_name, sizeof(sts_val_name), "status_value%d", i); + + /* Fetching the values from dict, and calculating + the max length for each field */ + ret = dict_get_bin(dict, sts_val_name, (void **)&(sts_vals[i])); + if (ret) + goto out; - /* gsync_count = number of nodes reporting output. - each sts_val object will store output of each - node */ - sts_vals = GF_MALLOC (gsync_count * sizeof (gf_gsync_status_t *), - gf_common_mt_char); - if (!sts_vals) { + for (j = 0; j < number_of_fields; j++) { + tmp = get_struct_variable(j, sts_vals[i]); + if (!tmp) { + gf_log("", GF_LOG_ERROR, "struct member empty."); ret = -1; goto out; + } + if (strlen(tmp) > spacing[j]) + spacing[j] = strlen(tmp); } - for (i = 0; i < gsync_count; i++) { - sts_vals[i] = GF_CALLOC (1, sizeof (gf_gsync_status_t), - gf_common_mt_char); - if (!sts_vals[i]) { - ret = -1; - goto out; - } - } + } - ret = gf_cli_read_status_data (dict, sts_vals, spacing, - gsync_count, num_of_fields); - if (ret) { - gf_log ("", GF_LOG_ERROR, "Unable to read status data"); - goto out; - } - - ret = gf_cli_print_status (title_values, sts_vals, spacing, gsync_count, - num_of_fields, is_detail); - if (ret) { - gf_log ("", GF_LOG_ERROR, "Unable to print status output"); - goto out; - } + /* Sort based on Session Slave */ + qsort(sts_vals, gsync_count, sizeof(gf_gsync_status_t *), + gf_gsync_status_t_comparator); out: - if (sts_vals) - GF_FREE (sts_vals); + return ret; +} - return ret; +int +gf_cli_gsync_status_output(dict_t *dict, gf_boolean_t is_detail) +{ + int gsync_count = 0; + int i = 0; + int ret = 0; + int spacing[16] = {0}; + int num_of_fields = 16; + char errmsg[1024] = ""; + char *master = NULL; + char *slave = NULL; + char *title_values[] = {"MASTER NODE", + "MASTER VOL", + "MASTER BRICK", + "SLAVE USER", + "SLAVE", + "SLAVE NODE", + "STATUS", + "CRAWL STATUS", + "LAST_SYNCED", + "ENTRY", + "DATA", + "META", + "FAILURES", + "CHECKPOINT TIME", + "CHECKPOINT COMPLETED", + "CHECKPOINT COMPLETION TIME"}; + gf_gsync_status_t **sts_vals = NULL; + + /* Checks if any session is active or not */ + ret = dict_get_int32(dict, "gsync-count", &gsync_count); + if (ret) { + ret = dict_get_str(dict, "master", &master); + + ret = dict_get_str(dict, "slave", &slave); + + if (master) { + if (slave) + snprintf(errmsg, sizeof(errmsg), + "No active " + "geo-replication sessions between %s" + " and %s", + master, slave); + else + snprintf(errmsg, sizeof(errmsg), + "No active " + "geo-replication sessions for %s", + master); + } else + snprintf(errmsg, sizeof(errmsg), + "No active " + "geo-replication sessions"); + + gf_log("cli", GF_LOG_INFO, "%s", errmsg); + cli_out("%s", errmsg); + ret = -1; + goto out; + } + + for (i = 0; i < num_of_fields; i++) + spacing[i] = strlen(title_values[i]); + + /* gsync_count = number of nodes reporting output. + each sts_val object will store output of each + node */ + sts_vals = GF_MALLOC(gsync_count * sizeof(gf_gsync_status_t *), + gf_common_mt_char); + if (!sts_vals) { + ret = -1; + goto out; + } + for (i = 0; i < gsync_count; i++) { + sts_vals[i] = GF_CALLOC(1, sizeof(gf_gsync_status_t), + gf_common_mt_char); + if (!sts_vals[i]) { + ret = -1; + goto out; + } + } + + ret = gf_cli_read_status_data(dict, sts_vals, spacing, gsync_count, + num_of_fields); + if (ret) { + gf_log("", GF_LOG_ERROR, "Unable to read status data"); + goto out; + } + + ret = gf_cli_print_status(title_values, sts_vals, spacing, gsync_count, + num_of_fields, is_detail); + if (ret) { + gf_log("", GF_LOG_ERROR, "Unable to print status output"); + goto out; + } + +out: + if (sts_vals) + GF_FREE(sts_vals); + + return ret; } static int32_t -write_contents_to_common_pem_file (dict_t *dict, int output_count) -{ - char *workdir = NULL; - char common_pem_file[PATH_MAX] = ""; - char *output = NULL; - char output_name[PATH_MAX] = ""; - int bytes_written = 0; - int fd = -1; - int ret = -1; - int i = -1; - - ret = dict_get_str (dict, "glusterd_workdir", &workdir); - if (ret || !workdir) { - gf_log ("", GF_LOG_ERROR, "Unable to fetch workdir"); +write_contents_to_common_pem_file(dict_t *dict, int output_count) +{ + char *workdir = NULL; + char common_pem_file[PATH_MAX] = ""; + char *output = NULL; + char output_name[PATH_MAX] = ""; + int bytes_written = 0; + int fd = -1; + int ret = -1; + int i = -1; + + ret = dict_get_str(dict, "glusterd_workdir", &workdir); + if (ret || !workdir) { + gf_log("", GF_LOG_ERROR, "Unable to fetch workdir"); + ret = -1; + goto out; + } + + snprintf(common_pem_file, sizeof(common_pem_file), + "%s/geo-replication/common_secret.pem.pub", workdir); + + sys_unlink(common_pem_file); + + fd = open(common_pem_file, O_WRONLY | O_CREAT, 0600); + if (fd == -1) { + gf_log("", GF_LOG_ERROR, + "Failed to open %s" + " Error : %s", + common_pem_file, strerror(errno)); + ret = -1; + goto out; + } + + for (i = 1; i <= output_count; i++) { + snprintf(output_name, sizeof(output_name), "output_%d", i); + ret = dict_get_str(dict, output_name, &output); + if (ret) { + gf_log("", GF_LOG_ERROR, "Failed to get %s.", output_name); + cli_out("Unable to fetch output."); + } + if (output) { + bytes_written = sys_write(fd, output, strlen(output)); + if (bytes_written != strlen(output)) { + gf_log("", GF_LOG_ERROR, + "Failed to write " + "to %s", + common_pem_file); ret = -1; goto out; - } - - snprintf (common_pem_file, sizeof(common_pem_file), - "%s/geo-replication/common_secret.pem.pub", - workdir); - - sys_unlink (common_pem_file); - - fd = open (common_pem_file, O_WRONLY | O_CREAT, 0600); - if (fd == -1) { - gf_log ("", GF_LOG_ERROR, "Failed to open %s" - " Error : %s", common_pem_file, - strerror (errno)); + } + /* Adding the new line character */ + bytes_written = sys_write(fd, "\n", 1); + if (bytes_written != 1) { + gf_log("", GF_LOG_ERROR, "Failed to add new line char"); ret = -1; goto out; + } + output = NULL; } + } - for (i = 1; i <= output_count; i++) { - snprintf (output_name, sizeof (output_name), - "output_%d", i); - ret = dict_get_str (dict, output_name, &output); - if (ret) { - gf_log ("", GF_LOG_ERROR, "Failed to get %s.", - output_name); - cli_out ("Unable to fetch output."); - } - if (output) { - bytes_written = sys_write (fd, output, strlen(output)); - if (bytes_written != strlen(output)) { - gf_log ("", GF_LOG_ERROR, "Failed to write " - "to %s", common_pem_file); - ret = -1; - goto out; - } - /* Adding the new line character */ - bytes_written = sys_write (fd, "\n", 1); - if (bytes_written != 1) { - gf_log ("", GF_LOG_ERROR, - "Failed to add new line char"); - ret = -1; - goto out; - } - output = NULL; - } - } - - cli_out ("Common secret pub file present at %s", common_pem_file); - ret = 0; + cli_out("Common secret pub file present at %s", common_pem_file); + ret = 0; out: - if (fd >= 0) - sys_close (fd); + if (fd >= 0) + sys_close(fd); - gf_log ("", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -gf_cli_sys_exec_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - int ret = -1; - int output_count = -1; - int i = -1; - char *output = NULL; - char *command = NULL; - char output_name[PATH_MAX] = ""; - gf_cli_rsp rsp = {0, }; - dict_t *dict = NULL; - - GF_ASSERT (myframe); - - if (req->rpc_status == -1) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - dict = dict_new (); - - if (!dict) { - ret = -1; - goto out; - } - - ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, &dict); +gf_cli_sys_exec_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + int ret = -1; + int output_count = -1; + int i = -1; + char *output = NULL; + char *command = NULL; + char output_name[PATH_MAX] = ""; + gf_cli_rsp rsp = { + 0, + }; + dict_t *dict = NULL; + + GF_ASSERT(myframe); + + if (req->rpc_status == -1) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + dict = dict_new(); + + if (!dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + + if (ret) + goto out; + + if (rsp.op_ret) { + cli_err("%s", rsp.op_errstr ? rsp.op_errstr : "Command failed."); + ret = rsp.op_ret; + goto out; + } - if (ret) - goto out; + ret = dict_get_int32(dict, "output_count", &output_count); + if (ret) { + cli_out("Command executed successfully."); + ret = 0; + goto out; + } - if (rsp.op_ret) { - cli_err ("%s", rsp.op_errstr ? rsp.op_errstr : - "Command failed."); - ret = rsp.op_ret; - goto out; - } + ret = dict_get_str(dict, "command", &command); + if (ret) { + gf_log("", GF_LOG_ERROR, "Unable to get command from dict"); + goto out; + } - ret = dict_get_int32 (dict, "output_count", &output_count); - if (ret) { - cli_out ("Command executed successfully."); - ret = 0; - goto out; - } + if (!strcmp(command, "gsec_create")) { + ret = write_contents_to_common_pem_file(dict, output_count); + if (!ret) + goto out; + } - ret = dict_get_str (dict, "command", &command); + for (i = 1; i <= output_count; i++) { + snprintf(output_name, sizeof(output_name), "output_%d", i); + ret = dict_get_str(dict, output_name, &output); if (ret) { - gf_log ("", GF_LOG_ERROR, - "Unable to get command from dict"); - goto out; + gf_log("", GF_LOG_ERROR, "Failed to get %s.", output_name); + cli_out("Unable to fetch output."); } - - if (!strcmp (command, "gsec_create")) { - ret = write_contents_to_common_pem_file (dict, output_count); - if (!ret) - goto out; + if (output) { + cli_out("%s", output); + output = NULL; } + } - for (i = 1; i <= output_count; i++) { - snprintf (output_name, sizeof (output_name), - "output_%d", i); - ret = dict_get_str (dict, output_name, &output); - if (ret) { - gf_log ("", GF_LOG_ERROR, "Failed to get %s.", - output_name); - cli_out ("Unable to fetch output."); - } - if (output) { - cli_out ("%s", output); - output = NULL; - } - } - - ret = 0; + ret = 0; out: - if (dict) - dict_unref (dict); - cli_cmd_broadcast_response (ret); + if (dict) + dict_unref(dict); + cli_cmd_broadcast_response(ret); - free (rsp.dict.dict_val); + free(rsp.dict.dict_val); - return ret; + return ret; } int -gf_cli_copy_file_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_copy_file_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - int ret = -1; - gf_cli_rsp rsp = {0, }; - dict_t *dict = NULL; + int ret = -1; + gf_cli_rsp rsp = { + 0, + }; + dict_t *dict = NULL; - GF_ASSERT (myframe); + GF_ASSERT(myframe); - if (req->rpc_status == -1) { - goto out; - } + if (req->rpc_status == -1) { + goto out; + } - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - dict = dict_new (); + dict = dict_new(); - if (!dict) { - ret = -1; - goto out; - } + if (!dict) { + ret = -1; + goto out; + } - ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, &dict); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); - if (ret) - goto out; + if (ret) + goto out; - if (rsp.op_ret) { - cli_err ("%s", rsp.op_errstr ? rsp.op_errstr : - "Copy unsuccessful"); - ret = rsp.op_ret; - goto out; - } + if (rsp.op_ret) { + cli_err("%s", rsp.op_errstr ? rsp.op_errstr : "Copy unsuccessful"); + ret = rsp.op_ret; + goto out; + } - cli_out ("Successfully copied file."); + cli_out("Successfully copied file."); out: - if (dict) - dict_unref (dict); - cli_cmd_broadcast_response (ret); + if (dict) + dict_unref(dict); + cli_cmd_broadcast_response(ret); - free (rsp.dict.dict_val); + free(rsp.dict.dict_val); - return ret; + return ret; } int -gf_cli_gsync_set_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - int ret = -1; - gf_cli_rsp rsp = {0, }; - dict_t *dict = NULL; - char *gsync_status = NULL; - char *master = NULL; - char *slave = NULL; - int32_t type = 0; - gf_boolean_t status_detail = _gf_false; - - GF_ASSERT (myframe); - - if (req->rpc_status == -1) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - dict = dict_new (); - - if (!dict) { - ret = -1; - goto out; - } - - ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, &dict); - +gf_cli_gsync_set_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + int ret = -1; + gf_cli_rsp rsp = { + 0, + }; + dict_t *dict = NULL; + char *gsync_status = NULL; + char *master = NULL; + char *slave = NULL; + int32_t type = 0; + gf_boolean_t status_detail = _gf_false; + + GF_ASSERT(myframe); + + if (req->rpc_status == -1) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + dict = dict_new(); + + if (!dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + + if (ret) + goto out; + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_gsync(dict, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); if (ret) - goto out; + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_gsync (dict, rsp.op_ret, rsp.op_errno, - rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } - - if (rsp.op_ret) { - cli_err ("%s", rsp.op_errstr ? rsp.op_errstr : - GEOREP" command unsuccessful"); - ret = rsp.op_ret; - goto out; - } - - ret = dict_get_str (dict, "gsync-status", &gsync_status); - if (!ret) - cli_out ("%s", gsync_status); - - ret = dict_get_int32 (dict, "type", &type); - if (ret) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "failed to get type"); - goto out; - } - - switch (type) { - case GF_GSYNC_OPTION_TYPE_START: - case GF_GSYNC_OPTION_TYPE_STOP: - if (dict_get_str (dict, "master", &master) != 0) - master = "???"; - if (dict_get_str (dict, "slave", &slave) != 0) - slave = "???"; - - cli_out ("%s " GEOREP " session between %s & %s" - " has been successful", - type == GF_GSYNC_OPTION_TYPE_START ? - "Starting" : "Stopping", - master, slave); - break; - - case GF_GSYNC_OPTION_TYPE_PAUSE: - case GF_GSYNC_OPTION_TYPE_RESUME: - if (dict_get_str (dict, "master", &master) != 0) - master = "???"; - if (dict_get_str (dict, "slave", &slave) != 0) - slave = "???"; - - cli_out ("%s " GEOREP " session between %s & %s" - " has been successful", - type == GF_GSYNC_OPTION_TYPE_PAUSE ? - "Pausing" : "Resuming", - master, slave); - break; - - case GF_GSYNC_OPTION_TYPE_CONFIG: - ret = gf_cli_gsync_config_command (dict); - break; - - case GF_GSYNC_OPTION_TYPE_STATUS: - status_detail = dict_get_str_boolean (dict, - "status-detail", - _gf_false); - ret = gf_cli_gsync_status_output (dict, status_detail); - break; - - case GF_GSYNC_OPTION_TYPE_DELETE: - if (dict_get_str (dict, "master", &master) != 0) - master = "???"; - if (dict_get_str (dict, "slave", &slave) != 0) - slave = "???"; - cli_out ("Deleting " GEOREP " session between %s & %s" - " has been successful", master, slave); - break; - - case GF_GSYNC_OPTION_TYPE_CREATE: - if (dict_get_str (dict, "master", &master) != 0) - master = "???"; - if (dict_get_str (dict, "slave", &slave) != 0) - slave = "???"; - cli_out ("Creating " GEOREP " session between %s & %s" - " has been successful", master, slave); - break; + if (rsp.op_ret) { + cli_err("%s", + rsp.op_errstr ? rsp.op_errstr : GEOREP " command unsuccessful"); + ret = rsp.op_ret; + goto out; + } + + ret = dict_get_str(dict, "gsync-status", &gsync_status); + if (!ret) + cli_out("%s", gsync_status); + + ret = dict_get_int32(dict, "type", &type); + if (ret) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "failed to get type"); + goto out; + } + + switch (type) { + case GF_GSYNC_OPTION_TYPE_START: + case GF_GSYNC_OPTION_TYPE_STOP: + if (dict_get_str(dict, "master", &master) != 0) + master = "???"; + if (dict_get_str(dict, "slave", &slave) != 0) + slave = "???"; + + cli_out( + "%s " GEOREP + " session between %s & %s" + " has been successful", + type == GF_GSYNC_OPTION_TYPE_START ? "Starting" : "Stopping", + master, slave); + break; + + case GF_GSYNC_OPTION_TYPE_PAUSE: + case GF_GSYNC_OPTION_TYPE_RESUME: + if (dict_get_str(dict, "master", &master) != 0) + master = "???"; + if (dict_get_str(dict, "slave", &slave) != 0) + slave = "???"; + + cli_out("%s " GEOREP + " session between %s & %s" + " has been successful", + type == GF_GSYNC_OPTION_TYPE_PAUSE ? "Pausing" : "Resuming", + master, slave); + break; + + case GF_GSYNC_OPTION_TYPE_CONFIG: + ret = gf_cli_gsync_config_command(dict); + break; + + case GF_GSYNC_OPTION_TYPE_STATUS: + status_detail = dict_get_str_boolean(dict, "status-detail", + _gf_false); + ret = gf_cli_gsync_status_output(dict, status_detail); + break; + + case GF_GSYNC_OPTION_TYPE_DELETE: + if (dict_get_str(dict, "master", &master) != 0) + master = "???"; + if (dict_get_str(dict, "slave", &slave) != 0) + slave = "???"; + cli_out("Deleting " GEOREP + " session between %s & %s" + " has been successful", + master, slave); + break; + + case GF_GSYNC_OPTION_TYPE_CREATE: + if (dict_get_str(dict, "master", &master) != 0) + master = "???"; + if (dict_get_str(dict, "slave", &slave) != 0) + slave = "???"; + cli_out("Creating " GEOREP + " session between %s & %s" + " has been successful", + master, slave); + break; - default: - cli_out (GEOREP" command executed successfully"); - } + default: + cli_out(GEOREP " command executed successfully"); + } out: - if (dict) - dict_unref (dict); - cli_cmd_broadcast_response (ret); + if (dict) + dict_unref(dict); + cli_cmd_broadcast_response(ret); - free (rsp.dict.dict_val); + free(rsp.dict.dict_val); - return ret; + return ret; } int32_t -gf_cli_sys_exec (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_sys_exec(call_frame_t *frame, xlator_t *this, void *data) { - int ret = 0; - dict_t *dict = NULL; - gf_cli_req req = {{0,}}; + int ret = 0; + dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; - if (!frame || !this || !data) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid data"); - goto out; - } + if (!frame || !this || !data) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid data"); + goto out; + } - dict = data; + dict = data; - ret = cli_to_glusterd (&req, frame, gf_cli_sys_exec_cbk, - (xdrproc_t) xdr_gf_cli_req, dict, - GLUSTER_CLI_SYS_EXEC, this, cli_rpc_prog, - NULL); + ret = cli_to_glusterd(&req, frame, gf_cli_sys_exec_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, GLUSTER_CLI_SYS_EXEC, + this, cli_rpc_prog, NULL); out: - GF_FREE (req.dict.dict_val); - return ret; + GF_FREE(req.dict.dict_val); + return ret; } int32_t -gf_cli_copy_file (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_copy_file(call_frame_t *frame, xlator_t *this, void *data) { - int ret = 0; - dict_t *dict = NULL; - gf_cli_req req = {{0,}}; + int ret = 0; + dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; - if (!frame || !this || !data) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Invalid data"); - goto out; - } + if (!frame || !this || !data) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Invalid data"); + goto out; + } - dict = data; + dict = data; - ret = cli_to_glusterd (&req, frame, gf_cli_copy_file_cbk, - (xdrproc_t) xdr_gf_cli_req, dict, - GLUSTER_CLI_COPY_FILE, this, cli_rpc_prog, - NULL); + ret = cli_to_glusterd(&req, frame, gf_cli_copy_file_cbk, + (xdrproc_t)xdr_gf_cli_req, dict, + GLUSTER_CLI_COPY_FILE, this, cli_rpc_prog, NULL); out: - GF_FREE (req.dict.dict_val); - return ret; + GF_FREE(req.dict.dict_val); + return ret; } int32_t -gf_cli_gsync_set (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_gsync_set(call_frame_t *frame, xlator_t *this, void *data) { - int ret = 0; - dict_t *dict = NULL; - gf_cli_req req = {{0,}}; + int ret = 0; + dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - 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); + 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); + GF_FREE(req.dict.dict_val); - return ret; + return ret; } - int -cli_profile_info_percentage_cmp (void *a, void *b) -{ - cli_profile_info_t *ia = NULL; - cli_profile_info_t *ib = NULL; - int ret = 0; - - ia = a; - ib = b; - if (ia->percentage_avg_latency < ib->percentage_avg_latency) - ret = -1; - else if (ia->percentage_avg_latency > ib->percentage_avg_latency) - ret = 1; - else - ret = 0; - return ret; +cli_profile_info_percentage_cmp(void *a, void *b) +{ + cli_profile_info_t *ia = NULL; + cli_profile_info_t *ib = NULL; + int ret = 0; + + ia = a; + ib = b; + if (ia->percentage_avg_latency < ib->percentage_avg_latency) + ret = -1; + else if (ia->percentage_avg_latency > ib->percentage_avg_latency) + ret = 1; + else + ret = 0; + return ret; } - void -cmd_profile_volume_brick_out (dict_t *dict, int count, int interval) -{ - char key[256] = {0}; - int i = 0; - uint64_t sec = 0; - uint64_t r_count = 0; - uint64_t w_count = 0; - uint64_t rb_counts[32] = {0}; - uint64_t wb_counts[32] = {0}; - cli_profile_info_t profile_info[GF_FOP_MAXVALUE] = {{0}}; - cli_profile_info_t upcall_info[GF_UPCALL_FLAGS_MAXVALUE] = {{0},}; - char output[128] = {0}; - int per_line = 0; - char read_blocks[128] = {0}; - char write_blocks[128] = {0}; - int index = 0; - int is_header_printed = 0; - int ret = 0; - double total_percentage_latency = 0; - - for (i = 0; i < 32; i++) { - snprintf (key, sizeof (key), "%d-%d-read-%d", count, - interval, (1 << i)); - ret = dict_get_uint64 (dict, key, &rb_counts[i]); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get %s from dict", key); - } +cmd_profile_volume_brick_out(dict_t *dict, int count, int interval) +{ + char key[256] = {0}; + int i = 0; + uint64_t sec = 0; + uint64_t r_count = 0; + uint64_t w_count = 0; + uint64_t rb_counts[32] = {0}; + uint64_t wb_counts[32] = {0}; + cli_profile_info_t profile_info[GF_FOP_MAXVALUE] = {{0}}; + cli_profile_info_t upcall_info[GF_UPCALL_FLAGS_MAXVALUE] = { + {0}, + }; + char output[128] = {0}; + int per_line = 0; + char read_blocks[128] = {0}; + char write_blocks[128] = {0}; + int index = 0; + int is_header_printed = 0; + int ret = 0; + double total_percentage_latency = 0; + + for (i = 0; i < 32; i++) { + snprintf(key, sizeof(key), "%d-%d-read-%d", count, interval, (1 << i)); + ret = dict_get_uint64(dict, key, &rb_counts[i]); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); } + } - for (i = 0; i < 32; i++) { - snprintf (key, sizeof (key), "%d-%d-write-%d", count, interval, - (1<<i)); - ret = dict_get_uint64 (dict, key, &wb_counts[i]); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get %s from dict", key); - } + for (i = 0; i < 32; i++) { + snprintf(key, sizeof(key), "%d-%d-write-%d", count, interval, (1 << i)); + ret = dict_get_uint64(dict, key, &wb_counts[i]); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); } + } - for (i = 0; i < GF_UPCALL_FLAGS_MAXVALUE; i++) { - snprintf (key, sizeof (key), "%d-%d-%d-upcall-hits", count, - interval, i); - ret = dict_get_uint64 (dict, key, &upcall_info[i].fop_hits); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get %s from dict", key); - } - upcall_info[i].fop_name = (char *)gf_upcall_list[i]; + for (i = 0; i < GF_UPCALL_FLAGS_MAXVALUE; i++) { + snprintf(key, sizeof(key), "%d-%d-%d-upcall-hits", count, interval, i); + ret = dict_get_uint64(dict, key, &upcall_info[i].fop_hits); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); } + upcall_info[i].fop_name = (char *)gf_upcall_list[i]; + } - for (i = 0; i < GF_FOP_MAXVALUE; i++) { - snprintf (key, sizeof (key), "%d-%d-%d-hits", count, - interval, i); - ret = dict_get_uint64 (dict, key, &profile_info[i].fop_hits); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get %s from dict", key); - } - - snprintf (key, sizeof (key), "%d-%d-%d-avglatency", count, - interval, i); - ret = dict_get_double (dict, key, &profile_info[i].avg_latency); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get %s from dict", key); - } - - snprintf (key, sizeof (key), "%d-%d-%d-minlatency", count, - interval, i); - ret = dict_get_double (dict, key, &profile_info[i].min_latency); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get %s from dict", key); - } - - snprintf (key, sizeof (key), "%d-%d-%d-maxlatency", count, - interval, i); - ret = dict_get_double (dict, key, &profile_info[i].max_latency); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get %s from dict", key); - } - profile_info[i].fop_name = (char *)gf_fop_list[i]; - - total_percentage_latency += - (profile_info[i].fop_hits * profile_info[i].avg_latency); - } - if (total_percentage_latency) { - for (i = 0; i < GF_FOP_MAXVALUE; i++) { - profile_info[i].percentage_avg_latency = 100 * ( - (profile_info[i].avg_latency* profile_info[i].fop_hits) / - total_percentage_latency); - } - gf_array_insertionsort (profile_info, 1, GF_FOP_MAXVALUE - 1, - sizeof (cli_profile_info_t), - cli_profile_info_percentage_cmp); - } - snprintf (key, sizeof (key), "%d-%d-duration", count, interval); - ret = dict_get_uint64 (dict, key, &sec); + for (i = 0; i < GF_FOP_MAXVALUE; i++) { + snprintf(key, sizeof(key), "%d-%d-%d-hits", count, interval, i); + ret = dict_get_uint64(dict, key, &profile_info[i].fop_hits); if (ret) { - gf_log ("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); + gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); } - snprintf (key, sizeof (key), "%d-%d-total-read", count, interval); - ret = dict_get_uint64 (dict, key, &r_count); + snprintf(key, sizeof(key), "%d-%d-%d-avglatency", count, interval, i); + ret = dict_get_double(dict, key, &profile_info[i].avg_latency); if (ret) { - gf_log ("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); + gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); } - snprintf (key, sizeof (key), "%d-%d-total-write", count, interval); - ret = dict_get_uint64 (dict, key, &w_count); + snprintf(key, sizeof(key), "%d-%d-%d-minlatency", count, interval, i); + ret = dict_get_double(dict, key, &profile_info[i].min_latency); if (ret) { - gf_log ("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); + gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); } - if (interval == -1) - cli_out ("Cumulative Stats:"); - else - cli_out ("Interval %d Stats:", interval); - snprintf (output, sizeof (output), "%14s", "Block Size:"); - snprintf (read_blocks, sizeof (read_blocks), "%14s", "No. of Reads:"); - snprintf (write_blocks, sizeof (write_blocks), "%14s", "No. of Writes:"); - index = 14; - for (i = 0; i < 32; i++) { - if ((rb_counts[i] == 0) && (wb_counts[i] == 0)) - continue; - per_line++; - snprintf (output+index, sizeof (output)-index, "%19db+ ", (1<<i)); - if (rb_counts[i]) { - snprintf (read_blocks+index, sizeof (read_blocks)-index, - "%21"PRId64" ", rb_counts[i]); - } else { - snprintf (read_blocks+index, sizeof (read_blocks)-index, - "%21s ", "0"); - } - if (wb_counts[i]) { - snprintf (write_blocks+index, sizeof (write_blocks)-index, - "%21"PRId64" ", wb_counts[i]); - } else { - snprintf (write_blocks+index, sizeof (write_blocks)-index, - "%21s ", "0"); - } - index += 22; - if (per_line == 3) { - cli_out ("%s", output); - cli_out ("%s", read_blocks); - cli_out ("%s", write_blocks); - cli_out (" "); - per_line = 0; - snprintf (output, sizeof (output), "%14s", "Block Size:"); - snprintf (read_blocks, sizeof (read_blocks), "%14s", - "No. of Reads:"); - snprintf (write_blocks, sizeof (write_blocks), "%14s", - "No. of Writes:"); - index = 14; - } + snprintf(key, sizeof(key), "%d-%d-%d-maxlatency", count, interval, i); + ret = dict_get_double(dict, key, &profile_info[i].max_latency); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); } + profile_info[i].fop_name = (char *)gf_fop_list[i]; - if (per_line != 0) { - cli_out ("%s", output); - cli_out ("%s", read_blocks); - cli_out ("%s", write_blocks); - } + total_percentage_latency += (profile_info[i].fop_hits * + profile_info[i].avg_latency); + } + if (total_percentage_latency) { for (i = 0; i < GF_FOP_MAXVALUE; i++) { - if (profile_info[i].fop_hits == 0) - continue; - if (is_header_printed == 0) { - cli_out ("%10s %13s %13s %13s %14s %11s", "%-latency", - "Avg-latency", "Min-Latency", "Max-Latency", - "No. of calls", "Fop"); - cli_out ("%10s %13s %13s %13s %14s %11s", "---------", - "-----------", "-----------", "-----------", - "------------", "----"); - is_header_printed = 1; - } - if (profile_info[i].fop_hits) { - cli_out ("%10.2lf %10.2lf us %10.2lf us %10.2lf us" - " %14"PRId64" %11s", - profile_info[i].percentage_avg_latency, - profile_info[i].avg_latency, - profile_info[i].min_latency, - profile_info[i].max_latency, - profile_info[i].fop_hits, - profile_info[i].fop_name); - } - } - - for (i = 0; i < GF_UPCALL_FLAGS_MAXVALUE; i++) { - if (upcall_info[i].fop_hits == 0) - continue; - if (upcall_info[i].fop_hits) { - cli_out ("%10.2lf %10.2lf us %10.2lf us %10.2lf us" - " %14"PRId64" %11s", - upcall_info[i].percentage_avg_latency, - upcall_info[i].avg_latency, - upcall_info[i].min_latency, - upcall_info[i].max_latency, - upcall_info[i].fop_hits, - upcall_info[i].fop_name); - } + profile_info[i] + .percentage_avg_latency = 100 * ((profile_info[i].avg_latency * + profile_info[i].fop_hits) / + total_percentage_latency); + } + gf_array_insertionsort(profile_info, 1, GF_FOP_MAXVALUE - 1, + sizeof(cli_profile_info_t), + cli_profile_info_percentage_cmp); + } + snprintf(key, sizeof(key), "%d-%d-duration", count, interval); + ret = dict_get_uint64(dict, key, &sec); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); + } + + snprintf(key, sizeof(key), "%d-%d-total-read", count, interval); + ret = dict_get_uint64(dict, key, &r_count); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); + } + + snprintf(key, sizeof(key), "%d-%d-total-write", count, interval); + ret = dict_get_uint64(dict, key, &w_count); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, "failed to get %s from dict", key); + } + + if (interval == -1) + cli_out("Cumulative Stats:"); + else + cli_out("Interval %d Stats:", interval); + snprintf(output, sizeof(output), "%14s", "Block Size:"); + snprintf(read_blocks, sizeof(read_blocks), "%14s", "No. of Reads:"); + snprintf(write_blocks, sizeof(write_blocks), "%14s", "No. of Writes:"); + index = 14; + for (i = 0; i < 32; i++) { + if ((rb_counts[i] == 0) && (wb_counts[i] == 0)) + continue; + per_line++; + snprintf(output + index, sizeof(output) - index, "%19db+ ", (1 << i)); + if (rb_counts[i]) { + snprintf(read_blocks + index, sizeof(read_blocks) - index, + "%21" PRId64 " ", rb_counts[i]); + } else { + snprintf(read_blocks + index, sizeof(read_blocks) - index, "%21s ", + "0"); } - - cli_out (" "); - cli_out ("%12s: %"PRId64" seconds", "Duration", sec); - cli_out ("%12s: %"PRId64" bytes", "Data Read", r_count); - cli_out ("%12s: %"PRId64" bytes", "Data Written", w_count); - cli_out (" "); + if (wb_counts[i]) { + snprintf(write_blocks + index, sizeof(write_blocks) - index, + "%21" PRId64 " ", wb_counts[i]); + } else { + snprintf(write_blocks + index, sizeof(write_blocks) - index, + "%21s ", "0"); + } + index += 22; + if (per_line == 3) { + cli_out("%s", output); + cli_out("%s", read_blocks); + cli_out("%s", write_blocks); + cli_out(" "); + per_line = 0; + snprintf(output, sizeof(output), "%14s", "Block Size:"); + snprintf(read_blocks, sizeof(read_blocks), "%14s", "No. of Reads:"); + snprintf(write_blocks, sizeof(write_blocks), "%14s", + "No. of Writes:"); + index = 14; + } + } + + if (per_line != 0) { + cli_out("%s", output); + cli_out("%s", read_blocks); + cli_out("%s", write_blocks); + } + for (i = 0; i < GF_FOP_MAXVALUE; i++) { + if (profile_info[i].fop_hits == 0) + continue; + if (is_header_printed == 0) { + cli_out("%10s %13s %13s %13s %14s %11s", "%-latency", "Avg-latency", + "Min-Latency", "Max-Latency", "No. of calls", "Fop"); + cli_out("%10s %13s %13s %13s %14s %11s", "---------", "-----------", + "-----------", "-----------", "------------", "----"); + is_header_printed = 1; + } + if (profile_info[i].fop_hits) { + cli_out( + "%10.2lf %10.2lf us %10.2lf us %10.2lf us" + " %14" PRId64 " %11s", + profile_info[i].percentage_avg_latency, + profile_info[i].avg_latency, profile_info[i].min_latency, + profile_info[i].max_latency, profile_info[i].fop_hits, + profile_info[i].fop_name); + } + } + + for (i = 0; i < GF_UPCALL_FLAGS_MAXVALUE; i++) { + if (upcall_info[i].fop_hits == 0) + continue; + if (upcall_info[i].fop_hits) { + cli_out( + "%10.2lf %10.2lf us %10.2lf us %10.2lf us" + " %14" PRId64 " %11s", + upcall_info[i].percentage_avg_latency, + upcall_info[i].avg_latency, upcall_info[i].min_latency, + upcall_info[i].max_latency, upcall_info[i].fop_hits, + upcall_info[i].fop_name); + } + } + + cli_out(" "); + cli_out("%12s: %" PRId64 " seconds", "Duration", sec); + cli_out("%12s: %" PRId64 " bytes", "Data Read", r_count); + cli_out("%12s: %" PRId64 " bytes", "Data Written", w_count); + cli_out(" "); } int32_t -gf_cli_profile_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - dict_t *dict = NULL; - gf1_cli_stats_op op = GF_CLI_STATS_NONE; - char key[256] = {0}; - int interval = 0; - int i = 1; - int32_t brick_count = 0; - char *volname = NULL; - char *brick = NULL; - char str[1024] = {0,}; - int stats_cleared = 0; - gf1_cli_info_op info_op = GF_CLI_INFO_NONE; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; +gf_cli_profile_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; + gf1_cli_stats_op op = GF_CLI_STATS_NONE; + char key[256] = {0}; + int interval = 0; + int i = 1; + int32_t brick_count = 0; + char *volname = NULL; + char *brick = NULL; + char str[1024] = { + 0, + }; + int stats_cleared = 0; + gf1_cli_info_op info_op = GF_CLI_INFO_NONE; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + gf_log("cli", GF_LOG_DEBUG, "Received resp to profile"); + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + dict = dict_new(); + + if (!dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + + if (ret) { + gf_log("", GF_LOG_ERROR, "Unable to allocate memory"); + goto out; + } else { + dict->extra_stdfree = rsp.dict.dict_val; + } + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_profile(dict, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + + ret = dict_get_int32(dict, "op", (int32_t *)&op); + if (ret) + goto out; + + if (rsp.op_ret && strcmp(rsp.op_errstr, "")) { + cli_err("%s", rsp.op_errstr); + } else { + switch (op) { + case GF_CLI_STATS_START: + cli_out("Starting volume profile on %s has been %s ", volname, + (rsp.op_ret) ? "unsuccessful" : "successful"); + break; + case GF_CLI_STATS_STOP: + cli_out("Stopping volume profile on %s has been %s ", volname, + (rsp.op_ret) ? "unsuccessful" : "successful"); + break; + case GF_CLI_STATS_INFO: + break; + default: + cli_out("volume profile on %s has been %s ", volname, + (rsp.op_ret) ? "unsuccessful" : "successful"); + break; } + } - gf_log ("cli", GF_LOG_DEBUG, "Received resp to profile"); - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + if (rsp.op_ret) { + ret = rsp.op_ret; + goto out; + } - dict = dict_new (); + if (GF_CLI_STATS_INFO != op) { + ret = 0; + goto out; + } - if (!dict) { - ret = -1; - goto out; - } + ret = dict_get_int32(dict, "info-op", (int32_t *)&info_op); + if (ret) + goto out; + + ret = dict_get_int32(dict, "count", &brick_count); + if (ret) + goto out; - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); + if (!brick_count) { + cli_err("All bricks of volume %s are down.", volname); + goto out; + } + while (i <= brick_count) { + snprintf(key, sizeof(key), "%d-brick", i); + ret = dict_get_str(dict, key, &brick); if (ret) { - gf_log ("", GF_LOG_ERROR, - "Unable to allocate memory"); - goto out; - } else { - dict->extra_stdfree = rsp.dict.dict_val; + gf_log("cli", GF_LOG_ERROR, "Couldn't get brick name"); + goto out; } - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_profile (dict, rsp.op_ret, - rsp.op_errno, - rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } + ret = dict_get_str_boolean(dict, "nfs", _gf_false); - ret = dict_get_str (dict, "volname", &volname); if (ret) - goto out; - - ret = dict_get_int32 (dict, "op", (int32_t*)&op); - if (ret) - goto out; - - if (rsp.op_ret && strcmp (rsp.op_errstr, "")) { - cli_err ("%s", rsp.op_errstr); + snprintf(str, sizeof(str), "NFS Server : %s", brick); + else + snprintf(str, sizeof(str), "Brick: %s", brick); + cli_out("%s", str); + memset(str, '-', strlen(str)); + cli_out("%s", str); + + if (GF_CLI_INFO_CLEAR == info_op) { + snprintf(key, sizeof(key), "%d-stats-cleared", i); + ret = dict_get_int32(dict, key, &stats_cleared); + if (ret) + goto out; + cli_out(stats_cleared ? "Cleared stats." + : "Failed to clear stats."); } else { - switch (op) { - case GF_CLI_STATS_START: - cli_out ("Starting volume profile on %s has been %s ", - volname, - (rsp.op_ret) ? "unsuccessful": "successful"); - break; - case GF_CLI_STATS_STOP: - cli_out ("Stopping volume profile on %s has been %s ", - volname, - (rsp.op_ret) ? "unsuccessful": "successful"); - break; - case GF_CLI_STATS_INFO: - break; - default: - cli_out ("volume profile on %s has been %s ", - volname, - (rsp.op_ret) ? "unsuccessful": "successful"); - break; - } - } - - if (rsp.op_ret) { - ret = rsp.op_ret; - goto out; - } + snprintf(key, sizeof(key), "%d-cumulative", i); + ret = dict_get_int32(dict, key, &interval); + if (ret == 0) + cmd_profile_volume_brick_out(dict, i, interval); - if (GF_CLI_STATS_INFO != op) { - ret = 0; - goto out; + snprintf(key, sizeof(key), "%d-interval", i); + ret = dict_get_int32(dict, key, &interval); + if (ret == 0) + cmd_profile_volume_brick_out(dict, i, interval); } - - ret = dict_get_int32 (dict, "info-op", (int32_t*)&info_op); - if (ret) - goto out; - - ret = dict_get_int32 (dict, "count", &brick_count); - if (ret) - goto out; - - if (!brick_count) { - cli_err ("All bricks of volume %s are down.", volname); - goto out; - } - - while (i <= brick_count) { - snprintf (key, sizeof (key), "%d-brick", i); - ret = dict_get_str (dict, key, &brick); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Couldn't get brick name"); - goto out; - } - - ret = dict_get_str_boolean (dict, "nfs", _gf_false); - - if (ret) - snprintf (str, sizeof (str), "NFS Server : %s", brick); - else - snprintf (str, sizeof (str), "Brick: %s", brick); - cli_out ("%s", str); - memset (str, '-', strlen (str)); - cli_out ("%s", str); - - if (GF_CLI_INFO_CLEAR == info_op) { - snprintf (key, sizeof (key), "%d-stats-cleared", i); - ret = dict_get_int32 (dict, key, &stats_cleared); - if (ret) - goto out; - cli_out (stats_cleared ? "Cleared stats." : - "Failed to clear stats."); - } else { - snprintf (key, sizeof (key), "%d-cumulative", i); - ret = dict_get_int32 (dict, key, &interval); - if (ret == 0) - cmd_profile_volume_brick_out (dict, i, - interval); - - snprintf (key, sizeof (key), "%d-interval", i); - ret = dict_get_int32 (dict, key, &interval); - if (ret == 0) - cmd_profile_volume_brick_out (dict, i, - interval); - } - i++; - } - ret = rsp.op_ret; + i++; + } + ret = rsp.op_ret; out: - if (dict) - dict_unref (dict); - free (rsp.op_errstr); - cli_cmd_broadcast_response (ret); - return ret; + if (dict) + dict_unref(dict); + free(rsp.op_errstr); + cli_cmd_broadcast_response(ret); + return ret; } int32_t -gf_cli_profile_volume (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_profile_volume(call_frame_t *frame, xlator_t *this, void *data) { - int ret = -1; - gf_cli_req req = {{0,}}; - dict_t *dict = NULL; + int ret = -1; + gf_cli_req req = {{ + 0, + }}; + dict_t *dict = NULL; - GF_ASSERT (frame); - GF_ASSERT (this); - GF_ASSERT (data); + GF_ASSERT(frame); + GF_ASSERT(this); + GF_ASSERT(data); - if (!frame || !this || !data) - goto out; - dict = data; + if (!frame || !this || !data) + goto out; + dict = data; - 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); + 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); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); - return ret; + GF_FREE(req.dict.dict_val); + return ret; } int32_t -gf_cli_top_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - dict_t *dict = NULL; - gf1_cli_stats_op op = GF_CLI_STATS_NONE; - char key[256] = {0}; - int i = 0; - int32_t brick_count = 0; - char brick[1024]; - int32_t members = 0; - char *filename; - char *bricks; - uint64_t value = 0; - int32_t j = 0; - gf1_cli_top_op top_op = GF_CLI_TOP_NONE; - uint64_t nr_open = 0; - uint64_t max_nr_open = 0; - double throughput = 0; - double time = 0; - int32_t time_sec = 0; - long int time_usec = 0; - char timestr[256] = {0, }; - char *openfd_str = NULL; - gf_boolean_t nfs = _gf_false; - gf_boolean_t clear_stats = _gf_false; - int stats_cleared = 0; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } +gf_cli_top_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; + gf1_cli_stats_op op = GF_CLI_STATS_NONE; + char key[256] = {0}; + int i = 0; + int32_t brick_count = 0; + char brick[1024]; + int32_t members = 0; + char *filename; + char *bricks; + uint64_t value = 0; + int32_t j = 0; + gf1_cli_top_op top_op = GF_CLI_TOP_NONE; + uint64_t nr_open = 0; + uint64_t max_nr_open = 0; + double throughput = 0; + double time = 0; + int32_t time_sec = 0; + long int time_usec = 0; + char timestr[256] = { + 0, + }; + char *openfd_str = NULL; + gf_boolean_t nfs = _gf_false; + gf_boolean_t clear_stats = _gf_false; + int stats_cleared = 0; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + gf_log("cli", GF_LOG_DEBUG, "Received resp to top"); + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + if (rsp.op_ret) { + if (strcmp(rsp.op_errstr, "")) + cli_err("%s", rsp.op_errstr); + cli_err("volume top unsuccessful"); + ret = rsp.op_ret; + goto out; + } - gf_log ("cli", GF_LOG_DEBUG, "Received resp to top"); - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + dict = dict_new(); - if (rsp.op_ret) { - if (strcmp (rsp.op_errstr, "")) - cli_err ("%s", rsp.op_errstr); - cli_err ("volume top unsuccessful"); - ret = rsp.op_ret; - goto out; - } + if (!dict) { + ret = -1; + goto out; + } - dict = dict_new (); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); - if (!dict) { - ret = -1; - goto out; - } + if (ret) { + gf_log("", GF_LOG_ERROR, "Unable to allocate memory"); + goto out; + } - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); + ret = dict_get_int32(dict, "op", (int32_t *)&op); + if (op != GF_CLI_STATS_TOP) { + ret = 0; + goto out; + } + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_top(dict, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); if (ret) { - gf_log ("", GF_LOG_ERROR, - "Unable to allocate memory"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); } + goto out; + } - ret = dict_get_int32 (dict, "op", (int32_t*)&op); + ret = dict_get_int32(dict, "count", &brick_count); + if (ret) + goto out; + snprintf(key, sizeof(key), "%d-top-op", 1); + ret = dict_get_int32(dict, key, (int32_t *)&top_op); + if (ret) + goto out; - if (op != GF_CLI_STATS_TOP) { - ret = 0; + clear_stats = dict_get_str_boolean(dict, "clear-stats", _gf_false); + + while (i < brick_count) { + i++; + snprintf(brick, sizeof(brick), "%d-brick", i); + ret = dict_get_str(dict, brick, &bricks); + if (ret) + goto out; + + nfs = dict_get_str_boolean(dict, "nfs", _gf_false); + + if (clear_stats) { + snprintf(key, sizeof(key), "%d-stats-cleared", i); + ret = dict_get_int32(dict, key, &stats_cleared); + if (ret) goto out; + cli_out(stats_cleared ? "Cleared stats for %s %s" + : "Failed to clear stats for %s %s", + nfs ? "NFS server on" : "brick", bricks); + continue; } - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_top (dict, rsp.op_ret, - rsp.op_errno, - rsp.op_errstr); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); + if (nfs) + cli_out("NFS Server : %s", bricks); + else + cli_out("Brick: %s", bricks); + + snprintf(key, sizeof(key), "%d-members", i); + ret = dict_get_int32(dict, key, &members); + + switch (top_op) { + case GF_CLI_TOP_OPEN: + snprintf(key, sizeof(key), "%d-current-open", i); + ret = dict_get_uint64(dict, key, &nr_open); + if (ret) + break; + snprintf(key, sizeof(key), "%d-max-open", i); + ret = dict_get_uint64(dict, key, &max_nr_open); + if (ret) + goto out; + snprintf(key, sizeof(key), "%d-max-openfd-time", i); + ret = dict_get_str(dict, key, &openfd_str); + if (ret) + goto out; + cli_out("Current open fds: %" PRIu64 + ", Max open" + " fds: %" PRIu64 ", Max openfd time: %s", + nr_open, max_nr_open, openfd_str); + case GF_CLI_TOP_READ: + case GF_CLI_TOP_WRITE: + case GF_CLI_TOP_OPENDIR: + case GF_CLI_TOP_READDIR: + if (!members) { + continue; + } + cli_out("Count\t\tfilename\n======================="); + break; + case GF_CLI_TOP_READ_PERF: + case GF_CLI_TOP_WRITE_PERF: + snprintf(key, sizeof(key), "%d-throughput", i); + ret = dict_get_double(dict, key, &throughput); + if (!ret) { + snprintf(key, sizeof(key), "%d-time", i); + ret = dict_get_double(dict, key, &time); } + if (!ret) + cli_out("Throughput %.2f MBps time %.4f secs", throughput, + time / 1e6); + + if (!members) { + continue; + } + cli_out("%*s %-*s %-*s", VOL_TOP_PERF_SPEED_WIDTH, "MBps", + VOL_TOP_PERF_FILENAME_DEF_WIDTH, "Filename", + VOL_TOP_PERF_TIME_WIDTH, "Time"); + cli_out("%*s %-*s %-*s", VOL_TOP_PERF_SPEED_WIDTH, + "====", VOL_TOP_PERF_FILENAME_DEF_WIDTH, + "========", VOL_TOP_PERF_TIME_WIDTH, "===="); + break; + default: goto out; } - ret = dict_get_int32 (dict, "count", &brick_count); - if (ret) - goto out; - snprintf (key, sizeof (key), "%d-top-op", 1); - ret = dict_get_int32 (dict, key, (int32_t*)&top_op); - if (ret) - goto out; - - clear_stats = dict_get_str_boolean (dict, "clear-stats", _gf_false); - - while (i < brick_count) { - i++; - snprintf (brick, sizeof (brick), "%d-brick", i); - ret = dict_get_str (dict, brick, &bricks); - if (ret) - goto out; - - nfs = dict_get_str_boolean (dict, "nfs", _gf_false); - - if (clear_stats) { - snprintf (key, sizeof (key), "%d-stats-cleared", i); - ret = dict_get_int32 (dict, key, &stats_cleared); - if (ret) - goto out; - cli_out (stats_cleared ? "Cleared stats for %s %s" : - "Failed to clear stats for %s %s", - nfs ? "NFS server on" : "brick", bricks); - continue; - } - - if (nfs) - cli_out ("NFS Server : %s", bricks); + for (j = 1; j <= members; j++) { + snprintf(key, sizeof(key), "%d-filename-%d", i, j); + ret = dict_get_str(dict, key, &filename); + if (ret) + break; + snprintf(key, sizeof(key), "%d-value-%d", i, j); + ret = dict_get_uint64(dict, key, &value); + if (ret) + goto out; + if (top_op == GF_CLI_TOP_READ_PERF || + top_op == GF_CLI_TOP_WRITE_PERF) { + snprintf(key, sizeof(key), "%d-time-sec-%d", i, j); + ret = dict_get_int32(dict, key, (int32_t *)&time_sec); + if (ret) + goto out; + snprintf(key, sizeof(key), "%d-time-usec-%d", i, j); + ret = dict_get_int32(dict, key, (int32_t *)&time_usec); + if (ret) + goto out; + gf_time_fmt(timestr, sizeof timestr, time_sec, gf_timefmt_FT); + snprintf(timestr + strlen(timestr), + sizeof timestr - strlen(timestr), ".%ld", time_usec); + if (strlen(filename) < VOL_TOP_PERF_FILENAME_DEF_WIDTH) + cli_out("%*" PRIu64 " %-*s %-*s", VOL_TOP_PERF_SPEED_WIDTH, + value, VOL_TOP_PERF_FILENAME_DEF_WIDTH, filename, + VOL_TOP_PERF_TIME_WIDTH, timestr); else - cli_out ("Brick: %s", bricks); - - snprintf(key, sizeof (key), "%d-members", i); - ret = dict_get_int32 (dict, key, &members); - - switch (top_op) { - case GF_CLI_TOP_OPEN: - snprintf (key, sizeof (key), "%d-current-open", i); - ret = dict_get_uint64 (dict, key, &nr_open); - if (ret) - break; - snprintf (key, sizeof (key), "%d-max-open", i); - ret = dict_get_uint64 (dict, key, &max_nr_open); - if (ret) - goto out; - snprintf (key, sizeof (key), "%d-max-openfd-time", i); - ret = dict_get_str (dict, key, &openfd_str); - if (ret) - goto out; - cli_out ("Current open fds: %"PRIu64", Max open" - " fds: %"PRIu64", Max openfd time: %s", nr_open, - max_nr_open, openfd_str); - case GF_CLI_TOP_READ: - case GF_CLI_TOP_WRITE: - case GF_CLI_TOP_OPENDIR: - case GF_CLI_TOP_READDIR: - if (!members) { - continue; - } - cli_out ("Count\t\tfilename\n======================="); - break; - case GF_CLI_TOP_READ_PERF: - case GF_CLI_TOP_WRITE_PERF: - snprintf (key, sizeof (key), "%d-throughput", i); - ret = dict_get_double (dict, key, &throughput); - if (!ret) { - snprintf (key, sizeof (key), "%d-time", i); - ret = dict_get_double (dict, key, &time); - } - if (!ret) - cli_out ("Throughput %.2f MBps time %.4f secs", throughput, - time / 1e6); - - if (!members) { - continue; - } - cli_out ("%*s %-*s %-*s", - VOL_TOP_PERF_SPEED_WIDTH, "MBps", - VOL_TOP_PERF_FILENAME_DEF_WIDTH, "Filename", - VOL_TOP_PERF_TIME_WIDTH, "Time"); - cli_out ("%*s %-*s %-*s", - VOL_TOP_PERF_SPEED_WIDTH, "====", - VOL_TOP_PERF_FILENAME_DEF_WIDTH, "========", - VOL_TOP_PERF_TIME_WIDTH, "===="); - break; - default: - goto out; - } - - for (j = 1; j <= members; j++) { - snprintf (key, sizeof (key), "%d-filename-%d", i, j); - ret = dict_get_str (dict, key, &filename); - if (ret) - break; - snprintf (key, sizeof (key), "%d-value-%d", i, j); - ret = dict_get_uint64 (dict, key, &value); - if (ret) - goto out; - if ( top_op == GF_CLI_TOP_READ_PERF || - top_op == GF_CLI_TOP_WRITE_PERF) { - snprintf (key, sizeof (key), "%d-time-sec-%d", i, j); - ret = dict_get_int32 (dict, key, (int32_t *)&time_sec); - if (ret) - goto out; - snprintf (key, sizeof (key), "%d-time-usec-%d", i, j); - ret = dict_get_int32 (dict, key, (int32_t *)&time_usec); - if (ret) - goto out; - gf_time_fmt (timestr, sizeof timestr, - time_sec, gf_timefmt_FT); - snprintf (timestr + strlen (timestr), sizeof timestr - strlen (timestr), - ".%ld", time_usec); - if (strlen (filename) < VOL_TOP_PERF_FILENAME_DEF_WIDTH) - cli_out ("%*"PRIu64" %-*s %-*s", - VOL_TOP_PERF_SPEED_WIDTH, - value, - VOL_TOP_PERF_FILENAME_DEF_WIDTH, - filename, - VOL_TOP_PERF_TIME_WIDTH, - timestr); - else - cli_out ("%*"PRIu64" ...%-*s %-*s", - VOL_TOP_PERF_SPEED_WIDTH, - value, - VOL_TOP_PERF_FILENAME_ALT_WIDTH , - filename + strlen (filename) - - VOL_TOP_PERF_FILENAME_ALT_WIDTH, - VOL_TOP_PERF_TIME_WIDTH, - timestr); - } else { - cli_out ("%"PRIu64"\t\t%s", value, filename); - } - } + cli_out("%*" PRIu64 " ...%-*s %-*s", + VOL_TOP_PERF_SPEED_WIDTH, value, + VOL_TOP_PERF_FILENAME_ALT_WIDTH, + filename + strlen(filename) - + VOL_TOP_PERF_FILENAME_ALT_WIDTH, + VOL_TOP_PERF_TIME_WIDTH, timestr); + } else { + cli_out("%" PRIu64 "\t\t%s", value, filename); + } } - ret = rsp.op_ret; + } + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); + cli_cmd_broadcast_response(ret); - if (dict) - dict_unref (dict); + if (dict) + dict_unref(dict); - free (rsp.dict.dict_val); - return ret; + free(rsp.dict.dict_val); + return ret; } int32_t -gf_cli_top_volume (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_top_volume(call_frame_t *frame, xlator_t *this, void *data) { - int ret = -1; - gf_cli_req req = {{0,}}; - dict_t *dict = NULL; + int ret = -1; + gf_cli_req req = {{ + 0, + }}; + dict_t *dict = NULL; - GF_ASSERT (frame); - GF_ASSERT (this); - GF_ASSERT (data); + GF_ASSERT(frame); + GF_ASSERT(this); + GF_ASSERT(data); - if (!frame || !this || !data) - goto out; - dict = data; + if (!frame || !this || !data) + goto out; + dict = data; - 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); + 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); - GF_FREE (req.dict.dict_val); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + GF_FREE(req.dict.dict_val); + return ret; } - int -gf_cli_getwd_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_getwd_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - gf1_cli_getwd_rsp rsp = {0,}; - int ret = -1; + gf1_cli_getwd_rsp rsp = { + 0, + }; + int ret = -1; - GF_ASSERT (myframe); + GF_ASSERT(myframe); - if (-1 == req->rpc_status) { - goto out; - } + if (-1 == req->rpc_status) { + goto out; + } - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf1_cli_getwd_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf1_cli_getwd_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - if (rsp.op_ret == -1) { - cli_err ("getwd failed"); - ret = rsp.op_ret; - goto out; - } + if (rsp.op_ret == -1) { + cli_err("getwd failed"); + ret = rsp.op_ret; + goto out; + } - gf_log ("cli", GF_LOG_INFO, "Received resp to getwd"); + gf_log("cli", GF_LOG_INFO, "Received resp to getwd"); - cli_out ("%s", rsp.wd); + cli_out("%s", rsp.wd); - ret = 0; + ret = 0; out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } int32_t -gf_cli_getwd (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_getwd(call_frame_t *frame, xlator_t *this, void *data) { - int ret = -1; - gf1_cli_getwd_req req = {0,}; + int ret = -1; + gf1_cli_getwd_req req = { + 0, + }; - GF_ASSERT (frame); - GF_ASSERT (this); + GF_ASSERT(frame); + GF_ASSERT(this); - if (!frame || !this) - goto out; + if (!frame || !this) + goto out; - ret = cli_cmd_submit (NULL, &req, frame, cli_rpc_prog, - GLUSTER_CLI_GETWD, NULL, - this, gf_cli_getwd_cbk, - (xdrproc_t) xdr_gf1_cli_getwd_req); + ret = cli_cmd_submit(NULL, &req, frame, cli_rpc_prog, GLUSTER_CLI_GETWD, + NULL, this, gf_cli_getwd_cbk, + (xdrproc_t)xdr_gf1_cli_getwd_req); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + return ret; } void -cli_print_volume_status_mempool (dict_t *dict, char *prefix) -{ - int ret = -1; - int32_t mempool_count = 0; - char *name = NULL; - int32_t hotcount = 0; - int32_t coldcount = 0; - uint64_t paddedsizeof = 0; - uint64_t alloccount = 0; - int32_t maxalloc = 0; - uint64_t pool_misses = 0; - int32_t maxstdalloc = 0; - char key[1024] = {0,}; - int i = 0; - - GF_ASSERT (dict); - GF_ASSERT (prefix); - - snprintf (key, sizeof (key), "%s.mempool-count",prefix); - ret = dict_get_int32 (dict, key, &mempool_count); +cli_print_volume_status_mempool(dict_t *dict, char *prefix) +{ + int ret = -1; + int32_t mempool_count = 0; + char *name = NULL; + int32_t hotcount = 0; + int32_t coldcount = 0; + uint64_t paddedsizeof = 0; + uint64_t alloccount = 0; + int32_t maxalloc = 0; + uint64_t pool_misses = 0; + int32_t maxstdalloc = 0; + char key[1024] = { + 0, + }; + int i = 0; + + GF_ASSERT(dict); + GF_ASSERT(prefix); + + snprintf(key, sizeof(key), "%s.mempool-count", prefix); + ret = dict_get_int32(dict, key, &mempool_count); + if (ret) + goto out; + + cli_out("Mempool Stats\n-------------"); + cli_out("%-30s %9s %9s %12s %10s %8s %8s %12s", "Name", "HotCount", + "ColdCount", "PaddedSizeof", "AllocCount", "MaxAlloc", "Misses", + "Max-StdAlloc"); + cli_out("%-30s %9s %9s %12s %10s %8s %8s %12s", "----", "--------", + "---------", "------------", "----------", "--------", "--------", + "------------"); + + for (i = 0; i < mempool_count; i++) { + snprintf(key, sizeof(key), "%s.pool%d.name", prefix, i); + ret = dict_get_str(dict, key, &name); if (ret) - goto out; + goto out; - cli_out ("Mempool Stats\n-------------"); - cli_out ("%-30s %9s %9s %12s %10s %8s %8s %12s", "Name", "HotCount", - "ColdCount", "PaddedSizeof", "AllocCount", "MaxAlloc", - "Misses", "Max-StdAlloc"); - cli_out ("%-30s %9s %9s %12s %10s %8s %8s %12s", "----", "--------", - "---------", "------------", "----------", - "--------", "--------", "------------"); - - for (i = 0; i < mempool_count; i++) { - snprintf (key, sizeof (key), "%s.pool%d.name", prefix, i); - ret = dict_get_str (dict, key, &name); - if (ret) - goto out; - - snprintf (key, sizeof (key), "%s.pool%d.hotcount", prefix, i); - ret = dict_get_int32 (dict, key, &hotcount); - if (ret) - goto out; + snprintf(key, sizeof(key), "%s.pool%d.hotcount", prefix, i); + ret = dict_get_int32(dict, key, &hotcount); + if (ret) + goto out; - snprintf (key, sizeof (key), "%s.pool%d.coldcount", prefix, i); - ret = dict_get_int32 (dict, key, &coldcount); - if (ret) - goto out; + snprintf(key, sizeof(key), "%s.pool%d.coldcount", prefix, i); + ret = dict_get_int32(dict, key, &coldcount); + if (ret) + goto out; - snprintf (key, sizeof (key), "%s.pool%d.paddedsizeof", - prefix, i); - ret = dict_get_uint64 (dict, key, &paddedsizeof); - if (ret) - goto out; + snprintf(key, sizeof(key), "%s.pool%d.paddedsizeof", prefix, i); + ret = dict_get_uint64(dict, key, &paddedsizeof); + if (ret) + goto out; - snprintf (key, sizeof (key), "%s.pool%d.alloccount", prefix, i); - ret = dict_get_uint64 (dict, key, &alloccount); - if (ret) - goto out; + snprintf(key, sizeof(key), "%s.pool%d.alloccount", prefix, i); + ret = dict_get_uint64(dict, key, &alloccount); + if (ret) + goto out; - snprintf (key, sizeof (key), "%s.pool%d.max_alloc", prefix, i); - ret = dict_get_int32 (dict, key, &maxalloc); - if (ret) - goto out; + snprintf(key, sizeof(key), "%s.pool%d.max_alloc", prefix, i); + ret = dict_get_int32(dict, key, &maxalloc); + if (ret) + goto out; - snprintf (key, sizeof (key), "%s.pool%d.max-stdalloc", prefix, i); - ret = dict_get_int32 (dict, key, &maxstdalloc); - if (ret) - goto out; + snprintf(key, sizeof(key), "%s.pool%d.max-stdalloc", prefix, i); + ret = dict_get_int32(dict, key, &maxstdalloc); + if (ret) + goto out; - snprintf (key, sizeof (key), "%s.pool%d.pool-misses", prefix, i); - ret = dict_get_uint64 (dict, key, &pool_misses); - if (ret) - goto out; + snprintf(key, sizeof(key), "%s.pool%d.pool-misses", prefix, i); + ret = dict_get_uint64(dict, key, &pool_misses); + if (ret) + goto out; - cli_out ("%-30s %9d %9d %12"PRIu64" %10"PRIu64" %8d %8"PRIu64 - " %12d", name, hotcount, coldcount, paddedsizeof, - alloccount, maxalloc, pool_misses, maxstdalloc); - } + cli_out("%-30s %9d %9d %12" PRIu64 " %10" PRIu64 " %8d %8" PRIu64 + " %12d", + name, hotcount, coldcount, paddedsizeof, alloccount, maxalloc, + pool_misses, maxstdalloc); + } out: - return; - + return; } void -cli_print_volume_status_mem (dict_t *dict, gf_boolean_t notbrick) -{ - int ret = -1; - char *volname = NULL; - char *hostname = NULL; - char *path = NULL; - int online = -1; - char key[1024] = {0,}; - int brick_index_max = -1; - int other_count = 0; - int index_max = 0; - int val = 0; - int i = 0; - - GF_ASSERT (dict); - - ret = dict_get_str (dict, "volname", &volname); +cli_print_volume_status_mem(dict_t *dict, gf_boolean_t notbrick) +{ + int ret = -1; + char *volname = NULL; + char *hostname = NULL; + char *path = NULL; + int online = -1; + char key[1024] = { + 0, + }; + int brick_index_max = -1; + int other_count = 0; + int index_max = 0; + int val = 0; + int i = 0; + + GF_ASSERT(dict); + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + cli_out("Memory status for volume : %s", volname); + + ret = dict_get_int32(dict, "brick-index-max", &brick_index_max); + if (ret) + goto out; + ret = dict_get_int32(dict, "other-count", &other_count); + if (ret) + goto out; + + index_max = brick_index_max + other_count; + + for (i = 0; i <= index_max; i++) { + cli_out("----------------------------------------------"); + + snprintf(key, sizeof(key), "brick%d.hostname", i); + ret = dict_get_str(dict, key, &hostname); if (ret) - goto out; - cli_out ("Memory status for volume : %s", volname); - - ret = dict_get_int32 (dict, "brick-index-max", &brick_index_max); + continue; + snprintf(key, sizeof(key), "brick%d.path", i); + ret = dict_get_str(dict, key, &path); if (ret) - goto out; - ret = dict_get_int32 (dict, "other-count", &other_count); - if (ret) - goto out; - - index_max = brick_index_max + other_count; - - for (i = 0; i <= index_max; i++) { - cli_out ("----------------------------------------------"); - - snprintf (key, sizeof (key), "brick%d.hostname", i); - ret = dict_get_str (dict, key, &hostname); - if (ret) - continue; - snprintf (key, sizeof (key), "brick%d.path", i); - ret = dict_get_str (dict, key, &path); - if (ret) - continue; - if (notbrick) - cli_out ("%s : %s", hostname, path); - else - cli_out ("Brick : %s:%s", hostname, path); - - snprintf (key, sizeof (key), "brick%d.status", i); - ret = dict_get_int32 (dict, key, &online); - if (ret) - goto out; - if (!online) { - if (notbrick) - cli_out ("%s is offline", hostname); - else - cli_out ("Brick is offline"); - continue; - } - - cli_out ("Mallinfo\n--------"); - - snprintf (key, sizeof (key), "brick%d.mallinfo.arena", i); - ret = dict_get_int32 (dict, key, &val); - if (ret) - goto out; - cli_out ("%-8s : %d","Arena", val); - - snprintf (key, sizeof (key), "brick%d.mallinfo.ordblks", i); - ret = dict_get_int32 (dict, key, &val); - if(ret) - goto out; - cli_out ("%-8s : %d","Ordblks", val); - - snprintf (key, sizeof (key), "brick%d.mallinfo.smblks", i); - ret = dict_get_int32 (dict, key, &val); - if(ret) - goto out; - cli_out ("%-8s : %d","Smblks", val); - - snprintf (key, sizeof (key), "brick%d.mallinfo.hblks", i); - ret = dict_get_int32 (dict, key, &val); - if(ret) - goto out; - cli_out ("%-8s : %d", "Hblks", val); - - snprintf (key, sizeof (key), "brick%d.mallinfo.hblkhd", i); - ret = dict_get_int32 (dict, key, &val); - if (ret) - goto out; - cli_out ("%-8s : %d", "Hblkhd", val); - - snprintf (key, sizeof (key), "brick%d.mallinfo.usmblks", i); - ret = dict_get_int32 (dict, key, &val); - if (ret) - goto out; - cli_out ("%-8s : %d", "Usmblks", val); - - snprintf (key, sizeof (key), "brick%d.mallinfo.fsmblks", i); - ret = dict_get_int32 (dict, key, &val); - if (ret) - goto out; - cli_out ("%-8s : %d", "Fsmblks", val); - - snprintf (key, sizeof (key), "brick%d.mallinfo.uordblks", i); - ret = dict_get_int32 (dict, key, &val); - if (ret) - goto out; - cli_out ("%-8s : %d", "Uordblks", val); - - snprintf (key, sizeof (key), "brick%d.mallinfo.fordblks", i); - ret = dict_get_int32 (dict, key, &val); - if (ret) - goto out; - cli_out ("%-8s : %d", "Fordblks", val); - - snprintf (key, sizeof (key), "brick%d.mallinfo.keepcost", i); - ret = dict_get_int32 (dict, key, &val); - if (ret) - goto out; - cli_out ("%-8s : %d", "Keepcost", val); + continue; + if (notbrick) + cli_out("%s : %s", hostname, path); + else + cli_out("Brick : %s:%s", hostname, path); - cli_out (" "); - snprintf (key, sizeof (key), "brick%d", i); - cli_print_volume_status_mempool (dict, key); + snprintf(key, sizeof(key), "brick%d.status", i); + ret = dict_get_int32(dict, key, &online); + if (ret) + goto out; + if (!online) { + if (notbrick) + cli_out("%s is offline", hostname); + else + cli_out("Brick is offline"); + continue; } -out: - cli_out ("----------------------------------------------\n"); - return; -} -void -cli_print_volume_status_client_list (dict_t *dict, gf_boolean_t notbrick) -{ - int ret = -1; - char *volname = NULL; - int client_count = 0; - int current_count = 0; - char key[1024] = {0,}; - int i = 0; - int total = 0; - char *name = NULL; - gf_boolean_t is_fuse_done = _gf_false; - gf_boolean_t is_gfapi_done = _gf_false; - gf_boolean_t is_tierd_done = _gf_false; - gf_boolean_t is_rebalance_done = _gf_false; - gf_boolean_t is_glustershd_done = _gf_false; - gf_boolean_t is_quotad_done = _gf_false; - gf_boolean_t is_snapd_done = _gf_false; - - GF_ASSERT (dict); - - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; - cli_out ("Client connections for volume %s", volname); + cli_out("Mallinfo\n--------"); - ret = dict_get_int32 (dict, "client-count", &client_count); + snprintf(key, sizeof(key), "brick%d.mallinfo.arena", i); + ret = dict_get_int32(dict, key, &val); if (ret) - goto out; + goto out; + cli_out("%-8s : %d", "Arena", val); - cli_out ("%-48s %15s", "Name", "count"); - cli_out ("%-48s %15s", "-----", "------"); - for (i = 0; i < client_count; i++) { - name = NULL; - snprintf (key, sizeof (key), - "client%d.name", i); - ret = dict_get_str (dict, key, &name); - - if (!strncmp (name, "fuse", 4)) { - if (!is_fuse_done) { - is_fuse_done = _gf_true; - ret = dict_get_int32 (dict, - "fuse-count", - ¤t_count); - if (ret) - goto out; - total = total + current_count; - goto print; - } - continue; - } else if (!strncmp (name, "gfapi", 5)) { - if (!is_gfapi_done) { - is_gfapi_done = _gf_true; - ret = dict_get_int32 (dict, - "gfapi-count", - ¤t_count); - if (ret) - goto out; - total = total + current_count; - goto print; - } - continue; - } else if (!strcmp(name, "tierd")) { - if (!is_tierd_done) { - is_tierd_done = _gf_true; - ret = dict_get_int32 (dict, - "tierd-count", - ¤t_count); - if (ret) - goto out; - total = total + current_count; - goto print; - } - continue; - } else if (!strcmp(name, "rebalance")) { - if (!is_rebalance_done) { - is_rebalance_done = _gf_true; - ret = dict_get_int32 (dict, - "rebalance-count", - ¤t_count); - if (ret) - goto out; - total = total + current_count; - goto print; - } - continue; - } else if (!strcmp(name, "glustershd")) { - if (!is_glustershd_done) { - is_glustershd_done = _gf_true; - ret = dict_get_int32 (dict, - "glustershd-count", - ¤t_count); - if (ret) - goto out; - total = total + current_count; - goto print; - } - continue; - } else if (!strcmp(name, "quotad")) { - if (!is_quotad_done) { - is_quotad_done = _gf_true; - ret = dict_get_int32 (dict, - "quotad-count", - ¤t_count); - if (ret) - goto out; - total = total + current_count; - goto print; - } - continue; - } else if (!strcmp(name, "snapd")) { - if (!is_snapd_done) { - is_snapd_done = _gf_true; - ret = dict_get_int32 (dict, - "snapd-count", - ¤t_count); - if (ret) - goto out; - total = total + current_count; - goto print; - } - continue; - } - -print: - cli_out ("%-48s %15d", name, current_count); - - } -out: - cli_out ("\ntotal clients for volume %s : %d ", volname, total); - cli_out ("-----------------------------------------------------------------\n"); - return; -} - -void -cli_print_volume_status_clients (dict_t *dict, gf_boolean_t notbrick) -{ - int ret = -1; - char *volname = NULL; - int brick_index_max = -1; - int other_count = 0; - int index_max = 0; - char *hostname = NULL; - char *path = NULL; - int online = -1; - int client_count = 0; - char *clientname = NULL; - uint64_t bytesread = 0; - uint64_t byteswrite = 0; - uint32_t opversion = 0; - char key[1024] = {0,}; - int i = 0; - int j = 0; - - GF_ASSERT (dict); - - ret = dict_get_str (dict, "volname", &volname); + snprintf(key, sizeof(key), "brick%d.mallinfo.ordblks", i); + ret = dict_get_int32(dict, key, &val); if (ret) - goto out; - cli_out ("Client connections for volume %s", volname); + goto out; + cli_out("%-8s : %d", "Ordblks", val); - ret = dict_get_int32 (dict, "brick-index-max", &brick_index_max); + snprintf(key, sizeof(key), "brick%d.mallinfo.smblks", i); + ret = dict_get_int32(dict, key, &val); if (ret) - goto out; - ret = dict_get_int32 (dict, "other-count", &other_count); + goto out; + cli_out("%-8s : %d", "Smblks", val); + + snprintf(key, sizeof(key), "brick%d.mallinfo.hblks", i); + ret = dict_get_int32(dict, key, &val); if (ret) - goto out; + goto out; + cli_out("%-8s : %d", "Hblks", val); - index_max = brick_index_max + other_count; + snprintf(key, sizeof(key), "brick%d.mallinfo.hblkhd", i); + ret = dict_get_int32(dict, key, &val); + if (ret) + goto out; + cli_out("%-8s : %d", "Hblkhd", val); - for (i = 0; i <= index_max; i++) { - hostname = NULL; - path = NULL; - online = -1; - client_count = 0; - clientname = NULL; - bytesread = 0; - byteswrite = 0; + snprintf(key, sizeof(key), "brick%d.mallinfo.usmblks", i); + ret = dict_get_int32(dict, key, &val); + if (ret) + goto out; + cli_out("%-8s : %d", "Usmblks", val); - cli_out ("----------------------------------------------"); + snprintf(key, sizeof(key), "brick%d.mallinfo.fsmblks", i); + ret = dict_get_int32(dict, key, &val); + if (ret) + goto out; + cli_out("%-8s : %d", "Fsmblks", val); - snprintf (key, sizeof (key), "brick%d.hostname", i); - ret = dict_get_str (dict, key, &hostname); + snprintf(key, sizeof(key), "brick%d.mallinfo.uordblks", i); + ret = dict_get_int32(dict, key, &val); + if (ret) + goto out; + cli_out("%-8s : %d", "Uordblks", val); - snprintf (key, sizeof (key), "brick%d.path", i); - ret = dict_get_str (dict, key, &path); + snprintf(key, sizeof(key), "brick%d.mallinfo.fordblks", i); + ret = dict_get_int32(dict, key, &val); + if (ret) + goto out; + cli_out("%-8s : %d", "Fordblks", val); - if (hostname && path) { - if (notbrick) - cli_out ("%s : %s", hostname, path); - else - cli_out ("Brick : %s:%s", hostname, path); - } - snprintf (key, sizeof (key), "brick%d.status", i); - ret = dict_get_int32 (dict, key, &online); - if (!online) { - if (notbrick) - cli_out ("%s is offline", hostname); - else - cli_out ("Brick is offline"); - continue; - } + snprintf(key, sizeof(key), "brick%d.mallinfo.keepcost", i); + ret = dict_get_int32(dict, key, &val); + if (ret) + goto out; + cli_out("%-8s : %d", "Keepcost", val); - snprintf (key, sizeof (key), "brick%d.clientcount", i); - ret = dict_get_int32 (dict, key, &client_count); - - if (hostname && path) - cli_out ("Clients connected : %d", client_count); - if (client_count == 0) - continue; - - cli_out ("%-48s %15s %15s %15s", "Hostname", "BytesRead", - "BytesWritten", "OpVersion"); - cli_out ("%-48s %15s %15s %15s", "--------", "---------", - "------------", "---------"); - for (j =0; j < client_count; j++) { - snprintf (key, sizeof (key), - "brick%d.client%d.hostname", i, j); - ret = dict_get_str (dict, key, &clientname); - - snprintf (key, sizeof (key), - "brick%d.client%d.bytesread", i, j); - ret = dict_get_uint64 (dict, key, &bytesread); - - snprintf (key, sizeof (key), - "brick%d.client%d.byteswrite", i, j); - ret = dict_get_uint64 (dict, key, &byteswrite); - - snprintf (key, sizeof (key), - "brick%d.client%d.opversion", i, j); - ret = dict_get_uint32 (dict, key, &opversion); - - cli_out ("%-48s %15"PRIu64" %15"PRIu64" %15"PRIu32, - clientname, bytesread, byteswrite, - opversion); - } - } + cli_out(" "); + snprintf(key, sizeof(key), "brick%d", i); + cli_print_volume_status_mempool(dict, key); + } out: - cli_out ("----------------------------------------------\n"); - return; + cli_out("----------------------------------------------\n"); + return; } void -cli_print_volume_status_inode_entry (dict_t *dict, char *prefix) -{ - int ret = -1; - char key[1024] = {0,}; - char *gfid = NULL; - uint64_t nlookup = 0; - uint32_t ref = 0; - int ia_type = 0; - char inode_type; - - GF_ASSERT (dict); - GF_ASSERT (prefix); - - snprintf (key, sizeof (key), "%s.gfid", prefix); - ret = dict_get_str (dict, key, &gfid); - if (ret) - goto out; - - snprintf (key, sizeof (key), "%s.nlookup", prefix); - ret = dict_get_uint64 (dict, key, &nlookup); - if (ret) - goto out; - - snprintf (key, sizeof (key), "%s.ref", prefix); - ret = dict_get_uint32 (dict, key, &ref); - if (ret) - goto out; +cli_print_volume_status_client_list(dict_t *dict, gf_boolean_t notbrick) +{ + int ret = -1; + char *volname = NULL; + int client_count = 0; + int current_count = 0; + char key[1024] = { + 0, + }; + int i = 0; + int total = 0; + char *name = NULL; + gf_boolean_t is_fuse_done = _gf_false; + gf_boolean_t is_gfapi_done = _gf_false; + gf_boolean_t is_tierd_done = _gf_false; + gf_boolean_t is_rebalance_done = _gf_false; + gf_boolean_t is_glustershd_done = _gf_false; + gf_boolean_t is_quotad_done = _gf_false; + gf_boolean_t is_snapd_done = _gf_false; + + GF_ASSERT(dict); + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + cli_out("Client connections for volume %s", volname); + + ret = dict_get_int32(dict, "client-count", &client_count); + if (ret) + goto out; + + cli_out("%-48s %15s", "Name", "count"); + cli_out("%-48s %15s", "-----", "------"); + for (i = 0; i < client_count; i++) { + name = NULL; + snprintf(key, sizeof(key), "client%d.name", i); + ret = dict_get_str(dict, key, &name); + + if (!strncmp(name, "fuse", 4)) { + if (!is_fuse_done) { + is_fuse_done = _gf_true; + ret = dict_get_int32(dict, "fuse-count", ¤t_count); + if (ret) + goto out; + total = total + current_count; + goto print; + } + continue; + } else if (!strncmp(name, "gfapi", 5)) { + if (!is_gfapi_done) { + is_gfapi_done = _gf_true; + ret = dict_get_int32(dict, "gfapi-count", ¤t_count); + if (ret) + goto out; + total = total + current_count; + goto print; + } + continue; + } else if (!strcmp(name, "tierd")) { + if (!is_tierd_done) { + is_tierd_done = _gf_true; + ret = dict_get_int32(dict, "tierd-count", ¤t_count); + if (ret) + goto out; + total = total + current_count; + goto print; + } + continue; + } else if (!strcmp(name, "rebalance")) { + if (!is_rebalance_done) { + is_rebalance_done = _gf_true; + ret = dict_get_int32(dict, "rebalance-count", ¤t_count); + if (ret) + goto out; + total = total + current_count; + goto print; + } + continue; + } else if (!strcmp(name, "glustershd")) { + if (!is_glustershd_done) { + is_glustershd_done = _gf_true; + ret = dict_get_int32(dict, "glustershd-count", ¤t_count); + if (ret) + goto out; + total = total + current_count; + goto print; + } + continue; + } else if (!strcmp(name, "quotad")) { + if (!is_quotad_done) { + is_quotad_done = _gf_true; + ret = dict_get_int32(dict, "quotad-count", ¤t_count); + if (ret) + goto out; + total = total + current_count; + goto print; + } + continue; + } else if (!strcmp(name, "snapd")) { + if (!is_snapd_done) { + is_snapd_done = _gf_true; + ret = dict_get_int32(dict, "snapd-count", ¤t_count); + if (ret) + goto out; + total = total + current_count; + goto print; + } + continue; + } + + print: + cli_out("%-48s %15d", name, current_count); + } +out: + cli_out("\ntotal clients for volume %s : %d ", volname, total); + cli_out( + "-----------------------------------------------------------------\n"); + return; +} - snprintf (key, sizeof (key), "%s.ia_type", prefix); - ret = dict_get_int32 (dict, key, &ia_type); - if (ret) - goto out; +void +cli_print_volume_status_clients(dict_t *dict, gf_boolean_t notbrick) +{ + int ret = -1; + char *volname = NULL; + int brick_index_max = -1; + int other_count = 0; + int index_max = 0; + char *hostname = NULL; + char *path = NULL; + int online = -1; + int client_count = 0; + char *clientname = NULL; + uint64_t bytesread = 0; + uint64_t byteswrite = 0; + uint32_t opversion = 0; + char key[1024] = { + 0, + }; + int i = 0; + int j = 0; + + GF_ASSERT(dict); + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + cli_out("Client connections for volume %s", volname); + + ret = dict_get_int32(dict, "brick-index-max", &brick_index_max); + if (ret) + goto out; + ret = dict_get_int32(dict, "other-count", &other_count); + if (ret) + goto out; + + index_max = brick_index_max + other_count; + + for (i = 0; i <= index_max; i++) { + hostname = NULL; + path = NULL; + online = -1; + client_count = 0; + clientname = NULL; + bytesread = 0; + byteswrite = 0; + + cli_out("----------------------------------------------"); + + snprintf(key, sizeof(key), "brick%d.hostname", i); + ret = dict_get_str(dict, key, &hostname); + + snprintf(key, sizeof(key), "brick%d.path", i); + ret = dict_get_str(dict, key, &path); + + if (hostname && path) { + if (notbrick) + cli_out("%s : %s", hostname, path); + else + cli_out("Brick : %s:%s", hostname, path); + } + snprintf(key, sizeof(key), "brick%d.status", i); + ret = dict_get_int32(dict, key, &online); + if (!online) { + if (notbrick) + cli_out("%s is offline", hostname); + else + cli_out("Brick is offline"); + continue; + } + + snprintf(key, sizeof(key), "brick%d.clientcount", i); + ret = dict_get_int32(dict, key, &client_count); + + if (hostname && path) + cli_out("Clients connected : %d", client_count); + if (client_count == 0) + continue; + + cli_out("%-48s %15s %15s %15s", "Hostname", "BytesRead", "BytesWritten", + "OpVersion"); + cli_out("%-48s %15s %15s %15s", "--------", "---------", "------------", + "---------"); + for (j = 0; j < client_count; j++) { + snprintf(key, sizeof(key), "brick%d.client%d.hostname", i, j); + ret = dict_get_str(dict, key, &clientname); + + snprintf(key, sizeof(key), "brick%d.client%d.bytesread", i, j); + ret = dict_get_uint64(dict, key, &bytesread); + + snprintf(key, sizeof(key), "brick%d.client%d.byteswrite", i, j); + ret = dict_get_uint64(dict, key, &byteswrite); + + snprintf(key, sizeof(key), "brick%d.client%d.opversion", i, j); + ret = dict_get_uint32(dict, key, &opversion); + + cli_out("%-48s %15" PRIu64 " %15" PRIu64 " %15" PRIu32, clientname, + bytesread, byteswrite, opversion); + } + } +out: + cli_out("----------------------------------------------\n"); + return; +} - switch (ia_type) { +void +cli_print_volume_status_inode_entry(dict_t *dict, char *prefix) +{ + int ret = -1; + char key[1024] = { + 0, + }; + char *gfid = NULL; + uint64_t nlookup = 0; + uint32_t ref = 0; + int ia_type = 0; + char inode_type; + + GF_ASSERT(dict); + GF_ASSERT(prefix); + + snprintf(key, sizeof(key), "%s.gfid", prefix); + ret = dict_get_str(dict, key, &gfid); + if (ret) + goto out; + + snprintf(key, sizeof(key), "%s.nlookup", prefix); + ret = dict_get_uint64(dict, key, &nlookup); + if (ret) + goto out; + + snprintf(key, sizeof(key), "%s.ref", prefix); + ret = dict_get_uint32(dict, key, &ref); + if (ret) + goto out; + + snprintf(key, sizeof(key), "%s.ia_type", prefix); + ret = dict_get_int32(dict, key, &ia_type); + if (ret) + goto out; + + switch (ia_type) { case IA_IFREG: - inode_type = 'R'; - break; + inode_type = 'R'; + break; case IA_IFDIR: - inode_type = 'D'; - break; + inode_type = 'D'; + break; case IA_IFLNK: - inode_type = 'L'; - break; + inode_type = 'L'; + break; case IA_IFBLK: - inode_type = 'B'; - break; + inode_type = 'B'; + break; case IA_IFCHR: - inode_type = 'C'; - break; + inode_type = 'C'; + break; case IA_IFIFO: - inode_type = 'F'; - break; + inode_type = 'F'; + break; case IA_IFSOCK: - inode_type = 'S'; - break; + inode_type = 'S'; + break; default: - inode_type = 'I'; - break; - } + inode_type = 'I'; + break; + } - cli_out ("%-40s %14"PRIu64" %14"PRIu32" %9c", - gfid, nlookup, ref, inode_type); + cli_out("%-40s %14" PRIu64 " %14" PRIu32 " %9c", gfid, nlookup, ref, + inode_type); out: - return; - + return; } void -cli_print_volume_status_itables (dict_t *dict, char *prefix) -{ - int ret = -1; - char key[1024] = {0,}; - uint32_t active_size = 0; - uint32_t lru_size = 0; - uint32_t purge_size = 0; - int i =0; - - GF_ASSERT (dict); - GF_ASSERT (prefix); +cli_print_volume_status_itables(dict_t *dict, char *prefix) +{ + int ret = -1; + char key[1024] = { + 0, + }; + uint32_t active_size = 0; + uint32_t lru_size = 0; + uint32_t purge_size = 0; + int i = 0; + + GF_ASSERT(dict); + GF_ASSERT(prefix); + + snprintf(key, sizeof(key), "%s.active_size", prefix); + ret = dict_get_uint32(dict, key, &active_size); + if (ret) + goto out; + if (active_size != 0) { + cli_out("Active inodes:"); + cli_out("%-40s %14s %14s %9s", "GFID", "Lookups", "Ref", "IA type"); + cli_out("%-40s %14s %14s %9s", "----", "-------", "---", "-------"); + } + for (i = 0; i < active_size; i++) { + snprintf(key, sizeof(key), "%s.active%d", prefix, i); + cli_print_volume_status_inode_entry(dict, key); + } + cli_out(" "); + + snprintf(key, sizeof(key), "%s.lru_size", prefix); + ret = dict_get_uint32(dict, key, &lru_size); + if (ret) + goto out; + if (lru_size != 0) { + cli_out("LRU inodes:"); + cli_out("%-40s %14s %14s %9s", "GFID", "Lookups", "Ref", "IA type"); + cli_out("%-40s %14s %14s %9s", "----", "-------", "---", "-------"); + } + for (i = 0; i < lru_size; i++) { + snprintf(key, sizeof(key), "%s.lru%d", prefix, i); + cli_print_volume_status_inode_entry(dict, key); + } + cli_out(" "); + + snprintf(key, sizeof(key), "%s.purge_size", prefix); + ret = dict_get_uint32(dict, key, &purge_size); + if (ret) + goto out; + if (purge_size != 0) { + cli_out("Purged inodes:"); + cli_out("%-40s %14s %14s %9s", "GFID", "Lookups", "Ref", "IA type"); + cli_out("%-40s %14s %14s %9s", "----", "-------", "---", "-------"); + } + for (i = 0; i < purge_size; i++) { + snprintf(key, sizeof(key), "%s.purge%d", prefix, i); + cli_print_volume_status_inode_entry(dict, key); + } + +out: + return; +} - snprintf (key, sizeof (key), "%s.active_size", prefix); - ret = dict_get_uint32 (dict, key, &active_size); +void +cli_print_volume_status_inode(dict_t *dict, gf_boolean_t notbrick) +{ + int ret = -1; + char *volname = NULL; + int brick_index_max = -1; + int other_count = 0; + int index_max = 0; + char *hostname = NULL; + char *path = NULL; + int online = -1; + int conn_count = 0; + char key[1024] = { + 0, + }; + int i = 0; + int j = 0; + + GF_ASSERT(dict); + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + cli_out("Inode tables for volume %s", volname); + + ret = dict_get_int32(dict, "brick-index-max", &brick_index_max); + if (ret) + goto out; + ret = dict_get_int32(dict, "other-count", &other_count); + if (ret) + goto out; + + index_max = brick_index_max + other_count; + + for (i = 0; i <= index_max; i++) { + cli_out("----------------------------------------------"); + + snprintf(key, sizeof(key), "brick%d.hostname", i); + ret = dict_get_str(dict, key, &hostname); if (ret) - goto out; - if (active_size != 0) { - cli_out ("Active inodes:"); - cli_out ("%-40s %14s %14s %9s", "GFID", "Lookups", "Ref", - "IA type"); - cli_out ("%-40s %14s %14s %9s", "----", "-------", "---", - "-------"); - } - for (i = 0; i < active_size; i++) { - snprintf (key, sizeof (key), "%s.active%d", prefix, i); - cli_print_volume_status_inode_entry (dict, key); - } - cli_out (" "); + goto out; + snprintf(key, sizeof(key), "brick%d.path", i); + ret = dict_get_str(dict, key, &path); + if (ret) + goto out; + if (notbrick) + cli_out("%s : %s", hostname, path); + else + cli_out("Brick : %s:%s", hostname, path); - snprintf (key, sizeof (key), "%s.lru_size", prefix); - ret = dict_get_uint32 (dict, key, &lru_size); + snprintf(key, sizeof(key), "brick%d.status", i); + ret = dict_get_int32(dict, key, &online); if (ret) - goto out; - if (lru_size != 0) { - cli_out ("LRU inodes:"); - cli_out ("%-40s %14s %14s %9s", "GFID", "Lookups", "Ref", - "IA type"); - cli_out ("%-40s %14s %14s %9s", "----", "-------", "---", - "-------"); - } - for (i = 0; i < lru_size; i++) { - snprintf (key, sizeof (key), "%s.lru%d", prefix, i); - cli_print_volume_status_inode_entry (dict, key); + goto out; + if (!online) { + if (notbrick) + cli_out("%s is offline", hostname); + else + cli_out("Brick is offline"); + continue; } - cli_out (" "); - snprintf (key, sizeof (key), "%s.purge_size", prefix); - ret = dict_get_uint32 (dict, key, &purge_size); + snprintf(key, sizeof(key), "brick%d.conncount", i); + ret = dict_get_int32(dict, key, &conn_count); if (ret) - goto out; - if (purge_size != 0) { - cli_out ("Purged inodes:"); - cli_out ("%-40s %14s %14s %9s", "GFID", "Lookups", "Ref", - "IA type"); - cli_out ("%-40s %14s %14s %9s", "----", "-------", "---", - "-------"); - } - for (i = 0; i < purge_size; i++) { - snprintf (key, sizeof (key), "%s.purge%d", prefix, i); - cli_print_volume_status_inode_entry (dict, key); - } + goto out; + + for (j = 0; j < conn_count; j++) { + if (conn_count > 1) + cli_out("Connection %d:", j + 1); + snprintf(key, sizeof(key), "brick%d.conn%d.itable", i, j); + cli_print_volume_status_itables(dict, key); + cli_out(" "); + } + } out: - return; + cli_out("----------------------------------------------"); + return; } void -cli_print_volume_status_inode (dict_t *dict, gf_boolean_t notbrick) -{ - int ret = -1; - char *volname = NULL; - int brick_index_max = -1; - int other_count = 0; - int index_max = 0; - char *hostname = NULL; - char *path = NULL; - int online = -1; - int conn_count = 0; - char key[1024] = {0,}; - int i = 0; - int j = 0; - - GF_ASSERT (dict); - - ret = dict_get_str (dict, "volname", &volname); +cli_print_volume_status_fdtable(dict_t *dict, char *prefix) +{ + int ret = -1; + char key[1024] = { + 0, + }; + int refcount = 0; + uint32_t maxfds = 0; + int firstfree = 0; + int openfds = 0; + int fd_pid = 0; + int fd_refcount = 0; + int fd_flags = 0; + int i = 0; + + GF_ASSERT(dict); + GF_ASSERT(prefix); + + snprintf(key, sizeof(key), "%s.refcount", prefix); + ret = dict_get_int32(dict, key, &refcount); + if (ret) + goto out; + + snprintf(key, sizeof(key), "%s.maxfds", prefix); + ret = dict_get_uint32(dict, key, &maxfds); + if (ret) + goto out; + + snprintf(key, sizeof(key), "%s.firstfree", prefix); + ret = dict_get_int32(dict, key, &firstfree); + if (ret) + goto out; + + cli_out("RefCount = %d MaxFDs = %d FirstFree = %d", refcount, maxfds, + firstfree); + + snprintf(key, sizeof(key), "%s.openfds", prefix); + ret = dict_get_int32(dict, key, &openfds); + if (ret) + goto out; + if (0 == openfds) { + cli_err("No open fds"); + goto out; + } + + cli_out("%-19s %-19s %-19s %-19s", "FD Entry", "PID", "RefCount", "Flags"); + cli_out("%-19s %-19s %-19s %-19s", "--------", "---", "--------", "-----"); + + for (i = 0; i < maxfds; i++) { + snprintf(key, sizeof(key), "%s.fdentry%d.pid", prefix, i); + ret = dict_get_int32(dict, key, &fd_pid); if (ret) - goto out; - cli_out ("Inode tables for volume %s", volname); + continue; - ret = dict_get_int32 (dict, "brick-index-max", &brick_index_max); + snprintf(key, sizeof(key), "%s.fdentry%d.refcount", prefix, i); + ret = dict_get_int32(dict, key, &fd_refcount); if (ret) - goto out; - ret = dict_get_int32 (dict, "other-count", &other_count); - if (ret) - goto out; - - index_max = brick_index_max + other_count; + continue; - for ( i = 0; i <= index_max; i++) { - cli_out ("----------------------------------------------"); - - snprintf (key, sizeof (key), "brick%d.hostname", i); - ret = dict_get_str (dict, key, &hostname); - if (ret) - goto out; - snprintf (key, sizeof (key), "brick%d.path", i); - ret = dict_get_str (dict, key, &path); - if (ret) - goto out; - if (notbrick) - cli_out ("%s : %s", hostname, path); - else - cli_out ("Brick : %s:%s", hostname, path); - - snprintf (key, sizeof (key), "brick%d.status", i); - ret = dict_get_int32 (dict, key, &online); - if (ret) - goto out; - if (!online) { - if (notbrick) - cli_out ("%s is offline", hostname); - else - cli_out ("Brick is offline"); - continue; - } - - snprintf (key, sizeof (key), "brick%d.conncount", i); - ret = dict_get_int32 (dict, key, &conn_count); - if (ret) - goto out; + snprintf(key, sizeof(key), "%s.fdentry%d.flags", prefix, i); + ret = dict_get_int32(dict, key, &fd_flags); + if (ret) + continue; - for (j = 0; j < conn_count; j++) { - if (conn_count > 1) - cli_out ("Connection %d:", j+1); + cli_out("%-19d %-19d %-19d %-19d", i, fd_pid, fd_refcount, fd_flags); + } - snprintf (key, sizeof (key), "brick%d.conn%d.itable", - i, j); - cli_print_volume_status_itables (dict, key); - cli_out (" "); - } - } out: - cli_out ("----------------------------------------------"); - return; + return; } void -cli_print_volume_status_fdtable (dict_t *dict, char *prefix) -{ - int ret = -1; - char key[1024] = {0,}; - int refcount = 0; - uint32_t maxfds = 0; - int firstfree = 0; - int openfds = 0; - int fd_pid = 0; - int fd_refcount = 0; - int fd_flags = 0; - int i = 0; - - GF_ASSERT (dict); - GF_ASSERT (prefix); - - snprintf (key, sizeof (key), "%s.refcount", prefix); - ret = dict_get_int32 (dict, key, &refcount); +cli_print_volume_status_fd(dict_t *dict, gf_boolean_t notbrick) +{ + int ret = -1; + char *volname = NULL; + int brick_index_max = -1; + int other_count = 0; + int index_max = 0; + char *hostname = NULL; + char *path = NULL; + int online = -1; + int conn_count = 0; + char key[1024] = { + 0, + }; + int i = 0; + int j = 0; + + GF_ASSERT(dict); + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + cli_out("FD tables for volume %s", volname); + + ret = dict_get_int32(dict, "brick-index-max", &brick_index_max); + if (ret) + goto out; + ret = dict_get_int32(dict, "other-count", &other_count); + if (ret) + goto out; + + index_max = brick_index_max + other_count; + + for (i = 0; i <= index_max; i++) { + cli_out("----------------------------------------------"); + + snprintf(key, sizeof(key), "brick%d.hostname", i); + ret = dict_get_str(dict, key, &hostname); if (ret) - goto out; - - snprintf (key, sizeof (key), "%s.maxfds", prefix); - ret = dict_get_uint32 (dict, key, &maxfds); + goto out; + snprintf(key, sizeof(key), "brick%d.path", i); + ret = dict_get_str(dict, key, &path); if (ret) - goto out; - - snprintf (key, sizeof (key), "%s.firstfree", prefix); - ret = dict_get_int32 (dict, key, &firstfree); - if (ret) - goto out; + goto out; - cli_out ("RefCount = %d MaxFDs = %d FirstFree = %d", - refcount, maxfds, firstfree); + if (notbrick) + cli_out("%s : %s", hostname, path); + else + cli_out("Brick : %s:%s", hostname, path); - snprintf (key, sizeof (key), "%s.openfds", prefix); - ret = dict_get_int32 (dict, key, &openfds); + snprintf(key, sizeof(key), "brick%d.status", i); + ret = dict_get_int32(dict, key, &online); if (ret) - goto out; - if (0 == openfds) { - cli_err ("No open fds"); - goto out; + goto out; + if (!online) { + if (notbrick) + cli_out("%s is offline", hostname); + else + cli_out("Brick is offline"); + continue; } - cli_out ("%-19s %-19s %-19s %-19s", "FD Entry", "PID", - "RefCount", "Flags"); - cli_out ("%-19s %-19s %-19s %-19s", "--------", "---", - "--------", "-----"); - - for (i = 0; i < maxfds ; i++) { - snprintf (key, sizeof (key), "%s.fdentry%d.pid", prefix, i); - ret = dict_get_int32 (dict, key, &fd_pid); - if (ret) - continue; - - snprintf (key, sizeof (key), "%s.fdentry%d.refcount", - prefix, i); - ret = dict_get_int32 (dict, key, &fd_refcount); - if (ret) - continue; + snprintf(key, sizeof(key), "brick%d.conncount", i); + ret = dict_get_int32(dict, key, &conn_count); + if (ret) + goto out; - snprintf (key, sizeof (key), "%s.fdentry%d.flags", prefix, i); - ret = dict_get_int32 (dict, key, &fd_flags); - if (ret) - continue; + for (j = 0; j < conn_count; j++) { + cli_out("Connection %d:", j + 1); - cli_out ("%-19d %-19d %-19d %-19d", i, fd_pid, fd_refcount, - fd_flags); + snprintf(key, sizeof(key), "brick%d.conn%d.fdtable", i, j); + cli_print_volume_status_fdtable(dict, key); + cli_out(" "); } - + } out: - return; + cli_out("----------------------------------------------"); + return; } void -cli_print_volume_status_fd (dict_t *dict, gf_boolean_t notbrick) -{ - int ret = -1; - char *volname = NULL; - int brick_index_max = -1; - int other_count = 0; - int index_max = 0; - char *hostname = NULL; - char *path = NULL; - int online = -1; - int conn_count = 0; - char key[1024] = {0,}; - int i = 0; - int j = 0; - - GF_ASSERT (dict); - - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; - cli_out ("FD tables for volume %s", volname); +cli_print_volume_status_call_frame(dict_t *dict, char *prefix) +{ + int ret = -1; + char key[1024] = { + 0, + }; + int ref_count = 0; + char *translator = 0; + int complete = 0; + char *parent = NULL; + char *wind_from = NULL; + char *wind_to = NULL; + char *unwind_from = NULL; + char *unwind_to = NULL; + + if (!dict || !prefix) + return; - ret = dict_get_int32 (dict, "brick-index-max", &brick_index_max); - if (ret) - goto out; - ret = dict_get_int32 (dict, "other-count", &other_count); - if (ret) - goto out; + snprintf(key, sizeof(key), "%s.refcount", prefix); + ret = dict_get_int32(dict, key, &ref_count); + if (ret) + return; - index_max = brick_index_max + other_count; + snprintf(key, sizeof(key), "%s.translator", prefix); + ret = dict_get_str(dict, key, &translator); + if (ret) + return; - for (i = 0; i <= index_max; i++) { - cli_out ("----------------------------------------------"); + snprintf(key, sizeof(key), "%s.complete", prefix); + ret = dict_get_int32(dict, key, &complete); + if (ret) + return; - snprintf (key, sizeof (key), "brick%d.hostname", i); - ret = dict_get_str (dict, key, &hostname); - if (ret) - goto out; - snprintf (key, sizeof (key), "brick%d.path", i); - ret = dict_get_str (dict, key, &path); - if (ret) - goto out; + cli_out(" Ref Count = %d", ref_count); + cli_out(" Translator = %s", translator); + cli_out(" Completed = %s", (complete ? "Yes" : "No")); - if (notbrick) - cli_out ("%s : %s", hostname, path); - else - cli_out ("Brick : %s:%s", hostname, path); + snprintf(key, sizeof(key), "%s.parent", prefix); + ret = dict_get_str(dict, key, &parent); + if (!ret) + cli_out(" Parent = %s", parent); - snprintf (key, sizeof (key), "brick%d.status", i); - ret = dict_get_int32 (dict, key, &online); - if (ret) - goto out; - if (!online) { - if (notbrick) - cli_out ("%s is offline", hostname); - else - cli_out ("Brick is offline"); - continue; - } + snprintf(key, sizeof(key), "%s.windfrom", prefix); + ret = dict_get_str(dict, key, &wind_from); + if (!ret) + cli_out(" Wind From = %s", wind_from); - snprintf (key, sizeof (key), "brick%d.conncount", i); - ret = dict_get_int32 (dict, key, &conn_count); - if (ret) - goto out; + snprintf(key, sizeof(key), "%s.windto", prefix); + ret = dict_get_str(dict, key, &wind_to); + if (!ret) + cli_out(" Wind To = %s", wind_to); - for (j = 0; j < conn_count; j++) { - cli_out ("Connection %d:", j+1); + snprintf(key, sizeof(key), "%s.unwindfrom", prefix); + ret = dict_get_str(dict, key, &unwind_from); + if (!ret) + cli_out(" Unwind From = %s", unwind_from); - snprintf (key, sizeof (key), "brick%d.conn%d.fdtable", - i, j); - cli_print_volume_status_fdtable (dict, key); - cli_out (" "); - } - } -out: - cli_out ("----------------------------------------------"); - return; + snprintf(key, sizeof(key), "%s.unwindto", prefix); + ret = dict_get_str(dict, key, &unwind_to); + if (!ret) + cli_out(" Unwind To = %s", unwind_to); } void -cli_print_volume_status_call_frame (dict_t *dict, char *prefix) -{ - int ret = -1; - char key[1024] = {0,}; - int ref_count = 0; - char *translator = 0; - int complete = 0; - char *parent = NULL; - char *wind_from = NULL; - char *wind_to = NULL; - char *unwind_from = NULL; - char *unwind_to = NULL; +cli_print_volume_status_call_stack(dict_t *dict, char *prefix) +{ + int ret = -1; + char key[1024] = { + 0, + }; + int uid = 0; + int gid = 0; + int pid = 0; + uint64_t unique = 0; + // char *op = NULL; + int count = 0; + int i = 0; + + if (!dict || !prefix) + return; - if (!dict || !prefix) - return; + snprintf(key, sizeof(key), "%s.uid", prefix); + ret = dict_get_int32(dict, key, &uid); + if (ret) + return; - snprintf (key, sizeof (key), "%s.refcount", prefix); - ret = dict_get_int32 (dict, key, &ref_count); - if (ret) - return; + snprintf(key, sizeof(key), "%s.gid", prefix); + ret = dict_get_int32(dict, key, &gid); + if (ret) + return; - snprintf (key, sizeof (key), "%s.translator", prefix); - ret = dict_get_str (dict, key, &translator); - if (ret) - return; + snprintf(key, sizeof(key), "%s.pid", prefix); + ret = dict_get_int32(dict, key, &pid); + if (ret) + return; - snprintf (key, sizeof (key), "%s.complete", prefix); - ret = dict_get_int32 (dict, key, &complete); - if (ret) - return; + snprintf(key, sizeof(key), "%s.unique", prefix); + ret = dict_get_uint64(dict, key, &unique); + if (ret) + return; - cli_out (" Ref Count = %d", ref_count); - cli_out (" Translator = %s", translator); - cli_out (" Completed = %s", (complete ? "Yes" : "No")); + /* + snprintf (key, sizeof (key), "%s.op", prefix); + ret = dict_get_str (dict, key, &op); + if (ret) + return; + */ - snprintf (key, sizeof (key), "%s.parent", prefix); - ret = dict_get_str (dict, key, &parent); - if (!ret) - cli_out (" Parent = %s", parent); + snprintf(key, sizeof(key), "%s.count", prefix); + ret = dict_get_int32(dict, key, &count); + if (ret) + return; - snprintf (key, sizeof (key), "%s.windfrom", prefix); - ret = dict_get_str (dict, key, &wind_from); - if (!ret) - cli_out (" Wind From = %s", wind_from); + cli_out(" UID : %d", uid); + cli_out(" GID : %d", gid); + cli_out(" PID : %d", pid); + cli_out(" Unique : %" PRIu64, unique); + // cli_out ("\tOp : %s", op); + cli_out(" Frames : %d", count); - snprintf (key, sizeof (key), "%s.windto", prefix); - ret = dict_get_str (dict, key, &wind_to); - if (!ret) - cli_out (" Wind To = %s", wind_to); + for (i = 0; i < count; i++) { + cli_out(" Frame %d", i + 1); - snprintf (key, sizeof (key), "%s.unwindfrom", prefix); - ret = dict_get_str (dict, key, &unwind_from); - if (!ret) - cli_out (" Unwind From = %s", unwind_from); + snprintf(key, sizeof(key), "%s.frame%d", prefix, i); + cli_print_volume_status_call_frame(dict, key); + } - snprintf (key, sizeof (key), "%s.unwindto", prefix); - ret = dict_get_str (dict, key, &unwind_to); - if (!ret) - cli_out (" Unwind To = %s", unwind_to); + cli_out(" "); } void -cli_print_volume_status_call_stack (dict_t *dict, char *prefix) -{ - int ret = -1; - char key[1024] = {0,}; - int uid = 0; - int gid = 0; - int pid = 0; - uint64_t unique = 0; - //char *op = NULL; - int count = 0; - int i = 0; - - if (!dict || !prefix) - return; - - snprintf (key, sizeof (key), "%s.uid", prefix); - ret = dict_get_int32 (dict, key, &uid); - if (ret) - return; - - snprintf (key, sizeof (key), "%s.gid", prefix); - ret = dict_get_int32 (dict, key, &gid); +cli_print_volume_status_callpool(dict_t *dict, gf_boolean_t notbrick) +{ + int ret = -1; + char *volname = NULL; + int brick_index_max = -1; + int other_count = 0; + int index_max = 0; + char *hostname = NULL; + char *path = NULL; + int online = -1; + int call_count = 0; + char key[1024] = { + 0, + }; + int i = 0; + int j = 0; + + GF_ASSERT(dict); + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + cli_out("Pending calls for volume %s", volname); + + ret = dict_get_int32(dict, "brick-index-max", &brick_index_max); + if (ret) + goto out; + ret = dict_get_int32(dict, "other-count", &other_count); + if (ret) + goto out; + + index_max = brick_index_max + other_count; + + for (i = 0; i <= index_max; i++) { + cli_out("----------------------------------------------"); + + snprintf(key, sizeof(key), "brick%d.hostname", i); + ret = dict_get_str(dict, key, &hostname); if (ret) - return; - - snprintf (key, sizeof (key), "%s.pid", prefix); - ret = dict_get_int32 (dict, key, &pid); - if (ret) - return; - - snprintf (key, sizeof (key), "%s.unique", prefix); - ret = dict_get_uint64 (dict, key, &unique); + goto out; + snprintf(key, sizeof(key), "brick%d.path", i); + ret = dict_get_str(dict, key, &path); if (ret) - return; - - /* - snprintf (key, sizeof (key), "%s.op", prefix); - ret = dict_get_str (dict, key, &op); - if (ret) - return; - */ + goto out; + if (notbrick) + cli_out("%s : %s", hostname, path); + else + cli_out("Brick : %s:%s", hostname, path); - snprintf (key, sizeof (key), "%s.count", prefix); - ret = dict_get_int32 (dict, key, &count); + snprintf(key, sizeof(key), "brick%d.status", i); + ret = dict_get_int32(dict, key, &online); if (ret) - return; - - cli_out (" UID : %d", uid); - cli_out (" GID : %d", gid); - cli_out (" PID : %d", pid); - cli_out (" Unique : %"PRIu64, unique); - //cli_out ("\tOp : %s", op); - cli_out (" Frames : %d", count); - - for (i = 0; i < count; i++) { - cli_out (" Frame %d", i+1); - - snprintf (key, sizeof (key), "%s.frame%d", prefix, i); - cli_print_volume_status_call_frame (dict, key); + goto out; + if (!online) { + if (notbrick) + cli_out("%s is offline", hostname); + else + cli_out("Brick is offline"); + continue; } - cli_out (" "); -} - -void -cli_print_volume_status_callpool (dict_t *dict, gf_boolean_t notbrick) -{ - int ret = -1; - char *volname = NULL; - int brick_index_max = -1; - int other_count = 0; - int index_max = 0; - char *hostname = NULL; - char *path = NULL; - int online = -1; - int call_count = 0; - char key[1024] = {0,}; - int i = 0; - int j = 0; - - GF_ASSERT (dict); - - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; - cli_out ("Pending calls for volume %s", volname); - - ret = dict_get_int32 (dict, "brick-index-max", &brick_index_max); + snprintf(key, sizeof(key), "brick%d.callpool.count", i); + ret = dict_get_int32(dict, key, &call_count); if (ret) - goto out; - ret = dict_get_int32 (dict, "other-count", &other_count); - if (ret) - goto out; + goto out; + cli_out("Pending calls: %d", call_count); - index_max = brick_index_max + other_count; + if (0 == call_count) + continue; - for (i = 0; i <= index_max; i++) { - cli_out ("----------------------------------------------"); + for (j = 0; j < call_count; j++) { + cli_out("Call Stack%d", j + 1); - snprintf (key, sizeof (key), "brick%d.hostname", i); - ret = dict_get_str (dict, key, &hostname); - if (ret) - goto out; - snprintf (key, sizeof (key), "brick%d.path", i); - ret = dict_get_str (dict, key, &path); - if (ret) - goto out; - - if (notbrick) - cli_out ("%s : %s", hostname, path); - else - cli_out ("Brick : %s:%s", hostname, path); - - snprintf (key, sizeof (key), "brick%d.status", i); - ret = dict_get_int32 (dict, key, &online); - if (ret) - goto out; - if (!online) { - if (notbrick) - cli_out ("%s is offline", hostname); - else - cli_out ("Brick is offline"); - continue; - } - - snprintf (key, sizeof (key), "brick%d.callpool.count", i); - ret = dict_get_int32 (dict, key, &call_count); - if (ret) - goto out; - cli_out ("Pending calls: %d", call_count); - - if (0 == call_count) - continue; - - for (j = 0; j < call_count; j++) { - cli_out ("Call Stack%d", j+1); - - snprintf (key, sizeof (key), - "brick%d.callpool.stack%d", i, j); - cli_print_volume_status_call_stack (dict, key); - } + snprintf(key, sizeof(key), "brick%d.callpool.stack%d", i, j); + cli_print_volume_status_call_stack(dict, key); } + } out: - cli_out ("----------------------------------------------"); - return; + cli_out("----------------------------------------------"); + return; } static void -cli_print_volume_status_tasks (dict_t *dict) -{ - int ret = -1; - int i = 0; - int j = 0; - int count = 0; - int task_count = 0; - int status = 0; - char *op = NULL; - char *task_id_str = NULL; - char *volname = NULL; - char key[64] = {0,}; - char task[32] = {0,}; - char *brick = NULL; - - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; - - ret = dict_get_int32 (dict, "tasks", &task_count); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get tasks count"); - return; - } +cli_print_volume_status_tasks(dict_t *dict) +{ + int ret = -1; + int i = 0; + int j = 0; + int count = 0; + int task_count = 0; + int status = 0; + char *op = NULL; + char *task_id_str = NULL; + char *volname = NULL; + char key[64] = { + 0, + }; + char task[32] = { + 0, + }; + char *brick = NULL; + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + + ret = dict_get_int32(dict, "tasks", &task_count); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get tasks count"); + return; + } - cli_out ("Task Status of Volume %s", volname); - cli_print_line (CLI_BRICK_STATUS_LINE_LEN); + cli_out("Task Status of Volume %s", volname); + cli_print_line(CLI_BRICK_STATUS_LINE_LEN); - if (task_count == 0) { - cli_out ("There are no active volume tasks"); - cli_out (" "); - return; - } + if (task_count == 0) { + cli_out("There are no active volume tasks"); + cli_out(" "); + return; + } - for (i = 0; i < task_count; i++) { - snprintf (key, sizeof (key), "task%d.type", i); - ret = dict_get_str(dict, key, &op); - if (ret) - return; - cli_out ("%-20s : %-20s", "Task", op); + for (i = 0; i < task_count; i++) { + snprintf(key, sizeof(key), "task%d.type", i); + ret = dict_get_str(dict, key, &op); + if (ret) + return; + cli_out("%-20s : %-20s", "Task", op); - snprintf (key, sizeof (key), "task%d.id", i); - ret = dict_get_str (dict, key, &task_id_str); - if (ret) - return; - cli_out ("%-20s : %-20s", "ID", task_id_str); + snprintf(key, sizeof(key), "task%d.id", i); + ret = dict_get_str(dict, key, &task_id_str); + if (ret) + return; + cli_out("%-20s : %-20s", "ID", task_id_str); - snprintf (key, sizeof (key), "task%d.status", i); - ret = dict_get_int32 (dict, key, &status); - if (ret) - return; + snprintf(key, sizeof(key), "task%d.status", i); + ret = dict_get_int32(dict, key, &status); + if (ret) + return; - snprintf (task, sizeof (task), "task%d", i); + snprintf(task, sizeof(task), "task%d", i); - if (!strcmp (op, "Remove brick")) { - snprintf (key, sizeof (key), "%s.count", task); - ret = dict_get_int32 (dict, key, &count); - if (ret) - goto out; + if (!strcmp(op, "Remove brick")) { + snprintf(key, sizeof(key), "%s.count", task); + ret = dict_get_int32(dict, key, &count); + if (ret) + goto out; - cli_out ("%-20s", "Removed bricks:"); + cli_out("%-20s", "Removed bricks:"); - for (j = 1; j <= count; j++) { - snprintf (key, sizeof (key),"%s.brick%d", - task, j); - ret = dict_get_str (dict, key, &brick); - if (ret) - goto out; + for (j = 1; j <= count; j++) { + snprintf(key, sizeof(key), "%s.brick%d", task, j); + ret = dict_get_str(dict, key, &brick); + if (ret) + goto out; - cli_out ("%-20s", brick); - } - } - cli_out ("%-20s : %-20s", "Status", - cli_vol_task_status_str[status]); - cli_out (" "); + cli_out("%-20s", brick); + } } + cli_out("%-20s : %-20s", "Status", cli_vol_task_status_str[status]); + cli_out(" "); + } out: - return; + return; } static int -gf_cli_status_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - int ret = -1; - int brick_index_max = -1; - int other_count = 0; - int index_max = 0; - int i = 0; - int type = -1; - int hot_brick_count = -1; - int pid = -1; - uint32_t cmd = 0; - gf_boolean_t notbrick = _gf_false; - char key[1024] = {0,}; - char *hostname = NULL; - char *path = NULL; - char *volname = NULL; - dict_t *dict = NULL; - gf_cli_rsp rsp = {0,}; - cli_volume_status_t status = {0}; - cli_local_t *local = NULL; - gf_boolean_t wipe_local = _gf_false; - char msg[1024] = {0,}; - - GF_ASSERT (myframe); - - if (req->rpc_status == -1) - goto out; - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - gf_log ("cli", GF_LOG_DEBUG, "Received response to status cmd"); - - local = ((call_frame_t *) myframe)->local; +gf_cli_status_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + int ret = -1; + int brick_index_max = -1; + int other_count = 0; + int index_max = 0; + int i = 0; + int type = -1; + int hot_brick_count = -1; + int pid = -1; + uint32_t cmd = 0; + gf_boolean_t notbrick = _gf_false; + char key[1024] = { + 0, + }; + char *hostname = NULL; + char *path = NULL; + char *volname = NULL; + dict_t *dict = NULL; + gf_cli_rsp rsp = { + 0, + }; + cli_volume_status_t status = {0}; + cli_local_t *local = NULL; + gf_boolean_t wipe_local = _gf_false; + char msg[1024] = { + 0, + }; + + GF_ASSERT(myframe); + + if (req->rpc_status == -1) + goto out; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + gf_log("cli", GF_LOG_DEBUG, "Received response to status cmd"); + + local = ((call_frame_t *)myframe)->local; + if (!local) { + local = cli_local_get(); if (!local) { - local = cli_local_get (); - if (!local) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "Failed to get local"); - goto out; - } - wipe_local = _gf_true; + ret = -1; + gf_log("cli", GF_LOG_ERROR, "Failed to get local"); + goto out; } + wipe_local = _gf_true; + } - if (rsp.op_ret) { - if (strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "%s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "Unable to obtain volume " - "status information."); - - if (global_state->mode & GLUSTER_MODE_XML) { - if (!local->all) - cli_xml_output_str ("volStatus", msg, - rsp.op_ret, rsp.op_errno, - rsp.op_errstr); - ret = 0; - goto out; - } + if (rsp.op_ret) { + if (strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), + "Unable to obtain volume " + "status information."); - cli_err ("%s", msg); - if (local && local->all) { - ret = 0; - cli_out (" "); - } else - ret = -1; + if (global_state->mode & GLUSTER_MODE_XML) { + if (!local->all) + cli_xml_output_str("volStatus", msg, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + ret = 0; + goto out; + } + + cli_err("%s", msg); + if (local && local->all) { + ret = 0; + cli_out(" "); + } else + ret = -1; + + goto out; + } + + dict = dict_new(); + if (!dict) + goto out; + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + if (ret) + goto out; + + ret = dict_get_uint32(dict, "cmd", &cmd); + if (ret) + goto out; + + if ((cmd & GF_CLI_STATUS_ALL)) { + 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"); + ret = -1; + } + goto out; + } + + if ((cmd & GF_CLI_STATUS_NFS) || (cmd & GF_CLI_STATUS_SHD) || + (cmd & GF_CLI_STATUS_QUOTAD) || (cmd & GF_CLI_STATUS_SNAPD) || + (cmd & GF_CLI_STATUS_BITD) || (cmd & GF_CLI_STATUS_SCRUB) || + (cmd & GF_CLI_STATUS_TIERD)) + notbrick = _gf_true; + + if (global_state->mode & GLUSTER_MODE_XML) { + if (!local->all) { + ret = cli_xml_output_vol_status_begin(local, rsp.op_ret, + rsp.op_errno, rsp.op_errstr); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto xml_end; + } + } + if (cmd & GF_CLI_STATUS_TASKS) { + ret = cli_xml_output_vol_status_tasks_detail(local, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Error outputting " + "to xml"); + goto xml_end; + } + } else { + ret = cli_xml_output_vol_status(local, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto xml_end; + } + } + + xml_end: + if (!local->all) { + ret = cli_xml_output_vol_status_end(local); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + } + } + goto out; + } + + status.brick = GF_MALLOC(PATH_MAX + 256, gf_common_mt_strdup); + if (!status.brick) { + errno = ENOMEM; + ret = -1; + goto out; + } + switch (cmd & GF_CLI_STATUS_MASK) { + case GF_CLI_STATUS_MEM: + cli_print_volume_status_mem(dict, notbrick); + goto cont; + break; + case GF_CLI_STATUS_CLIENTS: + cli_print_volume_status_clients(dict, notbrick); + goto cont; + break; + case GF_CLI_STATUS_CLIENT_LIST: + cli_print_volume_status_client_list(dict, notbrick); + goto cont; + break; + case GF_CLI_STATUS_INODE: + cli_print_volume_status_inode(dict, notbrick); + goto cont; + break; + case GF_CLI_STATUS_FD: + cli_print_volume_status_fd(dict, notbrick); + goto cont; + break; + case GF_CLI_STATUS_CALLPOOL: + cli_print_volume_status_callpool(dict, notbrick); + goto cont; + break; + case GF_CLI_STATUS_TASKS: + cli_print_volume_status_tasks(dict); + goto cont; + break; + default: + break; + } - goto out; - } + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; - dict = dict_new (); - if (!dict) - goto out; + ret = dict_get_int32(dict, "brick-index-max", &brick_index_max); + if (ret) + goto out; - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); - if (ret) - goto out; + ret = dict_get_int32(dict, "other-count", &other_count); + if (ret) + goto out; - ret = dict_get_uint32 (dict, "cmd", &cmd); - if (ret) - goto out; + index_max = brick_index_max + other_count; - if ((cmd & GF_CLI_STATUS_ALL)) { - 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"); - ret = -1; - } - goto out; - } - - if ((cmd & GF_CLI_STATUS_NFS) || (cmd & GF_CLI_STATUS_SHD) || - (cmd & GF_CLI_STATUS_QUOTAD) || (cmd & GF_CLI_STATUS_SNAPD) || - (cmd & GF_CLI_STATUS_BITD) || (cmd & GF_CLI_STATUS_SCRUB) || - (cmd & GF_CLI_STATUS_TIERD)) - notbrick = _gf_true; + ret = dict_get_int32(dict, "type", &type); + if (ret) + goto out; - if (global_state->mode & GLUSTER_MODE_XML) { - if (!local->all) { - ret = cli_xml_output_vol_status_begin (local, - rsp.op_ret, - rsp.op_errno, - rsp.op_errstr); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto xml_end; - } - } - if (cmd & GF_CLI_STATUS_TASKS) { - ret = cli_xml_output_vol_status_tasks_detail (local, - dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR,"Error outputting " - "to xml"); - goto xml_end; - } - } else { - ret = cli_xml_output_vol_status (local, dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto xml_end; - } - } + ret = dict_get_int32(dict, "hot_brick_count", &hot_brick_count); + if (ret) + goto out; -xml_end: - if (!local->all) { - ret = cli_xml_output_vol_status_end (local); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - } - } - goto out; - } + cli_out("Status of volume: %s", volname); - status.brick = GF_MALLOC (PATH_MAX + 256, gf_common_mt_strdup); - if (!status.brick) { - errno = ENOMEM; - ret = -1; - goto out; + if ((cmd & GF_CLI_STATUS_DETAIL) == 0) { + cli_out("%-*s %s %s %s %s", CLI_VOL_STATUS_BRICK_LEN, + "Gluster process", "TCP Port", "RDMA Port", "Online", "Pid"); + cli_print_line(CLI_BRICK_STATUS_LINE_LEN); + } + if (type == GF_CLUSTER_TYPE_TIER) { + cli_out("Hot Bricks:"); + } + for (i = 0; i <= index_max; i++) { + if (type == GF_CLUSTER_TYPE_TIER && i == hot_brick_count) { + cli_out("Cold Bricks:"); } - switch (cmd & GF_CLI_STATUS_MASK) { - case GF_CLI_STATUS_MEM: - cli_print_volume_status_mem (dict, notbrick); - goto cont; - break; - case GF_CLI_STATUS_CLIENTS: - cli_print_volume_status_clients (dict, notbrick); - goto cont; - break; - case GF_CLI_STATUS_CLIENT_LIST: - cli_print_volume_status_client_list (dict, notbrick); - goto cont; - break; - case GF_CLI_STATUS_INODE: - cli_print_volume_status_inode (dict, notbrick); - goto cont; - break; - case GF_CLI_STATUS_FD: - cli_print_volume_status_fd (dict, notbrick); - goto cont; - break; - case GF_CLI_STATUS_CALLPOOL: - cli_print_volume_status_callpool (dict, notbrick); - goto cont; - break; - case GF_CLI_STATUS_TASKS: - cli_print_volume_status_tasks (dict); - goto cont; - break; - default: - break; - } - - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; + status.rdma_port = 0; - ret = dict_get_int32 (dict, "brick-index-max", &brick_index_max); + snprintf(key, sizeof(key), "brick%d.hostname", i); + ret = dict_get_str(dict, key, &hostname); if (ret) - goto out; + continue; - ret = dict_get_int32 (dict, "other-count", &other_count); + snprintf(key, sizeof(key), "brick%d.path", i); + ret = dict_get_str(dict, key, &path); if (ret) - goto out; + continue; - index_max = brick_index_max + other_count; + /* Brick/not-brick is handled separately here as all + * types of nodes are contained in the default output + */ + memset(status.brick, 0, PATH_MAX + 255); + if (!strcmp(hostname, "NFS Server") || + !strcmp(hostname, "Self-heal Daemon") || + !strcmp(hostname, "Quota Daemon") || + !strcmp(hostname, "Snapshot Daemon") || + !strcmp(hostname, "Scrubber Daemon") || + !strcmp(hostname, "Bitrot Daemon") || + !strcmp(hostname, "Tier Daemon")) + snprintf(status.brick, PATH_MAX + 255, "%s on %s", hostname, path); + else { + snprintf(key, sizeof(key), "brick%d.rdma_port", i); + ret = dict_get_int32(dict, key, &(status.rdma_port)); + if (ret) + continue; + snprintf(status.brick, PATH_MAX + 255, "Brick %s:%s", hostname, + path); + } - ret = dict_get_int32 (dict, "type", &type); + snprintf(key, sizeof(key), "brick%d.port", i); + ret = dict_get_int32(dict, key, &(status.port)); if (ret) - goto out; + continue; - ret = dict_get_int32 (dict, "hot_brick_count", &hot_brick_count); + snprintf(key, sizeof(key), "brick%d.status", i); + ret = dict_get_int32(dict, key, &(status.online)); if (ret) - goto out; - - cli_out ("Status of volume: %s", volname); - - if ((cmd & GF_CLI_STATUS_DETAIL) == 0) { - cli_out ("%-*s %s %s %s %s", CLI_VOL_STATUS_BRICK_LEN, - "Gluster process", "TCP Port", "RDMA Port", - "Online", "Pid"); - cli_print_line (CLI_BRICK_STATUS_LINE_LEN); - } - if (type == GF_CLUSTER_TYPE_TIER) { - cli_out ("Hot Bricks:"); - } - for (i = 0; i <= index_max; i++) { - - if (type == GF_CLUSTER_TYPE_TIER && i == hot_brick_count) { - cli_out ("Cold Bricks:"); - } - status.rdma_port = 0; - - snprintf (key, sizeof (key), "brick%d.hostname", i); - ret = dict_get_str (dict, key, &hostname); - if (ret) - continue; - - snprintf (key, sizeof (key), "brick%d.path", i); - ret = dict_get_str (dict, key, &path); - if (ret) - continue; - - /* Brick/not-brick is handled separately here as all - * types of nodes are contained in the default output - */ - memset (status.brick, 0, PATH_MAX + 255); - if (!strcmp (hostname, "NFS Server") || - !strcmp (hostname, "Self-heal Daemon") || - !strcmp (hostname, "Quota Daemon") || - !strcmp (hostname, "Snapshot Daemon") || - !strcmp (hostname, "Scrubber Daemon") || - !strcmp (hostname, "Bitrot Daemon") || - !strcmp (hostname, "Tier Daemon")) - snprintf (status.brick, PATH_MAX + 255, "%s on %s", - hostname, path); - else { - snprintf (key, sizeof (key), "brick%d.rdma_port", i); - ret = dict_get_int32 (dict, key, &(status.rdma_port)); - if (ret) - continue; - snprintf (status.brick, PATH_MAX + 255, "Brick %s:%s", - hostname, path); - } + continue; - snprintf (key, sizeof (key), "brick%d.port", i); - ret = dict_get_int32 (dict, key, &(status.port)); - if (ret) - continue; - - snprintf (key, sizeof (key), "brick%d.status", i); - ret = dict_get_int32 (dict, key, &(status.online)); - if (ret) - continue; - - snprintf (key, sizeof (key), "brick%d.pid", i); - ret = dict_get_int32 (dict, key, &pid); - if (ret) - continue; - if (pid == -1) - ret = gf_asprintf (&(status.pid_str), "%s", "N/A"); - else - ret = gf_asprintf (&(status.pid_str), "%d", pid); - - if (ret == -1) - goto out; + snprintf(key, sizeof(key), "brick%d.pid", i); + ret = dict_get_int32(dict, key, &pid); + if (ret) + continue; + if (pid == -1) + ret = gf_asprintf(&(status.pid_str), "%s", "N/A"); + else + ret = gf_asprintf(&(status.pid_str), "%d", pid); - if ((cmd & GF_CLI_STATUS_DETAIL)) { - ret = cli_get_detail_status (dict, i, &status); - if (ret) - goto out; - cli_print_line (CLI_BRICK_STATUS_LINE_LEN); - cli_print_detailed_status (&status); - } else { - cli_print_brick_status (&status); - } + if (ret == -1) + goto out; + if ((cmd & GF_CLI_STATUS_DETAIL)) { + ret = cli_get_detail_status(dict, i, &status); + if (ret) + goto out; + cli_print_line(CLI_BRICK_STATUS_LINE_LEN); + cli_print_detailed_status(&status); + } else { + cli_print_brick_status(&status); } - cli_out (" "); + } + cli_out(" "); - if ((cmd & GF_CLI_STATUS_MASK) == GF_CLI_STATUS_NONE) - cli_print_volume_status_tasks (dict); + if ((cmd & GF_CLI_STATUS_MASK) == GF_CLI_STATUS_NONE) + cli_print_volume_status_tasks(dict); cont: - ret = rsp.op_ret; + ret = rsp.op_ret; out: - if (dict) - dict_unref (dict); - GF_FREE (status.brick); - if (local && wipe_local) { - cli_local_wipe (local); - } + if (dict) + dict_unref(dict); + GF_FREE(status.brick); + if (local && wipe_local) { + cli_local_wipe(local); + } - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } int32_t -gf_cli_status_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_status_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = -1; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = -1; + dict_t *dict = NULL; - if (!frame || !this || !data) - goto out; + if (!frame || !this || !data) + goto out; - dict = data; + dict = data; - 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; + 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; } int -gf_cli_status_volume_all (call_frame_t *frame, xlator_t *this, void *data) -{ - int i = 0; - int ret = -1; - int vol_count = -1; - uint32_t cmd = 0; - char key[1024] = {0}; - char *volname = NULL; - void *vol_dict = NULL; - dict_t *dict = NULL; - cli_local_t *local = NULL; - - if (!frame) - goto out; +gf_cli_status_volume_all(call_frame_t *frame, xlator_t *this, void *data) +{ + int i = 0; + int ret = -1; + int vol_count = -1; + uint32_t cmd = 0; + char key[1024] = {0}; + char *volname = NULL; + void *vol_dict = NULL; + dict_t *dict = NULL; + cli_local_t *local = NULL; - if (!frame->local) - goto out; + if (!frame) + goto out; - local = frame->local; + if (!frame->local) + goto out; - ret = dict_get_uint32 (local->dict, "cmd", &cmd); - if (ret) - goto out; + 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); + local->all = _gf_true; - if (ret) - goto out; + ret = gf_cli_status_volume(frame, this, data); - ret = dict_get_ptr (local->dict, "rsp-dict", &vol_dict); - if (ret) - goto out; + if (ret) + goto out; - ret = dict_get_int32 ((dict_t *)vol_dict, "vol_count", &vol_count); - if (ret) { - cli_err ("Failed to get names of volumes"); - goto out; - } + ret = dict_get_ptr(local->dict, "rsp-dict", &vol_dict); + if (ret) + goto out; - /* remove the "all" flag in cmd */ - cmd &= ~GF_CLI_STATUS_ALL; - cmd |= GF_CLI_STATUS_VOL; + ret = dict_get_int32((dict_t *)vol_dict, "vol_count", &vol_count); + if (ret) { + cli_err("Failed to get names of volumes"); + goto out; + } - if (global_state->mode & GLUSTER_MODE_XML) { - //TODO: Pass proper op_* values - ret = cli_xml_output_vol_status_begin (local, 0,0, NULL); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto xml_end; - } - } + /* remove the "all" flag in cmd */ + cmd &= ~GF_CLI_STATUS_ALL; + cmd |= GF_CLI_STATUS_VOL; - if (vol_count == 0 && !(global_state->mode & GLUSTER_MODE_XML)) { - cli_err ("No volumes present"); - ret = 0; - goto out; + if (global_state->mode & GLUSTER_MODE_XML) { + // TODO: Pass proper op_* values + ret = cli_xml_output_vol_status_begin(local, 0, 0, NULL); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto xml_end; } + } - for (i = 0; i < vol_count; i++) { + if (vol_count == 0 && !(global_state->mode & GLUSTER_MODE_XML)) { + cli_err("No volumes present"); + ret = 0; + goto out; + } - dict = dict_new (); - if (!dict) - goto out; + for (i = 0; i < vol_count; i++) { + dict = dict_new(); + if (!dict) + goto out; - snprintf (key, sizeof (key), "vol%d", i); - ret = dict_get_str (vol_dict, key, &volname); - if (ret) - goto out; + snprintf(key, sizeof(key), "vol%d", i); + ret = dict_get_str(vol_dict, key, &volname); + if (ret) + goto out; - ret = dict_set_str (dict, "volname", volname); - if (ret) - goto out; + ret = dict_set_str(dict, "volname", volname); + if (ret) + goto out; - ret = dict_set_uint32 (dict, "cmd", cmd); - if (ret) - goto out; + ret = dict_set_uint32(dict, "cmd", cmd); + if (ret) + goto out; - ret = gf_cli_status_volume (frame, this, dict); - if (ret) - goto out; + ret = gf_cli_status_volume(frame, this, dict); + if (ret) + goto out; - dict_unref (dict); - } + dict_unref(dict); + } xml_end: - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_status_end (local); - } + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_status_end(local); + } - out: - if (ret) - gf_log ("cli", GF_LOG_ERROR, "status all failed"); +out: + if (ret) + gf_log("cli", GF_LOG_ERROR, "status all failed"); - if (vol_dict) - dict_unref (vol_dict); + if (vol_dict) + dict_unref(vol_dict); - if (ret && dict) - dict_unref (dict); + if (ret && dict) + dict_unref(dict); - if (local) - cli_local_wipe (local); + if (local) + cli_local_wipe(local); - if (frame) - frame->local = NULL; + if (frame) + frame->local = NULL; - return ret; + return ret; } static int -gf_cli_mount_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_mount_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - gf1_cli_mount_rsp rsp = {0,}; - int ret = -1; + gf1_cli_mount_rsp rsp = { + 0, + }; + int ret = -1; - GF_ASSERT (myframe); + GF_ASSERT(myframe); - if (-1 == req->rpc_status) { - goto out; - } + if (-1 == req->rpc_status) { + goto out; + } - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf1_cli_mount_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf1_cli_mount_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - gf_log ("cli", GF_LOG_INFO, "Received resp to mount"); + gf_log("cli", GF_LOG_INFO, "Received resp to mount"); - if (rsp.op_ret == 0) { - ret = 0; - cli_out ("%s", rsp.path); - } else { - /* weird sounding but easy to parse... */ - cli_err ("%d : failed with this errno (%s)", - rsp.op_errno, strerror (rsp.op_errno)); - ret = -1; - } + if (rsp.op_ret == 0) { + ret = 0; + cli_out("%s", rsp.path); + } else { + /* weird sounding but easy to parse... */ + cli_err("%d : failed with this errno (%s)", rsp.op_errno, + strerror(rsp.op_errno)); + ret = -1; + } out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } int32_t -gf_cli_mount (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_mount(call_frame_t *frame, xlator_t *this, void *data) { - gf1_cli_mount_req req = {0,}; - int ret = -1; - void **dataa = data; - char *label = NULL; - dict_t *dict = NULL; + gf1_cli_mount_req req = { + 0, + }; + int ret = -1; + void **dataa = data; + char *label = NULL; + dict_t *dict = NULL; - if (!frame || !this || !data) - goto out; + if (!frame || !this || !data) + goto out; - label = dataa[0]; - dict = dataa[1]; + label = dataa[0]; + dict = dataa[1]; - req.label = label; - ret = dict_allocate_and_serialize (dict, &req.dict.dict_val, - &req.dict.dict_len); - if (ret) { - ret = -1; - goto out; - } + req.label = label; + ret = dict_allocate_and_serialize(dict, &req.dict.dict_val, + &req.dict.dict_len); + if (ret) { + ret = -1; + goto out; + } - ret = cli_cmd_submit (NULL, &req, frame, cli_rpc_prog, - GLUSTER_CLI_MOUNT, NULL, - this, gf_cli_mount_cbk, - (xdrproc_t)xdr_gf1_cli_mount_req); + ret = cli_cmd_submit(NULL, &req, frame, cli_rpc_prog, GLUSTER_CLI_MOUNT, + NULL, this, gf_cli_mount_cbk, + (xdrproc_t)xdr_gf1_cli_mount_req); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } static int -gf_cli_umount_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) +gf_cli_umount_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) { - gf1_cli_umount_rsp rsp = {0,}; - int ret = -1; + gf1_cli_umount_rsp rsp = { + 0, + }; + int ret = -1; - GF_ASSERT (myframe); + GF_ASSERT(myframe); - if (-1 == req->rpc_status) { - goto out; - } + if (-1 == req->rpc_status) { + goto out; + } - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf1_cli_umount_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf1_cli_umount_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } - gf_log ("cli", GF_LOG_INFO, "Received resp to mount"); + gf_log("cli", GF_LOG_INFO, "Received resp to mount"); - if (rsp.op_ret == 0) - ret = 0; - else { - cli_err ("umount failed"); - ret = -1; - } + if (rsp.op_ret == 0) + ret = 0; + else { + cli_err("umount failed"); + ret = -1; + } out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } int32_t -gf_cli_umount (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_umount(call_frame_t *frame, xlator_t *this, void *data) { - gf1_cli_umount_req req = {0,}; - int ret = -1; - dict_t *dict = NULL; + gf1_cli_umount_req req = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; - if (!frame || !this || !data) - goto out; + if (!frame || !this || !data) + goto out; - dict = data; + dict = data; - ret = dict_get_str (dict, "path", &req.path); - if (ret == 0) - ret = dict_get_int32 (dict, "lazy", &req.lazy); + ret = dict_get_str(dict, "path", &req.path); + if (ret == 0) + ret = dict_get_int32(dict, "lazy", &req.lazy); - if (ret) { - ret = -1; - goto out; - } + if (ret) { + ret = -1; + goto out; + } - ret = cli_cmd_submit (NULL, &req, frame, cli_rpc_prog, - GLUSTER_CLI_UMOUNT, NULL, - this, gf_cli_umount_cbk, - (xdrproc_t)xdr_gf1_cli_umount_req); + ret = cli_cmd_submit(NULL, &req, frame, cli_rpc_prog, GLUSTER_CLI_UMOUNT, + NULL, this, gf_cli_umount_cbk, + (xdrproc_t)xdr_gf1_cli_umount_req); - out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; +out: + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } void -cmd_heal_volume_statistics_out (dict_t *dict, int brick) -{ - - uint64_t num_entries = 0; - int ret = 0; - char key[256] = {0}; - char *hostname = NULL; - uint64_t i = 0; - uint64_t healed_count = 0; - uint64_t split_brain_count = 0; - uint64_t heal_failed_count = 0; - char *start_time_str = NULL; - char *end_time_str = NULL; - char *crawl_type = NULL; - int progress = -1; - - snprintf (key, sizeof key, "%d-hostname", brick); - ret = dict_get_str (dict, key, &hostname); +cmd_heal_volume_statistics_out(dict_t *dict, int brick) +{ + uint64_t num_entries = 0; + int ret = 0; + char key[256] = {0}; + char *hostname = NULL; + uint64_t i = 0; + uint64_t healed_count = 0; + uint64_t split_brain_count = 0; + uint64_t heal_failed_count = 0; + char *start_time_str = NULL; + char *end_time_str = NULL; + char *crawl_type = NULL; + int progress = -1; + + snprintf(key, sizeof key, "%d-hostname", brick); + ret = dict_get_str(dict, key, &hostname); + if (ret) + goto out; + cli_out("------------------------------------------------"); + cli_out("\nCrawl statistics for brick no %d", brick); + cli_out("Hostname of brick %s", hostname); + + snprintf(key, sizeof key, "statistics-%d-count", brick); + ret = dict_get_uint64(dict, key, &num_entries); + if (ret) + goto out; + + for (i = 0; i < num_entries; i++) { + snprintf(key, sizeof key, "statistics_crawl_type-%d-%" PRIu64, brick, + i); + ret = dict_get_str(dict, key, &crawl_type); if (ret) - goto out; - cli_out ("------------------------------------------------"); - cli_out ("\nCrawl statistics for brick no %d", brick); - cli_out ("Hostname of brick %s", hostname); + goto out; - snprintf (key, sizeof key, "statistics-%d-count", brick); - ret = dict_get_uint64 (dict, key, &num_entries); + snprintf(key, sizeof key, "statistics_healed_cnt-%d-%" PRIu64, brick, + i); + ret = dict_get_uint64(dict, key, &healed_count); if (ret) - goto out; - - for (i = 0; i < num_entries; i++) - { - snprintf (key, sizeof key, "statistics_crawl_type-%d-%"PRIu64, - brick, i); - ret = dict_get_str (dict, key, &crawl_type); - if (ret) - goto out; - - snprintf (key, sizeof key, "statistics_healed_cnt-%d-%"PRIu64, - brick,i); - ret = dict_get_uint64 (dict, key, &healed_count); - if (ret) - goto out; - - snprintf (key, sizeof key, "statistics_sb_cnt-%d-%"PRIu64, - brick, i); - ret = dict_get_uint64 (dict, key, &split_brain_count); - if (ret) - goto out; - snprintf (key, sizeof key, "statistics_heal_failed_cnt-%d-%"PRIu64, - brick, i); - ret = dict_get_uint64 (dict, key, &heal_failed_count); - if (ret) - goto out; - snprintf (key, sizeof key, "statistics_strt_time-%d-%"PRIu64, - brick, i); - ret = dict_get_str (dict, key, &start_time_str); - if (ret) - goto out; - snprintf (key, sizeof key, "statistics_end_time-%d-%"PRIu64, - brick, i); - ret = dict_get_str (dict, key, &end_time_str); - if (ret) - goto out; - snprintf (key, sizeof key, "statistics_inprogress-%d-%"PRIu64, - brick, i); - ret = dict_get_int32 (dict, key, &progress); - if (ret) - goto out; + goto out; - cli_out ("\nStarting time of crawl: %s", start_time_str); - if (progress == 1) - cli_out ("Crawl is in progress"); - else - cli_out ("Ending time of crawl: %s", end_time_str); - - cli_out ("Type of crawl: %s", crawl_type); - cli_out ("No. of entries healed: %"PRIu64, - healed_count); - cli_out ("No. of entries in split-brain: %"PRIu64, - split_brain_count); - cli_out ("No. of heal failed entries: %"PRIu64, - heal_failed_count); + snprintf(key, sizeof key, "statistics_sb_cnt-%d-%" PRIu64, brick, i); + ret = dict_get_uint64(dict, key, &split_brain_count); + if (ret) + goto out; + snprintf(key, sizeof key, "statistics_heal_failed_cnt-%d-%" PRIu64, + brick, i); + ret = dict_get_uint64(dict, key, &heal_failed_count); + if (ret) + goto out; + snprintf(key, sizeof key, "statistics_strt_time-%d-%" PRIu64, brick, i); + ret = dict_get_str(dict, key, &start_time_str); + if (ret) + goto out; + snprintf(key, sizeof key, "statistics_end_time-%d-%" PRIu64, brick, i); + ret = dict_get_str(dict, key, &end_time_str); + if (ret) + goto out; + snprintf(key, sizeof key, "statistics_inprogress-%d-%" PRIu64, brick, + i); + ret = dict_get_int32(dict, key, &progress); + if (ret) + goto out; - } + cli_out("\nStarting time of crawl: %s", start_time_str); + if (progress == 1) + cli_out("Crawl is in progress"); + else + cli_out("Ending time of crawl: %s", end_time_str); + cli_out("Type of crawl: %s", crawl_type); + cli_out("No. of entries healed: %" PRIu64, healed_count); + cli_out("No. of entries in split-brain: %" PRIu64, split_brain_count); + cli_out("No. of heal failed entries: %" PRIu64, heal_failed_count); + } out: - return; + return; } void -cmd_heal_volume_brick_out (dict_t *dict, int brick) -{ - uint64_t num_entries = 0; - int ret = 0; - char key[256] = {0}; - char *hostname = NULL; - char *path = NULL; - char *status = NULL; - uint64_t i = 0; - uint32_t time = 0; - char timestr[32] = {0}; - char *shd_status = NULL; - - snprintf (key, sizeof key, "%d-hostname", brick); - ret = dict_get_str (dict, key, &hostname); - if (ret) - goto out; - snprintf (key, sizeof key, "%d-path", brick); - ret = dict_get_str (dict, key, &path); - if (ret) - goto out; - cli_out ("\nBrick %s:%s", hostname, path); - - snprintf (key, sizeof key, "%d-status", brick); - ret = dict_get_str (dict, key, &status); - if (status && strlen (status)) - cli_out ("Status: %s", status); - - snprintf (key, sizeof key, "%d-shd-status",brick); - ret = dict_get_str (dict, key, &shd_status); - - if (!shd_status) { - snprintf (key, sizeof key, "%d-count", brick); - ret = dict_get_uint64 (dict, key, &num_entries); - cli_out ("Number of entries: %"PRIu64, num_entries); - - - for (i = 0; i < num_entries; i++) { - snprintf (key, sizeof key, "%d-%"PRIu64, brick, i); - ret = dict_get_str (dict, key, &path); - if (ret) - continue; - time = 0; - snprintf (key, sizeof key, "%d-%"PRIu64"-time", - brick, i); - ret = dict_get_uint32 (dict, key, &time); - if (ret || !time) { - cli_out ("%s", path); - } else { - gf_time_fmt (timestr, sizeof timestr, - time, gf_timefmt_FT); - if (i == 0) { - cli_out ("at path on brick"); - cli_out ("-----------------------------------"); - } - cli_out ("%s %s", timestr, path); - } - } - } - -out: - return; +cmd_heal_volume_brick_out(dict_t *dict, int brick) +{ + uint64_t num_entries = 0; + int ret = 0; + char key[256] = {0}; + char *hostname = NULL; + char *path = NULL; + char *status = NULL; + uint64_t i = 0; + uint32_t time = 0; + char timestr[32] = {0}; + char *shd_status = NULL; + + snprintf(key, sizeof key, "%d-hostname", brick); + ret = dict_get_str(dict, key, &hostname); + if (ret) + goto out; + snprintf(key, sizeof key, "%d-path", brick); + ret = dict_get_str(dict, key, &path); + if (ret) + goto out; + cli_out("\nBrick %s:%s", hostname, path); + + snprintf(key, sizeof key, "%d-status", brick); + ret = dict_get_str(dict, key, &status); + if (status && strlen(status)) + cli_out("Status: %s", status); + + snprintf(key, sizeof key, "%d-shd-status", brick); + ret = dict_get_str(dict, key, &shd_status); + + if (!shd_status) { + snprintf(key, sizeof key, "%d-count", brick); + ret = dict_get_uint64(dict, key, &num_entries); + cli_out("Number of entries: %" PRIu64, num_entries); + + for (i = 0; i < num_entries; i++) { + snprintf(key, sizeof key, "%d-%" PRIu64, brick, i); + ret = dict_get_str(dict, key, &path); + if (ret) + continue; + time = 0; + snprintf(key, sizeof key, "%d-%" PRIu64 "-time", brick, i); + ret = dict_get_uint32(dict, key, &time); + if (ret || !time) { + cli_out("%s", path); + } else { + gf_time_fmt(timestr, sizeof timestr, time, gf_timefmt_FT); + if (i == 0) { + cli_out("at path on brick"); + cli_out("-----------------------------------"); + } + cli_out("%s %s", timestr, path); + } + } + } + +out: + return; } - void -cmd_heal_volume_statistics_heal_count_out (dict_t *dict, int brick) -{ - uint64_t num_entries = 0; - int ret = 0; - char key[256] = {0}; - char *hostname = NULL; - char *path = NULL; - char *status = NULL; - char *shd_status = NULL; - - snprintf (key, sizeof key, "%d-hostname", brick); - ret = dict_get_str (dict, key, &hostname); +cmd_heal_volume_statistics_heal_count_out(dict_t *dict, int brick) +{ + uint64_t num_entries = 0; + int ret = 0; + char key[256] = {0}; + char *hostname = NULL; + char *path = NULL; + char *status = NULL; + char *shd_status = NULL; + + snprintf(key, sizeof key, "%d-hostname", brick); + ret = dict_get_str(dict, key, &hostname); + if (ret) + goto out; + snprintf(key, sizeof key, "%d-path", brick); + ret = dict_get_str(dict, key, &path); + if (ret) + goto out; + cli_out("\nBrick %s:%s", hostname, path); + + snprintf(key, sizeof key, "%d-status", brick); + ret = dict_get_str(dict, key, &status); + if (status && strlen(status)) + cli_out("Status: %s", status); + + snprintf(key, sizeof key, "%d-shd-status", brick); + ret = dict_get_str(dict, key, &shd_status); + + if (!shd_status) { + snprintf(key, sizeof key, "%d-hardlinks", brick); + ret = dict_get_uint64(dict, key, &num_entries); if (ret) - goto out; - snprintf (key, sizeof key, "%d-path", brick); - ret = dict_get_str (dict, key, &path); - if (ret) - goto out; - cli_out ("\nBrick %s:%s", hostname, path); - - snprintf (key, sizeof key, "%d-status", brick); - ret = dict_get_str (dict, key, &status); - if (status && strlen (status)) - cli_out ("Status: %s", status); - - snprintf (key, sizeof key, "%d-shd-status",brick); - ret = dict_get_str (dict, key, &shd_status); - - if(!shd_status) - { - snprintf (key, sizeof key, "%d-hardlinks", brick); - ret = dict_get_uint64 (dict, key, &num_entries); - if (ret) - cli_out ("No gathered input for this brick"); - else - cli_out ("Number of entries: %"PRIu64, num_entries); - - - } + cli_out("No gathered input for this brick"); + else + cli_out("Number of entries: %" PRIu64, num_entries); + } out: - return; + return; } int -gf_is_cli_heal_get_command (gf_xl_afr_op_t heal_op) -{ - /* If the command is get command value is 1 otherwise 0, for - invalid commands -1 */ - int get_cmds[GF_SHD_OP_HEAL_DISABLE + 1] = { - [GF_SHD_OP_INVALID] = -1, - [GF_SHD_OP_HEAL_INDEX] = 0, - [GF_SHD_OP_HEAL_FULL] = 0, - [GF_SHD_OP_INDEX_SUMMARY] = 1, - [GF_SHD_OP_HEALED_FILES] = 1, - [GF_SHD_OP_HEAL_FAILED_FILES] = 1, - [GF_SHD_OP_SPLIT_BRAIN_FILES] = 1, - [GF_SHD_OP_STATISTICS] = 1, - [GF_SHD_OP_STATISTICS_HEAL_COUNT] = 1, - [GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA] = 1, - [GF_SHD_OP_HEAL_ENABLE] = 0, - [GF_SHD_OP_HEAL_DISABLE] = 0, - }; - - if (heal_op > GF_SHD_OP_INVALID && heal_op <= GF_SHD_OP_HEAL_DISABLE) - return get_cmds[heal_op] == 1; - return _gf_false; +gf_is_cli_heal_get_command(gf_xl_afr_op_t heal_op) +{ + /* If the command is get command value is 1 otherwise 0, for + invalid commands -1 */ + int get_cmds[GF_SHD_OP_HEAL_DISABLE + 1] = { + [GF_SHD_OP_INVALID] = -1, + [GF_SHD_OP_HEAL_INDEX] = 0, + [GF_SHD_OP_HEAL_FULL] = 0, + [GF_SHD_OP_INDEX_SUMMARY] = 1, + [GF_SHD_OP_HEALED_FILES] = 1, + [GF_SHD_OP_HEAL_FAILED_FILES] = 1, + [GF_SHD_OP_SPLIT_BRAIN_FILES] = 1, + [GF_SHD_OP_STATISTICS] = 1, + [GF_SHD_OP_STATISTICS_HEAL_COUNT] = 1, + [GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA] = 1, + [GF_SHD_OP_HEAL_ENABLE] = 0, + [GF_SHD_OP_HEAL_DISABLE] = 0, + }; + + if (heal_op > GF_SHD_OP_INVALID && heal_op <= GF_SHD_OP_HEAL_DISABLE) + return get_cmds[heal_op] == 1; + return _gf_false; } int -gf_cli_heal_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - cli_local_t *local = NULL; - char *volname = NULL; - call_frame_t *frame = NULL; - dict_t *dict = NULL; - int brick_count = 0; - int i = 0; - gf_xl_afr_op_t heal_op = GF_SHD_OP_INVALID; - char *operation = NULL; - char *substr = NULL; - char *heal_op_str = NULL; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) { - goto out; - } - - frame = myframe; - - GF_ASSERT (frame->local); - - local = frame->local; - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - ret = dict_get_int32 (local->dict, "heal-op", (int32_t *)&heal_op); -//TODO: Proper XML output -//#if (HAVE_LIB_XML) -// if (global_state->mode & GLUSTER_MODE_XML) { -// ret = cli_xml_output_dict ("volHeal", dict, rsp.op_ret, -// rsp.op_errno, rsp.op_errstr); -// if (ret) -// gf_log ("cli", GF_LOG_ERROR, -// "Error outputting to xml"); -// goto out; -// } -//#endif - - ret = dict_get_str (local->dict, "volname", &volname); - if (ret) { - gf_log (frame->this->name, GF_LOG_ERROR, "failed to get volname"); - goto out; - } - - gf_log ("cli", GF_LOG_INFO, "Received resp to heal volume"); - - operation = "Gathering "; - substr = ""; - switch (heal_op) { - case GF_SHD_OP_HEAL_INDEX: - operation = "Launching heal operation "; - heal_op_str = "to perform index self heal"; - substr = "\nUse heal info commands to check" - " status."; - break; - case GF_SHD_OP_HEAL_FULL: - operation = "Launching heal operation "; - heal_op_str = "to perform full self heal"; - substr = "\nUse heal info commands to check" - " status."; - break; - case GF_SHD_OP_INDEX_SUMMARY: - heal_op_str = "list of entries to be healed"; - break; - case GF_SHD_OP_HEALED_FILES: - heal_op_str = "list of healed entries"; - break; - case GF_SHD_OP_HEAL_FAILED_FILES: - heal_op_str = "list of heal failed entries"; - break; - case GF_SHD_OP_SPLIT_BRAIN_FILES: - heal_op_str = "list of split brain entries"; - break; - case GF_SHD_OP_STATISTICS: - heal_op_str = "crawl statistics"; - break; - case GF_SHD_OP_STATISTICS_HEAL_COUNT: - heal_op_str = "count of entries to be healed"; - break; - case GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA: - heal_op_str = "count of entries to be healed per replica"; - break; +gf_cli_heal_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + cli_local_t *local = NULL; + char *volname = NULL; + call_frame_t *frame = NULL; + dict_t *dict = NULL; + int brick_count = 0; + int i = 0; + gf_xl_afr_op_t heal_op = GF_SHD_OP_INVALID; + char *operation = NULL; + char *substr = NULL; + char *heal_op_str = NULL; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) { + goto out; + } + + frame = myframe; + + GF_ASSERT(frame->local); + + local = frame->local; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + ret = dict_get_int32(local->dict, "heal-op", (int32_t *)&heal_op); + // TODO: Proper XML output + //#if (HAVE_LIB_XML) + // if (global_state->mode & GLUSTER_MODE_XML) { + // ret = cli_xml_output_dict ("volHeal", dict, rsp.op_ret, + // rsp.op_errno, rsp.op_errstr); + // if (ret) + // gf_log ("cli", GF_LOG_ERROR, + // "Error outputting to xml"); + // goto out; + // } + //#endif + + ret = dict_get_str(local->dict, "volname", &volname); + if (ret) { + gf_log(frame->this->name, GF_LOG_ERROR, "failed to get volname"); + goto out; + } + + gf_log("cli", GF_LOG_INFO, "Received resp to heal volume"); + + operation = "Gathering "; + substr = ""; + switch (heal_op) { + case GF_SHD_OP_HEAL_INDEX: + operation = "Launching heal operation "; + heal_op_str = "to perform index self heal"; + substr = + "\nUse heal info commands to check" + " status."; + break; + case GF_SHD_OP_HEAL_FULL: + operation = "Launching heal operation "; + heal_op_str = "to perform full self heal"; + substr = + "\nUse heal info commands to check" + " status."; + break; + case GF_SHD_OP_INDEX_SUMMARY: + heal_op_str = "list of entries to be healed"; + break; + case GF_SHD_OP_HEALED_FILES: + heal_op_str = "list of healed entries"; + break; + case GF_SHD_OP_HEAL_FAILED_FILES: + heal_op_str = "list of heal failed entries"; + break; + case GF_SHD_OP_SPLIT_BRAIN_FILES: + heal_op_str = "list of split brain entries"; + break; + case GF_SHD_OP_STATISTICS: + heal_op_str = "crawl statistics"; + break; + case GF_SHD_OP_STATISTICS_HEAL_COUNT: + heal_op_str = "count of entries to be healed"; + break; + case GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA: + heal_op_str = "count of entries to be healed per replica"; + break; /* The below 4 cases are never hit; they're coded only to make * compiler warnings go away.*/ - case GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE: - case GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME: - case GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK: - case GF_SHD_OP_HEAL_SUMMARY: - break; - - case GF_SHD_OP_INVALID: - heal_op_str = "invalid heal op"; - break; - case GF_SHD_OP_HEAL_ENABLE: - operation = ""; - heal_op_str = "Enable heal"; - break; - case GF_SHD_OP_HEAL_DISABLE: - operation = ""; - heal_op_str = "Disable heal"; - break; - case GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE: - operation = ""; - heal_op_str = "Enable granular entry heal"; - break; - case GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE: - operation = ""; - heal_op_str = "Disable granular entry heal"; - break; - } - - if (rsp.op_ret) { - if (strcmp (rsp.op_errstr, "")) { - cli_err ("%s%s on volume %s has been unsuccessful:", - operation, heal_op_str, volname); - cli_err ("%s", rsp.op_errstr); - } - ret = rsp.op_ret; - goto out; - } else { - cli_out ("%s%s on volume %s has been successful %s", operation, - heal_op_str, volname, substr); + case GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE: + case GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME: + case GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK: + case GF_SHD_OP_HEAL_SUMMARY: + break; + + case GF_SHD_OP_INVALID: + heal_op_str = "invalid heal op"; + break; + case GF_SHD_OP_HEAL_ENABLE: + operation = ""; + heal_op_str = "Enable heal"; + break; + case GF_SHD_OP_HEAL_DISABLE: + operation = ""; + heal_op_str = "Disable heal"; + break; + case GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE: + operation = ""; + heal_op_str = "Enable granular entry heal"; + break; + case GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE: + operation = ""; + heal_op_str = "Disable granular entry heal"; + break; + } + + if (rsp.op_ret) { + if (strcmp(rsp.op_errstr, "")) { + cli_err("%s%s on volume %s has been unsuccessful:", operation, + heal_op_str, volname); + cli_err("%s", rsp.op_errstr); } - ret = rsp.op_ret; - if (!gf_is_cli_heal_get_command (heal_op)) - goto out; - - dict = dict_new (); - if (!dict) { - ret = -1; - goto out; - } - - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); - - if (ret) { - gf_log ("", GF_LOG_ERROR, - "Unable to allocate memory"); - goto out; - } else { - dict->extra_stdfree = rsp.dict.dict_val; - } - ret = dict_get_int32 (dict, "count", &brick_count); - if (ret) - goto out; - - if (!brick_count) { - cli_err ("All bricks of volume %s are down.", volname); - goto out; - } - - switch (heal_op) { + goto out; + } else { + cli_out("%s%s on volume %s has been successful %s", operation, + heal_op_str, volname, substr); + } + + ret = rsp.op_ret; + if (!gf_is_cli_heal_get_command(heal_op)) + goto out; + + dict = dict_new(); + if (!dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + + if (ret) { + gf_log("", GF_LOG_ERROR, "Unable to allocate memory"); + goto out; + } else { + dict->extra_stdfree = rsp.dict.dict_val; + } + ret = dict_get_int32(dict, "count", &brick_count); + if (ret) + goto out; + + if (!brick_count) { + cli_err("All bricks of volume %s are down.", volname); + goto out; + } + + switch (heal_op) { case GF_SHD_OP_STATISTICS: - for (i = 0; i < brick_count; i++) - cmd_heal_volume_statistics_out (dict, i); - break; + for (i = 0; i < brick_count; i++) + cmd_heal_volume_statistics_out(dict, i); + break; case GF_SHD_OP_STATISTICS_HEAL_COUNT: case GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA: - for (i = 0; i < brick_count; i++) - cmd_heal_volume_statistics_heal_count_out (dict, - i); - break; + for (i = 0; i < brick_count; i++) + cmd_heal_volume_statistics_heal_count_out(dict, i); + break; case GF_SHD_OP_INDEX_SUMMARY: case GF_SHD_OP_HEALED_FILES: case GF_SHD_OP_HEAL_FAILED_FILES: case GF_SHD_OP_SPLIT_BRAIN_FILES: - for (i = 0; i < brick_count; i++) - cmd_heal_volume_brick_out (dict, i); - break; + for (i = 0; i < brick_count; i++) + cmd_heal_volume_brick_out(dict, i); + break; default: - break; - } + break; + } - ret = rsp.op_ret; + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - free (rsp.op_errstr); - if (dict) - dict_unref (dict); - return ret; + cli_cmd_broadcast_response(ret); + free(rsp.op_errstr); + if (dict) + dict_unref(dict); + return ret; } int32_t -gf_cli_heal_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_heal_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - int ret = 0; - dict_t *dict = NULL; + gf_cli_req req = {{ + 0, + }}; + int ret = 0; + dict_t *dict = NULL; - if (!frame || !this || !data) { - ret = -1; - goto out; - } + if (!frame || !this || !data) { + ret = -1; + goto out; + } - dict = data; + dict = data; - 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); + 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); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); + GF_FREE(req.dict.dict_val); - return ret; + return ret; } int32_t -gf_cli_statedump_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - char msg[1024] = {0,}; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) - goto out; - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - gf_log ("cli", GF_LOG_DEBUG, "Received response to statedump"); - if (rsp.op_ret) - snprintf (msg, sizeof(msg), "%s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "Volume statedump successful"); - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str ("volStatedump", msg, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } +gf_cli_statedump_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char msg[1024] = { + 0, + }; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) + goto out; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + gf_log("cli", GF_LOG_DEBUG, "Received response to statedump"); + if (rsp.op_ret) + snprintf(msg, sizeof(msg), "%s", rsp.op_errstr); + else + snprintf(msg, sizeof(msg), "Volume statedump successful"); + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_str("volStatedump", msg, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (rsp.op_ret) - cli_err ("volume statedump: failed: %s", msg); - else - cli_out ("volume statedump: success"); - ret = rsp.op_ret; + if (rsp.op_ret) + cli_err("volume statedump: failed: %s", msg); + else + cli_out("volume statedump: success"); + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } int32_t -gf_cli_statedump_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_statedump_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - dict_t *options = NULL; - int ret = -1; + gf_cli_req req = {{ + 0, + }}; + dict_t *options = NULL; + int ret = -1; - if (!frame || !this || !data) - goto out; + if (!frame || !this || !data) + goto out; - options = data; + options = data; - 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); + 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: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); - return ret; + GF_FREE(req.dict.dict_val); + return ret; } int32_t -gf_cli_list_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - int ret = -1; - gf_cli_rsp rsp = {0,}; - dict_t *dict = NULL; - int vol_count = 0;; - char *volname = NULL; - char key[1024] = {0,}; - int i = 0; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) - goto out; - - ret = xdr_to_generic (*iov, &rsp, - (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - dict = dict_new (); - if (!dict) { - ret = -1; - goto out; - } +gf_cli_list_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + int ret = -1; + gf_cli_rsp rsp = { + 0, + }; + dict_t *dict = NULL; + int vol_count = 0; + ; + char *volname = NULL; + char key[1024] = { + 0, + }; + int i = 0; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) + goto out; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + dict = dict_new(); + if (!dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to allocate memory"); + goto out; + } + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_list(dict, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } + + if (rsp.op_ret) + cli_err("%s", rsp.op_errstr); + else { + ret = dict_get_int32(dict, "count", &vol_count); + if (ret) + goto out; - ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, &dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to allocate memory"); - goto out; + if (vol_count == 0) { + cli_err("No volumes present in cluster"); + goto out; } - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_list (dict, rsp.op_ret, rsp.op_errno, - rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); + for (i = 0; i < vol_count; i++) { + snprintf(key, sizeof(key), "volume%d", i); + ret = dict_get_str(dict, key, &volname); + if (ret) goto out; + cli_out("%s", volname); } + } - if (rsp.op_ret) - cli_err ("%s", rsp.op_errstr); - else { - ret = dict_get_int32 (dict, "count", &vol_count); - if (ret) - goto out; - - if (vol_count == 0) { - cli_err ("No volumes present in cluster"); - goto out; - } - for (i = 0; i < vol_count; i++) { - snprintf (key, sizeof (key), "volume%d", i); - ret = dict_get_str (dict, key, &volname); - if (ret) - goto out; - cli_out ("%s", volname); - } - } - - ret = rsp.op_ret; + ret = rsp.op_ret; out: - cli_cmd_broadcast_response (ret); - return ret; + cli_cmd_broadcast_response(ret); + return ret; } int32_t -gf_cli_list_volume (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_list_volume(call_frame_t *frame, xlator_t *this, void *data) { - int ret = -1; - gf_cli_req req = {{0,}}; + int ret = -1; + gf_cli_req req = {{ + 0, + }}; - if (!frame || !this) - goto out; + if (!frame || !this) + goto out; - ret = cli_cmd_submit (NULL, &req, frame, cli_rpc_prog, - GLUSTER_CLI_LIST_VOLUME, NULL, - this, gf_cli_list_volume_cbk, - (xdrproc_t)xdr_gf_cli_req); + ret = cli_cmd_submit(NULL, &req, frame, cli_rpc_prog, + GLUSTER_CLI_LIST_VOLUME, NULL, this, + gf_cli_list_volume_cbk, (xdrproc_t)xdr_gf_cli_req); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int32_t -gf_cli_clearlocks_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - char *lk_summary = NULL; - char *volname = NULL; - dict_t *dict = NULL; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) - goto out; - - ret = xdr_to_generic (*iov, &rsp, - (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; +gf_cli_clearlocks_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + char *lk_summary = NULL; + char *volname = NULL; + dict_t *dict = NULL; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) + goto out; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + gf_log("cli", GF_LOG_DEBUG, "Received response to clear-locks"); + + if (rsp.op_ret) { + cli_err("Volume clear-locks unsuccessful"); + cli_err("%s", rsp.op_errstr); + + } else { + if (!rsp.dict.dict_len) { + cli_err("Possibly no locks cleared"); + ret = 0; + goto out; } - gf_log ("cli", GF_LOG_DEBUG, "Received response to clear-locks"); - - if (rsp.op_ret) { - cli_err ("Volume clear-locks unsuccessful"); - cli_err ("%s", rsp.op_errstr); - - } else { - if (!rsp.dict.dict_len) { - cli_err ("Possibly no locks cleared"); - ret = 0; - goto out; - } - dict = dict_new (); + dict = dict_new(); - if (!dict) { - ret = -1; - goto out; - } + if (!dict) { + ret = -1; + goto out; + } - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Unable to serialize response dictionary"); - goto out; - } - - ret = dict_get_str (dict, "volname", &volname); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to get volname " - "from dictionary"); - goto out; - } + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Unable to serialize response dictionary"); + goto out; + } - ret = dict_get_str (dict, "lk-summary", &lk_summary); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to get lock " - "summary from dictionary"); - goto out; - } - cli_out ("Volume clear-locks successful"); - cli_out ("%s", lk_summary); + ret = dict_get_str(dict, "volname", &volname); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Unable to get volname " + "from dictionary"); + goto out; + } + ret = dict_get_str(dict, "lk-summary", &lk_summary); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Unable to get lock " + "summary from dictionary"); + goto out; } + cli_out("Volume clear-locks successful"); + cli_out("%s", lk_summary); + } - ret = rsp.op_ret; + ret = rsp.op_ret; out: - if (dict) - dict_unref (dict); - cli_cmd_broadcast_response (ret); - return ret; + if (dict) + dict_unref(dict); + cli_cmd_broadcast_response(ret); + return ret; } int32_t -gf_cli_clearlocks_volume (call_frame_t *frame, xlator_t *this, - void *data) +gf_cli_clearlocks_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - dict_t *options = NULL; - int ret = -1; + gf_cli_req req = {{ + 0, + }}; + dict_t *options = NULL; + int ret = -1; - if (!frame || !this || !data) - goto out; + if (!frame || !this || !data) + goto out; - options = data; + options = 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); + 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_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); - return ret; + GF_FREE(req.dict.dict_val); + return ret; } int32_t -cli_snapshot_remove_reply (gf_cli_rsp *rsp, dict_t *dict, call_frame_t *frame) +cli_snapshot_remove_reply(gf_cli_rsp *rsp, dict_t *dict, call_frame_t *frame) { - int32_t ret = -1; - char *snap_name = NULL; - int32_t delete_cmd = -1; - cli_local_t *local = NULL; + int32_t ret = -1; + char *snap_name = NULL; + int32_t delete_cmd = -1; + cli_local_t *local = NULL; - GF_ASSERT (frame); - GF_ASSERT (rsp); - GF_ASSERT (dict); + GF_ASSERT(frame); + GF_ASSERT(rsp); + GF_ASSERT(dict); - local = frame->local; + local = frame->local; - ret = dict_get_int32 (dict, "sub-cmd", &delete_cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not get sub-cmd"); - goto end; - } + ret = dict_get_int32(dict, "sub-cmd", &delete_cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not get sub-cmd"); + goto end; + } - if ((global_state->mode & GLUSTER_MODE_XML) && - (delete_cmd == GF_SNAP_DELETE_TYPE_SNAP)) { - ret = cli_xml_output_snap_delete_begin (local, rsp->op_ret, - rsp->op_errno, - rsp->op_errstr); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for delete"); - goto end; - } + if ((global_state->mode & GLUSTER_MODE_XML) && + (delete_cmd == GF_SNAP_DELETE_TYPE_SNAP)) { + ret = cli_xml_output_snap_delete_begin(local, rsp->op_ret, + rsp->op_errno, rsp->op_errstr); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for delete"); + goto end; + } + } + + if (rsp->op_ret && !(global_state->mode & GLUSTER_MODE_XML)) { + cli_err("snapshot delete: failed: %s", + rsp->op_errstr ? rsp->op_errstr + : "Please check log file for details"); + ret = rsp->op_ret; + goto out; + } + + if (delete_cmd == GF_SNAP_DELETE_TYPE_ALL || + delete_cmd == GF_SNAP_DELETE_TYPE_VOL) { + local = ((call_frame_t *)frame)->local; + if (!local) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, "frame->local is NULL"); + goto out; } + /* During first call back of snapshot delete of type + * ALL and VOL, We will get the snapcount and snapnames. + * Hence to make the subsequent rpc calls for individual + * snapshot delete, We need to save it in local dictionary. + */ + dict_copy(dict, local->dict); + ret = 0; + goto out; + } - if (rsp->op_ret && !(global_state->mode & GLUSTER_MODE_XML)) { - cli_err ("snapshot delete: failed: %s", - rsp->op_errstr ? rsp->op_errstr : - "Please check log file for details"); - ret = rsp->op_ret; - goto out; + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_snapshot_delete(local, dict, rsp); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for snapshot delete command"); + goto out; } - - if (delete_cmd == GF_SNAP_DELETE_TYPE_ALL || - delete_cmd == GF_SNAP_DELETE_TYPE_VOL) { - local = ((call_frame_t *) frame) -> local; - if (!local) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "frame->local is NULL"); - goto out; - } - - /* During first call back of snapshot delete of type - * ALL and VOL, We will get the snapcount and snapnames. - * Hence to make the subsequent rpc calls for individual - * snapshot delete, We need to save it in local dictionary. - */ - dict_copy (dict, local->dict); - ret = 0; - goto out; + /* Error out in case of the op already failed */ + if (rsp->op_ret) { + ret = rsp->op_ret; + goto out; } - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_snapshot_delete (local, dict, rsp); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for snapshot delete command"); - goto out; - } - /* Error out in case of the op already failed */ - if (rsp->op_ret) { - ret = rsp->op_ret; - goto out; - } - } else { - ret = dict_get_str (dict, "snapname", &snap_name); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snapname"); - goto out; - } - - cli_out ("snapshot delete: %s: snap removed successfully", - snap_name); + } else { + ret = dict_get_str(dict, "snapname", &snap_name); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snapname"); + goto out; } - ret = 0; + + cli_out("snapshot delete: %s: snap removed successfully", snap_name); + } + ret = 0; out: - if ((global_state->mode & GLUSTER_MODE_XML) && - (delete_cmd == GF_SNAP_DELETE_TYPE_SNAP)) { - ret = cli_xml_output_snap_delete_end (local); - } + if ((global_state->mode & GLUSTER_MODE_XML) && + (delete_cmd == GF_SNAP_DELETE_TYPE_SNAP)) { + ret = cli_xml_output_snap_delete_end(local); + } end: - return ret; + return ret; } int -cli_snapshot_config_display (dict_t *dict, gf_cli_rsp *rsp) -{ - char buf[PATH_MAX] = ""; - char *volname = NULL; - int ret = -1; - int config_command = 0; - uint64_t value = 0; - uint64_t hard_limit = 0; - uint64_t soft_limit = 0; - uint64_t i = 0; - uint64_t voldisplaycount = 0; - char *auto_delete = NULL; - char *snap_activate = NULL; - - GF_ASSERT (dict); - GF_ASSERT (rsp); +cli_snapshot_config_display(dict_t *dict, gf_cli_rsp *rsp) +{ + char buf[PATH_MAX] = ""; + char *volname = NULL; + int ret = -1; + int config_command = 0; + uint64_t value = 0; + uint64_t hard_limit = 0; + uint64_t soft_limit = 0; + uint64_t i = 0; + uint64_t voldisplaycount = 0; + char *auto_delete = NULL; + char *snap_activate = NULL; + + GF_ASSERT(dict); + GF_ASSERT(rsp); + + if (rsp->op_ret) { + cli_err("Snapshot Config : failed: %s", + rsp->op_errstr ? rsp->op_errstr + : "Please check log file for details"); + ret = rsp->op_ret; + goto out; + } + + ret = dict_get_int32(dict, "config-command", &config_command); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch config type"); + goto out; + } + + ret = dict_get_str(dict, "volname", &volname); + /* Ignore the error, as volname is optional */ + + if (!volname) { + volname = "System"; + } + + ret = dict_get_uint64(dict, "snap-max-hard-limit", &hard_limit); + /* Ignore the error, as the key specified is optional */ + ret = dict_get_uint64(dict, "snap-max-soft-limit", &soft_limit); + + ret = dict_get_str(dict, "auto-delete", &auto_delete); + + ret = dict_get_str(dict, "snap-activate-on-create", &snap_activate); + + if (!hard_limit && !soft_limit && + config_command != GF_SNAP_CONFIG_DISPLAY && !auto_delete && + !snap_activate) { + ret = -1; + gf_log(THIS->name, GF_LOG_ERROR, "Could not fetch config-key"); + goto out; + } + + switch (config_command) { + case GF_SNAP_CONFIG_TYPE_SET: + if (hard_limit && soft_limit) { + cli_out( + "snapshot config: snap-max-hard-limit " + "& snap-max-soft-limit for system set " + "successfully"); + } else if (hard_limit) { + cli_out( + "snapshot config: snap-max-hard-limit " + "for %s set successfully", + volname); + } else if (soft_limit) { + cli_out( + "snapshot config: snap-max-soft-limit " + "for %s set successfully", + volname); + } else if (auto_delete) { + cli_out( + "snapshot config: auto-delete " + "successfully set"); + } else if (snap_activate) { + cli_out( + "snapshot config: activate-on-create " + "successfully set"); + } + break; - if (rsp->op_ret) { - cli_err ("Snapshot Config : failed: %s", - rsp->op_errstr ? rsp->op_errstr : - "Please check log file for details"); - ret = rsp->op_ret; + case GF_SNAP_CONFIG_DISPLAY: + cli_out("\nSnapshot System Configuration:"); + ret = dict_get_uint64(dict, "snap-max-hard-limit", &value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not fetch " + "snap_max_hard_limit for %s", + volname); + ret = -1; goto out; - } + } + cli_out("snap-max-hard-limit : %" PRIu64, value); - ret = dict_get_int32 (dict, "config-command", &config_command); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch config type"); + ret = dict_get_uint64(dict, "snap-max-soft-limit", &soft_limit); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not fetch " + "snap-max-soft-limit for %s", + volname); + ret = -1; goto out; - } - - ret = dict_get_str (dict, "volname", &volname); - /* Ignore the error, as volname is optional */ + } + cli_out("snap-max-soft-limit : %" PRIu64 "%%", soft_limit); - if (!volname) { - volname = "System"; - } + cli_out("auto-delete : %s", auto_delete); - ret = dict_get_uint64 (dict, "snap-max-hard-limit", &hard_limit); - /* Ignore the error, as the key specified is optional */ - ret = dict_get_uint64 (dict, "snap-max-soft-limit", &soft_limit); + cli_out("activate-on-create : %s\n", snap_activate); - ret = dict_get_str (dict, "auto-delete", &auto_delete); + cli_out("Snapshot Volume Configuration:"); - ret = dict_get_str (dict, "snap-activate-on-create", &snap_activate); - - if (!hard_limit && !soft_limit - && config_command != GF_SNAP_CONFIG_DISPLAY - && !auto_delete && !snap_activate) { + ret = dict_get_uint64(dict, "voldisplaycount", &voldisplaycount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch voldisplaycount"); ret = -1; - gf_log(THIS->name, GF_LOG_ERROR, - "Could not fetch config-key"); goto out; - } - - switch (config_command) { - case GF_SNAP_CONFIG_TYPE_SET: - if (hard_limit && soft_limit) { - cli_out ("snapshot config: snap-max-hard-limit " - "& snap-max-soft-limit for system set " - "successfully"); - } else if (hard_limit) { - cli_out ("snapshot config: snap-max-hard-limit " - "for %s set successfully", - volname); - } else if (soft_limit) { - cli_out ("snapshot config: snap-max-soft-limit " - "for %s set successfully", - volname); - } else if (auto_delete) { - cli_out ("snapshot config: auto-delete " - "successfully set"); - } else if (snap_activate) { - cli_out ("snapshot config: activate-on-create " - "successfully set"); - } - break; + } - case GF_SNAP_CONFIG_DISPLAY: - cli_out ("\nSnapshot System Configuration:"); - ret = dict_get_uint64 (dict, "snap-max-hard-limit", - &value); + for (i = 0; i < voldisplaycount; i++) { + snprintf(buf, sizeof(buf), "volume%" PRIu64 "-volname", i); + ret = dict_get_str(dict, buf, &volname); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch " - "snap_max_hard_limit for %s", volname); - ret = -1; - goto out; - } - cli_out ("snap-max-hard-limit : %"PRIu64, value); - - ret = dict_get_uint64 (dict, "snap-max-soft-limit", - &soft_limit); + gf_log("cli", GF_LOG_ERROR, + "Could not fetch " + " %s", + buf); + ret = -1; + goto out; + } + cli_out("\nVolume : %s", volname); + + snprintf(buf, sizeof(buf), + "volume%" PRIu64 "-snap-max-hard-limit", i); + ret = dict_get_uint64(dict, buf, &value); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch " - "snap-max-soft-limit for %s", volname); - ret = -1; - goto out; - } - cli_out ("snap-max-soft-limit : %"PRIu64"%%", - soft_limit); - - cli_out ("auto-delete : %s", auto_delete); - - cli_out ("activate-on-create : %s\n", snap_activate); - - cli_out ("Snapshot Volume Configuration:"); - - ret = dict_get_uint64 (dict, "voldisplaycount", - &voldisplaycount); + gf_log("cli", GF_LOG_ERROR, + "Could not fetch " + " %s", + buf); + ret = -1; + goto out; + } + cli_out("snap-max-hard-limit : %" PRIu64, value); + + snprintf(buf, sizeof(buf), + "volume%" PRIu64 "-active-hard-limit", i); + ret = dict_get_uint64(dict, buf, &value); if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Could not fetch voldisplaycount"); - ret = -1; - goto out; - } - - for (i = 0; i < voldisplaycount; i++) { - snprintf (buf, sizeof(buf), "volume%"PRIu64"-volname", i); - ret = dict_get_str (dict, buf, &volname); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch " - " %s", buf); - ret = -1; - goto out; - } - cli_out ("\nVolume : %s", volname); - - snprintf (buf, sizeof(buf), - "volume%"PRIu64"-snap-max-hard-limit", i); - ret = dict_get_uint64 (dict, buf, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch " - " %s", buf); - ret = -1; - goto out; - } - cli_out ("snap-max-hard-limit : %"PRIu64, value); - - snprintf (buf, sizeof(buf), - "volume%"PRIu64"-active-hard-limit", i); - ret = dict_get_uint64 (dict, buf, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch" - " effective snap_max_hard_limit for " - "%s", volname); - ret = -1; - goto out; - } - cli_out ("Effective snap-max-hard-limit : %"PRIu64, - value); - - snprintf (buf, sizeof(buf), - "volume%"PRIu64"-snap-max-soft-limit", i); - ret = dict_get_uint64 (dict, buf, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch " - " %s", buf); - ret = -1; - goto out; - } - cli_out ("Effective snap-max-soft-limit : %"PRIu64" " - "(%"PRIu64"%%)", value, soft_limit); - } - break; + gf_log("cli", GF_LOG_ERROR, + "Could not fetch" + " effective snap_max_hard_limit for " + "%s", + volname); + ret = -1; + goto out; + } + cli_out("Effective snap-max-hard-limit : %" PRIu64, value); + + snprintf(buf, sizeof(buf), + "volume%" PRIu64 "-snap-max-soft-limit", i); + ret = dict_get_uint64(dict, buf, &value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not fetch " + " %s", + buf); + ret = -1; + goto out; + } + cli_out("Effective snap-max-soft-limit : %" PRIu64 + " " + "(%" PRIu64 "%%)", + value, soft_limit); + } + break; default: - break; - } + break; + } - ret = 0; + ret = 0; out: - return ret; + return ret; } /* This function is used to print the volume related information @@ -9749,91 +9706,86 @@ out: * arg - 1, prefix str : snaplist.snap{0..}.vol{0..}.* */ int -cli_get_each_volinfo_in_snap (dict_t *dict, char *keyprefix, - gf_boolean_t snap_driven) { - char key[PATH_MAX] = ""; - char *get_buffer = NULL; - int value = 0; - int ret = -1; - char indent[5] = "\t"; - char *volname = NULL; - - GF_ASSERT (dict); - GF_ASSERT (keyprefix); - - if (snap_driven) { - ret = snprintf (key, sizeof (key), "%s.volname", keyprefix); - if (ret < 0) { - goto out; - } - - ret = dict_get_str (dict, key, &get_buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get %s", key); - goto out; - } - cli_out ("%s" INDENT_MAIN_HEAD "%s", indent, - "Snap Volume Name", ":", get_buffer); - - ret = snprintf (key, sizeof (key), - "%s.origin-volname", keyprefix); - if (ret < 0) { - goto out; - } +cli_get_each_volinfo_in_snap(dict_t *dict, char *keyprefix, + gf_boolean_t snap_driven) +{ + char key[PATH_MAX] = ""; + char *get_buffer = NULL; + int value = 0; + int ret = -1; + char indent[5] = "\t"; + char *volname = NULL; - ret = dict_get_str (dict, key, &volname); - if (ret) { - gf_log ("cli", GF_LOG_WARNING, "Failed to get %s", key); - cli_out ("%-12s", "Origin:"); - } - cli_out ("%s" INDENT_MAIN_HEAD "%s", indent, - "Origin Volume name", ":", volname); + GF_ASSERT(dict); + GF_ASSERT(keyprefix); + if (snap_driven) { + ret = snprintf(key, sizeof(key), "%s.volname", keyprefix); + if (ret < 0) { + goto out; + } - ret = snprintf (key, sizeof (key), "%s.snapcount", - keyprefix); - if (ret < 0) { - goto out; - } + ret = dict_get_str(dict, key, &get_buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key); + goto out; + } + cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Snap Volume Name", ":", + get_buffer); - ret = dict_get_int32 (dict, key, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get %s", key); - goto out; - } - cli_out ("%s%s %s %s %d", indent, "Snaps taken for", - volname, ":", value); + ret = snprintf(key, sizeof(key), "%s.origin-volname", keyprefix); + if (ret < 0) { + goto out; + } - ret = snprintf (key, sizeof (key), "%s.snaps-available", - keyprefix); - if (ret < 0) { - goto out; - } + ret = dict_get_str(dict, key, &volname); + if (ret) { + gf_log("cli", GF_LOG_WARNING, "Failed to get %s", key); + cli_out("%-12s", "Origin:"); + } + cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Origin Volume name", ":", + volname); - ret = dict_get_int32 (dict, key, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get %s", key); - goto out; - } - cli_out ("%s%s %s %s %d", indent, "Snaps available for", - volname, ":", value); + ret = snprintf(key, sizeof(key), "%s.snapcount", keyprefix); + if (ret < 0) { + goto out; } + ret = dict_get_int32(dict, key, &value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key); + goto out; + } + cli_out("%s%s %s %s %d", indent, "Snaps taken for", volname, ":", + value); - ret = snprintf (key, sizeof (key), "%s.vol-status", keyprefix); + ret = snprintf(key, sizeof(key), "%s.snaps-available", keyprefix); if (ret < 0) { - goto out; + goto out; } - ret = dict_get_str (dict, key, &get_buffer); + ret = dict_get_int32(dict, key, &value); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get %s", key); - goto out; + gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key); + goto out; } - cli_out ("%s" INDENT_MAIN_HEAD "%s", indent, "Status", - ":", get_buffer); + cli_out("%s%s %s %s %d", indent, "Snaps available for", volname, ":", + value); + } + + ret = snprintf(key, sizeof(key), "%s.vol-status", keyprefix); + if (ret < 0) { + goto out; + } + + ret = dict_get_str(dict, key, &get_buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key); + goto out; + } + cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Status", ":", get_buffer); out: - return ret; + return ret; } /* This function is used to print snap related information @@ -9841,924 +9793,890 @@ out: * arg - 1, prefix_str : snaplist.snap{0..}.* */ int -cli_get_volinfo_in_snap (dict_t *dict, char *keyprefix) { +cli_get_volinfo_in_snap(dict_t *dict, char *keyprefix) +{ + char key[PATH_MAX] = ""; + int i = 0; + int volcount = 0; + int ret = -1; - char key[PATH_MAX] = ""; - int i = 0; - int volcount = 0; - int ret = -1; + GF_ASSERT(dict); + GF_ASSERT(keyprefix); - GF_ASSERT (dict); - GF_ASSERT (keyprefix); + ret = snprintf(key, sizeof(key), "%s.vol-count", keyprefix); + if (ret < 0) { + goto out; + } - ret = snprintf (key, sizeof (key), "%s.vol-count", keyprefix); + ret = dict_get_int32(dict, key, &volcount); + for (i = 1; i <= volcount; i++) { + ret = snprintf(key, sizeof(key), "%s.vol%d", keyprefix, i); if (ret < 0) { - goto out; + goto out; } - - ret = dict_get_int32 (dict, key, &volcount); - for (i = 1 ; i <= volcount ; i++) { - ret = snprintf (key, sizeof (key), - "%s.vol%d", keyprefix, i); - if (ret < 0) { - goto out; - } - ret = cli_get_each_volinfo_in_snap (dict, key, _gf_true); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not list " - "details of volume in a snap"); - goto out; - } - cli_out (" "); + ret = cli_get_each_volinfo_in_snap(dict, key, _gf_true); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not list " + "details of volume in a snap"); + goto out; } + cli_out(" "); + } out: - return ret; + return ret; } int -cli_get_each_snap_info (dict_t *dict, char *prefix_str, - gf_boolean_t snap_driven) { - char key_buffer[PATH_MAX] = ""; - char *get_buffer = NULL; - int ret = -1; - char indent[5] = ""; - - GF_ASSERT (dict); - GF_ASSERT (prefix_str); - - if (!snap_driven) - strcat (indent, "\t"); - - ret = snprintf (key_buffer, sizeof (key_buffer), "%s.snapname", - prefix_str); - if (ret < 0) { - goto out; - } - - ret = dict_get_str (dict, key_buffer, &get_buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to fetch snapname %s ", - key_buffer); - goto out; - } - cli_out ("%s" INDENT_MAIN_HEAD "%s", indent, "Snapshot", - ":", get_buffer); - - ret = snprintf (key_buffer, sizeof (key_buffer), "%s.snap-id", - prefix_str); - if (ret < 0) { - goto out; - } - - ret = dict_get_str (dict, key_buffer, &get_buffer); +cli_get_each_snap_info(dict_t *dict, char *prefix_str, gf_boolean_t snap_driven) +{ + char key_buffer[PATH_MAX] = ""; + char *get_buffer = NULL; + int ret = -1; + char indent[5] = ""; + + GF_ASSERT(dict); + GF_ASSERT(prefix_str); + + if (!snap_driven) + strcat(indent, "\t"); + + ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snapname", prefix_str); + if (ret < 0) { + goto out; + } + + ret = dict_get_str(dict, key_buffer, &get_buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to fetch snapname %s ", key_buffer); + goto out; + } + cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Snapshot", ":", get_buffer); + + ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snap-id", prefix_str); + if (ret < 0) { + goto out; + } + + ret = dict_get_str(dict, key_buffer, &get_buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to fetch snap-id %s ", key_buffer); + goto out; + } + cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Snap UUID", ":", get_buffer); + + ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snap-desc", prefix_str); + if (ret < 0) { + goto out; + } + + ret = dict_get_str(dict, key_buffer, &get_buffer); + if (!ret) { + /* Ignore error for description */ + cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Description", ":", + get_buffer); + } + + ret = snprintf(key_buffer, sizeof(key_buffer), "%s.snap-time", prefix_str); + if (ret < 0) { + goto out; + } + + ret = dict_get_str(dict, key_buffer, &get_buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to fetch snap-time %s ", + prefix_str); + goto out; + } + cli_out("%s" INDENT_MAIN_HEAD "%s", indent, "Created", ":", get_buffer); + + if (snap_driven) { + cli_out("%-12s", "Snap Volumes:\n"); + ret = cli_get_volinfo_in_snap(dict, prefix_str); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to fetch snap-id %s ", - key_buffer); - goto out; - } - cli_out ("%s" INDENT_MAIN_HEAD "%s", indent, "Snap UUID", - ":", get_buffer); - - ret = snprintf (key_buffer, sizeof (key_buffer), "%s.snap-desc", - prefix_str); - if (ret < 0) { - goto out; - } - - ret = dict_get_str (dict, key_buffer, &get_buffer); - if (!ret) { - /* Ignore error for description */ - cli_out ("%s" INDENT_MAIN_HEAD "%s", indent, - "Description", ":", get_buffer); - } - - ret = snprintf (key_buffer, sizeof (key_buffer), "%s.snap-time", - prefix_str); - if (ret < 0) { - goto out; - } - - ret = dict_get_str (dict, key_buffer, &get_buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to fetch snap-time %s ", - prefix_str); - goto out; - } - cli_out ("%s" INDENT_MAIN_HEAD "%s", indent, "Created", - ":", get_buffer); - - if (snap_driven) { - cli_out ("%-12s", "Snap Volumes:\n"); - ret = cli_get_volinfo_in_snap (dict, prefix_str); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to list details " - "of the snaps"); - goto out; - } + gf_log("cli", GF_LOG_ERROR, + "Unable to list details " + "of the snaps"); + goto out; } + } out: - return ret; + return ret; } /* This is a generic function to print snap related information. * arg - 0, dict : Response Dictionary */ int -cli_call_snapshot_info (dict_t *dict, gf_boolean_t bool_snap_driven) { - int snap_count = 0; - char key[PATH_MAX] = ""; - int ret = -1; - int i = 0; +cli_call_snapshot_info(dict_t *dict, gf_boolean_t bool_snap_driven) +{ + int snap_count = 0; + char key[PATH_MAX] = ""; + int ret = -1; + int i = 0; - GF_ASSERT (dict); + GF_ASSERT(dict); - ret = dict_get_int32 (dict, "snapcount", &snap_count); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to get snapcount"); - goto out; - } + ret = dict_get_int32(dict, "snapcount", &snap_count); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get snapcount"); + goto out; + } - if (snap_count == 0) { - cli_out ("No snapshots present"); - } + if (snap_count == 0) { + cli_out("No snapshots present"); + } - for (i = 1 ; i <= snap_count ; i++) { - ret = snprintf (key, sizeof (key), "snap%d", i); - if (ret < 0) { - goto out; - } - ret = cli_get_each_snap_info (dict, key, bool_snap_driven); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Unable to print snap details"); - goto out; - } + for (i = 1; i <= snap_count; i++) { + ret = snprintf(key, sizeof(key), "snap%d", i); + if (ret < 0) { + goto out; + } + ret = cli_get_each_snap_info(dict, key, bool_snap_driven); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to print snap details"); + goto out; } + } out: - return ret; + return ret; } int -cli_get_snaps_in_volume (dict_t *dict) { - int ret = -1; - int i = 0; - int count = 0; - int avail = 0; - char key[PATH_MAX] = ""; - char *get_buffer = NULL; - - GF_ASSERT (dict); - - ret = dict_get_str (dict, "origin-volname", &get_buffer); +cli_get_snaps_in_volume(dict_t *dict) +{ + int ret = -1; + int i = 0; + int count = 0; + int avail = 0; + char key[PATH_MAX] = ""; + char *get_buffer = NULL; + + GF_ASSERT(dict); + + ret = dict_get_str(dict, "origin-volname", &get_buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch origin-volname"); + goto out; + } + cli_out(INDENT_MAIN_HEAD "%s", "Volume Name", ":", get_buffer); + + ret = dict_get_int32(dict, "snapcount", &avail); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch snapcount"); + goto out; + } + cli_out(INDENT_MAIN_HEAD "%d", "Snaps Taken", ":", avail); + + ret = dict_get_int32(dict, "snaps-available", &count); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch snaps-available"); + goto out; + } + cli_out(INDENT_MAIN_HEAD "%d", "Snaps Available", ":", count); + + for (i = 1; i <= avail; i++) { + snprintf(key, sizeof(key), "snap%d", i); + ret = cli_get_each_snap_info(dict, key, _gf_false); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch origin-volname"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Unable to print snap details"); + goto out; } - cli_out (INDENT_MAIN_HEAD "%s", "Volume Name", ":", get_buffer); - ret = dict_get_int32 (dict, "snapcount", &avail); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch snapcount"); - goto out; + ret = snprintf(key, sizeof(key), "snap%d.vol1", i); + if (ret < 0) { + goto out; } - cli_out (INDENT_MAIN_HEAD "%d", "Snaps Taken", ":", avail); - - ret = dict_get_int32 (dict, "snaps-available", &count); + ret = cli_get_each_volinfo_in_snap(dict, key, _gf_false); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch snaps-available"); - goto out; + gf_log("cli", GF_LOG_ERROR, + "Could not get volume " + "related information"); + goto out; } - cli_out (INDENT_MAIN_HEAD "%d", "Snaps Available", ":", count); - - for (i = 1 ; i <= avail ; i++) { - snprintf (key, sizeof (key), "snap%d", i); - ret = cli_get_each_snap_info (dict, key, _gf_false); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Unable to print snap details"); - goto out; - } - - ret = snprintf (key, sizeof (key), "snap%d.vol1", i); - if (ret < 0) { - goto out; - } - ret = cli_get_each_volinfo_in_snap (dict, key, _gf_false); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not get volume " - "related information"); - goto out; - } - cli_out (" "); - } + cli_out(" "); + } out: - return ret; + return ret; } int -cli_snapshot_list (dict_t *dict) { - int snapcount = 0; - char key[PATH_MAX] = ""; - int ret = -1; - int i = 0; - char *get_buffer = NULL; - - GF_ASSERT (dict); - - ret = dict_get_int32 (dict, "snapcount", &snapcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch snap count"); - goto out; - } - - if (snapcount == 0) { - cli_out ("No snapshots present"); - } - - for (i = 1 ; i <= snapcount ; i++) { - ret = snprintf (key, sizeof (key), "snapname%d", i); - if (ret < 0) { - goto out; - } +cli_snapshot_list(dict_t *dict) +{ + int snapcount = 0; + char key[PATH_MAX] = ""; + int ret = -1; + int i = 0; + char *get_buffer = NULL; - ret = dict_get_str (dict, key, &get_buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not get %s ", key); - goto out; - } else { - cli_out ("%s", get_buffer); - } - } -out: - return ret; -} + GF_ASSERT(dict); -int -cli_get_snap_volume_status (dict_t *dict, char *key_prefix) -{ - int ret = -1; - char key[PATH_MAX] = ""; - char *buffer = NULL; - int brickcount = 0; - int i = 0; - int pid = 0; + ret = dict_get_int32(dict, "snapcount", &snapcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch snap count"); + goto out; + } - GF_ASSERT (dict); - GF_ASSERT (key_prefix); + if (snapcount == 0) { + cli_out("No snapshots present"); + } - ret = snprintf (key, sizeof (key), "%s.brickcount", key_prefix); + for (i = 1; i <= snapcount; i++) { + ret = snprintf(key, sizeof(key), "snapname%d", i); if (ret < 0) { - goto out; - } - ret = dict_get_int32 (dict, key, &brickcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to fetch brickcount"); - goto out; + goto out; } - for (i = 0 ; i < brickcount ; i++) { - ret = snprintf (key, sizeof (key), "%s.brick%d.path", - key_prefix, i); - if (ret < 0) { - goto out; - } - - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_INFO, - "Unable to get Brick Path"); - continue; - } - cli_out ("\n\t%-17s %s %s", "Brick Path", ":", buffer); - - ret = snprintf (key, sizeof (key), "%s.brick%d.vgname", - key_prefix, i); - if (ret < 0) { - goto out; - } - - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_INFO, - "Unable to get Volume Group"); - cli_out ("\t%-17s %s %s", "Volume Group", ":", - "N/A"); - } else - cli_out ("\t%-17s %s %s", "Volume Group", ":", - buffer); - - ret = snprintf (key, sizeof (key), "%s.brick%d.status", - key_prefix, i); - if (ret < 0) { - goto out; - } - - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_INFO, - "Unable to get Brick Running"); - cli_out ("\t%-17s %s %s", "Brick Running", ":", - "N/A"); - } else - cli_out ("\t%-17s %s %s", "Brick Running", ":", - buffer); - - ret = snprintf (key, sizeof (key), "%s.brick%d.pid", - key_prefix, i); - if (ret < 0) { - goto out; - } - - ret = dict_get_int32 (dict, key, &pid); - if (ret) { - gf_log ("cli", GF_LOG_INFO, - "Unable to get pid"); - cli_out ("\t%-17s %s %s", "Brick PID", ":", "N/A"); - } else - cli_out ("\t%-17s %s %d", "Brick PID", ":", pid); - - ret = snprintf (key, sizeof (key), "%s.brick%d.data", - key_prefix, i); - if (ret < 0) { - goto out; - } - - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_INFO, - "Unable to get Data Percent"); - cli_out ("\t%-17s %s %s", "Data Percentage", ":", - "N/A"); - } else - cli_out ("\t%-17s %s %s", "Data Percentage", ":", - buffer); - - ret = snprintf (key, sizeof (key), "%s.brick%d.lvsize", - key_prefix, i); - if (ret < 0) { - goto out; - } - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_INFO, "Unable to get LV Size"); - cli_out ("\t%-17s %s %s", "LV Size", ":", "N/A"); - } else - cli_out ("\t%-17s %s %s", "LV Size", ":", buffer); - + ret = dict_get_str(dict, key, &get_buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not get %s ", key); + goto out; + } else { + cli_out("%s", get_buffer); } - - ret = 0; + } out: - return ret; + return ret; } - - int -cli_get_single_snap_status (dict_t *dict, char *keyprefix) -{ - int ret = -1; - char key[PATH_MAX] = ""; - int i = 0; - int volcount = 0; - char *get_buffer = NULL; - - GF_ASSERT (dict); - GF_ASSERT (keyprefix); - - ret = snprintf (key, sizeof (key), "%s.snapname", keyprefix); +cli_get_snap_volume_status(dict_t *dict, char *key_prefix) +{ + int ret = -1; + char key[PATH_MAX] = ""; + char *buffer = NULL; + int brickcount = 0; + int i = 0; + int pid = 0; + + GF_ASSERT(dict); + GF_ASSERT(key_prefix); + + ret = snprintf(key, sizeof(key), "%s.brickcount", key_prefix); + if (ret < 0) { + goto out; + } + ret = dict_get_int32(dict, key, &brickcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to fetch brickcount"); + goto out; + } + + for (i = 0; i < brickcount; i++) { + ret = snprintf(key, sizeof(key), "%s.brick%d.path", key_prefix, i); if (ret < 0) { - goto out; + goto out; } - ret = dict_get_str (dict, key, &get_buffer); + ret = dict_get_str(dict, key, &buffer); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to get snapname"); - goto out; + gf_log("cli", GF_LOG_INFO, "Unable to get Brick Path"); + continue; } - cli_out ("\nSnap Name : %s", get_buffer); + cli_out("\n\t%-17s %s %s", "Brick Path", ":", buffer); - ret = snprintf (key, sizeof (key), "%s.uuid", keyprefix); + ret = snprintf(key, sizeof(key), "%s.brick%d.vgname", key_prefix, i); if (ret < 0) { - goto out; + goto out; } - ret = dict_get_str (dict, key, &get_buffer); + ret = dict_get_str(dict, key, &buffer); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to get snap UUID"); - goto out; - } - cli_out ("Snap UUID : %s", get_buffer); + gf_log("cli", GF_LOG_INFO, "Unable to get Volume Group"); + cli_out("\t%-17s %s %s", "Volume Group", ":", "N/A"); + } else + cli_out("\t%-17s %s %s", "Volume Group", ":", buffer); - ret = snprintf (key, sizeof (key), "%s.volcount", keyprefix); + ret = snprintf(key, sizeof(key), "%s.brick%d.status", key_prefix, i); if (ret < 0) { - goto out; + goto out; } - ret = dict_get_int32 (dict, key, &volcount); + ret = dict_get_str(dict, key, &buffer); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to get volume count"); - goto out; - } + gf_log("cli", GF_LOG_INFO, "Unable to get Brick Running"); + cli_out("\t%-17s %s %s", "Brick Running", ":", "N/A"); + } else + cli_out("\t%-17s %s %s", "Brick Running", ":", buffer); - for (i = 0 ; i < volcount ; i++) { - ret = snprintf (key, sizeof (key), "%s.vol%d", keyprefix, i); - if (ret < 0) { - goto out; - } - - ret = cli_get_snap_volume_status (dict, key); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Could not get snap volume status"); - goto out; - } + ret = snprintf(key, sizeof(key), "%s.brick%d.pid", key_prefix, i); + if (ret < 0) { + goto out; } -out: - return ret; -} - -int32_t -cli_populate_req_dict_for_delete (dict_t *snap_dict, dict_t *dict, size_t index) -{ - int32_t ret = -1; - char key[PATH_MAX] = ""; - char *buffer = NULL; - - GF_ASSERT (snap_dict); - GF_ASSERT (dict); - ret = dict_set_int32 (snap_dict, "sub-cmd", - GF_SNAP_DELETE_TYPE_ITER); + ret = dict_get_int32(dict, key, &pid); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save command " - "type in snap dictionary"); - goto out; - } + gf_log("cli", GF_LOG_INFO, "Unable to get pid"); + cli_out("\t%-17s %s %s", "Brick PID", ":", "N/A"); + } else + cli_out("\t%-17s %s %d", "Brick PID", ":", pid); - ret = snprintf (key, sizeof (key), "snapname%zu", index); + ret = snprintf(key, sizeof(key), "%s.brick%d.data", key_prefix, i); if (ret < 0) { - goto out; + goto out; } - ret = dict_get_str (dict, key, &buffer); + ret = dict_get_str(dict, key, &buffer); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snapname"); - goto out; - } + gf_log("cli", GF_LOG_INFO, "Unable to get Data Percent"); + cli_out("\t%-17s %s %s", "Data Percentage", ":", "N/A"); + } else + cli_out("\t%-17s %s %s", "Data Percentage", ":", buffer); - ret = dict_set_dynstr_with_alloc (snap_dict, "snapname", buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to save snapname"); - goto out; + ret = snprintf(key, sizeof(key), "%s.brick%d.lvsize", key_prefix, i); + if (ret < 0) { + goto out; } - - ret = dict_set_int32 (snap_dict, "type", GF_SNAP_OPTION_TYPE_DELETE); + ret = dict_get_str(dict, key, &buffer); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to save command type"); - goto out; - } + gf_log("cli", GF_LOG_INFO, "Unable to get LV Size"); + cli_out("\t%-17s %s %s", "LV Size", ":", "N/A"); + } else + cli_out("\t%-17s %s %s", "LV Size", ":", buffer); + } - ret = dict_set_dynstr_with_alloc (snap_dict, "cmd-str", - "snapshot delete"); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Could not save command string as delete"); - goto out; - } + ret = 0; out: - return ret; + return ret; } int -cli_populate_req_dict_for_status (dict_t *snap_dict, dict_t *dict, int index) -{ - int ret = -1; - char key[PATH_MAX] = ""; - char *buffer = NULL; - - GF_ASSERT (snap_dict); - GF_ASSERT (dict); - - ret = dict_set_uint32 (snap_dict, "sub-cmd", - GF_SNAP_STATUS_TYPE_ITER); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save command " - "type in snap dict"); - goto out; +cli_get_single_snap_status(dict_t *dict, char *keyprefix) +{ + int ret = -1; + char key[PATH_MAX] = ""; + int i = 0; + int volcount = 0; + char *get_buffer = NULL; + + GF_ASSERT(dict); + GF_ASSERT(keyprefix); + + ret = snprintf(key, sizeof(key), "%s.snapname", keyprefix); + if (ret < 0) { + goto out; + } + + ret = dict_get_str(dict, key, &get_buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get snapname"); + goto out; + } + cli_out("\nSnap Name : %s", get_buffer); + + ret = snprintf(key, sizeof(key), "%s.uuid", keyprefix); + if (ret < 0) { + goto out; + } + + ret = dict_get_str(dict, key, &get_buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get snap UUID"); + goto out; + } + cli_out("Snap UUID : %s", get_buffer); + + ret = snprintf(key, sizeof(key), "%s.volcount", keyprefix); + if (ret < 0) { + goto out; + } + + ret = dict_get_int32(dict, key, &volcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get volume count"); + goto out; + } + + for (i = 0; i < volcount; i++) { + ret = snprintf(key, sizeof(key), "%s.vol%d", keyprefix, i); + if (ret < 0) { + goto out; } - ret = snprintf (key, sizeof (key), "status.snap%d.snapname", index); - if (ret < 0) { - goto out; - } - - ret = dict_get_str (dict, key, &buffer); + ret = cli_get_snap_volume_status(dict, key); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not get snapname"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Could not get snap volume status"); + goto out; } + } +out: + return ret; +} - ret = dict_set_str (snap_dict, "snapname", buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not save snapname " - "in snap dict"); - goto out; - - } +int32_t +cli_populate_req_dict_for_delete(dict_t *snap_dict, dict_t *dict, size_t index) +{ + int32_t ret = -1; + char key[PATH_MAX] = ""; + char *buffer = NULL; + + GF_ASSERT(snap_dict); + GF_ASSERT(dict); + + ret = dict_set_int32(snap_dict, "sub-cmd", GF_SNAP_DELETE_TYPE_ITER); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save command " + "type in snap dictionary"); + goto out; + } + + ret = snprintf(key, sizeof(key), "snapname%zu", index); + if (ret < 0) { + goto out; + } + + ret = dict_get_str(dict, key, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snapname"); + goto out; + } + + ret = dict_set_dynstr_with_alloc(snap_dict, "snapname", buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to save snapname"); + goto out; + } + + ret = dict_set_int32(snap_dict, "type", GF_SNAP_OPTION_TYPE_DELETE); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to save command type"); + goto out; + } + + ret = dict_set_dynstr_with_alloc(snap_dict, "cmd-str", "snapshot delete"); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not save command string as delete"); + goto out; + } +out: + return ret; +} - ret = dict_set_int32 (snap_dict, "type", GF_SNAP_OPTION_TYPE_STATUS); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Could not save command type"); - goto out; - } +int +cli_populate_req_dict_for_status(dict_t *snap_dict, dict_t *dict, int index) +{ + int ret = -1; + char key[PATH_MAX] = ""; + char *buffer = NULL; + + GF_ASSERT(snap_dict); + GF_ASSERT(dict); + + ret = dict_set_uint32(snap_dict, "sub-cmd", GF_SNAP_STATUS_TYPE_ITER); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save command " + "type in snap dict"); + goto out; + } + + ret = snprintf(key, sizeof(key), "status.snap%d.snapname", index); + if (ret < 0) { + goto out; + } + + ret = dict_get_str(dict, key, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not get snapname"); + goto out; + } + + ret = dict_set_str(snap_dict, "snapname", buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not save snapname " + "in snap dict"); + goto out; + } + + ret = dict_set_int32(snap_dict, "type", GF_SNAP_OPTION_TYPE_STATUS); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not save command type"); + goto out; + } + + ret = dict_set_dynstr_with_alloc(snap_dict, "cmd-str", "snapshot status"); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not save command string as status"); + goto out; + } + + ret = dict_set_int32(snap_dict, "hold_vol_locks", _gf_false); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Setting volume lock flag failed"); + goto out; + } + +out: + return ret; +} - ret = dict_set_dynstr_with_alloc (snap_dict, "cmd-str", - "snapshot status"); +int +cli_snapshot_status(dict_t *dict, gf_cli_rsp *rsp, call_frame_t *frame) +{ + char key[PATH_MAX] = ""; + int ret = -1; + int status_cmd = -1; + cli_local_t *local = NULL; + + GF_ASSERT(dict); + GF_ASSERT(rsp); + GF_ASSERT(frame); + + local = ((call_frame_t *)frame)->local; + if (!local) { + gf_log("cli", GF_LOG_ERROR, "frame->local is NULL"); + goto out; + } + + if (rsp->op_ret) { + if (rsp->op_errstr) { + ret = dict_set_dynstr_with_alloc(local->dict, "op_err_str", + rsp->op_errstr); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to set " + "op_errstr in local dictionary"); + goto out; + } + } + ret = rsp->op_ret; + goto out; + } + + ret = dict_get_int32(dict, "sub-cmd", &status_cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch status type"); + goto out; + } + + if ((status_cmd != GF_SNAP_STATUS_TYPE_SNAP) && + (status_cmd != GF_SNAP_STATUS_TYPE_ITER)) { + dict_copy(dict, local->dict); + goto out; + } + + ret = snprintf(key, sizeof(key), "status.snap0"); + if (ret < 0) { + goto out; + } + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_snapshot_status_single_snap(local, dict, key); if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Could not save command string as status"); - goto out; + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for snapshot status"); + goto out; } - - ret = dict_set_int32 (snap_dict, "hold_vol_locks", _gf_false); + } else { + ret = cli_get_single_snap_status(dict, key); if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Setting volume lock flag failed"); - goto out; + gf_log("cli", GF_LOG_ERROR, + "Could not fetch " + "status of snap"); + goto out; } + } + ret = 0; out: - return ret; + return ret; } int -cli_snapshot_status (dict_t *dict, gf_cli_rsp *rsp, - call_frame_t *frame) -{ - char key[PATH_MAX] = ""; - int ret = -1; - int status_cmd = -1; - cli_local_t *local = NULL; - - GF_ASSERT (dict); - GF_ASSERT (rsp); - GF_ASSERT (frame); - - local = ((call_frame_t *) frame) -> local; - if (!local) { - gf_log ("cli", GF_LOG_ERROR, "frame->local is NULL"); - goto out; - } - - if (rsp->op_ret) { - if (rsp->op_errstr) { - ret = dict_set_dynstr_with_alloc (local->dict, - "op_err_str", - rsp->op_errstr); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to set " - "op_errstr in local dictionary"); - goto out; - } - } - ret = rsp->op_ret; - goto out; - } - - ret = dict_get_int32 (dict, "sub-cmd", &status_cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch status type"); +gf_cli_generate_snapshot_event(gf_cli_rsp *rsp, dict_t *dict, int32_t type, + char *snap_name, char *volname, char *snap_uuid, + char *clone_name) +{ + int ret = -1; + int config_command = 0; + int32_t delete_cmd = -1; + uint64_t hard_limit = 0; + uint64_t soft_limit = 0; + char *auto_delete = NULL; + char *snap_activate = NULL; + char msg[PATH_MAX] = { + 0, + }; + char option[512] = { + 0, + }; + + GF_VALIDATE_OR_GOTO("cli", dict, out); + GF_VALIDATE_OR_GOTO("cli", rsp, out); + + switch (type) { + case GF_SNAP_OPTION_TYPE_CREATE: + if (!snap_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); goto out; - } + } - if ((status_cmd != GF_SNAP_STATUS_TYPE_SNAP) && - (status_cmd != GF_SNAP_STATUS_TYPE_ITER)) { - dict_copy (dict, local->dict); + if (!volname) { + gf_log("cli", GF_LOG_ERROR, "Failed to get volume name"); goto out; - } + } + if (rsp->op_ret != 0) { + gf_event(EVENT_SNAPSHOT_CREATE_FAILED, + "snapshot_name=%s;volume_name=%s;error=%s", snap_name, + volname, + rsp->op_errstr ? rsp->op_errstr + : "Please check log file for details"); + ret = 0; + break; + } - ret = snprintf (key, sizeof (key), "status.snap0"); - if (ret < 0) { + if (!snap_uuid) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid"); goto out; - } + } - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_snapshot_status_single_snap (local, dict, key); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for snapshot status"); - goto out; - } - } else { - ret = cli_get_single_snap_status (dict, key); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch " - "status of snap"); - goto out; - } - } + gf_event(EVENT_SNAPSHOT_CREATED, + "snapshot_name=%s;" + "volume_name=%s;snapshot_uuid=%s", + snap_name, volname, snap_uuid); - ret = 0; -out: - return ret; -} - -int -gf_cli_generate_snapshot_event (gf_cli_rsp *rsp, dict_t *dict, - int32_t type, char *snap_name, - char *volname, char *snap_uuid, - char *clone_name) -{ - int ret = -1; - int config_command = 0; - int32_t delete_cmd = -1; - uint64_t hard_limit = 0; - uint64_t soft_limit = 0; - char *auto_delete = NULL; - char *snap_activate = NULL; - char msg[PATH_MAX] = {0, }; - char option[512] = {0, }; - - GF_VALIDATE_OR_GOTO ("cli", dict, out); - GF_VALIDATE_OR_GOTO ("cli", rsp, out); - - switch (type) { - case GF_SNAP_OPTION_TYPE_CREATE: - if (!snap_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get snap name"); - goto out; - } - - if (!volname) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get volume name"); - goto out; - } - - if (rsp->op_ret != 0) { - gf_event (EVENT_SNAPSHOT_CREATE_FAILED, - "snapshot_name=%s;volume_name=%s;error=%s", - snap_name, volname, - rsp->op_errstr ? rsp->op_errstr : - "Please check log file for details"); - ret = 0; - break; - } - - if (!snap_uuid) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap uuid"); - goto out; - } + ret = 0; + break; - gf_event (EVENT_SNAPSHOT_CREATED, "snapshot_name=%s;" - "volume_name=%s;snapshot_uuid=%s", snap_name, - volname, snap_uuid); + case GF_SNAP_OPTION_TYPE_ACTIVATE: + if (!snap_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); + goto out; + } + if (rsp->op_ret != 0) { + gf_event(EVENT_SNAPSHOT_ACTIVATE_FAILED, + "snapshot_name=%s;error=%s", snap_name, + rsp->op_errstr ? rsp->op_errstr + : "Please check log file for details"); ret = 0; break; + } - case GF_SNAP_OPTION_TYPE_ACTIVATE: - if (!snap_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get snap name"); - goto out; - } + if (!snap_uuid) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid"); + goto out; + } - if (rsp->op_ret != 0) { - gf_event (EVENT_SNAPSHOT_ACTIVATE_FAILED, - "snapshot_name=%s;error=%s", snap_name, - rsp->op_errstr ? rsp->op_errstr : - "Please check log file for details"); - ret = 0; - break; - } + gf_event(EVENT_SNAPSHOT_ACTIVATED, + "snapshot_name=%s;" + "snapshot_uuid=%s", + snap_name, snap_uuid); - if (!snap_uuid) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap uuid"); - goto out; - } + ret = 0; + break; - gf_event (EVENT_SNAPSHOT_ACTIVATED, "snapshot_name=%s;" - "snapshot_uuid=%s", snap_name, snap_uuid); + case GF_SNAP_OPTION_TYPE_DEACTIVATE: + if (!snap_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); + goto out; + } + if (rsp->op_ret != 0) { + gf_event(EVENT_SNAPSHOT_DEACTIVATE_FAILED, + "snapshot_name=%s;error=%s", snap_name, + rsp->op_errstr ? rsp->op_errstr + : "Please check log file for details"); ret = 0; break; + } - case GF_SNAP_OPTION_TYPE_DEACTIVATE: - if (!snap_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get snap name"); - goto out; - } + if (!snap_uuid) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid"); + goto out; + } - if (rsp->op_ret != 0) { - gf_event (EVENT_SNAPSHOT_DEACTIVATE_FAILED, - "snapshot_name=%s;error=%s", snap_name, - rsp->op_errstr ? rsp->op_errstr : - "Please check log file for details"); - ret = 0; - break; - } + gf_event(EVENT_SNAPSHOT_DEACTIVATED, + "snapshot_name=%s;" + "snapshot_uuid=%s", + snap_name, snap_uuid); - if (!snap_uuid) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap uuid"); - goto out; - } + ret = 0; + break; - gf_event (EVENT_SNAPSHOT_DEACTIVATED, "snapshot_name=%s;" - "snapshot_uuid=%s", snap_name, snap_uuid); + case GF_SNAP_OPTION_TYPE_RESTORE: + if (!snap_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); + goto out; + } + if (rsp->op_ret != 0) { + gf_event(EVENT_SNAPSHOT_RESTORE_FAILED, + "snapshot_name=%s;error=%s", snap_name, + rsp->op_errstr ? rsp->op_errstr + : "Please check log file for details"); ret = 0; break; + } - case GF_SNAP_OPTION_TYPE_RESTORE: - if (!snap_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get snap name"); - goto out; - } + if (!snap_uuid) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid"); + goto out; + } - if (rsp->op_ret != 0) { - gf_event (EVENT_SNAPSHOT_RESTORE_FAILED, - "snapshot_name=%s;error=%s", snap_name, - rsp->op_errstr ? rsp->op_errstr : - "Please check log file for details"); - ret = 0; - break; - } + if (!volname) { + gf_log("cli", GF_LOG_ERROR, "Failed to get volname"); + goto out; + } - if (!snap_uuid) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap uuid"); - goto out; - } + gf_event(EVENT_SNAPSHOT_RESTORED, + "snapshot_name=%s;" + "snapshot_uuid=%s;volume_name=%s", + snap_name, snap_uuid, volname); - if (!volname) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get volname"); - goto out; - } + ret = 0; + break; - gf_event (EVENT_SNAPSHOT_RESTORED, "snapshot_name=%s;" - "snapshot_uuid=%s;volume_name=%s", - snap_name, snap_uuid, volname); + case GF_SNAP_OPTION_TYPE_DELETE: + ret = dict_get_int32(dict, "sub-cmd", &delete_cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not get sub-cmd"); + goto out; + } + /* + * Need not generate any event (success or failure) for delete * + * all, as it will trigger individual delete for all snapshots * + */ + if (delete_cmd == GF_SNAP_DELETE_TYPE_ALL) { ret = 0; break; + } - case GF_SNAP_OPTION_TYPE_DELETE: - ret = dict_get_int32 (dict, "sub-cmd", &delete_cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not get sub-cmd"); - goto out; - } + if (!snap_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); + goto out; + } - /* - * Need not generate any event (success or failure) for delete * - * all, as it will trigger individual delete for all snapshots * - */ - if (delete_cmd == GF_SNAP_DELETE_TYPE_ALL) { - ret = 0; - break; - } + if (rsp->op_ret != 0) { + gf_event(EVENT_SNAPSHOT_DELETE_FAILED, + "snapshot_name=%s;error=%s", snap_name, + rsp->op_errstr ? rsp->op_errstr + : "Please check log file for details"); + ret = 0; + break; + } - if (!snap_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get snap name"); - goto out; - } + if (!snap_uuid) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid"); + goto out; + } - if (rsp->op_ret != 0) { - gf_event (EVENT_SNAPSHOT_DELETE_FAILED, - "snapshot_name=%s;error=%s", snap_name, - rsp->op_errstr ? rsp->op_errstr : - "Please check log file for details"); - ret = 0; - break; - } + gf_event(EVENT_SNAPSHOT_DELETED, + "snapshot_name=%s;" + "snapshot_uuid=%s", + snap_name, snap_uuid); - if (!snap_uuid) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap uuid"); - goto out; - } + ret = 0; + break; - gf_event (EVENT_SNAPSHOT_DELETED, "snapshot_name=%s;" - "snapshot_uuid=%s", snap_name, snap_uuid); + case GF_SNAP_OPTION_TYPE_CLONE: + if (!clone_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get clone name"); + goto out; + } + + if (!snap_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snapname name"); + goto out; + } + if (rsp->op_ret != 0) { + gf_event(EVENT_SNAPSHOT_CLONE_FAILED, + "snapshot_name=%s;clone_name=%s;" + "error=%s", + snap_name, clone_name, + rsp->op_errstr ? rsp->op_errstr + : "Please check log file for details"); ret = 0; break; + } - case GF_SNAP_OPTION_TYPE_CLONE: - if (!clone_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get clone name"); - goto out; - } + if (!snap_uuid) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid"); + goto out; + } - if (!snap_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get snapname name"); - goto out; - } + gf_event(EVENT_SNAPSHOT_CLONED, + "snapshot_name=%s;" + "clone_name=%s;clone_uuid=%s", + snap_name, clone_name, snap_uuid); - if (rsp->op_ret != 0) { - gf_event (EVENT_SNAPSHOT_CLONE_FAILED, - "snapshot_name=%s;clone_name=%s;" - "error=%s", snap_name, clone_name, - rsp->op_errstr ? rsp->op_errstr : - "Please check log file for details"); - ret = 0; - break; - } + ret = 0; + break; - if (!snap_uuid) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap uuid"); - goto out; - } + case GF_SNAP_OPTION_TYPE_CONFIG: + if (rsp->op_ret != 0) { + gf_event(EVENT_SNAPSHOT_CONFIG_UPDATE_FAILED, "error=%s", + rsp->op_errstr ? rsp->op_errstr + : "Please check log file for details"); + ret = 0; + break; + } - gf_event (EVENT_SNAPSHOT_CLONED, "snapshot_name=%s;" - "clone_name=%s;clone_uuid=%s", - snap_name, clone_name, snap_uuid); + ret = dict_get_int32(dict, "config-command", &config_command); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch config type"); + goto out; + } + if (config_command == GF_SNAP_CONFIG_DISPLAY) { ret = 0; break; + } - case GF_SNAP_OPTION_TYPE_CONFIG: - if (rsp->op_ret != 0) { - gf_event (EVENT_SNAPSHOT_CONFIG_UPDATE_FAILED, - "error=%s", - rsp->op_errstr ? rsp->op_errstr : - "Please check log file for details"); - ret = 0; - break; - } + /* These are optional parameters therefore ignore the error */ + ret = dict_get_uint64(dict, "snap-max-hard-limit", &hard_limit); + ret = dict_get_uint64(dict, "snap-max-soft-limit", &soft_limit); + ret = dict_get_str(dict, "auto-delete", &auto_delete); + ret = dict_get_str(dict, "snap-activate-on-create", &snap_activate); - ret = dict_get_int32 (dict, "config-command", &config_command); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Could not fetch config type"); - goto out; - } - - if (config_command == GF_SNAP_CONFIG_DISPLAY) { - ret = 0; - break; - } + if (!hard_limit && !soft_limit && !auto_delete && !snap_activate) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, + "At least one option from " + "snap-max-hard-limit, snap-max-soft-limit, " + "auto-delete and snap-activate-on-create " + "should be set"); + goto out; + } - /* These are optional parameters therefore ignore the error */ - ret = dict_get_uint64 (dict, "snap-max-hard-limit", - &hard_limit); - ret = dict_get_uint64 (dict, "snap-max-soft-limit", - &soft_limit); - ret = dict_get_str (dict, "auto-delete", - &auto_delete); - ret = dict_get_str (dict, "snap-activate-on-create", - &snap_activate); - - if (!hard_limit && !soft_limit && - !auto_delete && !snap_activate) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "At least one option from " - "snap-max-hard-limit, snap-max-soft-limit, " - "auto-delete and snap-activate-on-create " - "should be set"); - goto out; - } + volname = NULL; + ret = dict_get_str(dict, "volname", &volname); - volname = NULL; - ret = dict_get_str (dict, "volname", &volname); - - if (hard_limit || soft_limit) { - snprintf (option, sizeof(option), "%s=%"PRIu64, - hard_limit ? "hard_limit" : "soft_limit", - hard_limit ? hard_limit:soft_limit); - } else if (auto_delete || snap_activate) { - snprintf (option, sizeof(option), "%s=%s", - auto_delete ? "auto-delete" : "snap-activate", - auto_delete ? auto_delete:snap_activate); - } + if (hard_limit || soft_limit) { + snprintf(option, sizeof(option), "%s=%" PRIu64, + hard_limit ? "hard_limit" : "soft_limit", + hard_limit ? hard_limit : soft_limit); + } else if (auto_delete || snap_activate) { + snprintf(option, sizeof(option), "%s=%s", + auto_delete ? "auto-delete" : "snap-activate", + auto_delete ? auto_delete : snap_activate); + } - snprintf (msg, sizeof(msg), "config_type=%s;%s", - volname?"volume_config":"system_config", option); + snprintf(msg, sizeof(msg), "config_type=%s;%s", + volname ? "volume_config" : "system_config", option); - gf_event (EVENT_SNAPSHOT_CONFIG_UPDATED, "%s", msg); + gf_event(EVENT_SNAPSHOT_CONFIG_UPDATED, "%s", msg); - ret = 0; - break; + ret = 0; + break; default: - gf_log ("cli", GF_LOG_WARNING, - "Cannot generate event for unknown type."); - ret = 0; - goto out; - } + gf_log("cli", GF_LOG_WARNING, + "Cannot generate event for unknown type."); + ret = 0; + goto out; + } out: - return ret; + return ret; } /* @@ -10766,1415 +10684,1463 @@ out: * repeating the same code again and again. * */ int -gf_cli_snapshot_get_data_from_dict (dict_t *dict, char **snap_name, - char **volname, char **snap_uuid, - int8_t *soft_limit_flag, - char **clone_name) +gf_cli_snapshot_get_data_from_dict(dict_t *dict, char **snap_name, + char **volname, char **snap_uuid, + int8_t *soft_limit_flag, char **clone_name) { - int ret = -1; + int ret = -1; - GF_VALIDATE_OR_GOTO ("cli", dict, out); + GF_VALIDATE_OR_GOTO("cli", dict, out); - if (snap_name) { - ret = dict_get_str (dict, "snapname", snap_name); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get snapname from dict"); - } + if (snap_name) { + ret = dict_get_str(dict, "snapname", snap_name); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, "failed to get snapname from dict"); } + } - if (volname) { - ret = dict_get_str (dict, "volname1", volname); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get volname1 from dict"); - } + if (volname) { + ret = dict_get_str(dict, "volname1", volname); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, "failed to get volname1 from dict"); } + } - if (snap_uuid) { - ret = dict_get_str (dict, "snapuuid", snap_uuid); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get snapuuid from dict"); - } + if (snap_uuid) { + ret = dict_get_str(dict, "snapuuid", snap_uuid); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, "failed to get snapuuid from dict"); } + } - if (soft_limit_flag) { - ret = dict_get_int8 (dict, "soft-limit-reach", - soft_limit_flag); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get soft-limit-reach from dict"); - } + if (soft_limit_flag) { + ret = dict_get_int8(dict, "soft-limit-reach", soft_limit_flag); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, + "failed to get soft-limit-reach from dict"); } + } - if (clone_name) { - ret = dict_get_str (dict, "clonename", clone_name); - if (ret) { - gf_log ("cli", GF_LOG_DEBUG, - "failed to get clonename from dict"); - } + if (clone_name) { + ret = dict_get_str(dict, "clonename", clone_name); + if (ret) { + gf_log("cli", GF_LOG_DEBUG, "failed to get clonename from dict"); } + } - ret = 0; + ret = 0; out: - return ret; + return ret; } int -gf_cli_snapshot_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - int ret = -1; - gf_cli_rsp rsp = {0, }; - dict_t *dict = NULL; - char *snap_name = NULL; - char *clone_name = NULL; - int32_t type = 0; - call_frame_t *frame = NULL; - gf_boolean_t snap_driven = _gf_false; - int8_t soft_limit_flag = -1; - char *volname = NULL; - char *snap_uuid = NULL; - - GF_ASSERT (myframe); - - if (req->rpc_status == -1) { - goto out; - } - - frame = myframe; - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (frame->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } +gf_cli_snapshot_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + int ret = -1; + gf_cli_rsp rsp = { + 0, + }; + dict_t *dict = NULL; + char *snap_name = NULL; + char *clone_name = NULL; + int32_t type = 0; + call_frame_t *frame = NULL; + gf_boolean_t snap_driven = _gf_false; + int8_t soft_limit_flag = -1; + char *volname = NULL; + char *snap_uuid = NULL; + + GF_ASSERT(myframe); + + if (req->rpc_status == -1) { + goto out; + } + + frame = myframe; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(frame->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + dict = dict_new(); + + if (!dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + + if (ret) + goto out; + + ret = dict_get_int32(dict, "type", &type); + if (ret) { + gf_log(frame->this->name, GF_LOG_ERROR, "failed to get type"); + goto out; + } + + ret = gf_cli_snapshot_get_data_from_dict( + dict, &snap_name, &volname, &snap_uuid, &soft_limit_flag, &clone_name); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to fetch data from dict."); + goto out; + } - dict = dict_new (); - - if (!dict) { - ret = -1; - goto out; - } - - ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, &dict); - - if (ret) - goto out; +#if (USE_EVENTS) + ret = gf_cli_generate_snapshot_event(&rsp, dict, type, snap_name, volname, + snap_uuid, clone_name); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to generate snapshot event"); + goto out; + } +#endif - ret = dict_get_int32 (dict, "type", &type); + /* Snapshot status and delete command is handled separately */ + if (global_state->mode & GLUSTER_MODE_XML && + GF_SNAP_OPTION_TYPE_STATUS != type && + GF_SNAP_OPTION_TYPE_DELETE != type) { + ret = cli_xml_output_snapshot(type, dict, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); if (ret) { - gf_log (frame->this->name, GF_LOG_ERROR, "failed to get type"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); } - ret = gf_cli_snapshot_get_data_from_dict (dict, &snap_name, &volname, - &snap_uuid, &soft_limit_flag, - &clone_name); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to fetch data from dict."); - goto out; - } + goto out; + } -#if (USE_EVENTS) - ret = gf_cli_generate_snapshot_event (&rsp, dict, type, snap_name, - volname, snap_uuid, clone_name); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to generate snapshot event"); + switch (type) { + case GF_SNAP_OPTION_TYPE_CREATE: + if (rsp.op_ret) { + cli_err("snapshot create: failed: %s", + rsp.op_errstr ? rsp.op_errstr + : "Please check log file for details"); + ret = rsp.op_ret; goto out; - } -#endif - - /* Snapshot status and delete command is handled separately */ - if (global_state->mode & GLUSTER_MODE_XML && - GF_SNAP_OPTION_TYPE_STATUS != type && - GF_SNAP_OPTION_TYPE_DELETE != type) { - ret = cli_xml_output_snapshot (type, dict, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Error outputting to xml"); - } + } + if (!snap_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); goto out; - } + } - switch (type) { - case GF_SNAP_OPTION_TYPE_CREATE: - if (rsp.op_ret) { - cli_err("snapshot create: failed: %s", - rsp.op_errstr ? rsp.op_errstr : - "Please check log file for details"); - ret = rsp.op_ret; - goto out; - } - - if (!snap_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get snap name"); - goto out; - } - - if (!volname) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get volume name"); - goto out; - } + if (!volname) { + gf_log("cli", GF_LOG_ERROR, "Failed to get volume name"); + goto out; + } - cli_out ("snapshot create: success: Snap %s created " - "successfully", snap_name); + cli_out( + "snapshot create: success: Snap %s created " + "successfully", + snap_name); - if (soft_limit_flag == 1) { - cli_out ("Warning: Soft-limit of volume (%s) is " - "reached. Snapshot creation is not possible " - "once hard-limit is reached.", volname); - } - ret = 0; - break; + if (soft_limit_flag == 1) { + cli_out( + "Warning: Soft-limit of volume (%s) is " + "reached. Snapshot creation is not possible " + "once hard-limit is reached.", + volname); + } + ret = 0; + break; case GF_SNAP_OPTION_TYPE_CLONE: - if (rsp.op_ret) { - cli_err("snapshot clone: failed: %s", - rsp.op_errstr ? rsp.op_errstr : - "Please check log file for details"); - ret = rsp.op_ret; - goto out; - } + if (rsp.op_ret) { + cli_err("snapshot clone: failed: %s", + rsp.op_errstr ? rsp.op_errstr + : "Please check log file for details"); + ret = rsp.op_ret; + goto out; + } - if (!clone_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get clone name"); - goto out; - } + if (!clone_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get clone name"); + goto out; + } - if (!snap_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get snapname name"); - goto out; - } + if (!snap_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snapname name"); + goto out; + } - cli_out ("snapshot clone: success: Clone %s created " - "successfully", clone_name); + cli_out( + "snapshot clone: success: Clone %s created " + "successfully", + clone_name); - ret = 0; - break; + ret = 0; + break; case GF_SNAP_OPTION_TYPE_RESTORE: - if (rsp.op_ret) { - cli_err("snapshot restore: failed: %s", - rsp.op_errstr ? rsp.op_errstr : - "Please check log file for details"); - ret = rsp.op_ret; - goto out; - } + if (rsp.op_ret) { + cli_err("snapshot restore: failed: %s", + rsp.op_errstr ? rsp.op_errstr + : "Please check log file for details"); + ret = rsp.op_ret; + goto out; + } - if (!snap_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get snap name"); - goto out; - } + if (!snap_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); + goto out; + } - cli_out ("Snapshot restore: %s: Snap restored " - "successfully", snap_name); + cli_out( + "Snapshot restore: %s: Snap restored " + "successfully", + snap_name); - ret = 0; - break; + ret = 0; + break; case GF_SNAP_OPTION_TYPE_ACTIVATE: - if (rsp.op_ret) { - cli_err("snapshot activate: failed: %s", - rsp.op_errstr ? rsp.op_errstr : - "Please check log file for details"); - ret = rsp.op_ret; - goto out; - } + if (rsp.op_ret) { + cli_err("snapshot activate: failed: %s", + rsp.op_errstr ? rsp.op_errstr + : "Please check log file for details"); + ret = rsp.op_ret; + goto out; + } - if (!snap_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get snap name"); - goto out; - } + if (!snap_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); + goto out; + } - cli_out ("Snapshot activate: %s: Snap activated " - "successfully", snap_name); + cli_out( + "Snapshot activate: %s: Snap activated " + "successfully", + snap_name); - ret = 0; - break; + ret = 0; + break; case GF_SNAP_OPTION_TYPE_DEACTIVATE: - if (rsp.op_ret) { - cli_err("snapshot deactivate: failed: %s", - rsp.op_errstr ? rsp.op_errstr : - "Please check log file for details"); - ret = rsp.op_ret; - goto out; - } + if (rsp.op_ret) { + cli_err("snapshot deactivate: failed: %s", + rsp.op_errstr ? rsp.op_errstr + : "Please check log file for details"); + ret = rsp.op_ret; + goto out; + } - if (!snap_name) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to get snap name"); - goto out; - } + if (!snap_name) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); + goto out; + } - cli_out ("Snapshot deactivate: %s: Snap deactivated " - "successfully", snap_name); + cli_out( + "Snapshot deactivate: %s: Snap deactivated " + "successfully", + snap_name); - ret = 0; - break; + ret = 0; + break; case GF_SNAP_OPTION_TYPE_INFO: - if (rsp.op_ret) { - cli_err ("Snapshot info : failed: %s", - rsp.op_errstr ? rsp.op_errstr : - "Please check log file for details"); - ret = rsp.op_ret; - goto out; - } + if (rsp.op_ret) { + cli_err("Snapshot info : failed: %s", + rsp.op_errstr ? rsp.op_errstr + : "Please check log file for details"); + ret = rsp.op_ret; + goto out; + } - snap_driven = dict_get_str_boolean (dict, "snap-driven", - _gf_false); - if (snap_driven == _gf_true) { - ret = cli_call_snapshot_info (dict, snap_driven); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Snapshot info failed"); - goto out; - } - } else if (snap_driven == _gf_false) { - ret = cli_get_snaps_in_volume (dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Snapshot info failed"); - goto out; - } + snap_driven = dict_get_str_boolean(dict, "snap-driven", _gf_false); + if (snap_driven == _gf_true) { + ret = cli_call_snapshot_info(dict, snap_driven); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Snapshot info failed"); + goto out; } - break; - - case GF_SNAP_OPTION_TYPE_CONFIG: - ret = cli_snapshot_config_display (dict, &rsp); + } else if (snap_driven == _gf_false) { + ret = cli_get_snaps_in_volume(dict); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to display " - "snapshot config output."); - goto out; + gf_log("cli", GF_LOG_ERROR, "Snapshot info failed"); + goto out; } - break; + } + break; + + case GF_SNAP_OPTION_TYPE_CONFIG: + ret = cli_snapshot_config_display(dict, &rsp); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to display " + "snapshot config output."); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_LIST: - if (rsp.op_ret) { - cli_err ("Snapshot list : failed: %s", - rsp.op_errstr ? rsp.op_errstr : - "Please check log file for details"); - ret = rsp.op_ret; - goto out; - } + if (rsp.op_ret) { + cli_err("Snapshot list : failed: %s", + rsp.op_errstr ? rsp.op_errstr + : "Please check log file for details"); + ret = rsp.op_ret; + goto out; + } - ret = cli_snapshot_list (dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to display " - "snapshot list"); - goto out; - } - break; + ret = cli_snapshot_list(dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to display " + "snapshot list"); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_DELETE: - ret = cli_snapshot_remove_reply (&rsp, dict, frame); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Failed to delete snap"); - goto out; - } - break; + ret = cli_snapshot_remove_reply(&rsp, dict, frame); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to delete snap"); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_STATUS: - ret = cli_snapshot_status (dict, &rsp, frame); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to display " - "snapshot status output."); - goto out; - } - break; + ret = cli_snapshot_status(dict, &rsp, frame); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to display " + "snapshot status output."); + goto out; + } + break; default: - cli_err ("Unknown command executed"); - ret = -1; - goto out; - } + cli_err("Unknown command executed"); + ret = -1; + goto out; + } out: - if (dict) - dict_unref (dict); - cli_cmd_broadcast_response (ret); + if (dict) + dict_unref(dict); + cli_cmd_broadcast_response(ret); - free (rsp.dict.dict_val); - free (rsp.op_errstr); + free(rsp.dict.dict_val); + free(rsp.op_errstr); - return ret; + return ret; } int32_t -gf_cli_snapshot_for_delete (call_frame_t *frame, xlator_t *this, - void *data) -{ - gf_cli_req req = {{0,}}; - int32_t ret = -1; - int32_t cmd = -1; - cli_local_t *local = NULL; - dict_t *snap_dict = NULL; - int32_t snapcount = 0; - int i = 0; - char question[PATH_MAX] = ""; - char *volname = NULL; - gf_answer_t answer = GF_ANSWER_NO; - - GF_VALIDATE_OR_GOTO ("cli", frame, out); - GF_VALIDATE_OR_GOTO ("cli", frame->local, out); - GF_VALIDATE_OR_GOTO ("cli", this, out); - GF_VALIDATE_OR_GOTO ("cli", data, out); - - local = frame->local; - - ret = dict_get_int32 (local->dict, "sub-cmd", &cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get " - "sub-cmd"); - goto out; - } - - /* No need multiple RPCs for individual snapshot delete*/ - if (cmd == GF_SNAP_DELETE_TYPE_SNAP) { - ret = 0; - goto out; - } - - ret = dict_get_int32 (local->dict, "snapcount", - &snapcount); +gf_cli_snapshot_for_delete(call_frame_t *frame, xlator_t *this, void *data) +{ + gf_cli_req req = {{ + 0, + }}; + int32_t ret = -1; + int32_t cmd = -1; + cli_local_t *local = NULL; + dict_t *snap_dict = NULL; + int32_t snapcount = 0; + int i = 0; + char question[PATH_MAX] = ""; + char *volname = NULL; + gf_answer_t answer = GF_ANSWER_NO; + + GF_VALIDATE_OR_GOTO("cli", frame, out); + GF_VALIDATE_OR_GOTO("cli", frame->local, out); + GF_VALIDATE_OR_GOTO("cli", this, out); + GF_VALIDATE_OR_GOTO("cli", data, out); + + local = frame->local; + + ret = dict_get_int32(local->dict, "sub-cmd", &cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to get " + "sub-cmd"); + goto out; + } + + /* No need multiple RPCs for individual snapshot delete*/ + if (cmd == GF_SNAP_DELETE_TYPE_SNAP) { + ret = 0; + goto out; + } + + ret = dict_get_int32(local->dict, "snapcount", &snapcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not get " + "snapcount"); + goto out; + } + + if (global_state->mode & GLUSTER_MODE_XML) { +#ifdef HAVE_LIB_XML + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"snapCount", "%d", snapcount); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not get " - "snapcount"); - goto out; + gf_log("cli", GF_LOG_ERROR, + "Failed to write " + "xml element \"snapCount\""); + goto out; } - - if (global_state->mode & GLUSTER_MODE_XML) { -#ifdef HAVE_LIB_XML - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"snapCount", - "%d", snapcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to write " - "xml element \"snapCount\""); - goto out; - } #endif /* HAVE_LIB_XML */ - } else if (snapcount == 0) { - cli_out ("No snapshots present"); - goto out; + } else if (snapcount == 0) { + cli_out("No snapshots present"); + goto out; + } + + if (cmd == GF_SNAP_DELETE_TYPE_ALL) { + snprintf(question, sizeof(question), + "System contains %d " + "snapshot(s).\nDo you still " + "want to continue and delete them? ", + snapcount); + } else { + ret = dict_get_str(local->dict, "volname", &volname); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to fetch " + "volname from local dictionary"); + goto out; } - if (cmd == GF_SNAP_DELETE_TYPE_ALL) { - snprintf (question, sizeof (question), "System contains %d " - "snapshot(s).\nDo you still " - "want to continue and delete them? ", - snapcount); - } else { - ret = dict_get_str (local->dict, "volname", &volname); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to fetch " - "volname from local dictionary"); - goto out; - } + snprintf(question, sizeof(question), + "Volume (%s) contains " + "%d snapshot(s).\nDo you still want to " + "continue and delete them? ", + volname, snapcount); + } - snprintf (question, sizeof (question), "Volume (%s) contains " - "%d snapshot(s).\nDo you still want to " - "continue and delete them? ", volname, - snapcount); - } - - answer = cli_cmd_get_confirmation (global_state, question); - if (GF_ANSWER_NO == answer) { - ret = 0; - gf_log ("cli", GF_LOG_DEBUG, "User cancelled " - "snapshot delete operation for snap delete"); - goto out; - } + answer = cli_cmd_get_confirmation(global_state, question); + if (GF_ANSWER_NO == answer) { + ret = 0; + gf_log("cli", GF_LOG_DEBUG, + "User cancelled " + "snapshot delete operation for snap delete"); + goto out; + } - for (i = 1 ; i <= snapcount ; i++) { - ret = -1; + for (i = 1; i <= snapcount; i++) { + ret = -1; - snap_dict = dict_new(); - if (!snap_dict) - goto out; + snap_dict = dict_new(); + if (!snap_dict) + goto out; - ret = cli_populate_req_dict_for_delete (snap_dict, - local->dict, i); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not " - "populate snap request dictionary"); - goto out; - } + ret = cli_populate_req_dict_for_delete(snap_dict, local->dict, i); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not " + "populate snap request dictionary"); + goto out; + } - ret = cli_to_glusterd (&req, frame, - gf_cli_snapshot_cbk, - (xdrproc_t) xdr_gf_cli_req, snap_dict, - GLUSTER_CLI_SNAP, this, cli_rpc_prog, - NULL); - if (ret) { - /* Fail the operation if deleting one of the - * snapshots is failed - */ - gf_log ("cli", GF_LOG_ERROR, "cli_to_glusterd " - "for snapshot delete failed"); - goto out; - } - dict_unref (snap_dict); - snap_dict = NULL; + ret = cli_to_glusterd(&req, frame, gf_cli_snapshot_cbk, + (xdrproc_t)xdr_gf_cli_req, snap_dict, + GLUSTER_CLI_SNAP, this, cli_rpc_prog, NULL); + if (ret) { + /* Fail the operation if deleting one of the + * snapshots is failed + */ + gf_log("cli", GF_LOG_ERROR, + "cli_to_glusterd " + "for snapshot delete failed"); + goto out; } + dict_unref(snap_dict); + snap_dict = NULL; + } out: - if (snap_dict) - dict_unref (snap_dict); + if (snap_dict) + dict_unref(snap_dict); - return ret; + return ret; } int32_t -gf_cli_snapshot_for_status (call_frame_t *frame, xlator_t *this, - void *data) -{ - - gf_cli_req req = {{0,}}; - int ret = -1; - int32_t cmd = -1; - cli_local_t *local = NULL; - dict_t *snap_dict = NULL; - int snapcount = 0; - int i = 0; +gf_cli_snapshot_for_status(call_frame_t *frame, xlator_t *this, void *data) +{ + gf_cli_req req = {{ + 0, + }}; + int ret = -1; + int32_t cmd = -1; + cli_local_t *local = NULL; + dict_t *snap_dict = NULL; + int snapcount = 0; + int i = 0; + + GF_VALIDATE_OR_GOTO("cli", frame, out); + GF_VALIDATE_OR_GOTO("cli", frame->local, out); + GF_VALIDATE_OR_GOTO("cli", this, out); + GF_VALIDATE_OR_GOTO("cli", data, out); + + local = frame->local; + + ret = dict_get_int32(local->dict, "sub-cmd", &cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get sub-cmd"); + goto out; + } + + /* Snapshot status of single snap (i.e. GF_SNAP_STATUS_TYPE_SNAP) + * is already handled. Therefore we can return from here. + * If want to get status of all snaps in the system or volume then + * we should get them one by one.*/ + if ((cmd == GF_SNAP_STATUS_TYPE_SNAP) || + (cmd == GF_SNAP_STATUS_TYPE_ITER)) { + ret = 0; + goto out; + } - GF_VALIDATE_OR_GOTO ("cli", frame, out); - GF_VALIDATE_OR_GOTO ("cli", frame->local, out); - GF_VALIDATE_OR_GOTO ("cli", this, out); - GF_VALIDATE_OR_GOTO ("cli", data, out); + ret = dict_get_int32(local->dict, "status.snapcount", &snapcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not get snapcount"); + goto out; + } - local = frame->local; + if (snapcount == 0 && !(global_state->mode & GLUSTER_MODE_XML)) { + cli_out("No snapshots present"); + } - ret = dict_get_int32 (local->dict, "sub-cmd", &cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get sub-cmd"); - goto out; - } + for (i = 0; i < snapcount; i++) { + ret = -1; - /* Snapshot status of single snap (i.e. GF_SNAP_STATUS_TYPE_SNAP) - * is already handled. Therefore we can return from here. - * If want to get status of all snaps in the system or volume then - * we should get them one by one.*/ - if ((cmd == GF_SNAP_STATUS_TYPE_SNAP) || - (cmd == GF_SNAP_STATUS_TYPE_ITER)) { - ret = 0; - goto out; - } + snap_dict = dict_new(); + if (!snap_dict) + goto out; - ret = dict_get_int32 (local->dict, "status.snapcount", &snapcount); + ret = cli_populate_req_dict_for_status(snap_dict, local->dict, i); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not get snapcount"); - goto out; + gf_log("cli", GF_LOG_ERROR, + "Could not " + "populate snap request dictionary"); + goto out; } - if (snapcount == 0 && !(global_state->mode & GLUSTER_MODE_XML)) { - cli_out ("No snapshots present"); - } + ret = cli_to_glusterd(&req, frame, gf_cli_snapshot_cbk, + (xdrproc_t)xdr_gf_cli_req, snap_dict, + GLUSTER_CLI_SNAP, this, cli_rpc_prog, NULL); - for (i = 0 ; i < snapcount; i++) { - ret = -1; - - snap_dict = dict_new(); - if (!snap_dict) - goto out; - - ret = cli_populate_req_dict_for_status (snap_dict, - local->dict, i); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not " - "populate snap request dictionary"); - goto out; - } - - ret = cli_to_glusterd (&req, frame, - gf_cli_snapshot_cbk, - (xdrproc_t) xdr_gf_cli_req, snap_dict, - GLUSTER_CLI_SNAP, this, cli_rpc_prog, - NULL); - - /* Ignore the return value and error for snapshot - * status of type "ALL" or "VOL" - * - * Scenario : There might be case where status command - * and delete command might be issued at the same time. - * In that case when status tried to fetch detail of - * snap which has been deleted by concurrent command, - * then it will show snapshot not present. Which will - * not be appropriate. - */ - if (ret && - (cmd != GF_SNAP_STATUS_TYPE_ALL && - cmd != GF_SNAP_STATUS_TYPE_VOL)) { - gf_log ("cli", GF_LOG_ERROR, - "cli_to_glusterd for snapshot status failed"); - goto out; - } - dict_unref (snap_dict); - snap_dict = NULL; + /* Ignore the return value and error for snapshot + * status of type "ALL" or "VOL" + * + * Scenario : There might be case where status command + * and delete command might be issued at the same time. + * In that case when status tried to fetch detail of + * snap which has been deleted by concurrent command, + * then it will show snapshot not present. Which will + * not be appropriate. + */ + if (ret && (cmd != GF_SNAP_STATUS_TYPE_ALL && + cmd != GF_SNAP_STATUS_TYPE_VOL)) { + gf_log("cli", GF_LOG_ERROR, + "cli_to_glusterd for snapshot status failed"); + goto out; } + dict_unref(snap_dict); + snap_dict = NULL; + } - ret = 0; + ret = 0; out: - if (snap_dict) - dict_unref (snap_dict); + if (snap_dict) + dict_unref(snap_dict); - return ret; + return ret; } int32_t -gf_cli_snapshot (call_frame_t *frame, xlator_t *this, - void *data) -{ - gf_cli_req req = {{0,}}; - dict_t *options = NULL; - int ret = -1; - int tmp_ret = -1; - cli_local_t *local = NULL; - char *err_str = NULL; - int type = -1; - - if (!frame || !this || !data) - goto out; - - if (!frame->local) - goto out; +gf_cli_snapshot(call_frame_t *frame, xlator_t *this, void *data) +{ + gf_cli_req req = {{ + 0, + }}; + dict_t *options = NULL; + int ret = -1; + int tmp_ret = -1; + cli_local_t *local = NULL; + char *err_str = NULL; + int type = -1; - local = frame->local; + if (!frame || !this || !data) + goto out; - options = data; + if (!frame->local) + goto out; - ret = dict_get_int32 (local->dict, "type", &type); + local = frame->local; - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_snapshot_begin_composite_op (local); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to begin " - "snapshot xml composite op"); - goto out; - } - } + options = data; + ret = dict_get_int32(local->dict, "type", &type); - ret = cli_to_glusterd (&req, frame, gf_cli_snapshot_cbk, - (xdrproc_t) xdr_gf_cli_req, options, - GLUSTER_CLI_SNAP, this, cli_rpc_prog, - NULL); + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_snapshot_begin_composite_op(local); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "cli_to_glusterd for " - "snapshot failed"); - goto xmlend; + gf_log("cli", GF_LOG_ERROR, + "Failed to begin " + "snapshot xml composite op"); + goto out; + } + } + + ret = cli_to_glusterd(&req, frame, gf_cli_snapshot_cbk, + (xdrproc_t)xdr_gf_cli_req, options, GLUSTER_CLI_SNAP, + this, cli_rpc_prog, NULL); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "cli_to_glusterd for " + "snapshot failed"); + goto xmlend; + } + + if (GF_SNAP_OPTION_TYPE_STATUS == type) { + ret = gf_cli_snapshot_for_status(frame, this, data); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "cli to glusterd " + "for snapshot status command failed"); } - if (GF_SNAP_OPTION_TYPE_STATUS == type) { - ret = gf_cli_snapshot_for_status (frame, this, data); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "cli to glusterd " - "for snapshot status command failed"); - } + goto xmlend; + } - goto xmlend; + if (GF_SNAP_OPTION_TYPE_DELETE == type) { + ret = gf_cli_snapshot_for_delete(frame, this, data); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "cli to glusterd " + "for snapshot delete command failed"); } - if (GF_SNAP_OPTION_TYPE_DELETE == type) { - ret = gf_cli_snapshot_for_delete (frame, this, data); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "cli to glusterd " - "for snapshot delete command failed"); - } + goto xmlend; + } - goto xmlend; - } - - ret = 0; + ret = 0; xmlend: - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_snapshot_end_composite_op (local); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to end " - "snapshot xml composite op"); - goto out; - } - } -out: - if (ret && local && GF_SNAP_OPTION_TYPE_STATUS == type) { - tmp_ret = dict_get_str (local->dict, "op_err_str", &err_str); - if (tmp_ret || !err_str) { - cli_err ("Snapshot Status : failed: %s", "Please " - "check log file for details"); - } else { - cli_err ("Snapshot Status : failed: %s", err_str); - dict_del (local->dict, "op_err_str"); - } + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_snapshot_end_composite_op(local); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to end " + "snapshot xml composite op"); + goto out; + } + } +out: + if (ret && local && GF_SNAP_OPTION_TYPE_STATUS == type) { + tmp_ret = dict_get_str(local->dict, "op_err_str", &err_str); + if (tmp_ret || !err_str) { + cli_err("Snapshot Status : failed: %s", + "Please " + "check log file for details"); + } else { + cli_err("Snapshot Status : failed: %s", err_str); + dict_del(local->dict, "op_err_str"); } + } - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); + GF_FREE(req.dict.dict_val); - if (global_state->mode & GLUSTER_MODE_XML) { - /* XML mode handles its own error */ - ret = 0; - } - return ret; + if (global_state->mode & GLUSTER_MODE_XML) { + /* XML mode handles its own error */ + ret = 0; + } + return ret; } int32_t -gf_cli_barrier_volume_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) - goto out; - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - gf_log ("cli", GF_LOG_DEBUG, "Received response to barrier"); - - if (rsp.op_ret) { - if (rsp.op_errstr && (strlen (rsp.op_errstr) > 1)) { - cli_err ("volume barrier: command unsuccessful : %s", - rsp.op_errstr); - } else { - cli_err ("volume barrier: command unsuccessful"); - } +gf_cli_barrier_volume_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) + goto out; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + gf_log("cli", GF_LOG_DEBUG, "Received response to barrier"); + + if (rsp.op_ret) { + if (rsp.op_errstr && (strlen(rsp.op_errstr) > 1)) { + cli_err("volume barrier: command unsuccessful : %s", rsp.op_errstr); } else { - cli_out ("volume barrier: command successful"); + cli_err("volume barrier: command unsuccessful"); } - ret = rsp.op_ret; + } else { + cli_out("volume barrier: command successful"); + } + ret = rsp.op_ret; out: - free (rsp.op_errstr); - free (rsp.dict.dict_val); - cli_cmd_broadcast_response (ret); - return ret; + free(rsp.op_errstr); + free(rsp.dict.dict_val); + cli_cmd_broadcast_response(ret); + return ret; } int -gf_cli_barrier_volume (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_barrier_volume(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - dict_t *options = NULL; - int ret = -1; + gf_cli_req req = {{ + 0, + }}; + dict_t *options = NULL; + int ret = -1; - if (!frame || !this || !data) - goto out; + if (!frame || !this || !data) + goto out; - options = data; + options = data; - ret = cli_to_glusterd (&req, frame, gf_cli_barrier_volume_cbk, - (xdrproc_t) xdr_gf_cli_req, options, - GLUSTER_CLI_BARRIER_VOLUME, this, cli_rpc_prog, - NULL); + ret = cli_to_glusterd(&req, frame, gf_cli_barrier_volume_cbk, + (xdrproc_t)xdr_gf_cli_req, options, + GLUSTER_CLI_BARRIER_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); - GF_FREE (req.dict.dict_val); - return ret; + GF_FREE(req.dict.dict_val); + return ret; } int32_t -gf_cli_get_vol_opt_cbk (struct rpc_req *req, struct iovec *iov, int count, - void *myframe) -{ - gf_cli_rsp rsp = {0,}; - int ret = -1; - dict_t *dict = NULL; - char *key = NULL; - char *value = NULL; - char msg[1024] = {0,}; - int i = 0; - char dict_key[50] = {0,}; - - GF_ASSERT (myframe); - - if (-1 == req->rpc_status) - goto out; - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - gf_log ("cli", GF_LOG_DEBUG, "Received response to get volume option"); - - if (rsp.op_ret) { - if (strcmp (rsp.op_errstr, "")) - snprintf (msg, sizeof (msg), "volume get option: " - "failed: %s", rsp.op_errstr); - else - snprintf (msg, sizeof (msg), "volume get option: " - "failed"); - - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_str ("volGetopts", msg, rsp.op_ret, - rsp.op_errno, rsp.op_errstr); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - } - } else { - cli_err ("%s", msg); - } - ret = rsp.op_ret; - goto out_nolog; - } - dict = dict_new (); - - if (!dict) { - ret = -1; - goto out; - } - - ret = dict_unserialize (rsp.dict.dict_val, rsp.dict.dict_len, &dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Failed rsp_dict unserialization"); - goto out; - } +gf_cli_get_vol_opt_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + gf_cli_rsp rsp = { + 0, + }; + int ret = -1; + dict_t *dict = NULL; + char *key = NULL; + char *value = NULL; + char msg[1024] = { + 0, + }; + int i = 0; + char dict_key[50] = { + 0, + }; + + GF_ASSERT(myframe); + + if (-1 == req->rpc_status) + goto out; + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + gf_log("cli", GF_LOG_DEBUG, "Received response to get volume option"); + + if (rsp.op_ret) { + if (strcmp(rsp.op_errstr, "")) + snprintf(msg, sizeof(msg), + "volume get option: " + "failed: %s", + rsp.op_errstr); + else + snprintf(msg, sizeof(msg), + "volume get option: " + "failed"); if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_getopts (dict, rsp.op_ret, - rsp.op_errno, - rsp.op_errstr); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "xml output generation " - "failed"); - ret = 0; - } - goto out; - } - - ret = dict_get_str (dict, "warning", &value); - if (!ret) { - cli_out ("%s", value); + ret = cli_xml_output_str("volGetopts", msg, rsp.op_ret, + rsp.op_errno, rsp.op_errstr); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + } + } else { + cli_err("%s", msg); } - - ret = dict_get_int32 (dict, "count", &count); + ret = rsp.op_ret; + goto out_nolog; + } + dict = dict_new(); + + if (!dict) { + ret = -1; + goto out; + } + + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed rsp_dict unserialization"); + goto out; + } + + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_getopts(dict, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to retrieve count " - "from the dictionary"); - goto out; - } - - if (count <= 0) { - gf_log ("cli", GF_LOG_ERROR, "Value of count :%d is " - "invalid", count); - ret = -1; - goto out; - } - - cli_out ("%-40s%-40s", "Option", "Value"); - cli_out ("%-40s%-40s", "------", "-----"); - for (i=1; i<=count; i++) { - snprintf (dict_key, sizeof dict_key, "key%d", i); - ret = dict_get_str (dict, dict_key, &key); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to" - " retrieve %s from the " - "dictionary", dict_key); - goto out; - } - snprintf (dict_key, sizeof dict_key, "value%d", i); - ret = dict_get_str (dict, dict_key, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to " - "retrieve key value for %s from" - "the dictionary", dict_key); - goto out; - } - cli_out ("%-40s%-40s", key, value); + gf_log("cli", GF_LOG_ERROR, + "xml output generation " + "failed"); + ret = 0; + } + goto out; + } + + ret = dict_get_str(dict, "warning", &value); + if (!ret) { + cli_out("%s", value); + } + + ret = dict_get_int32(dict, "count", &count); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to retrieve count " + "from the dictionary"); + goto out; + } + + if (count <= 0) { + gf_log("cli", GF_LOG_ERROR, + "Value of count :%d is " + "invalid", + count); + ret = -1; + goto out; + } + + cli_out("%-40s%-40s", "Option", "Value"); + cli_out("%-40s%-40s", "------", "-----"); + for (i = 1; i <= count; i++) { + snprintf(dict_key, sizeof dict_key, "key%d", i); + ret = dict_get_str(dict, dict_key, &key); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to" + " retrieve %s from the " + "dictionary", + dict_key); + goto out; + } + snprintf(dict_key, sizeof dict_key, "value%d", i); + ret = dict_get_str(dict, dict_key, &value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to " + "retrieve key value for %s from" + "the dictionary", + dict_key); + goto out; } + cli_out("%-40s%-40s", key, value); + } out: - if (ret) { - cli_out ("volume get option failed. Check the cli/glusterd log " - "file for more details"); - } + if (ret) { + cli_out( + "volume get option failed. Check the cli/glusterd log " + "file for more details"); + } out_nolog: - if (dict) - dict_unref (dict); - free (rsp.op_errstr); - free (rsp.dict.dict_val); - cli_cmd_broadcast_response (ret); - return ret; + if (dict) + dict_unref(dict); + free(rsp.op_errstr); + free(rsp.dict.dict_val); + cli_cmd_broadcast_response(ret); + return ret; } int -gf_cli_get_vol_opt (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_get_vol_opt(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = {{0,}}; - dict_t *options = NULL; - int ret = -1; + gf_cli_req req = {{ + 0, + }}; + dict_t *options = NULL; + int ret = -1; - if (!frame || !this || !data) - goto out; + if (!frame || !this || !data) + goto out; - options = data; + options = data; - ret = cli_to_glusterd (&req, frame, gf_cli_get_vol_opt_cbk, - (xdrproc_t)xdr_gf_cli_req, options, - GLUSTER_CLI_GET_VOL_OPT, this, cli_rpc_prog, - NULL); + ret = cli_to_glusterd(&req, frame, gf_cli_get_vol_opt_cbk, + (xdrproc_t)xdr_gf_cli_req, options, + GLUSTER_CLI_GET_VOL_OPT, this, cli_rpc_prog, NULL); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); - return ret; + GF_FREE(req.dict.dict_val); + return ret; } int -add_cli_cmd_timeout_to_dict (dict_t *dict) +add_cli_cmd_timeout_to_dict(dict_t *dict) { - int ret = 0; + int ret = 0; - if (cli_default_conn_timeout > 120) { - ret = dict_set_uint32 (dict, "timeout", cli_default_conn_timeout); - if (ret) { - gf_log ("cli", GF_LOG_INFO, "Failed to save" - "timeout to dict"); - } + if (cli_default_conn_timeout > 120) { + ret = dict_set_uint32(dict, "timeout", cli_default_conn_timeout); + if (ret) { + gf_log("cli", GF_LOG_INFO, + "Failed to save" + "timeout to dict"); } - return ret; + } + 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; - } +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 (!frame->local) { - ret = -1; - goto out; - } + if (!this || !frame || !dict) { + ret = -1; + goto out; + } - local = frame->local; + if (!frame->local) { + ret = -1; + goto out; + } - if (!local->words) { - ret = -1; - goto out; - } + local = frame->local; - words = local->words; + if (!local->words) { + ret = -1; + goto out; + } - while (words[i]) - len += strlen (words[i++]) + 1; + words = local->words; - cmd = GF_CALLOC (1, len, gf_common_mt_char); + while (words[i]) + len += strlen(words[i++]) + 1; - if (!cmd) { - ret = -1; - goto out; - } + cmd = GF_CALLOC(1, len, gf_common_mt_char); - for (i = 0; words[i]; i++) { - strncat (cmd, words[i], len - 1); - if (words[i+1] != NULL) - strncat (cmd, " ", len - 1); - } + if (!cmd) { + ret = -1; + goto out; + } - cmd [len - 1] = '\0'; + for (i = 0; words[i]; i++) { + strncat(cmd, words[i], len - 1); + if (words[i + 1] != NULL) + strncat(cmd, " ", len - 1); + } - ret = dict_set_dynstr (dict, "cmd-str", cmd); - if (ret) - goto out; + cmd[len - 1] = '\0'; - ret = add_cli_cmd_timeout_to_dict (dict); + 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); + ret = add_cli_cmd_timeout_to_dict(dict); - if (ret < 0) { - gf_log (this->name, GF_LOG_DEBUG, - "failed to get serialized length of dict"); - goto out; - } + ret = dict_allocate_and_serialize(dict, &(req->dict).dict_val, + &(req->dict).dict_len); - ret = cli_cmd_submit (NULL, req, frame, prog, procnum, iobref, this, - cbkfn, (xdrproc_t) xdrproc); -out: - return ret; + if (ret < 0) { + gf_log(this->name, GF_LOG_DEBUG, + "failed to get serialized length of dict"); + goto out; + } + ret = cli_cmd_submit(NULL, req, frame, prog, procnum, iobref, this, cbkfn, + (xdrproc_t)xdrproc); +out: + return ret; } int -gf_cli_print_bitrot_scrub_status (dict_t *dict) -{ - int i = 1; - int j = 0; - int ret = -1; - int count = 0; - char key[256] = {0,}; - char *volname = NULL; - char *node_name = NULL; - char *scrub_freq = NULL; - char *state_scrub = NULL; - char *scrub_impact = NULL; - char *bad_file_str = NULL; - char *scrub_log_file = NULL; - char *bitrot_log_file = NULL; - uint64_t scrub_files = 0; - uint64_t unsigned_files = 0; - uint64_t scrub_time = 0; - uint64_t days = 0; - uint64_t hours = 0; - uint64_t minutes = 0; - uint64_t seconds = 0; - char *last_scrub = NULL; - uint64_t error_count = 0; - int8_t scrub_running = 0; - char *scrub_state_op = NULL; - - - ret = dict_get_str (dict, "volname", &volname); +gf_cli_print_bitrot_scrub_status(dict_t *dict) +{ + int i = 1; + int j = 0; + int ret = -1; + int count = 0; + char key[256] = { + 0, + }; + char *volname = NULL; + char *node_name = NULL; + char *scrub_freq = NULL; + char *state_scrub = NULL; + char *scrub_impact = NULL; + char *bad_file_str = NULL; + char *scrub_log_file = NULL; + char *bitrot_log_file = NULL; + uint64_t scrub_files = 0; + uint64_t unsigned_files = 0; + uint64_t scrub_time = 0; + uint64_t days = 0; + uint64_t hours = 0; + uint64_t minutes = 0; + uint64_t seconds = 0; + char *last_scrub = NULL; + uint64_t error_count = 0; + int8_t scrub_running = 0; + char *scrub_state_op = NULL; + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get volume name"); + + ret = dict_get_str(dict, "features.scrub", &state_scrub); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get scrub state value"); + + ret = dict_get_str(dict, "features.scrub-throttle", &scrub_impact); + if (ret) + gf_log("cli", GF_LOG_TRACE, + "failed to get scrub impact " + "value"); + + ret = dict_get_str(dict, "features.scrub-freq", &scrub_freq); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get scrub -freq value"); + + ret = dict_get_str(dict, "bitrot_log_file", &bitrot_log_file); + if (ret) + gf_log("cli", GF_LOG_TRACE, + "failed to get bitrot log file " + "location"); + + ret = dict_get_str(dict, "scrub_log_file", &scrub_log_file); + if (ret) + gf_log("cli", GF_LOG_TRACE, + "failed to get scrubber log file " + "location"); + + ret = dict_get_int32(dict, "count", &count); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "count not get count value from" + " dictionary"); + goto out; + } + + for (i = 1; i <= count; i++) { + snprintf(key, 256, "scrub-running-%d", i); + ret = dict_get_int8(dict, key, &scrub_running); if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get volume name"); - - ret = dict_get_str (dict, "features.scrub", &state_scrub); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get scrub state value"); - - ret = dict_get_str (dict, "features.scrub-throttle", &scrub_impact); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get scrub impact " - "value"); - - ret = dict_get_str (dict, "features.scrub-freq", &scrub_freq); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get scrub -freq value"); - - ret = dict_get_str (dict, "bitrot_log_file", &bitrot_log_file); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get bitrot log file " - "location"); - - ret = dict_get_str (dict, "scrub_log_file", &scrub_log_file); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get scrubber log file " - "location"); + gf_log("cli", GF_LOG_TRACE, + "failed to get scrubbed " + "files"); + if (scrub_running) + break; + } - ret = dict_get_int32 (dict, "count", &count); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "count not get count value from" - " dictionary"); - goto out; - } + if (scrub_running) + gf_asprintf(&scrub_state_op, "%s (In Progress)", state_scrub); + else + gf_asprintf(&scrub_state_op, "%s (Idle)", state_scrub); - for (i = 1; i <= count; i++) { - snprintf (key, 256, "scrub-running-%d", i); - ret = dict_get_int8 (dict, key, &scrub_running); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get scrubbed " - "files"); - if (scrub_running) - break; - } + cli_out("\n%s: %s\n", "Volume name ", volname); - if (scrub_running) - gf_asprintf (&scrub_state_op, "%s (In Progress)", state_scrub); - else - gf_asprintf (&scrub_state_op, "%s (Idle)", state_scrub); + cli_out("%s: %s\n", "State of scrub", scrub_state_op); - cli_out ("\n%s: %s\n", "Volume name ", volname); + cli_out("%s: %s\n", "Scrub impact", scrub_impact); - cli_out ("%s: %s\n", "State of scrub", scrub_state_op); + cli_out("%s: %s\n", "Scrub frequency", scrub_freq); - cli_out ("%s: %s\n", "Scrub impact", scrub_impact); + cli_out("%s: %s\n", "Bitrot error log location", bitrot_log_file); - cli_out ("%s: %s\n", "Scrub frequency", scrub_freq); + cli_out("%s: %s\n", "Scrubber error log location", scrub_log_file); - cli_out ("%s: %s\n", "Bitrot error log location", bitrot_log_file); + for (i = 1; i <= count; i++) { + /* Reset the variables to prevent carryover of values */ + node_name = NULL; + last_scrub = NULL; + scrub_time = 0; + days = 0; + hours = 0; + minutes = 0; + seconds = 0; + error_count = 0; + scrub_files = 0; + unsigned_files = 0; - cli_out ("%s: %s\n", "Scrubber error log location", scrub_log_file); + snprintf(key, 256, "node-name-%d", i); + ret = dict_get_str(dict, key, &node_name); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get node-name"); + snprintf(key, 256, "scrubbed-files-%d", i); + ret = dict_get_uint64(dict, key, &scrub_files); + if (ret) + gf_log("cli", GF_LOG_TRACE, + "failed to get scrubbed " + "files"); - for (i = 1; i <= count; i++) { - /* Reset the variables to prevent carryover of values */ - node_name = NULL; - last_scrub = NULL; - scrub_time = 0; - days = 0; - hours = 0; - minutes = 0; - seconds = 0; - error_count = 0; - scrub_files = 0; - unsigned_files = 0; + snprintf(key, 256, "unsigned-files-%d", i); + ret = dict_get_uint64(dict, key, &unsigned_files); + if (ret) + gf_log("cli", GF_LOG_TRACE, + "failed to get unsigned " + "files"); - snprintf (key, 256, "node-name-%d", i); - ret = dict_get_str (dict, key, &node_name); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get node-name"); + snprintf(key, 256, "scrub-duration-%d", i); + ret = dict_get_uint64(dict, key, &scrub_time); + if (ret) + gf_log("cli", GF_LOG_TRACE, + "failed to get last scrub " + "duration"); - snprintf (key, 256, "scrubbed-files-%d", i); - ret = dict_get_uint64 (dict, key, &scrub_files); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get scrubbed " - "files"); + snprintf(key, 256, "last-scrub-time-%d", i); + ret = dict_get_str(dict, key, &last_scrub); + if (ret) + gf_log("cli", GF_LOG_TRACE, + "failed to get last scrub" + " time"); + snprintf(key, 256, "error-count-%d", i); + ret = dict_get_uint64(dict, key, &error_count); + if (ret) + gf_log("cli", GF_LOG_TRACE, + "failed to get error " + "count"); - snprintf (key, 256, "unsigned-files-%d", i); - ret = dict_get_uint64 (dict, key, &unsigned_files); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get unsigned " - "files"); + cli_out("\n%s\n", + "==========================================" + "==============="); - snprintf (key, 256, "scrub-duration-%d", i); - ret = dict_get_uint64 (dict, key, &scrub_time); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get last scrub " - "duration"); + cli_out("%s: %s\n", "Node", node_name); - snprintf (key, 256, "last-scrub-time-%d", i); - ret = dict_get_str (dict, key, &last_scrub); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get last scrub" - " time"); - snprintf (key, 256, "error-count-%d", i); - ret = dict_get_uint64 (dict, key, &error_count); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get error " - "count"); + cli_out("%s: %" PRIu64 "\n", "Number of Scrubbed files", scrub_files); - cli_out ("\n%s\n", "==========================================" - "==============="); + cli_out("%s: %" PRIu64 "\n", "Number of Skipped files", unsigned_files); - cli_out ("%s: %s\n", "Node", node_name); + if ((!last_scrub) || !strcmp(last_scrub, "")) + cli_out("%s: %s\n", "Last completed scrub time", + "Scrubber pending to complete."); + else + cli_out("%s: %s\n", "Last completed scrub time", last_scrub); - cli_out ("%s: %"PRIu64 "\n", "Number of Scrubbed files", - scrub_files); + /* Printing last scrub duration time in human readable form*/ + seconds = scrub_time % 60; + minutes = (scrub_time / 60) % 60; + hours = (scrub_time / 3600) % 24; + days = scrub_time / 86400; + cli_out("%s: %" PRIu64 ":%" PRIu64 ":%" PRIu64 ":%" PRIu64 "\n", + "Duration of last scrub (D:M:H:M:S)", days, hours, minutes, + seconds); - cli_out ("%s: %"PRIu64 "\n", "Number of Skipped files", - unsigned_files); + cli_out("%s: %" PRIu64 "\n", "Error count", error_count); - if ((!last_scrub) || !strcmp (last_scrub, "")) - cli_out ("%s: %s\n", "Last completed scrub time", - "Scrubber pending to complete."); - else - cli_out ("%s: %s\n", "Last completed scrub time", - last_scrub); - - /* Printing last scrub duration time in human readable form*/ - seconds = scrub_time%60; - minutes = (scrub_time/60)%60; - hours = (scrub_time/3600)%24; - days = scrub_time/86400; - cli_out ("%s: %"PRIu64 ":%"PRIu64 ":%"PRIu64 ":%"PRIu64 "\n", - "Duration of last scrub (D:M:H:M:S)", - days, hours, minutes, seconds); - - cli_out ("%s: %"PRIu64 "\n", "Error count", error_count); - - if (error_count) { - cli_out ("%s:\n", "Corrupted object's [GFID]"); - /* Printing list of bad file's (Corrupted object's)*/ - for (j = 0; j < error_count; j++) { - snprintf (key, 256, "quarantine-%d-%d", j, i); - ret = dict_get_str (dict, key, &bad_file_str); - if (!ret) { - cli_out ("%s\n", bad_file_str); - } - } + if (error_count) { + cli_out("%s:\n", "Corrupted object's [GFID]"); + /* Printing list of bad file's (Corrupted object's)*/ + for (j = 0; j < error_count; j++) { + snprintf(key, 256, "quarantine-%d-%d", j, i); + ret = dict_get_str(dict, key, &bad_file_str); + if (!ret) { + cli_out("%s\n", bad_file_str); } + } } - cli_out ("%s\n", "==========================================" - "==============="); + } + cli_out("%s\n", + "==========================================" + "==============="); out: - GF_FREE (scrub_state_op); - return 0; + GF_FREE(scrub_state_op); + return 0; } int -gf_cli_bitrot_cbk (struct rpc_req *req, struct iovec *iov, - int count, void *myframe) -{ - int ret = -1; - int type = 0; - gf_cli_rsp rsp = {0, }; - dict_t *dict = NULL; - char *scrub_cmd = NULL; - char *volname = NULL; - char *cmd_str = NULL; - char *cmd_op = NULL; - - GF_ASSERT (myframe); - - if (req->rpc_status == -1) { - goto out; - } - - ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); - if (ret < 0) { - gf_log (((call_frame_t *) myframe)->this->name, GF_LOG_ERROR, - "Failed to decode xdr response"); - goto out; - } - - if (rsp.op_ret) { - ret = -1; - if (global_state->mode & GLUSTER_MODE_XML) - goto xml_output; - - if (strcmp (rsp.op_errstr, "")) - cli_err ("Bitrot command failed : %s", rsp.op_errstr); - else - cli_err ("Bitrot command : failed"); - - goto out; - } +gf_cli_bitrot_cbk(struct rpc_req *req, struct iovec *iov, int count, + void *myframe) +{ + int ret = -1; + int type = 0; + gf_cli_rsp rsp = { + 0, + }; + dict_t *dict = NULL; + char *scrub_cmd = NULL; + char *volname = NULL; + char *cmd_str = NULL; + char *cmd_op = NULL; + + GF_ASSERT(myframe); + + if (req->rpc_status == -1) { + goto out; + } + + ret = xdr_to_generic(*iov, &rsp, (xdrproc_t)xdr_gf_cli_rsp); + if (ret < 0) { + gf_log(((call_frame_t *)myframe)->this->name, GF_LOG_ERROR, + "Failed to decode xdr response"); + goto out; + } + + if (rsp.op_ret) { + ret = -1; + if (global_state->mode & GLUSTER_MODE_XML) + goto xml_output; - if (rsp.dict.dict_len) { - /* Unserialize the dictionary */ - dict = dict_new (); + if (strcmp(rsp.op_errstr, "")) + cli_err("Bitrot command failed : %s", rsp.op_errstr); + else + cli_err("Bitrot command : failed"); - if (!dict) { - ret = -1; - goto out; - } + goto out; + } - ret = dict_unserialize (rsp.dict.dict_val, - rsp.dict.dict_len, - &dict); + if (rsp.dict.dict_len) { + /* Unserialize the dictionary */ + dict = dict_new(); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "failed to unserialize " - "req-buffer to dictionary"); - goto out; - } + if (!dict) { + ret = -1; + goto out; } - gf_log ("cli", GF_LOG_DEBUG, "Received resp to bit rot command"); + ret = dict_unserialize(rsp.dict.dict_val, rsp.dict.dict_len, &dict); - ret = dict_get_int32 (dict, "type", &type); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get command type"); - goto out; + gf_log("cli", GF_LOG_ERROR, + "failed to unserialize " + "req-buffer to dictionary"); + goto out; } + } - /* Ignoring the error, as using dict val for cli output only */ - ret = dict_get_str (dict, "scrub-value", &scrub_cmd); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "Failed to get scrub command"); + gf_log("cli", GF_LOG_DEBUG, "Received resp to bit rot command"); - ret = dict_get_str (dict, "volname", &volname); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get volume name"); + ret = dict_get_int32(dict, "type", &type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get command type"); + goto out; + } - ret = dict_get_str (dict, "cmd-str", &cmd_str); - if (ret) - gf_log ("cli", GF_LOG_TRACE, "failed to get command string"); + /* Ignoring the error, as using dict val for cli output only */ + ret = dict_get_str(dict, "scrub-value", &scrub_cmd); + if (ret) + gf_log("cli", GF_LOG_TRACE, "Failed to get scrub command"); - if (cmd_str) - cmd_op = strrchr(cmd_str, ' ') + 1; + ret = dict_get_str(dict, "volname", &volname); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get volume name"); - if ((type == GF_BITROT_CMD_SCRUB_STATUS) && - !(global_state->mode & GLUSTER_MODE_XML)) { - ret = gf_cli_print_bitrot_scrub_status (dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to print bitrot " - "scrub status"); - } - goto out; - } + ret = dict_get_str(dict, "cmd-str", &cmd_str); + if (ret) + gf_log("cli", GF_LOG_TRACE, "failed to get command string"); - switch (type) { - case GF_BITROT_OPTION_TYPE_ENABLE: - cli_out("volume bitrot: success bitrot enabled " - "for volume %s", volname); - ret = 0; - goto out; + if (cmd_str) + cmd_op = strrchr(cmd_str, ' ') + 1; + + if ((type == GF_BITROT_CMD_SCRUB_STATUS) && + !(global_state->mode & GLUSTER_MODE_XML)) { + ret = gf_cli_print_bitrot_scrub_status(dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to print bitrot " + "scrub status"); + } + goto out; + } + + switch (type) { + case GF_BITROT_OPTION_TYPE_ENABLE: + cli_out( + "volume bitrot: success bitrot enabled " + "for volume %s", + volname); + ret = 0; + goto out; case GF_BITROT_OPTION_TYPE_DISABLE: - cli_out("volume bitrot: success bitrot disabled " - "for volume %s", volname); - ret = 0; - goto out; + cli_out( + "volume bitrot: success bitrot disabled " + "for volume %s", + volname); + ret = 0; + goto out; case GF_BITROT_CMD_SCRUB_ONDEMAND: - cli_out("volume bitrot: scrubber started ondemand " - "for volume %s", volname); - ret = 0; - goto out; + cli_out( + "volume bitrot: scrubber started ondemand " + "for volume %s", + volname); + ret = 0; + goto out; case GF_BITROT_OPTION_TYPE_SCRUB: - if (!strncmp ("pause", scrub_cmd, sizeof ("pause"))) - cli_out("volume bitrot: scrubber paused " - "for volume %s", volname); - if (!strncmp ("resume", scrub_cmd, sizeof ("resume"))) - cli_out("volume bitrot: scrubber resumed " - "for volume %s", volname); - ret = 0; - goto out; + if (!strncmp("pause", scrub_cmd, sizeof("pause"))) + cli_out( + "volume bitrot: scrubber paused " + "for volume %s", + volname); + if (!strncmp("resume", scrub_cmd, sizeof("resume"))) + cli_out( + "volume bitrot: scrubber resumed " + "for volume %s", + volname); + ret = 0; + goto out; case GF_BITROT_OPTION_TYPE_SCRUB_FREQ: - cli_out("volume bitrot: scrub-frequency is set to %s " - "successfully for volume %s", cmd_op, volname); - ret = 0; - goto out; + cli_out( + "volume bitrot: scrub-frequency is set to %s " + "successfully for volume %s", + cmd_op, volname); + ret = 0; + goto out; case GF_BITROT_OPTION_TYPE_SCRUB_THROTTLE: - cli_out("volume bitrot: scrub-throttle is set to %s " - "successfully for volume %s", cmd_op, volname); - ret = 0; - goto out; - } + cli_out( + "volume bitrot: scrub-throttle is set to %s " + "successfully for volume %s", + cmd_op, volname); + ret = 0; + goto out; + } xml_output: - if (global_state->mode & GLUSTER_MODE_XML) { - ret = cli_xml_output_vol_profile (dict, rsp.op_ret, - rsp.op_errno, - rsp.op_errstr); - if (ret) - gf_log ("cli", GF_LOG_ERROR, - "Error outputting to xml"); - goto out; - } + if (global_state->mode & GLUSTER_MODE_XML) { + ret = cli_xml_output_vol_profile(dict, rsp.op_ret, rsp.op_errno, + rsp.op_errstr); + if (ret) + gf_log("cli", GF_LOG_ERROR, "Error outputting to xml"); + goto out; + } - if (!rsp.op_ret) - cli_out ("volume bitrot: success"); + if (!rsp.op_ret) + cli_out("volume bitrot: success"); - ret = rsp.op_ret; + ret = rsp.op_ret; out: - if (dict) - dict_unref (dict); + if (dict) + dict_unref(dict); - free (rsp.dict.dict_val); - free (rsp.op_errstr); + free(rsp.dict.dict_val); + free(rsp.op_errstr); - cli_cmd_broadcast_response (ret); + cli_cmd_broadcast_response(ret); - return ret; + return ret; } int32_t -gf_cli_bitrot (call_frame_t *frame, xlator_t *this, void *data) +gf_cli_bitrot(call_frame_t *frame, xlator_t *this, void *data) { - gf_cli_req req = { {0,} }; - dict_t *options = NULL; - int ret = -1; + gf_cli_req req = {{ + 0, + }}; + dict_t *options = NULL; + int ret = -1; - if (!frame || !this || !data) - goto out; + if (!frame || !this || !data) + goto out; - options = data; + options = data; - ret = cli_to_glusterd (&req, frame, gf_cli_bitrot_cbk, - (xdrproc_t) xdr_gf_cli_req, options, - GLUSTER_CLI_BITROT, this, cli_rpc_prog, - NULL); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "cli_to_glusterd for " - "bitrot failed"); - goto out; - } + ret = cli_to_glusterd(&req, frame, gf_cli_bitrot_cbk, + (xdrproc_t)xdr_gf_cli_req, options, + GLUSTER_CLI_BITROT, this, cli_rpc_prog, NULL); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "cli_to_glusterd for " + "bitrot failed"); + goto out; + } out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); - GF_FREE (req.dict.dict_val); + GF_FREE(req.dict.dict_val); - return ret; + return ret; } struct rpc_clnt_procedure gluster_cli_actors[GLUSTER_CLI_MAXVALUE] = { - [GLUSTER_CLI_NULL] = {"NULL", NULL }, - [GLUSTER_CLI_PROBE] = {"PROBE_QUERY", gf_cli_probe}, - [GLUSTER_CLI_DEPROBE] = {"DEPROBE_QUERY", gf_cli_deprobe}, - [GLUSTER_CLI_LIST_FRIENDS] = {"LIST_FRIENDS", gf_cli_list_friends}, - [GLUSTER_CLI_UUID_RESET] = {"UUID_RESET", gf_cli3_1_uuid_reset}, - [GLUSTER_CLI_UUID_GET] = {"UUID_GET", gf_cli3_1_uuid_get}, - [GLUSTER_CLI_CREATE_VOLUME] = {"CREATE_VOLUME", gf_cli_create_volume}, - [GLUSTER_CLI_DELETE_VOLUME] = {"DELETE_VOLUME", gf_cli_delete_volume}, - [GLUSTER_CLI_START_VOLUME] = {"START_VOLUME", gf_cli_start_volume}, - [GLUSTER_CLI_STOP_VOLUME] = {"STOP_VOLUME", gf_cli_stop_volume}, - [GLUSTER_CLI_RENAME_VOLUME] = {"RENAME_VOLUME", gf_cli_rename_volume}, - [GLUSTER_CLI_DEFRAG_VOLUME] = {"DEFRAG_VOLUME", gf_cli_defrag_volume}, - [GLUSTER_CLI_GET_VOLUME] = {"GET_VOLUME", gf_cli_get_volume}, - [GLUSTER_CLI_GET_NEXT_VOLUME] = {"GET_NEXT_VOLUME", gf_cli_get_next_volume}, - [GLUSTER_CLI_SET_VOLUME] = {"SET_VOLUME", gf_cli_set_volume}, - [GLUSTER_CLI_ADD_BRICK] = {"ADD_BRICK", gf_cli_add_brick}, - [GLUSTER_CLI_REMOVE_BRICK] = {"REMOVE_BRICK", gf_cli_remove_brick}, - [GLUSTER_CLI_REPLACE_BRICK] = {"REPLACE_BRICK", gf_cli_replace_brick}, - [GLUSTER_CLI_LOG_ROTATE] = {"LOG ROTATE", gf_cli_log_rotate}, - [GLUSTER_CLI_GETSPEC] = {"GETSPEC", gf_cli_getspec}, - [GLUSTER_CLI_PMAP_PORTBYBRICK] = {"PMAP PORTBYBRICK", gf_cli_pmap_b2p}, - [GLUSTER_CLI_SYNC_VOLUME] = {"SYNC_VOLUME", gf_cli_sync_volume}, - [GLUSTER_CLI_RESET_VOLUME] = {"RESET_VOLUME", gf_cli_reset_volume}, - [GLUSTER_CLI_FSM_LOG] = {"FSM_LOG", gf_cli_fsm_log}, - [GLUSTER_CLI_GSYNC_SET] = {"GSYNC_SET", gf_cli_gsync_set}, - [GLUSTER_CLI_PROFILE_VOLUME] = {"PROFILE_VOLUME", gf_cli_profile_volume}, - [GLUSTER_CLI_QUOTA] = {"QUOTA", gf_cli_quota}, - [GLUSTER_CLI_TOP_VOLUME] = {"TOP_VOLUME", gf_cli_top_volume}, - [GLUSTER_CLI_GETWD] = {"GETWD", gf_cli_getwd}, - [GLUSTER_CLI_STATUS_VOLUME] = {"STATUS_VOLUME", gf_cli_status_volume}, - [GLUSTER_CLI_STATUS_ALL] = {"STATUS_ALL", gf_cli_status_volume_all}, - [GLUSTER_CLI_MOUNT] = {"MOUNT", gf_cli_mount}, - [GLUSTER_CLI_UMOUNT] = {"UMOUNT", gf_cli_umount}, - [GLUSTER_CLI_HEAL_VOLUME] = {"HEAL_VOLUME", gf_cli_heal_volume}, - [GLUSTER_CLI_STATEDUMP_VOLUME] = {"STATEDUMP_VOLUME", gf_cli_statedump_volume}, - [GLUSTER_CLI_LIST_VOLUME] = {"LIST_VOLUME", gf_cli_list_volume}, - [GLUSTER_CLI_CLRLOCKS_VOLUME] = {"CLEARLOCKS_VOLUME", gf_cli_clearlocks_volume}, - [GLUSTER_CLI_COPY_FILE] = {"COPY_FILE", gf_cli_copy_file}, - [GLUSTER_CLI_SYS_EXEC] = {"SYS_EXEC", gf_cli_sys_exec}, - [GLUSTER_CLI_SNAP] = {"SNAP", gf_cli_snapshot}, - [GLUSTER_CLI_BARRIER_VOLUME] = {"BARRIER VOLUME", gf_cli_barrier_volume}, - [GLUSTER_CLI_GET_VOL_OPT] = {"GET_VOL_OPT", gf_cli_get_vol_opt}, - [GLUSTER_CLI_BITROT] = {"BITROT", gf_cli_bitrot}, - [GLUSTER_CLI_ATTACH_TIER] = {"ATTACH_TIER", gf_cli_attach_tier}, - [GLUSTER_CLI_TIER] = {"TIER", gf_cli_tier}, - [GLUSTER_CLI_GET_STATE] = {"GET_STATE", gf_cli_get_state}, - [GLUSTER_CLI_RESET_BRICK] = {"RESET_BRICK", gf_cli_reset_brick}, - [GLUSTER_CLI_REMOVE_TIER_BRICK] = {"DETACH_TIER", gf_cli_remove_tier_brick}, - [GLUSTER_CLI_ADD_TIER_BRICK] = {"ADD_TIER_BRICK", gf_cli_add_tier_brick} -}; + [GLUSTER_CLI_NULL] = {"NULL", NULL}, + [GLUSTER_CLI_PROBE] = {"PROBE_QUERY", gf_cli_probe}, + [GLUSTER_CLI_DEPROBE] = {"DEPROBE_QUERY", gf_cli_deprobe}, + [GLUSTER_CLI_LIST_FRIENDS] = {"LIST_FRIENDS", gf_cli_list_friends}, + [GLUSTER_CLI_UUID_RESET] = {"UUID_RESET", gf_cli3_1_uuid_reset}, + [GLUSTER_CLI_UUID_GET] = {"UUID_GET", gf_cli3_1_uuid_get}, + [GLUSTER_CLI_CREATE_VOLUME] = {"CREATE_VOLUME", gf_cli_create_volume}, + [GLUSTER_CLI_DELETE_VOLUME] = {"DELETE_VOLUME", gf_cli_delete_volume}, + [GLUSTER_CLI_START_VOLUME] = {"START_VOLUME", gf_cli_start_volume}, + [GLUSTER_CLI_STOP_VOLUME] = {"STOP_VOLUME", gf_cli_stop_volume}, + [GLUSTER_CLI_RENAME_VOLUME] = {"RENAME_VOLUME", gf_cli_rename_volume}, + [GLUSTER_CLI_DEFRAG_VOLUME] = {"DEFRAG_VOLUME", gf_cli_defrag_volume}, + [GLUSTER_CLI_GET_VOLUME] = {"GET_VOLUME", gf_cli_get_volume}, + [GLUSTER_CLI_GET_NEXT_VOLUME] = {"GET_NEXT_VOLUME", gf_cli_get_next_volume}, + [GLUSTER_CLI_SET_VOLUME] = {"SET_VOLUME", gf_cli_set_volume}, + [GLUSTER_CLI_ADD_BRICK] = {"ADD_BRICK", gf_cli_add_brick}, + [GLUSTER_CLI_REMOVE_BRICK] = {"REMOVE_BRICK", gf_cli_remove_brick}, + [GLUSTER_CLI_REPLACE_BRICK] = {"REPLACE_BRICK", gf_cli_replace_brick}, + [GLUSTER_CLI_LOG_ROTATE] = {"LOG ROTATE", gf_cli_log_rotate}, + [GLUSTER_CLI_GETSPEC] = {"GETSPEC", gf_cli_getspec}, + [GLUSTER_CLI_PMAP_PORTBYBRICK] = {"PMAP PORTBYBRICK", gf_cli_pmap_b2p}, + [GLUSTER_CLI_SYNC_VOLUME] = {"SYNC_VOLUME", gf_cli_sync_volume}, + [GLUSTER_CLI_RESET_VOLUME] = {"RESET_VOLUME", gf_cli_reset_volume}, + [GLUSTER_CLI_FSM_LOG] = {"FSM_LOG", gf_cli_fsm_log}, + [GLUSTER_CLI_GSYNC_SET] = {"GSYNC_SET", gf_cli_gsync_set}, + [GLUSTER_CLI_PROFILE_VOLUME] = {"PROFILE_VOLUME", gf_cli_profile_volume}, + [GLUSTER_CLI_QUOTA] = {"QUOTA", gf_cli_quota}, + [GLUSTER_CLI_TOP_VOLUME] = {"TOP_VOLUME", gf_cli_top_volume}, + [GLUSTER_CLI_GETWD] = {"GETWD", gf_cli_getwd}, + [GLUSTER_CLI_STATUS_VOLUME] = {"STATUS_VOLUME", gf_cli_status_volume}, + [GLUSTER_CLI_STATUS_ALL] = {"STATUS_ALL", gf_cli_status_volume_all}, + [GLUSTER_CLI_MOUNT] = {"MOUNT", gf_cli_mount}, + [GLUSTER_CLI_UMOUNT] = {"UMOUNT", gf_cli_umount}, + [GLUSTER_CLI_HEAL_VOLUME] = {"HEAL_VOLUME", gf_cli_heal_volume}, + [GLUSTER_CLI_STATEDUMP_VOLUME] = {"STATEDUMP_VOLUME", + gf_cli_statedump_volume}, + [GLUSTER_CLI_LIST_VOLUME] = {"LIST_VOLUME", gf_cli_list_volume}, + [GLUSTER_CLI_CLRLOCKS_VOLUME] = {"CLEARLOCKS_VOLUME", + gf_cli_clearlocks_volume}, + [GLUSTER_CLI_COPY_FILE] = {"COPY_FILE", gf_cli_copy_file}, + [GLUSTER_CLI_SYS_EXEC] = {"SYS_EXEC", gf_cli_sys_exec}, + [GLUSTER_CLI_SNAP] = {"SNAP", gf_cli_snapshot}, + [GLUSTER_CLI_BARRIER_VOLUME] = {"BARRIER VOLUME", gf_cli_barrier_volume}, + [GLUSTER_CLI_GET_VOL_OPT] = {"GET_VOL_OPT", gf_cli_get_vol_opt}, + [GLUSTER_CLI_BITROT] = {"BITROT", gf_cli_bitrot}, + [GLUSTER_CLI_ATTACH_TIER] = {"ATTACH_TIER", gf_cli_attach_tier}, + [GLUSTER_CLI_TIER] = {"TIER", gf_cli_tier}, + [GLUSTER_CLI_GET_STATE] = {"GET_STATE", gf_cli_get_state}, + [GLUSTER_CLI_RESET_BRICK] = {"RESET_BRICK", gf_cli_reset_brick}, + [GLUSTER_CLI_REMOVE_TIER_BRICK] = {"DETACH_TIER", gf_cli_remove_tier_brick}, + [GLUSTER_CLI_ADD_TIER_BRICK] = {"ADD_TIER_BRICK", gf_cli_add_tier_brick}}; struct rpc_clnt_program cli_prog = { - .progname = "Gluster CLI", - .prognum = GLUSTER_CLI_PROGRAM, - .progver = GLUSTER_CLI_VERSION, - .numproc = GLUSTER_CLI_MAXVALUE, - .proctable = gluster_cli_actors, + .progname = "Gluster CLI", + .prognum = GLUSTER_CLI_PROGRAM, + .progver = GLUSTER_CLI_VERSION, + .numproc = GLUSTER_CLI_MAXVALUE, + .proctable = gluster_cli_actors, }; struct rpc_clnt_procedure cli_quotad_procs[GF_AGGREGATOR_MAXVALUE] = { - [GF_AGGREGATOR_NULL] = {"NULL", NULL}, - [GF_AGGREGATOR_LOOKUP] = {"LOOKUP", NULL}, - [GF_AGGREGATOR_GETLIMIT] = {"GETLIMIT", cli_quotad_getlimit}, + [GF_AGGREGATOR_NULL] = {"NULL", NULL}, + [GF_AGGREGATOR_LOOKUP] = {"LOOKUP", NULL}, + [GF_AGGREGATOR_GETLIMIT] = {"GETLIMIT", cli_quotad_getlimit}, }; struct rpc_clnt_program cli_quotad_clnt = { - .progname = "CLI Quotad client", - .prognum = GLUSTER_AGGREGATOR_PROGRAM, - .progver = GLUSTER_AGGREGATOR_VERSION, - .numproc = GF_AGGREGATOR_MAXVALUE, - .proctable = cli_quotad_procs, + .progname = "CLI Quotad client", + .prognum = GLUSTER_AGGREGATOR_PROGRAM, + .progver = GLUSTER_AGGREGATOR_VERSION, + .numproc = GF_AGGREGATOR_MAXVALUE, + .proctable = cli_quotad_procs, }; diff --git a/cli/src/cli-xml-output.c b/cli/src/cli-xml-output.c index fd42192162b..5dbf37e3d5d 100644 --- a/cli/src/cli-xml-output.c +++ b/cli/src/cli-xml-output.c @@ -15,10 +15,7 @@ #include "syscall.h" #include "upcall-utils.h" -enum gf_task_types { - GF_TASK_TYPE_REBALANCE, - GF_TASK_TYPE_REMOVE_BRICK -}; +enum gf_task_types { GF_TASK_TYPE_REBALANCE, GF_TASK_TYPE_REMOVE_BRICK }; /* * IMPORTANT NOTE: @@ -47,4337 +44,4156 @@ enum gf_task_types { * of #if (HAVE_LIB_XML) */ - #if (HAVE_LIB_XML) #include <libxml/encoding.h> #include <libxml/xmlwriter.h> -#define XML_RET_CHECK_AND_GOTO(ret, label) do { \ - if (ret < 0) { \ - ret = -1; \ - goto label; \ - } \ - else \ - ret = 0; \ - }while (0) \ +#define XML_RET_CHECK_AND_GOTO(ret, label) \ + do { \ + if (ret < 0) { \ + ret = -1; \ + goto label; \ + } else \ + ret = 0; \ + } while (0) int -cli_begin_xml_output (xmlTextWriterPtr *writer, xmlDocPtr *doc) +cli_begin_xml_output(xmlTextWriterPtr *writer, xmlDocPtr *doc) { - int ret = -1; + int ret = -1; - *writer = xmlNewTextWriterDoc (doc, 0); - if (writer == NULL) { - ret = -1; - goto out; - } + *writer = xmlNewTextWriterDoc(doc, 0); + if (writer == NULL) { + ret = -1; + goto out; + } - ret = xmlTextWriterStartDocument (*writer, "1.0", "UTF-8", "yes"); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterStartDocument(*writer, "1.0", "UTF-8", "yes"); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <cliOutput> */ - ret = xmlTextWriterStartElement (*writer, (xmlChar *)"cliOutput"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <cliOutput> */ + ret = xmlTextWriterStartElement(*writer, (xmlChar *)"cliOutput"); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_end_xml_output (xmlTextWriterPtr writer, xmlDocPtr doc) +cli_end_xml_output(xmlTextWriterPtr writer, xmlDocPtr doc) { - int ret = -1; - - /* </cliOutput> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; - ret = xmlTextWriterEndDocument (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </cliOutput> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + ret = xmlTextWriterEndDocument(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - /* Dump xml document to stdout and pretty format it */ - xmlSaveFormatFileEnc ("-", doc, "UTF-8", 1); + /* Dump xml document to stdout and pretty format it */ + xmlSaveFormatFileEnc("-", doc, "UTF-8", 1); - xmlFreeTextWriter (writer); - xmlFreeDoc (doc); + xmlFreeTextWriter(writer); + xmlFreeDoc(doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_common (xmlTextWriterPtr writer, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_common(xmlTextWriterPtr writer, int op_ret, int op_errno, + char *op_errstr) { - int ret = -1; + int ret = -1; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"opRet", - "%d", op_ret); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"opRet", "%d", + op_ret); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"opErrno", - "%d", op_errno); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"opErrno", "%d", + op_errno); + XML_RET_CHECK_AND_GOTO(ret, out); - if (op_errstr) - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"opErrstr", - "%s", op_errstr); - else - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"opErrstr", - "%s", ""); + if (op_errstr) + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"opErrstr", + "%s", op_errstr); + else + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"opErrstr", + "%s", ""); - XML_RET_CHECK_AND_GOTO (ret, out); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } #endif int -cli_xml_output_str (char *op, char *str, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_str(char *op, char *str, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); - if (ret) - goto out; + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; - if (op) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"cliOp", - "%s", op); - XML_RET_CHECK_AND_GOTO (ret, out); - } + if (op) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"cliOp", "%s", + op); + XML_RET_CHECK_AND_GOTO(ret, out); + } - if (str) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"output", - "%s", str); - XML_RET_CHECK_AND_GOTO (ret, out); - } + if (str) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"output", "%s", + str); + XML_RET_CHECK_AND_GOTO(ret, out); + } - ret = cli_end_xml_output (writer, doc); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } #if (HAVE_LIB_XML) int -cli_xml_output_data_pair (dict_t *this, char *key, data_t *value, - void *data) +cli_xml_output_data_pair(dict_t *this, char *key, data_t *value, void *data) { - int ret = -1; - xmlTextWriterPtr *writer = NULL; + int ret = -1; + xmlTextWriterPtr *writer = NULL; - writer = (xmlTextWriterPtr *)data; + writer = (xmlTextWriterPtr *)data; - ret = xmlTextWriterWriteFormatElement (*writer, (xmlChar *)key, - "%s", value->data); + ret = xmlTextWriterWriteFormatElement(*writer, (xmlChar *)key, "%s", + value->data); - XML_RET_CHECK_AND_GOTO (ret, out); + XML_RET_CHECK_AND_GOTO(ret, out); out: - return ret; + return ret; } #endif int -cli_xml_output_dict ( char *op, dict_t *dict, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_dict(char *op, dict_t *dict, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); - if (ret) - goto out; + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; - /* <"op"> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)op); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <"op"> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)op); + XML_RET_CHECK_AND_GOTO(ret, out); - if (dict) - dict_foreach (dict, cli_xml_output_data_pair, &writer); + if (dict) + dict_foreach(dict, cli_xml_output_data_pair, &writer); - /* </"op"> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </"op"> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_end_xml_output (writer, doc); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } #if (HAVE_LIB_XML) int -cli_xml_output_vol_status_common (xmlTextWriterPtr writer, dict_t *dict, - int brick_index, int *online, - gf_boolean_t *node_present) +cli_xml_output_vol_status_common(xmlTextWriterPtr writer, dict_t *dict, + int brick_index, int *online, + gf_boolean_t *node_present) { - int ret = -1; - char *hostname = NULL; - char *path = NULL; - char *uuid = NULL; - int port = 0; - int rdma_port = 0; - int status = 0; - int pid = 0; - char key[1024] = {0,}; - - snprintf (key, sizeof (key), "brick%d.hostname", brick_index); - ret = dict_get_str (dict, key, &hostname); - if (ret) { - *node_present = _gf_false; - goto out; + int ret = -1; + char *hostname = NULL; + char *path = NULL; + char *uuid = NULL; + int port = 0; + int rdma_port = 0; + int status = 0; + int pid = 0; + char key[1024] = { + 0, + }; + + snprintf(key, sizeof(key), "brick%d.hostname", brick_index); + ret = dict_get_str(dict, key, &hostname); + if (ret) { + *node_present = _gf_false; + goto out; + } + *node_present = _gf_true; + + /* <node> + * will be closed in the calling function cli_xml_output_vol_status()*/ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"node"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hostname", "%s", + hostname); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.path", brick_index); + ret = dict_get_str(dict, key, &path); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"path", "%s", + path); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.peerid", brick_index); + ret = dict_get_str(dict, key, &uuid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"peerid", "%s", + uuid); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.status", brick_index); + ret = dict_get_int32(dict, key, &status); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status", "%d", + status); + XML_RET_CHECK_AND_GOTO(ret, out); + *online = status; + + snprintf(key, sizeof(key), "brick%d.port", brick_index); + ret = dict_get_int32(dict, key, &port); + if (ret) + goto out; + + snprintf(key, sizeof(key), "brick%d.rdma_port", brick_index); + ret = dict_get_int32(dict, key, &rdma_port); + + /* If the process is either offline or doesn't provide a port (shd) + * port = "N/A" + * else print the port number of the process. + */ + + /* + * Tag 'port' can be removed once console management is started + * to support new tag ports. + */ + + if (*online == 1 && port != 0) + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"port", "%d", + port); + else + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"port", "%s", + "N/A"); + XML_RET_CHECK_AND_GOTO(ret, out); + ret = xmlTextWriterStartElement(writer, (xmlChar *)"ports"); + if (*online == 1 && (port != 0 || rdma_port != 0)) { + if (port) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"tcp", + "%d", port); + } else { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"tcp", + "%s", "N/A"); } - *node_present = _gf_true; - - /* <node> - * will be closed in the calling function cli_xml_output_vol_status()*/ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"node"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"hostname", - "%s", hostname); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.path", brick_index); - ret = dict_get_str (dict, key, &path); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"path", - "%s", path); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.peerid", brick_index); - ret = dict_get_str (dict, key, &uuid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"peerid", - "%s", uuid); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.status", brick_index); - ret = dict_get_int32 (dict, key, &status); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"status", - "%d", status); - XML_RET_CHECK_AND_GOTO (ret, out); - *online = status; - - snprintf (key, sizeof (key), "brick%d.port", brick_index); - ret = dict_get_int32 (dict, key, &port); - if (ret) - goto out; - - snprintf (key, sizeof (key), "brick%d.rdma_port", brick_index); - ret = dict_get_int32 (dict, key, &rdma_port); - - /* If the process is either offline or doesn't provide a port (shd) - * port = "N/A" - * else print the port number of the process. - */ - - /* - * Tag 'port' can be removed once console management is started - * to support new tag ports. - */ - - if (*online == 1 && port != 0) - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"port", - "%d", port); - else - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"port", - "%s", "N/A"); - XML_RET_CHECK_AND_GOTO (ret, out); - ret = xmlTextWriterStartElement (writer, (xmlChar *)"ports"); - if (*online == 1 && (port != 0 || rdma_port != 0)) { - - if (port) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"tcp", - "%d", port); - } else { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"tcp", - "%s", "N/A"); - } - XML_RET_CHECK_AND_GOTO (ret, out); - if (rdma_port) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"rdma", - "%d", rdma_port); - } else { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"rdma", - "%s", "N/A"); - } - XML_RET_CHECK_AND_GOTO (ret, out); + XML_RET_CHECK_AND_GOTO(ret, out); + if (rdma_port) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"rdma", + "%d", rdma_port); } else { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"tcp", - "%s", "N/A"); - XML_RET_CHECK_AND_GOTO (ret, out); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"rdma", - "%s", "N/A"); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"rdma", + "%s", "N/A"); } + XML_RET_CHECK_AND_GOTO(ret, out); + } else { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"tcp", "%s", + "N/A"); + XML_RET_CHECK_AND_GOTO(ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"rdma", "%s", + "N/A"); + XML_RET_CHECK_AND_GOTO(ret, out); + } - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d.pid", brick_index); - ret = dict_get_int32 (dict, key, &pid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"pid", - "%d", pid); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "brick%d.pid", brick_index); + ret = dict_get_int32(dict, key, &pid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"pid", "%d", pid); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_detail (xmlTextWriterPtr writer, dict_t *dict, - int brick_index) -{ - int ret = -1; - uint64_t size_total = 0; - uint64_t size_free = 0; - char *device = NULL; - uint64_t block_size = 0; - char *mnt_options = NULL; - char *fs_name = NULL; - char *inode_size = NULL; - uint64_t inodes_total = 0; - uint64_t inodes_free = 0; - char key[1024] = {0,}; - - snprintf (key, sizeof (key), "brick%d.total", brick_index); - ret = dict_get_uint64 (dict, key, &size_total); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"sizeTotal", - "%"PRIu64, size_total); - XML_RET_CHECK_AND_GOTO (ret, out); - } - snprintf (key, sizeof (key), "brick%d.free", brick_index); - ret = dict_get_uint64 (dict, key, &size_free); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"sizeFree", - "%"PRIu64, size_free); - XML_RET_CHECK_AND_GOTO (ret, out); - } - snprintf (key, sizeof (key), "brick%d.device", brick_index); - ret = dict_get_str (dict, key, &device); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"device", - "%s", device); - XML_RET_CHECK_AND_GOTO (ret, out); - } - snprintf (key, sizeof (key), "brick%d.block_size", brick_index); - ret = dict_get_uint64 (dict, key, &block_size); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"blockSize", - "%"PRIu64, block_size); - XML_RET_CHECK_AND_GOTO (ret, out); - } - snprintf (key, sizeof (key), "brick%d.mnt_options", brick_index); - ret = dict_get_str (dict, key, &mnt_options); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"mntOptions", - "%s", mnt_options); - XML_RET_CHECK_AND_GOTO (ret, out); - } - snprintf (key, sizeof (key), "brick%d.fs_name", brick_index); - ret = dict_get_str (dict, key, &fs_name); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"fsName", - "%s", fs_name); - XML_RET_CHECK_AND_GOTO (ret, out); - } - snprintf (key, sizeof (key), "brick%d.inode_size", brick_index); - ret = dict_get_str (dict, key, &inode_size); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"inodeSize", - "%s", fs_name); - XML_RET_CHECK_AND_GOTO (ret, out); - } - snprintf (key, sizeof (key), "brick%d.total_inodes", brick_index); - ret = dict_get_uint64 (dict, key, &inodes_total); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"inodesTotal", - "%"PRIu64, inodes_total); - XML_RET_CHECK_AND_GOTO (ret, out); - } - snprintf (key, sizeof (key), "brick%d.free_inodes", brick_index); - ret = dict_get_uint64 (dict, key, &inodes_free); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"inodesFree", - "%"PRIu64, inodes_free); - XML_RET_CHECK_AND_GOTO (ret, out); - } else { - ret = 0; - } - -out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; -} - -int -cli_xml_output_vol_status_mempool (xmlTextWriterPtr writer, dict_t *dict, - char *prefix) +cli_xml_output_vol_status_detail(xmlTextWriterPtr writer, dict_t *dict, + int brick_index) { - int ret = -1; - int mempool_count = 0; - char *name = NULL; - int hotcount = 0; - int coldcount = 0; - uint64_t paddedsizeof = 0; - uint64_t alloccount = 0; - int maxalloc = 0; - char key[1024] = {0,}; - int i = 0; - - /* <mempool> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"mempool"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.mempool-count", prefix); - ret = dict_get_int32 (dict, key, &mempool_count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"count", - "%d", mempool_count); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < mempool_count; i++) { - /* <pool> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"pool"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.pool%d.name", prefix, i); - ret = dict_get_str (dict, key, &name); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"name", - "%s", name); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.pool%d.hotcount", prefix, i); - ret = dict_get_int32 (dict, key, &hotcount); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"hotCount", - "%d", hotcount); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.pool%d.coldcount", prefix, i); - ret = dict_get_int32 (dict, key, &coldcount); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"coldCount", - "%d", coldcount); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.pool%d.paddedsizeof", - prefix, i); - ret = dict_get_uint64 (dict, key, &paddedsizeof); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"padddedSizeOf", "%"PRIu64, - paddedsizeof); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.pool%d.alloccount", prefix, i); - ret = dict_get_uint64 (dict, key, &alloccount); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"allocCount", - "%"PRIu64, alloccount); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.pool%d.max_alloc", prefix, i); - ret = dict_get_int32 (dict, key, &maxalloc); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"maxAlloc", - "%d", maxalloc); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.pool%d.pool-misses", prefix, i); - ret = dict_get_uint64 (dict, key, &alloccount); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"poolMisses", - "%"PRIu64, alloccount); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.pool%d.max-stdalloc", prefix, i); - ret = dict_get_int32 (dict, key, &maxalloc); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"maxStdAlloc", - "%d", maxalloc); - XML_RET_CHECK_AND_GOTO (ret, out); - - - /* </pool> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } - - /* </mempool> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + uint64_t size_total = 0; + uint64_t size_free = 0; + char *device = NULL; + uint64_t block_size = 0; + char *mnt_options = NULL; + char *fs_name = NULL; + char *inode_size = NULL; + uint64_t inodes_total = 0; + uint64_t inodes_free = 0; + char key[1024] = { + 0, + }; + + snprintf(key, sizeof(key), "brick%d.total", brick_index); + ret = dict_get_uint64(dict, key, &size_total); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"sizeTotal", + "%" PRIu64, size_total); + XML_RET_CHECK_AND_GOTO(ret, out); + } + snprintf(key, sizeof(key), "brick%d.free", brick_index); + ret = dict_get_uint64(dict, key, &size_free); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"sizeFree", + "%" PRIu64, size_free); + XML_RET_CHECK_AND_GOTO(ret, out); + } + snprintf(key, sizeof(key), "brick%d.device", brick_index); + ret = dict_get_str(dict, key, &device); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"device", "%s", + device); + XML_RET_CHECK_AND_GOTO(ret, out); + } + snprintf(key, sizeof(key), "brick%d.block_size", brick_index); + ret = dict_get_uint64(dict, key, &block_size); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"blockSize", + "%" PRIu64, block_size); + XML_RET_CHECK_AND_GOTO(ret, out); + } + snprintf(key, sizeof(key), "brick%d.mnt_options", brick_index); + ret = dict_get_str(dict, key, &mnt_options); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"mntOptions", + "%s", mnt_options); + XML_RET_CHECK_AND_GOTO(ret, out); + } + snprintf(key, sizeof(key), "brick%d.fs_name", brick_index); + ret = dict_get_str(dict, key, &fs_name); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"fsName", "%s", + fs_name); + XML_RET_CHECK_AND_GOTO(ret, out); + } + snprintf(key, sizeof(key), "brick%d.inode_size", brick_index); + ret = dict_get_str(dict, key, &inode_size); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"inodeSize", + "%s", fs_name); + XML_RET_CHECK_AND_GOTO(ret, out); + } + snprintf(key, sizeof(key), "brick%d.total_inodes", brick_index); + ret = dict_get_uint64(dict, key, &inodes_total); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"inodesTotal", + "%" PRIu64, inodes_total); + XML_RET_CHECK_AND_GOTO(ret, out); + } + snprintf(key, sizeof(key), "brick%d.free_inodes", brick_index); + ret = dict_get_uint64(dict, key, &inodes_free); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"inodesFree", + "%" PRIu64, inodes_free); + XML_RET_CHECK_AND_GOTO(ret, out); + } else { + ret = 0; + } out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_mem (xmlTextWriterPtr writer, dict_t *dict, - int brick_index) +cli_xml_output_vol_status_mempool(xmlTextWriterPtr writer, dict_t *dict, + char *prefix) { - int ret = -1; - int arena = 0; - int ordblks = 0; - int smblks = 0; - int hblks = 0; - int hblkhd = 0; - int usmblks = 0; - int fsmblks = 0; - int uordblks = 0; - int fordblks = 0; - int keepcost = 0; - char key[1024] = {0,}; - - /* <memStatus> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"memStatus"); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* <mallinfo> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"mallinfo"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.mallinfo.arena", brick_index); - ret = dict_get_int32 (dict, key, &arena); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"arena", - "%d", arena); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.mallinfo.ordblks", brick_index); - ret = dict_get_int32 (dict, key, &ordblks); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"ordblks", - "%d", ordblks); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + int mempool_count = 0; + char *name = NULL; + int hotcount = 0; + int coldcount = 0; + uint64_t paddedsizeof = 0; + uint64_t alloccount = 0; + int maxalloc = 0; + char key[1024] = { + 0, + }; + int i = 0; + + /* <mempool> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"mempool"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.mempool-count", prefix); + ret = dict_get_int32(dict, key, &mempool_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d", + mempool_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 0; i < mempool_count; i++) { + /* <pool> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"pool"); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d.mallinfo.smblks", brick_index); - ret = dict_get_int32 (dict, key, &smblks); + snprintf(key, sizeof(key), "%s.pool%d.name", prefix, i); + ret = dict_get_str(dict, key, &name); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"smblks", - "%d", smblks); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + name); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d.mallinfo.hblks", brick_index); - ret = dict_get_int32 (dict, key, &hblks); + snprintf(key, sizeof(key), "%s.pool%d.hotcount", prefix, i); + ret = dict_get_int32(dict, key, &hotcount); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"hblks", - "%d", hblks); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hotCount", + "%d", hotcount); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d.mallinfo.hblkhd", brick_index); - ret = dict_get_int32 (dict, key, &hblkhd); + snprintf(key, sizeof(key), "%s.pool%d.coldcount", prefix, i); + ret = dict_get_int32(dict, key, &coldcount); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"hblkhd", - "%d", hblkhd); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"coldCount", + "%d", coldcount); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d.mallinfo.usmblks", brick_index); - ret = dict_get_int32 (dict, key, &usmblks); + snprintf(key, sizeof(key), "%s.pool%d.paddedsizeof", prefix, i); + ret = dict_get_uint64(dict, key, &paddedsizeof); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"usmblks", - "%d", usmblks); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"padddedSizeOf", "%" PRIu64, paddedsizeof); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d.mallinfo.fsmblks", brick_index); - ret = dict_get_int32 (dict, key, &fsmblks); + snprintf(key, sizeof(key), "%s.pool%d.alloccount", prefix, i); + ret = dict_get_uint64(dict, key, &alloccount); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"fsmblks", - "%d", fsmblks); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"allocCount", + "%" PRIu64, alloccount); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d.mallinfo.uordblks", brick_index); - ret = dict_get_int32 (dict, key, &uordblks); + snprintf(key, sizeof(key), "%s.pool%d.max_alloc", prefix, i); + ret = dict_get_int32(dict, key, &maxalloc); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"uordblks", - "%d", uordblks); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"maxAlloc", + "%d", maxalloc); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d.mallinfo.fordblks", brick_index); - ret = dict_get_int32 (dict, key, &fordblks); + snprintf(key, sizeof(key), "%s.pool%d.pool-misses", prefix, i); + ret = dict_get_uint64(dict, key, &alloccount); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"fordblks", - "%d", fordblks); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"poolMisses", + "%" PRIu64, alloccount); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d.mallinfo.keepcost", brick_index); - ret = dict_get_int32 (dict, key, &keepcost); + snprintf(key, sizeof(key), "%s.pool%d.max-stdalloc", prefix, i); + ret = dict_get_int32(dict, key, &maxalloc); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"keepcost", - "%d", keepcost); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </mallinfo> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"maxStdAlloc", + "%d", maxalloc); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d", brick_index); - ret = cli_xml_output_vol_status_mempool (writer, dict, key); - if (ret) - goto out; + /* </pool> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } - /* </memStatus> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </mempool> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_clients (xmlTextWriterPtr writer, dict_t *dict, - int brick_index) +cli_xml_output_vol_status_mem(xmlTextWriterPtr writer, dict_t *dict, + int brick_index) { - int ret = -1; - int client_count = 0; - char *hostname = NULL; - uint64_t bytes_read = 0; - uint64_t bytes_write = 0; - uint32_t opversion = 0; - char key[1024] = {0,}; - int i = 0; - - /* <clientsStatus> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"clientsStatus"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.clientcount", brick_index); - ret = dict_get_int32 (dict, key, &client_count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"clientCount", - "%d", client_count); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < client_count; i++) { - /* <client> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"client"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.client%d.hostname", - brick_index, i); - ret = dict_get_str (dict, key, &hostname); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"hostname", - "%s", hostname); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.client%d.bytesread", - brick_index, i); - ret = dict_get_uint64 (dict, key, &bytes_read); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"bytesRead", - "%"PRIu64, bytes_read); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.client%d.byteswrite", - brick_index, i); - ret = dict_get_uint64 (dict, key, &bytes_write); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"bytesWrite", - "%"PRIu64, bytes_write); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.client%d.opversion", - brick_index, i); - ret = dict_get_uint32 (dict, key, &opversion); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"opVersion", - "%"PRIu32, opversion); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </client> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + int ret = -1; + int arena = 0; + int ordblks = 0; + int smblks = 0; + int hblks = 0; + int hblkhd = 0; + int usmblks = 0; + int fsmblks = 0; + int uordblks = 0; + int fordblks = 0; + int keepcost = 0; + char key[1024] = { + 0, + }; + + /* <memStatus> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"memStatus"); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* <mallinfo> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"mallinfo"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.mallinfo.arena", brick_index); + ret = dict_get_int32(dict, key, &arena); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"arena", "%d", + arena); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.mallinfo.ordblks", brick_index); + ret = dict_get_int32(dict, key, &ordblks); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"ordblks", "%d", + ordblks); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.mallinfo.smblks", brick_index); + ret = dict_get_int32(dict, key, &smblks); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"smblks", "%d", + smblks); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.mallinfo.hblks", brick_index); + ret = dict_get_int32(dict, key, &hblks); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hblks", "%d", + hblks); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.mallinfo.hblkhd", brick_index); + ret = dict_get_int32(dict, key, &hblkhd); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hblkhd", "%d", + hblkhd); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.mallinfo.usmblks", brick_index); + ret = dict_get_int32(dict, key, &usmblks); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"usmblks", "%d", + usmblks); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.mallinfo.fsmblks", brick_index); + ret = dict_get_int32(dict, key, &fsmblks); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"fsmblks", "%d", + fsmblks); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.mallinfo.uordblks", brick_index); + ret = dict_get_int32(dict, key, &uordblks); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uordblks", "%d", + uordblks); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.mallinfo.fordblks", brick_index); + ret = dict_get_int32(dict, key, &fordblks); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"fordblks", "%d", + fordblks); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.mallinfo.keepcost", brick_index); + ret = dict_get_int32(dict, key, &keepcost); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"keepcost", "%d", + keepcost); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </mallinfo> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d", brick_index); + ret = cli_xml_output_vol_status_mempool(writer, dict, key); + if (ret) + goto out; + + /* </memStatus> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </clientsStatus> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_inode_entry (xmlTextWriterPtr writer, dict_t *dict, - char *prefix) +cli_xml_output_vol_status_clients(xmlTextWriterPtr writer, dict_t *dict, + int brick_index) { - int ret = -1; - char *gfid = NULL; - uint64_t nlookup = 0; - uint32_t ref = 0; - int ia_type = 0; - char key[1024] = {0,}; - - /* <inode> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"inode"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.gfid", prefix); - ret = dict_get_str (dict, key, &gfid); + int ret = -1; + int client_count = 0; + char *hostname = NULL; + uint64_t bytes_read = 0; + uint64_t bytes_write = 0; + uint32_t opversion = 0; + char key[1024] = { + 0, + }; + int i = 0; + + /* <clientsStatus> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"clientsStatus"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.clientcount", brick_index); + ret = dict_get_int32(dict, key, &client_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"clientCount", + "%d", client_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 0; i < client_count; i++) { + /* <client> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"client"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.client%d.hostname", brick_index, i); + ret = dict_get_str(dict, key, &hostname); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"gfid", - "%s", gfid); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hostname", + "%s", hostname); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%s.nlookup", prefix); - ret = dict_get_uint64 (dict, key, &nlookup); + snprintf(key, sizeof(key), "brick%d.client%d.bytesread", brick_index, + i); + ret = dict_get_uint64(dict, key, &bytes_read); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"nLookup", - "%"PRIu64, nlookup); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"bytesRead", + "%" PRIu64, bytes_read); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%s.ref", prefix); - ret = dict_get_uint32 (dict, key, &ref); + snprintf(key, sizeof(key), "brick%d.client%d.byteswrite", brick_index, + i); + ret = dict_get_uint64(dict, key, &bytes_write); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"ref", - "%"PRIu32, ref); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"bytesWrite", + "%" PRIu64, bytes_write); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%s.ia_type", prefix); - ret = dict_get_int32 (dict, key, &ia_type); + snprintf(key, sizeof(key), "brick%d.client%d.opversion", brick_index, + i); + ret = dict_get_uint32(dict, key, &opversion); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"iaType", - "%d", ia_type); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"opVersion", + "%" PRIu32, opversion); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </inode> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </client> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + /* </clientsStatus> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_itable (xmlTextWriterPtr writer, dict_t *dict, - char *prefix) +cli_xml_output_vol_status_inode_entry(xmlTextWriterPtr writer, dict_t *dict, + char *prefix) { - int ret = -1; - uint32_t active_size = 0; - uint32_t lru_size = 0; - uint32_t purge_size = 0; - char key[1024] = {0,}; - int i = 0; - - snprintf (key, sizeof (key), "%s.active_size", prefix); - ret = dict_get_uint32 (dict, key, &active_size); - if (ret) + int ret = -1; + char *gfid = NULL; + uint64_t nlookup = 0; + uint32_t ref = 0; + int ia_type = 0; + char key[1024] = { + 0, + }; + + /* <inode> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"inode"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.gfid", prefix); + ret = dict_get_str(dict, key, &gfid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"gfid", "%s", + gfid); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.nlookup", prefix); + ret = dict_get_uint64(dict, key, &nlookup); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"nLookup", + "%" PRIu64, nlookup); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.ref", prefix); + ret = dict_get_uint32(dict, key, &ref); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"ref", "%" PRIu32, + ref); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.ia_type", prefix); + ret = dict_get_int32(dict, key, &ia_type); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"iaType", "%d", + ia_type); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </inode> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + +out: + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; +} + +int +cli_xml_output_vol_status_itable(xmlTextWriterPtr writer, dict_t *dict, + char *prefix) +{ + int ret = -1; + uint32_t active_size = 0; + uint32_t lru_size = 0; + uint32_t purge_size = 0; + char key[1024] = { + 0, + }; + int i = 0; + + snprintf(key, sizeof(key), "%s.active_size", prefix); + ret = dict_get_uint32(dict, key, &active_size); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"activeSize", + "%" PRIu32, active_size); + XML_RET_CHECK_AND_GOTO(ret, out); + if (active_size != 0) { + /* <active> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"active"); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 0; i < active_size; i++) { + snprintf(key, sizeof(key), "%s.active%d", prefix, i); + ret = cli_xml_output_vol_status_inode_entry(writer, dict, key); + if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"activeSize", - "%"PRIu32, active_size); - XML_RET_CHECK_AND_GOTO (ret, out); - if (active_size != 0) { - /* <active> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"active"); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < active_size; i++) { - snprintf (key, sizeof (key), "%s.active%d", prefix, i); - ret = cli_xml_output_vol_status_inode_entry - (writer, dict, key); - if (ret) - goto out; - } - /* </active> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); } + /* </active> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + + snprintf(key, sizeof(key), "%s.lru_size", prefix); + ret = dict_get_uint32(dict, key, &lru_size); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"lruSize", + "%" PRIu32, lru_size); + XML_RET_CHECK_AND_GOTO(ret, out); + if (lru_size != 0) { + /* <lru> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"lru"); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%s.lru_size", prefix); - ret = dict_get_uint32 (dict, key, &lru_size); - if (ret) + for (i = 0; i < lru_size; i++) { + snprintf(key, sizeof(key), "%s.lru%d", prefix, i); + ret = cli_xml_output_vol_status_inode_entry(writer, dict, key); + if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"lruSize", - "%"PRIu32, lru_size); - XML_RET_CHECK_AND_GOTO (ret, out); - if (lru_size != 0) { - /* <lru> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"lru"); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < lru_size; i++) { - snprintf (key, sizeof (key), "%s.lru%d", prefix, i); - ret = cli_xml_output_vol_status_inode_entry - (writer, dict, key); - if (ret) - goto out; - } - /* </lru> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); } + /* </lru> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + + snprintf(key, sizeof(key), "%s.purge_size", prefix); + ret = dict_get_uint32(dict, key, &purge_size); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"purgeSize", + "%" PRIu32, purge_size); + XML_RET_CHECK_AND_GOTO(ret, out); + if (purge_size != 0) { + /* <purge> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"purge"); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%s.purge_size", prefix); - ret = dict_get_uint32 (dict, key, &purge_size); - if (ret) + for (i = 0; i < purge_size; i++) { + snprintf(key, sizeof(key), "%s.purge%d", prefix, i); + ret = cli_xml_output_vol_status_inode_entry(writer, dict, key); + if (ret) goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"purgeSize", - "%"PRIu32, purge_size); - XML_RET_CHECK_AND_GOTO (ret, out); - if (purge_size != 0) { - /* <purge> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"purge"); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < purge_size; i++) { - snprintf (key, sizeof (key), "%s.purge%d", prefix, i); - ret = cli_xml_output_vol_status_inode_entry - (writer, dict, key); - if (ret) - goto out; - } - /* </purge> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); } + /* </purge> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_inode (xmlTextWriterPtr writer, dict_t *dict, - int brick_index) +cli_xml_output_vol_status_inode(xmlTextWriterPtr writer, dict_t *dict, + int brick_index) { - int ret = -1; - int conn_count = 0; - char key[1024] = {0,}; - int i = 0; - - /* <inodeStatus> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"inodeStatus"); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + int conn_count = 0; + char key[1024] = { + 0, + }; + int i = 0; + + /* <inodeStatus> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"inodeStatus"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.conncount", brick_index); + ret = dict_get_int32(dict, key, &conn_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"connections", + "%d", conn_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 0; i < conn_count; i++) { + /* <connection> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"connection"); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d.conncount", brick_index); - ret = dict_get_int32 (dict, key, &conn_count); + snprintf(key, sizeof(key), "brick%d.conn%d.itable", brick_index, i); + ret = cli_xml_output_vol_status_itable(writer, dict, key); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"connections", - "%d", conn_count); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < conn_count; i++) { - /* <connection> */ - ret = xmlTextWriterStartElement (writer, - (xmlChar *)"connection"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.conn%d.itable", - brick_index, i); - ret = cli_xml_output_vol_status_itable (writer, dict, key); - if (ret) - goto out; + goto out; - /* </connection> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + /* </connection> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } - /* </inodeStatus> */ - ret= xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </inodeStatus> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_fdtable (xmlTextWriterPtr writer, dict_t *dict, - char *prefix) +cli_xml_output_vol_status_fdtable(xmlTextWriterPtr writer, dict_t *dict, + char *prefix) { - int ret = -1; - int refcount = 0; - uint32_t maxfds = 0; - int firstfree = 0; - int openfds = 0; - int fd_pid = 0; - int fd_refcount = 0; - int fd_flags = 0; - char key[1024] = {0,}; - int i = 0; - - /* <fdTable> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"fdTable"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.refcount", prefix); - ret = dict_get_int32 (dict, key, &refcount); + int ret = -1; + int refcount = 0; + uint32_t maxfds = 0; + int firstfree = 0; + int openfds = 0; + int fd_pid = 0; + int fd_refcount = 0; + int fd_flags = 0; + char key[1024] = { + 0, + }; + int i = 0; + + /* <fdTable> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"fdTable"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.refcount", prefix); + ret = dict_get_int32(dict, key, &refcount); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"refCount", "%d", + refcount); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.maxfds", prefix); + ret = dict_get_uint32(dict, key, &maxfds); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"maxFds", + "%" PRIu32, maxfds); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.firstfree", prefix); + ret = dict_get_int32(dict, key, &firstfree); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"firstFree", "%d", + firstfree); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.openfds", prefix); + ret = dict_get_int32(dict, key, &openfds); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"openFds", "%d", + openfds); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 0; i < maxfds; i++) { + snprintf(key, sizeof(key), "%s.fdentry%d.pid", prefix, i); + ret = dict_get_int32(dict, key, &fd_pid); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"refCount", - "%d", refcount); - XML_RET_CHECK_AND_GOTO (ret, out); + continue; - snprintf (key, sizeof (key), "%s.maxfds", prefix); - ret = dict_get_uint32 (dict, key, &maxfds); + snprintf(key, sizeof(key), "%s.fdentry%d.refcount", prefix, i); + ret = dict_get_int32(dict, key, &fd_refcount); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"maxFds", - "%"PRIu32, maxfds); - XML_RET_CHECK_AND_GOTO (ret, out); + continue; - snprintf (key, sizeof (key), "%s.firstfree", prefix); - ret = dict_get_int32 (dict, key, &firstfree); + snprintf(key, sizeof(key), "%s.fdentry%d.flags", prefix, i); + ret = dict_get_int32(dict, key, &fd_flags); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"firstFree", - "%d", firstfree); - XML_RET_CHECK_AND_GOTO (ret, out); + continue; - snprintf (key, sizeof (key), "%s.openfds", prefix); - ret = dict_get_int32 (dict, key, &openfds); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"openFds", - "%d", openfds); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <fd> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"fd"); + XML_RET_CHECK_AND_GOTO(ret, out); - for (i = 0; i < maxfds; i++) { - snprintf (key, sizeof (key), "%s.fdentry%d.pid", prefix, i); - ret = dict_get_int32 (dict, key, &fd_pid); - if (ret) - continue; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"entry", "%d", + i + 1); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%s.fdentry%d.refcount", - prefix, i); - ret = dict_get_int32 (dict, key, &fd_refcount); - if (ret) - continue; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"pid", "%d", + fd_pid); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%s.fdentry%d.flags", prefix, i); - ret = dict_get_int32 (dict, key, &fd_flags); - if (ret) - continue; - - /* <fd> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"fd"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"entry", - "%d", i+1); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"pid", - "%d", fd_pid); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"refCount", - "%d", fd_refcount); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"flags", - "%d", fd_flags); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </fd> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"refCount", + "%d", fd_refcount); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"flags", "%d", + fd_flags); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </fd> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } - /* </fdTable> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </fdTable> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_fd (xmlTextWriterPtr writer, dict_t *dict, - int brick_index) +cli_xml_output_vol_status_fd(xmlTextWriterPtr writer, dict_t *dict, + int brick_index) { - int ret = -1; - int conn_count = 0; - char key[1024] = {0,}; - int i = 0; - - /* <fdStatus> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"fdStatus"); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + int conn_count = 0; + char key[1024] = { + 0, + }; + int i = 0; + + /* <fdStatus> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"fdStatus"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.conncount", brick_index); + ret = dict_get_int32(dict, key, &conn_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"connections", + "%d", conn_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 0; i < conn_count; i++) { + /* <connection> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"connection"); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "brick%d.conncount", brick_index); - ret = dict_get_int32 (dict, key, &conn_count); + snprintf(key, sizeof(key), "brick%d.conn%d.fdtable", brick_index, i); + ret = cli_xml_output_vol_status_fdtable(writer, dict, key); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"connections", - "%d", conn_count); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < conn_count; i++) { - /* <connection> */ - ret = xmlTextWriterStartElement (writer, - (xmlChar *)"connection"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.conn%d.fdtable", - brick_index, i); - ret = cli_xml_output_vol_status_fdtable (writer, dict, key); - if (ret) - goto out; + goto out; - /* </connection> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + /* </connection> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } - /* </fdStatus> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </fdStatus> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_callframe (xmlTextWriterPtr writer, dict_t *dict, - char *prefix) +cli_xml_output_vol_status_callframe(xmlTextWriterPtr writer, dict_t *dict, + char *prefix) { - int ret = -1; - int ref_count = 0; - char *translator = NULL; - int complete = 0; - char *parent = NULL; - char *wind_from = NULL; - char *wind_to = NULL; - char *unwind_from = NULL; - char *unwind_to = NULL; - char key[1024] = {0,}; - - /* <callFrame> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"callFrame"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.refcount", prefix); - ret = dict_get_int32 (dict, key, &ref_count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"refCount", - "%d", ref_count); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.translator", prefix); - ret = dict_get_str (dict, key, &translator); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"translator", - "%s", translator); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.complete", prefix); - ret = dict_get_int32 (dict, key, &complete); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"complete", - "%d", complete); - XML_RET_CHECK_AND_GOTO (ret ,out); - - snprintf (key, sizeof (key), "%s.parent", prefix); - ret = dict_get_str (dict, key, &parent); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"parent", - "%s", parent); - XML_RET_CHECK_AND_GOTO (ret, out); - } + int ret = -1; + int ref_count = 0; + char *translator = NULL; + int complete = 0; + char *parent = NULL; + char *wind_from = NULL; + char *wind_to = NULL; + char *unwind_from = NULL; + char *unwind_to = NULL; + char key[1024] = { + 0, + }; + + /* <callFrame> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"callFrame"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.refcount", prefix); + ret = dict_get_int32(dict, key, &ref_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"refCount", "%d", + ref_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.translator", prefix); + ret = dict_get_str(dict, key, &translator); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"translator", "%s", + translator); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.complete", prefix); + ret = dict_get_int32(dict, key, &complete); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"complete", "%d", + complete); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.parent", prefix); + ret = dict_get_str(dict, key, &parent); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"parent", "%s", + parent); + XML_RET_CHECK_AND_GOTO(ret, out); + } - snprintf (key, sizeof (key), "%s.windfrom", prefix); - ret = dict_get_str (dict, key, &wind_from); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"windFrom", - "%s", wind_from); - XML_RET_CHECK_AND_GOTO (ret, out); - } + snprintf(key, sizeof(key), "%s.windfrom", prefix); + ret = dict_get_str(dict, key, &wind_from); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"windFrom", + "%s", wind_from); + XML_RET_CHECK_AND_GOTO(ret, out); + } - snprintf (key, sizeof (key), "%s.windto", prefix); - ret = dict_get_str (dict, key, &wind_to); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"windTo", - "%s", wind_to); - XML_RET_CHECK_AND_GOTO (ret, out); - } + snprintf(key, sizeof(key), "%s.windto", prefix); + ret = dict_get_str(dict, key, &wind_to); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"windTo", "%s", + wind_to); + XML_RET_CHECK_AND_GOTO(ret, out); + } - snprintf (key, sizeof (key), "%s.unwindfrom", prefix); - ret = dict_get_str (dict, key, &unwind_from); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"unwindFrom", - "%s", unwind_from); - XML_RET_CHECK_AND_GOTO (ret, out); - } + snprintf(key, sizeof(key), "%s.unwindfrom", prefix); + ret = dict_get_str(dict, key, &unwind_from); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"unwindFrom", + "%s", unwind_from); + XML_RET_CHECK_AND_GOTO(ret, out); + } - snprintf (key, sizeof (key), "%s.unwindto", prefix); - ret = dict_get_str (dict, key, &unwind_to); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"unwindTo", - "%s", unwind_to); - XML_RET_CHECK_AND_GOTO (ret, out); - } + snprintf(key, sizeof(key), "%s.unwindto", prefix); + ret = dict_get_str(dict, key, &unwind_to); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"unwindTo", + "%s", unwind_to); + XML_RET_CHECK_AND_GOTO(ret, out); + } - /* </callFrame> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </callFrame> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_callstack (xmlTextWriterPtr writer, dict_t *dict, - char *prefix) +cli_xml_output_vol_status_callstack(xmlTextWriterPtr writer, dict_t *dict, + char *prefix) { - int ret = -1; - int uid = 0; - int gid = 0; - int pid = 0; - uint64_t unique = 0; - int frame_count = 0; - char key[1024] = {0,}; - int i = 0; - - /* <callStack> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"callStack"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.uid", prefix); - ret = dict_get_int32 (dict, key, &uid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"uid", - "%d", uid); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.gid", prefix); - ret = dict_get_int32 (dict, key, &gid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"gid", - "%d", gid); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.pid", prefix); - ret = dict_get_int32 (dict, key, &pid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"pid", - "%d", pid); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.unique", prefix); - ret = dict_get_uint64 (dict, key, &unique); + int ret = -1; + int uid = 0; + int gid = 0; + int pid = 0; + uint64_t unique = 0; + int frame_count = 0; + char key[1024] = { + 0, + }; + int i = 0; + + /* <callStack> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"callStack"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.uid", prefix); + ret = dict_get_int32(dict, key, &uid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uid", "%d", uid); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.gid", prefix); + ret = dict_get_int32(dict, key, &gid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"gid", "%d", gid); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.pid", prefix); + ret = dict_get_int32(dict, key, &pid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"pid", "%d", pid); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.unique", prefix); + ret = dict_get_uint64(dict, key, &unique); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"unique", + "%" PRIu64, unique); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.count", prefix); + ret = dict_get_int32(dict, key, &frame_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"frameCount", "%d", + frame_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 0; i < frame_count; i++) { + snprintf(key, sizeof(key), "%s.frame%d", prefix, i); + ret = cli_xml_output_vol_status_callframe(writer, dict, key); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"unique", - "%"PRIu64, unique); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.count", prefix); - ret = dict_get_int32 (dict, key, &frame_count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"frameCount", - "%d", frame_count); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < frame_count; i++) { - snprintf (key, sizeof (key), "%s.frame%d", prefix, i); - ret = cli_xml_output_vol_status_callframe (writer, dict, - key); - if (ret) - goto out; - } + goto out; + } - /* </callStack> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </callStack> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_callpool (xmlTextWriterPtr writer, dict_t *dict, - int brick_index) +cli_xml_output_vol_status_callpool(xmlTextWriterPtr writer, dict_t *dict, + int brick_index) { - int ret = -1; - int call_count = 0; - char key[1024] = {0,}; - int i = 0; - - /* <callpoolStatus> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"callpoolStatus"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "brick%d.callpool.count", brick_index); - ret = dict_get_int32 (dict, key, &call_count); + int ret = -1; + int call_count = 0; + char key[1024] = { + 0, + }; + int i = 0; + + /* <callpoolStatus> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"callpoolStatus"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "brick%d.callpool.count", brick_index); + ret = dict_get_int32(dict, key, &call_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d", + call_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 0; i < call_count; i++) { + snprintf(key, sizeof(key), "brick%d.callpool.stack%d", brick_index, i); + ret = cli_xml_output_vol_status_callstack(writer, dict, key); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"count", - "%d", call_count); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < call_count; i++) { - snprintf (key, sizeof (key), "brick%d.callpool.stack%d", - brick_index, i); - ret = cli_xml_output_vol_status_callstack (writer, dict, - key); - if (ret) - goto out; - } + goto out; + } - /* </callpoolStatus> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </callpoolStatus> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } #endif int -cli_xml_output_vol_status_begin (cli_local_t *local, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_vol_status_begin(cli_local_t *local, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; + int ret = -1; - ret = cli_begin_xml_output (&(local->writer), &(local->doc)); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = cli_begin_xml_output(&(local->writer), &(local->doc)); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_xml_output_common (local->writer, op_ret, op_errno, - op_errstr); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = cli_xml_output_common(local->writer, op_ret, op_errno, op_errstr); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <volStatus> */ - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *) "volStatus"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <volStatus> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"volStatus"); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <volumes> */ - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"volumes"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <volumes> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"volumes"); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_vol_status_end (cli_local_t *local) +cli_xml_output_vol_status_end(cli_local_t *local) { #if (HAVE_LIB_XML) - int ret = -1; + int ret = -1; - /* </volumes> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </volumes> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </volStatus> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO(ret, out); + /* </volStatus> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_end_xml_output (local->writer, local->doc); + ret = cli_end_xml_output(local->writer, local->doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } #if (HAVE_LIB_XML) int -cli_xml_output_remove_brick_task_params (xmlTextWriterPtr writer, dict_t *dict, - char *prefix) +cli_xml_output_remove_brick_task_params(xmlTextWriterPtr writer, dict_t *dict, + char *prefix) { - int ret = -1; - char key[1024] = {0,}; - int count = 0; - int i = 0; - char *brick = NULL; - - /* <params> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"params"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.count", prefix); - ret = dict_get_int32 (dict, key, &count); + int ret = -1; + char key[1024] = { + 0, + }; + int count = 0; + int i = 0; + char *brick = NULL; + + /* <params> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"params"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.count", prefix); + ret = dict_get_int32(dict, key, &count); + if (ret) + goto out; + + for (i = 1; i <= count; i++) { + snprintf(key, sizeof(key), "%s.brick%d", prefix, i); + ret = dict_get_str(dict, key, &brick); if (ret) - goto out; - - for (i = 1; i <= count; i++) { - snprintf (key, sizeof (key), "%s.brick%d", prefix, i); - ret = dict_get_str (dict, key, &brick); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"brick", - "%s", brick); - XML_RET_CHECK_AND_GOTO (ret, out); - brick = NULL; - } + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"brick", "%s", + brick); + XML_RET_CHECK_AND_GOTO(ret, out); + brick = NULL; + } - /* </param> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </param> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_status_tasks (cli_local_t *local, dict_t *dict) { - int ret = -1; - char *task_type = NULL; - char *task_id_str = NULL; - int status = 0; - int tasks = 0; - char key[1024] = {0,}; - int i = 0; - - /* <tasks> */ - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"tasks"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_int32 (dict, "tasks", &tasks); - if (ret) - goto out; +cli_xml_output_vol_status_tasks(cli_local_t *local, dict_t *dict) +{ + int ret = -1; + char *task_type = NULL; + char *task_id_str = NULL; + int status = 0; + int tasks = 0; + char key[1024] = { + 0, + }; + int i = 0; + + /* <tasks> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"tasks"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_int32(dict, "tasks", &tasks); + if (ret) + goto out; + + for (i = 0; i < tasks; i++) { + /* <task> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"task"); + XML_RET_CHECK_AND_GOTO(ret, out); - for (i = 0; i < tasks; i++) { - /* <task> */ - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *)"task"); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "task%d.type", i); + ret = dict_get_str(dict, key, &task_type); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"type", + "%s", task_type); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "task%d.type", i); - ret = dict_get_str (dict, key, &task_type); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"type", - "%s", task_type); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "task%d.id", i); + ret = dict_get_str(dict, key, &task_id_str); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"id", + "%s", task_id_str); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "task%d.id", i); - ret = dict_get_str (dict, key, &task_id_str); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"id", - "%s", task_id_str); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "task%d.status", i); + ret = dict_get_int32(dict, key, &status); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"status", "%d", status); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "task%d.status", i); - ret = dict_get_int32 (dict, key, &status); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"status", - "%d", status); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"statusStr", - "%s", - cli_vol_task_status_str[status]); - - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "task%d", i); - if (!strcmp (task_type, "Remove brick")) { - ret = cli_xml_output_remove_brick_task_params - (local->writer, dict, key); - if (ret) - goto out; - } + ret = xmlTextWriterWriteFormatElement(local->writer, + (xmlChar *)"statusStr", "%s", + cli_vol_task_status_str[status]); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </task> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "task%d", i); + if (!strcmp(task_type, "Remove brick")) { + ret = cli_xml_output_remove_brick_task_params(local->writer, dict, + key); + if (ret) + goto out; } - /* </tasks> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </task> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + + /* </tasks> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } #endif int -cli_xml_output_vol_status_tasks_detail (cli_local_t *local, dict_t *dict) +cli_xml_output_vol_status_tasks_detail(cli_local_t *local, dict_t *dict) { #if (HAVE_LIB_XML) - int ret = -1; - char *volname = NULL; + int ret = -1; + char *volname = NULL; - /*<volume>*/ - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"volume"); - XML_RET_CHECK_AND_GOTO (ret, out); + /*<volume>*/ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"volume"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"volName", "%s", - volname); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"volName", + "%s", volname); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_xml_output_vol_status_tasks (local, dict); - if (ret) - goto out; + ret = cli_xml_output_vol_status_tasks(local, dict); + if (ret) + goto out; - /* </volume> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </volume> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - return ret; + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_vol_status (cli_local_t *local, dict_t *dict) +cli_xml_output_vol_status(cli_local_t *local, dict_t *dict) { #if (HAVE_LIB_XML) - int ret = -1; - char *volname = NULL; - int brick_count = 0; - int brick_index_max = -1; - int other_count = 0; - int index_max = 0; - uint32_t cmd = GF_CLI_STATUS_NONE; - int online = 0; - gf_boolean_t node_present = _gf_true; - int i; - int type = -1; - int hot_brick_count = -1; - - /* <volume> */ - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"volume"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"volName", "%s", - volname); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_int32 (dict, "count", &brick_count); + int ret = -1; + char *volname = NULL; + int brick_count = 0; + int brick_index_max = -1; + int other_count = 0; + int index_max = 0; + uint32_t cmd = GF_CLI_STATUS_NONE; + int online = 0; + gf_boolean_t node_present = _gf_true; + int i; + int type = -1; + int hot_brick_count = -1; + + /* <volume> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"volume"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"volName", + "%s", volname); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_int32(dict, "count", &brick_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"nodeCount", + "%d", brick_count); + + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_uint32(dict, "cmd", &cmd); + if (ret) + goto out; + + ret = dict_get_int32(dict, "brick-index-max", &brick_index_max); + if (ret) + goto out; + ret = dict_get_int32(dict, "other-count", &other_count); + if (ret) + goto out; + + index_max = brick_index_max + other_count; + + ret = dict_get_int32(dict, "type", &type); + if (ret) + goto out; + + if (type == GF_CLUSTER_TYPE_TIER) { + ret = dict_get_int32(dict, "hot_brick_count", &hot_brick_count); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"nodeCount", "%d", - brick_count); - - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; - ret = dict_get_uint32 (dict, "cmd", &cmd); - if (ret) - goto out; - - ret = dict_get_int32 (dict, "brick-index-max", &brick_index_max); - if (ret) - goto out; - ret = dict_get_int32 (dict, "other-count", &other_count); - if (ret) - goto out; - - index_max = brick_index_max + other_count; - - ret = dict_get_int32 (dict, "type", &type); - if (ret) + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"hotBricks"); + XML_RET_CHECK_AND_GOTO(ret, out); + } + for (i = 0; i <= index_max; i++) { + if (type == GF_CLUSTER_TYPE_TIER && i == hot_brick_count) { + /* </hotBricks>*/ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + ret = xmlTextWriterStartElement(local->writer, + (xmlChar *)"coldBricks"); + XML_RET_CHECK_AND_GOTO(ret, out); + } + ret = cli_xml_output_vol_status_common(local->writer, dict, i, &online, + &node_present); + if (ret) { + if (node_present) goto out; - - if (type == GF_CLUSTER_TYPE_TIER) { - ret = dict_get_int32 (dict, "hot_brick_count", - &hot_brick_count); - if (ret) - goto out; - - ret = xmlTextWriterStartElement - (local->writer, (xmlChar *)"hotBricks"); - XML_RET_CHECK_AND_GOTO (ret, out); - + else + continue; } - for (i = 0; i <= index_max; i++) { - if (type == GF_CLUSTER_TYPE_TIER && i == hot_brick_count) { + switch (cmd & GF_CLI_STATUS_MASK) { + case GF_CLI_STATUS_DETAIL: + ret = cli_xml_output_vol_status_detail(local->writer, dict, i); + if (ret) + goto out; + break; - /* </hotBricks>*/ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *)"coldBricks"); - XML_RET_CHECK_AND_GOTO (ret, out); - } - ret = cli_xml_output_vol_status_common (local->writer, dict, i, - &online, &node_present); - if (ret) { - if (node_present) - goto out; - else - continue; + case GF_CLI_STATUS_MEM: + if (online) { + ret = cli_xml_output_vol_status_mem(local->writer, dict, i); + if (ret) + goto out; } + break; - switch (cmd & GF_CLI_STATUS_MASK) { - case GF_CLI_STATUS_DETAIL: - ret = cli_xml_output_vol_status_detail (local->writer, - dict, i); - if (ret) - goto out; - break; - - case GF_CLI_STATUS_MEM: - if (online) { - ret = cli_xml_output_vol_status_mem - (local->writer, dict, i); - if (ret) - goto out; - } - break; - - case GF_CLI_STATUS_CLIENTS: - if (online) { - ret = cli_xml_output_vol_status_clients - (local->writer, dict, i); - if (ret) - goto out; - } - break; - - case GF_CLI_STATUS_INODE: - if (online) { - ret = cli_xml_output_vol_status_inode - (local->writer, dict, i); - if (ret) - goto out; - } - break; - - case GF_CLI_STATUS_FD: - if (online) { - ret = cli_xml_output_vol_status_fd - (local->writer, dict, i); - if (ret) - goto out; - } - break; - - case GF_CLI_STATUS_CALLPOOL: - if (online) { - ret = cli_xml_output_vol_status_callpool - (local->writer, dict, i); - if (ret) - goto out; - } - break; - default: - break; + case GF_CLI_STATUS_CLIENTS: + if (online) { + ret = cli_xml_output_vol_status_clients(local->writer, dict, + i); + if (ret) + goto out; + } + break; + case GF_CLI_STATUS_INODE: + if (online) { + ret = cli_xml_output_vol_status_inode(local->writer, dict, + i); + if (ret) + goto out; } + break; - /* </node> was opened in cli_xml_output_vol_status_common()*/ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + case GF_CLI_STATUS_FD: + if (online) { + ret = cli_xml_output_vol_status_fd(local->writer, dict, i); + if (ret) + goto out; + } + break; - /* </coldBricks>*/ - if (type == GF_CLUSTER_TYPE_TIER && i == brick_index_max) { - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + case GF_CLI_STATUS_CALLPOOL: + if (online) { + ret = cli_xml_output_vol_status_callpool(local->writer, + dict, i); + if (ret) + goto out; } + break; + default: + break; } - /* Tasks are only present when a normal volume status call is done on a - * single volume or on all volumes - */ - if (((cmd & GF_CLI_STATUS_MASK) == GF_CLI_STATUS_NONE) && - (cmd & (GF_CLI_STATUS_VOL|GF_CLI_STATUS_ALL))) { - ret = cli_xml_output_vol_status_tasks (local, dict); - if (ret) - goto out; + /* </node> was opened in cli_xml_output_vol_status_common()*/ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </coldBricks>*/ + if (type == GF_CLUSTER_TYPE_TIER && i == brick_index_max) { + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); } + } - /* </volume> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* Tasks are only present when a normal volume status call is done on a + * single volume or on all volumes + */ + if (((cmd & GF_CLI_STATUS_MASK) == GF_CLI_STATUS_NONE) && + (cmd & (GF_CLI_STATUS_VOL | GF_CLI_STATUS_ALL))) { + ret = cli_xml_output_vol_status_tasks(local, dict); + if (ret) + goto out; + } + + /* </volume> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } #if (HAVE_LIB_XML) int -cli_xml_output_vol_top_rw_perf (xmlTextWriterPtr writer, dict_t *dict, - int brick_index, int member_index) +cli_xml_output_vol_top_rw_perf(xmlTextWriterPtr writer, dict_t *dict, + int brick_index, int member_index) { - int ret = -1; - char *filename = NULL; - uint64_t throughput = 0; - long int time_sec = 0; - long int time_usec = 0; - char timestr[256] = {0,}; - char key[1024] = {0,}; - int len; - - /* <file> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"file"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%d-filename-%d", brick_index, - member_index); - ret = dict_get_str (dict, key, &filename); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"filename", - "%s", filename); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%d-value-%d", brick_index, member_index); - ret = dict_get_uint64 (dict, key, &throughput); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"count", - "%"PRIu64, throughput); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%d-time-sec-%d", brick_index, - member_index); - ret = dict_get_int32 (dict, key, (int32_t *)&time_sec); - if (ret) - goto out; - - snprintf (key, sizeof (key), "%d-time-usec-%d", brick_index, - member_index); - ret = dict_get_int32 (dict, key, (int32_t *)&time_usec); - if (ret) - goto out; - - gf_time_fmt (timestr, sizeof timestr, time_sec, gf_timefmt_FT); - len = strlen (timestr); - snprintf (timestr + len, - sizeof (timestr) - len, - ".%"GF_PRI_SUSECONDS, time_usec); - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"time", - "%s", timestr); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </file> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + char *filename = NULL; + uint64_t throughput = 0; + long int time_sec = 0; + long int time_usec = 0; + char timestr[256] = { + 0, + }; + char key[1024] = { + 0, + }; + int len; + + /* <file> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"file"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%d-filename-%d", brick_index, member_index); + ret = dict_get_str(dict, key, &filename); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"filename", "%s", + filename); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%d-value-%d", brick_index, member_index); + ret = dict_get_uint64(dict, key, &throughput); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", + "%" PRIu64, throughput); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%d-time-sec-%d", brick_index, member_index); + ret = dict_get_int32(dict, key, (int32_t *)&time_sec); + if (ret) + goto out; + + snprintf(key, sizeof(key), "%d-time-usec-%d", brick_index, member_index); + ret = dict_get_int32(dict, key, (int32_t *)&time_usec); + if (ret) + goto out; + + gf_time_fmt(timestr, sizeof timestr, time_sec, gf_timefmt_FT); + len = strlen(timestr); + snprintf(timestr + len, sizeof(timestr) - len, ".%" GF_PRI_SUSECONDS, + time_usec); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"time", "%s", + timestr); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </file> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_top_other (xmlTextWriterPtr writer, dict_t *dict, - int brick_index, int member_index) +cli_xml_output_vol_top_other(xmlTextWriterPtr writer, dict_t *dict, + int brick_index, int member_index) { - int ret = -1; - char *filename = NULL; - uint64_t count = 0; - char key[1024] = {0,}; - - /* <file> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"file"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%d-filename-%d", brick_index, - member_index); - ret = dict_get_str (dict, key, &filename); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"filename", - "%s", filename); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%d-value-%d", brick_index, member_index); - ret = dict_get_uint64 (dict, key, &count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"count", - "%"PRIu64, count); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </file> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + char *filename = NULL; + uint64_t count = 0; + char key[1024] = { + 0, + }; + + /* <file> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"file"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%d-filename-%d", brick_index, member_index); + ret = dict_get_str(dict, key, &filename); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"filename", "%s", + filename); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%d-value-%d", brick_index, member_index); + ret = dict_get_uint64(dict, key, &count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", + "%" PRIu64, count); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </file> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } #endif int -cli_xml_output_vol_top (dict_t *dict, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_vol_top(dict_t *dict, int op_ret, int op_errno, char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; - int brick_count = 0; - int top_op = GF_CLI_TOP_NONE; - char *brick_name = NULL; - int members = 0; - uint64_t current_open = 0; - uint64_t max_open = 0; - char *max_open_time = NULL; - double throughput = 0.0; - double time_taken = 0.0; - char key[1024] = {0,}; - int i = 0; - int j = 0; - - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; - - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); - if (ret) - goto out; - - /* <volTop> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volTop"); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; + int brick_count = 0; + int top_op = GF_CLI_TOP_NONE; + char *brick_name = NULL; + int members = 0; + uint64_t current_open = 0; + uint64_t max_open = 0; + char *max_open_time = NULL; + double throughput = 0.0; + double time_taken = 0.0; + char key[1024] = { + 0, + }; + int i = 0; + int j = 0; + + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; + + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; + + /* <volTop> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volTop"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_int32(dict, "count", &brick_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"brickCount", "%d", + brick_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_int32(dict, "1-top-op", &top_op); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"topOp", "%d", + top_op); + XML_RET_CHECK_AND_GOTO(ret, out); + + while (i < brick_count) { + i++; + + /* <brick> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"brick"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_int32 (dict, "count", &brick_count); + snprintf(key, sizeof(key), "%d-brick", i); + ret = dict_get_str(dict, key, &brick_name); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"brickCount", - "%d", brick_count); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + brick_name); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_int32 (dict, "1-top-op", &top_op); + snprintf(key, sizeof(key), "%d-members", i); + ret = dict_get_int32(dict, key, &members); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"topOp", - "%d", top_op); - XML_RET_CHECK_AND_GOTO (ret, out); - - while (i < brick_count) { - i++; + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"members", + "%d", members); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <brick> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"brick"); - XML_RET_CHECK_AND_GOTO (ret, out); + switch (top_op) { + case GF_CLI_TOP_OPEN: + snprintf(key, sizeof(key), "%d-current-open", i); + ret = dict_get_uint64(dict, key, ¤t_open); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"currentOpen", "%" PRIu64, current_open); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%d-brick", i); - ret = dict_get_str (dict, key, &brick_name); + snprintf(key, sizeof(key), "%d-max-open", i); + ret = dict_get_uint64(dict, key, &max_open); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"name", - "%s", brick_name); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"maxOpen", "%" PRIu64, max_open); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key , sizeof (key), "%d-members", i); - ret = dict_get_int32 (dict, key, &members); + snprintf(key, sizeof(key), "%d-max-openfd-time", i); + ret = dict_get_str(dict, key, &max_open_time); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"members", - "%d", members); - XML_RET_CHECK_AND_GOTO (ret, out); - - switch (top_op) { - case GF_CLI_TOP_OPEN: - snprintf (key, sizeof (key), "%d-current-open", i); - ret = dict_get_uint64 (dict, key, ¤t_open); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"currentOpen", "%"PRIu64, - current_open); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%d-max-open", i); - ret = dict_get_uint64 (dict, key, &max_open); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"maxOpen", "%"PRIu64, - max_open); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%d-max-openfd-time", i); - ret = dict_get_str (dict, key, &max_open_time); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"maxOpenTime", "%s", - max_open_time); - XML_RET_CHECK_AND_GOTO (ret, out); - - case GF_CLI_TOP_READ: - case GF_CLI_TOP_WRITE: - case GF_CLI_TOP_OPENDIR: - case GF_CLI_TOP_READDIR: - - break; - - case GF_CLI_TOP_READ_PERF: - case GF_CLI_TOP_WRITE_PERF: - snprintf (key, sizeof (key), "%d-throughput", i); - ret = dict_get_double (dict, key, &throughput); - if (!ret) { - snprintf (key, sizeof (key), "%d-time", i); - ret = dict_get_double (dict, key, &time_taken); - } - - if (!ret) { - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"throughput", - "%f", throughput); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"timeTaken", - "%f", time_taken); - XML_RET_CHECK_AND_GOTO (ret, out); - } - - break; - - default: - ret = -1; - goto out; + goto out; + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"maxOpenTime", "%s", max_open_time); + XML_RET_CHECK_AND_GOTO(ret, out); + + case GF_CLI_TOP_READ: + case GF_CLI_TOP_WRITE: + case GF_CLI_TOP_OPENDIR: + case GF_CLI_TOP_READDIR: + + break; + + case GF_CLI_TOP_READ_PERF: + case GF_CLI_TOP_WRITE_PERF: + snprintf(key, sizeof(key), "%d-throughput", i); + ret = dict_get_double(dict, key, &throughput); + if (!ret) { + snprintf(key, sizeof(key), "%d-time", i); + ret = dict_get_double(dict, key, &time_taken); } - for (j = 1; j <= members; j++) { - if (top_op == GF_CLI_TOP_READ_PERF || - top_op == GF_CLI_TOP_WRITE_PERF) { - ret = cli_xml_output_vol_top_rw_perf - (writer, dict, i, j); - } else { - ret = cli_xml_output_vol_top_other - (writer, dict, i, j); - } - if (ret) - goto out; + if (!ret) { + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"throughput", "%f", throughput); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"timeTaken", "%f", time_taken); + XML_RET_CHECK_AND_GOTO(ret, out); } + break; - /* </brick> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + default: + ret = -1; + goto out; } - /* </volTop> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - ret = cli_end_xml_output (writer, doc); + for (j = 1; j <= members; j++) { + if (top_op == GF_CLI_TOP_READ_PERF || + top_op == GF_CLI_TOP_WRITE_PERF) { + ret = cli_xml_output_vol_top_rw_perf(writer, dict, i, j); + } else { + ret = cli_xml_output_vol_top_other(writer, dict, i, j); + } + if (ret) + goto out; + } + + /* </brick> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + + /* </volTop> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } #if (HAVE_LIB_XML) int -cli_xml_output_vol_profile_stats (xmlTextWriterPtr writer, dict_t *dict, - int brick_index, int interval) +cli_xml_output_vol_profile_stats(xmlTextWriterPtr writer, dict_t *dict, + int brick_index, int interval) { - int ret = -1; - uint64_t read_count = 0; - uint64_t write_count = 0; - uint64_t hits = 0; - double avg_latency = 0.0; - double max_latency = 0.0; - double min_latency = 0.0; - uint64_t duration = 0; - uint64_t total_read = 0; - uint64_t total_write = 0; - char key[1024] = {0}; - int i = 0; - - /* <cumulativeStats> || <intervalStats> */ - if (interval == -1) - ret = xmlTextWriterStartElement (writer, - (xmlChar *)"cumulativeStats"); - else - ret = xmlTextWriterStartElement (writer, - (xmlChar *)"intervalStats"); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* <blockStats> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"blockStats"); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < 32; i++) { - /* <block> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"block"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"size", "%"PRIu32, (1 << i)); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%d-%d-read-%d", brick_index, - interval, (1 << i)); - ret = dict_get_uint64 (dict, key, &read_count); - if (ret) - read_count = 0; - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"reads", "%"PRIu64, read_count); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%d-%d-write-%d", brick_index, - interval, (1 << i)); - ret = dict_get_uint64 (dict, key, &write_count); - if (ret) - write_count = 0; - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"writes", "%"PRIu64, write_count); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </block> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } - - /* </blockStats> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* <fopStats> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"fopStats"); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < GF_FOP_MAXVALUE; i++) { - snprintf (key, sizeof (key), "%d-%d-%d-hits", brick_index, - interval, i); - ret = dict_get_uint64 (dict, key, &hits); - if (ret) - goto cont; + int ret = -1; + uint64_t read_count = 0; + uint64_t write_count = 0; + uint64_t hits = 0; + double avg_latency = 0.0; + double max_latency = 0.0; + double min_latency = 0.0; + uint64_t duration = 0; + uint64_t total_read = 0; + uint64_t total_write = 0; + char key[1024] = {0}; + int i = 0; + + /* <cumulativeStats> || <intervalStats> */ + if (interval == -1) + ret = xmlTextWriterStartElement(writer, (xmlChar *)"cumulativeStats"); + else + ret = xmlTextWriterStartElement(writer, (xmlChar *)"intervalStats"); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* <blockStats> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"blockStats"); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 0; i < 32; i++) { + /* <block> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"block"); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%d-%d-%d-avglatency", brick_index, - interval, i); - ret = dict_get_double (dict, key, &avg_latency); - if (ret) - goto cont; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"size", + "%" PRIu32, (1 << i)); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%d-%d-%d-minlatency", brick_index, - interval, i); - ret = dict_get_double (dict, key, &min_latency); - if (ret) - goto cont; + snprintf(key, sizeof(key), "%d-%d-read-%d", brick_index, interval, + (1 << i)); + ret = dict_get_uint64(dict, key, &read_count); + if (ret) + read_count = 0; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"reads", + "%" PRIu64, read_count); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%d-%d-%d-maxlatency", brick_index, - interval, i); - ret = dict_get_double (dict, key, &max_latency); - if (ret) - goto cont; + snprintf(key, sizeof(key), "%d-%d-write-%d", brick_index, interval, + (1 << i)); + ret = dict_get_uint64(dict, key, &write_count); + if (ret) + write_count = 0; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"writes", + "%" PRIu64, write_count); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <fop> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"fop"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </block> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"name","%s", gf_fop_list[i]); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </blockStats> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"hits", "%"PRIu64, hits); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <fopStats> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"fopStats"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"avgLatency", "%f", avg_latency); - XML_RET_CHECK_AND_GOTO (ret, out); + for (i = 0; i < GF_FOP_MAXVALUE; i++) { + snprintf(key, sizeof(key), "%d-%d-%d-hits", brick_index, interval, i); + ret = dict_get_uint64(dict, key, &hits); + if (ret) + goto cont; - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"minLatency", "%f", min_latency); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "%d-%d-%d-avglatency", brick_index, interval, + i); + ret = dict_get_double(dict, key, &avg_latency); + if (ret) + goto cont; - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"maxLatency", "%f", max_latency); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "%d-%d-%d-minlatency", brick_index, interval, + i); + ret = dict_get_double(dict, key, &min_latency); + if (ret) + goto cont; - /* </fop> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "%d-%d-%d-maxlatency", brick_index, interval, + i); + ret = dict_get_double(dict, key, &max_latency); + if (ret) + goto cont; -cont: - hits = 0; - avg_latency = 0.0; - min_latency = 0.0; - max_latency = 0.0; - } + /* <fop> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"fop"); + XML_RET_CHECK_AND_GOTO(ret, out); - for (i = 0; i < GF_UPCALL_FLAGS_MAXVALUE; i++) { - hits = 0; - avg_latency = 0.0; - min_latency = 0.0; - max_latency = 0.0; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + gf_fop_list[i]); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%d-%d-%d-upcall-hits", brick_index, - interval, i); - ret = dict_get_uint64 (dict, key, &hits); - if (ret) - continue; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hits", + "%" PRIu64, hits); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <fop> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"fop"); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"avgLatency", + "%f", avg_latency); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"name", "%s", gf_fop_list[i]); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"minLatency", + "%f", min_latency); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"hits", "%"PRIu64, hits); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"maxLatency", + "%f", max_latency); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"avgLatency", "%f", avg_latency); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </fop> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"minLatency", "%f", min_latency); - XML_RET_CHECK_AND_GOTO (ret, out); + cont: + hits = 0; + avg_latency = 0.0; + min_latency = 0.0; + max_latency = 0.0; + } + + for (i = 0; i < GF_UPCALL_FLAGS_MAXVALUE; i++) { + hits = 0; + avg_latency = 0.0; + min_latency = 0.0; + max_latency = 0.0; + + snprintf(key, sizeof(key), "%d-%d-%d-upcall-hits", brick_index, + interval, i); + ret = dict_get_uint64(dict, key, &hits); + if (ret) + continue; - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"maxLatency", "%f", max_latency); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <fop> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"fop"); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </fop> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + gf_fop_list[i]); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </fopStats> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hits", + "%" PRIu64, hits); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%d-%d-duration", brick_index, interval); - ret = dict_get_uint64 (dict, key, &duration); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"duration", - "%"PRIu64, duration); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"avgLatency", + "%f", avg_latency); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%d-%d-total-read", brick_index, interval); - ret = dict_get_uint64 (dict, key, &total_read); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"totalRead", - "%"PRIu64, total_read); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"minLatency", + "%f", min_latency); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%d-%d-total-write", brick_index, interval); - ret = dict_get_uint64 (dict, key, &total_write); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"totalWrite", - "%"PRIu64, total_write); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"maxLatency", + "%f", max_latency); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </cumulativeStats> || </intervalStats> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </fop> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + + /* </fopStats> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%d-%d-duration", brick_index, interval); + ret = dict_get_uint64(dict, key, &duration); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"duration", + "%" PRIu64, duration); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%d-%d-total-read", brick_index, interval); + ret = dict_get_uint64(dict, key, &total_read); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"totalRead", + "%" PRIu64, total_read); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%d-%d-total-write", brick_index, interval); + ret = dict_get_uint64(dict, key, &total_write); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"totalWrite", + "%" PRIu64, total_write); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </cumulativeStats> || </intervalStats> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } #endif int -cli_xml_output_vol_profile (dict_t *dict, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_vol_profile(dict_t *dict, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; - char *volname = NULL; - int op = GF_CLI_STATS_NONE; - int info_op = GF_CLI_INFO_NONE; - int brick_count = 0; - char *brick_name = NULL; - int interval = 0; - char key[1024] = {0,}; - int i = 0; - int stats_cleared = 0; - - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; - - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); - if (ret) - goto out; - - /* <volProfile> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volProfile"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"volname", - "%s", volname); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_int32 (dict, "op", &op); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"profileOp", - "%d", op); - XML_RET_CHECK_AND_GOTO (ret, out); - - if (GF_CLI_STATS_INFO != op) - goto cont; + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; + char *volname = NULL; + int op = GF_CLI_STATS_NONE; + int info_op = GF_CLI_INFO_NONE; + int brick_count = 0; + char *brick_name = NULL; + int interval = 0; + char key[1024] = { + 0, + }; + int i = 0; + int stats_cleared = 0; + + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; + + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; + + /* <volProfile> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volProfile"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"volname", "%s", + volname); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_int32(dict, "op", &op); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"profileOp", "%d", + op); + XML_RET_CHECK_AND_GOTO(ret, out); + + if (GF_CLI_STATS_INFO != op) + goto cont; + + ret = dict_get_int32(dict, "count", &brick_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"brickCount", "%d", + brick_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_int32(dict, "info-op", &info_op); + if (ret) + goto out; + + while (i < brick_count) { + i++; + + /* <brick> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"brick"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_int32 (dict, "count", &brick_count); + snprintf(key, sizeof(key), "%d-brick", i); + ret = dict_get_str(dict, key, &brick_name); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"brickCount", - "%d", brick_count); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"brickName", + "%s", brick_name); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_int32 (dict, "info-op", &info_op); - if (ret) + if (GF_CLI_INFO_CLEAR == info_op) { + snprintf(key, sizeof(key), "%d-stats-cleared", i); + ret = dict_get_int32(dict, key, &stats_cleared); + if (ret) goto out; - while (i < brick_count) { - i++; - - /* <brick> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"brick"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%d-brick", i); - ret = dict_get_str (dict, key, &brick_name); + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"clearStats", "%s", + stats_cleared ? "Cleared stats." : "Failed to clear stats."); + XML_RET_CHECK_AND_GOTO(ret, out); + } else { + snprintf(key, sizeof(key), "%d-cumulative", i); + ret = dict_get_int32(dict, key, &interval); + if (ret == 0) { + ret = cli_xml_output_vol_profile_stats(writer, dict, i, + interval); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"brickName", "%s", brick_name); - XML_RET_CHECK_AND_GOTO (ret, out); - - if (GF_CLI_INFO_CLEAR == info_op) { - snprintf (key, sizeof (key), "%d-stats-cleared", i); - ret = dict_get_int32 (dict, key, &stats_cleared); - if (ret) - goto out; - - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"clearStats", "%s", - stats_cleared ? "Cleared stats." : - "Failed to clear stats."); - XML_RET_CHECK_AND_GOTO (ret, out); - } else { - snprintf (key, sizeof (key), "%d-cumulative", i); - ret = dict_get_int32 (dict, key, &interval); - if (ret == 0) { - ret = cli_xml_output_vol_profile_stats - (writer, dict, i, interval); - if (ret) - goto out; - } - - snprintf (key, sizeof (key), "%d-interval", i); - ret = dict_get_int32 (dict, key, &interval); - if (ret == 0) { - ret = cli_xml_output_vol_profile_stats - (writer, dict, i, interval); - if (ret) - goto out; - } - } - - /* </brick> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + } + + snprintf(key, sizeof(key), "%d-interval", i); + ret = dict_get_int32(dict, key, &interval); + if (ret == 0) { + ret = cli_xml_output_vol_profile_stats(writer, dict, i, + interval); + if (ret) + goto out; + } } + /* </brick> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + cont: - /* </volProfile> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </volProfile> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_end_xml_output (writer, doc); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_vol_list (dict_t *dict, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_vol_list(dict_t *dict, int op_ret, int op_errno, char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; - int count = 0; - char *volname = NULL; - char key[1024] = {0,}; - int i = 0; - - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; - - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; + int count = 0; + char *volname = NULL; + char key[1024] = { + 0, + }; + int i = 0; + + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; + + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; + + /* <volList> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volList"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_int32(dict, "count", &count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d", + count); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 0; i < count; i++) { + snprintf(key, sizeof(key), "volume%d", i); + ret = dict_get_str(dict, key, &volname); if (ret) - goto out; - - /* <volList> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volList"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_int32 (dict, "count", &count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"count", - "%d", count); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < count; i++) { - snprintf (key, sizeof (key), "volume%d", i); - ret = dict_get_str (dict, key, &volname); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"volume", - "%s", volname); - XML_RET_CHECK_AND_GOTO (ret, out); - } + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"volume", "%s", + volname); + XML_RET_CHECK_AND_GOTO(ret, out); + } - /* </volList> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </volList> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_end_xml_output (writer, doc); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } #if (HAVE_LIB_XML) int -cli_xml_output_vol_info_option (xmlTextWriterPtr writer, char *substr, - char *optstr, char *valstr) +cli_xml_output_vol_info_option(xmlTextWriterPtr writer, char *substr, + char *optstr, char *valstr) { - int ret = -1; - char *ptr1 = NULL; - char *ptr2 = NULL; - - ptr1 = substr; - ptr2 = optstr; - - while (ptr1) { - if (*ptr1 != *ptr2) - break; - ptr1++; - ptr2++; - if (!*ptr1) - break; - if (!*ptr2) - break; - } - if (*ptr2 == '\0') - goto out; - - /* <option> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"option"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"name", - "%s", ptr2); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"value", - "%s", valstr); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </option> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + char *ptr1 = NULL; + char *ptr2 = NULL; + + ptr1 = substr; + ptr2 = optstr; + + while (ptr1) { + if (*ptr1 != *ptr2) + break; + ptr1++; + ptr2++; + if (!*ptr1) + break; + if (!*ptr2) + break; + } + if (*ptr2 == '\0') + goto out; + + /* <option> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"option"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + ptr2); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"value", "%s", + valstr); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </option> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } struct tmp_xml_option_logger { - char *key; - xmlTextWriterPtr writer; + char *key; + xmlTextWriterPtr writer; }; static int -_output_vol_info_option (dict_t *d, char *k, data_t *v, - void *data) +_output_vol_info_option(dict_t *d, char *k, data_t *v, void *data) { - int ret = 0; - char *ptr = NULL; - struct tmp_xml_option_logger *tmp = NULL; + int ret = 0; + char *ptr = NULL; + struct tmp_xml_option_logger *tmp = NULL; - tmp = data; + tmp = data; - ptr = strstr (k, "option."); - if (!ptr) - goto out; + ptr = strstr(k, "option."); + if (!ptr) + goto out; - if (!v) { - ret = -1; - goto out; - } - ret = cli_xml_output_vol_info_option (tmp->writer, tmp->key, k, - v->data); + if (!v) { + ret = -1; + goto out; + } + ret = cli_xml_output_vol_info_option(tmp->writer, tmp->key, k, v->data); out: - return ret; + return ret; } int -cli_xml_output_vol_info_options (xmlTextWriterPtr writer, dict_t *dict, - char *prefix) +cli_xml_output_vol_info_options(xmlTextWriterPtr writer, dict_t *dict, + char *prefix) { - int ret = -1; - int opt_count = 0; - char key[1024] = {0,}; - struct tmp_xml_option_logger tmp = {0,}; - - snprintf (key, sizeof (key), "%s.opt_count", prefix); - ret = dict_get_int32 (dict, key, &opt_count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"optCount", - "%d", opt_count); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* <options> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"options"); - XML_RET_CHECK_AND_GOTO (ret, out); - snprintf (key, sizeof (key), "%s.option.", prefix); - - tmp.key = key; - tmp.writer = writer; - ret = dict_foreach (dict, _output_vol_info_option, &tmp); - if (ret) - goto out; - - /* </options> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + int opt_count = 0; + char key[1024] = { + 0, + }; + struct tmp_xml_option_logger tmp = { + 0, + }; + + snprintf(key, sizeof(key), "%s.opt_count", prefix); + ret = dict_get_int32(dict, key, &opt_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"optCount", "%d", + opt_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* <options> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"options"); + XML_RET_CHECK_AND_GOTO(ret, out); + snprintf(key, sizeof(key), "%s.option.", prefix); + + tmp.key = key; + tmp.writer = writer; + ret = dict_foreach(dict, _output_vol_info_option, &tmp); + if (ret) + goto out; + + /* </options> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } #endif int -cli_xml_output_vol_info (cli_local_t *local, dict_t *dict) +cli_xml_output_vol_info(cli_local_t *local, dict_t *dict) { #if (HAVE_LIB_XML) - int ret = 0; - int count = 0; - char *volname = NULL; - char *volume_id = NULL; - char *uuid = NULL; - int type = 0; - int status = 0; - int brick_count = 0; - int dist_count = 0; - int stripe_count = 0; - int replica_count = 0; - int arbiter_count = 0; - int snap_count = 0; - int isArbiter = 0; - int disperse_count = 0; - int redundancy_count = 0; - int transport = 0; - char *brick = NULL; - char key[1024] = {0,}; - int i = 0; - int j = 1; - char *caps __attribute__((unused)) = NULL; - int k __attribute__((unused)) = 0; - int index = 1; - int tier_vol_type = 0; - /* hot dist count is always zero so need for it to be - * included in the array.*/ - int hot_dist_count = 0; - values c = 0; - char *keys[MAX] = { - [COLD_BRICK_COUNT] = "volume%d.cold_brick_count", - [COLD_TYPE] = "volume%d.cold_type", - [COLD_DIST_COUNT] = "volume%d.cold_dist_count", - [COLD_REPLICA_COUNT] = "volume%d.cold_replica_count", - [COLD_ARBITER_COUNT] = "volume%d.cold_arbiter_count", - [COLD_DISPERSE_COUNT] = "volume%d.cold_disperse_count", - [COLD_REDUNDANCY_COUNT] = "volume%d.cold_redundancy_count", - [HOT_BRICK_COUNT] = "volume%d.hot_brick_count", - [HOT_TYPE] = "volume%d.hot_type", - [HOT_REPLICA_COUNT] = "volume%d.hot_replica_count"}; - int value[MAX] = {}; - - - ret = dict_get_int32 (dict, "count", &count); + int ret = 0; + int count = 0; + char *volname = NULL; + char *volume_id = NULL; + char *uuid = NULL; + int type = 0; + int status = 0; + int brick_count = 0; + int dist_count = 0; + int stripe_count = 0; + int replica_count = 0; + int arbiter_count = 0; + int snap_count = 0; + int isArbiter = 0; + int disperse_count = 0; + int redundancy_count = 0; + int transport = 0; + char *brick = NULL; + char key[1024] = { + 0, + }; + int i = 0; + int j = 1; + char *caps __attribute__((unused)) = NULL; + int k __attribute__((unused)) = 0; + int index = 1; + int tier_vol_type = 0; + /* hot dist count is always zero so need for it to be + * included in the array.*/ + int hot_dist_count = 0; + values c = 0; + char *keys[MAX] = { + [COLD_BRICK_COUNT] = "volume%d.cold_brick_count", + [COLD_TYPE] = "volume%d.cold_type", + [COLD_DIST_COUNT] = "volume%d.cold_dist_count", + [COLD_REPLICA_COUNT] = "volume%d.cold_replica_count", + [COLD_ARBITER_COUNT] = "volume%d.cold_arbiter_count", + [COLD_DISPERSE_COUNT] = "volume%d.cold_disperse_count", + [COLD_REDUNDANCY_COUNT] = "volume%d.cold_redundancy_count", + [HOT_BRICK_COUNT] = "volume%d.hot_brick_count", + [HOT_TYPE] = "volume%d.hot_type", + [HOT_REPLICA_COUNT] = "volume%d.hot_replica_count"}; + int value[MAX] = {}; + + ret = dict_get_int32(dict, "count", &count); + if (ret) + goto out; + + for (i = 0; i < count; i++) { + /* <volume> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"volume"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "volume%d.name", i); + ret = dict_get_str(dict, key, &volname); if (ret) - goto out; + goto out; + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"name", + "%s", volname); + XML_RET_CHECK_AND_GOTO(ret, out); - for (i = 0; i < count; i++) { - /* <volume> */ - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *)"volume"); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "volume%d.volume_id", i); + ret = dict_get_str(dict, key, &volume_id); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"id", + "%s", volume_id); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "volume%d.name", i); - ret = dict_get_str (dict, key, &volname); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"name", - "%s", volname); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "volume%d.status", i); + ret = dict_get_int32(dict, key, &status); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"status", "%d", status); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "volume%d.volume_id", i); - ret = dict_get_str (dict, key, &volume_id); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"id", - "%s", volume_id); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(local->writer, + (xmlChar *)"statusStr", "%s", + cli_vol_status_str[status]); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "volume%d.status", i); - ret = dict_get_int32 (dict, key, &status); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"status", - "%d", status); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret =xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"statusStr", "%s", - cli_vol_status_str[status]); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "volume%d.snap_count", i); - ret = dict_get_int32 (dict, key, &snap_count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"snapshotCount", - "%d", snap_count); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "volume%d.snap_count", i); + ret = dict_get_int32(dict, key, &snap_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"snapshotCount", "%d", snap_count); + XML_RET_CHECK_AND_GOTO(ret, out); + snprintf(key, sizeof(key), "volume%d.brick_count", i); + ret = dict_get_int32(dict, key, &brick_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"brickCount", "%d", brick_count); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "volume%d.brick_count", i); - ret = dict_get_int32 (dict, key, &brick_count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"brickCount", - "%d", brick_count); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "volume%d.dist_count", i); + ret = dict_get_int32(dict, key, &dist_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"distCount", "%d", dist_count); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "volume%d.dist_count", i); - ret = dict_get_int32 (dict, key, &dist_count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"distCount", - "%d", dist_count); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "volume%d.stripe_count", i); + ret = dict_get_int32(dict, key, &stripe_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"stripeCount", "%d", stripe_count); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "volume%d.stripe_count", i); - ret = dict_get_int32 (dict, key, &stripe_count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"stripeCount", - "%d", stripe_count); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "volume%d.replica_count", i); + ret = dict_get_int32(dict, key, &replica_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"replicaCount", "%d", replica_count); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "volume%d.replica_count", i); - ret = dict_get_int32 (dict, key, &replica_count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"replicaCount", - "%d", replica_count); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "volume%d.arbiter_count", i); + ret = dict_get_int32(dict, key, &arbiter_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"arbiterCount", "%d", arbiter_count); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "volume%d.arbiter_count", i); - ret = dict_get_int32 (dict, key, &arbiter_count); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"arbiterCount", - "%d", arbiter_count); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "volume%d.disperse_count", i); + ret = dict_get_int32(dict, key, &disperse_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"disperseCount", "%d", disperse_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "volume%d.redundancy_count", i); + ret = dict_get_int32(dict, key, &redundancy_count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(local->writer, + (xmlChar *)"redundancyCount", + "%d", redundancy_count); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "volume%d.type", i); + ret = dict_get_int32(dict, key, &type); + if (ret) + goto out; + /* For Distributed-(stripe,replicate,stipe-replicate,disperse) + types + */ + type = get_vol_type(type, dist_count, brick_count); + + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"type", + "%d", type); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"typeStr", "%s", vol_type_str[type]); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "volume%d.transport", i); + ret = dict_get_int32(dict, key, &transport); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"transport", "%d", transport); + XML_RET_CHECK_AND_GOTO(ret, out); + +#ifdef HAVE_BD_XLATOR + /* <xlators> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"xlators"); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (k = 0;; k++) { + snprintf(key, sizeof(key), "volume%d.xlator%d", i, k); + ret = dict_get_str(dict, key, &caps); + if (ret) + break; + + /* <xlator> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"xlator"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"name", "%s", caps); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "volume%d.disperse_count", i); - ret = dict_get_int32 (dict, key, &disperse_count); + /* <capabilities> */ + ret = xmlTextWriterStartElement(local->writer, + (xmlChar *)"capabilities"); + XML_RET_CHECK_AND_GOTO(ret, out); + + j = 0; + for (j = 0;; j++) { + snprintf(key, sizeof(key), "volume%d.xlator%d.caps%d", i, k, j); + ret = dict_get_str(dict, key, &caps); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"disperseCount", - "%d", disperse_count); - XML_RET_CHECK_AND_GOTO (ret, out); + break; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"capability", "%s", caps); + XML_RET_CHECK_AND_GOTO(ret, out); + } + /* </capabilities> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + /* </xlator> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + ret = xmlTextWriterFullEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + /* </xlators> */ +#endif + j = 1; + + /* <bricks> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"bricks"); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "volume%d.redundancy_count", i); - ret = dict_get_int32 (dict, key, &redundancy_count); + if (type == GF_CLUSTER_TYPE_TIER) { + /*the values for hot stripe, disperse and redundancy + * should not be looped in here as they are zero + * always */ + for (c = COLD_BRICK_COUNT; c < MAX; c++) { + snprintf(key, 256, keys[c], i); + ret = dict_get_int32(dict, key, &value[c]); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"redundancyCount", - "%d", redundancy_count); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + } + + hot_dist_count = (value[HOT_REPLICA_COUNT] + ? value[HOT_REPLICA_COUNT] + : 1); + + tier_vol_type = get_vol_type(value[HOT_TYPE], hot_dist_count, + value[HOT_BRICK_COUNT]); - snprintf (key, sizeof (key), "volume%d.type", i); - ret = dict_get_int32 (dict, key, &type); + if ((value[HOT_TYPE] != GF_CLUSTER_TYPE_TIER) && + (value[HOT_TYPE] > 0) && + (hot_dist_count < value[HOT_BRICK_COUNT])) + tier_vol_type = value[HOT_TYPE] + GF_CLUSTER_TYPE_MAX - 1; + + ret = xmlTextWriterStartElement(local->writer, + (xmlChar *)"hotBricks"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"hotBrickType", "%s", + vol_type_str[tier_vol_type]); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"hotreplicaCount", "%d", + value[HOT_REPLICA_COUNT]); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement(local->writer, + (xmlChar *)"hotbrickCount", + "%d", value[HOT_BRICK_COUNT]); + XML_RET_CHECK_AND_GOTO(ret, out); + + if (value[HOT_TYPE] == GF_CLUSTER_TYPE_NONE || + value[HOT_TYPE] == GF_CLUSTER_TYPE_TIER) { + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"numberOfBricks", "%d", + value[HOT_BRICK_COUNT]); + } else { + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"numberOfBricks", "%d x %d = %d", + (value[HOT_BRICK_COUNT] / hot_dist_count), hot_dist_count, + value[HOT_BRICK_COUNT]); + } + XML_RET_CHECK_AND_GOTO(ret, out); + + while (index <= value[HOT_BRICK_COUNT]) { + snprintf(key, 1024, "volume%d.brick%d", i, index); + ret = dict_get_str(dict, key, &brick); if (ret) - goto out; - /* For Distributed-(stripe,replicate,stipe-replicate,disperse) - types - */ - type = get_vol_type (type, dist_count, brick_count); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"type", - "%d", type); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"typeStr", - "%s", - vol_type_str[type]); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "volume%d.transport", i); - ret = dict_get_int32 (dict, key, &transport); + goto out; + + ret = xmlTextWriterStartElement(local->writer, + (xmlChar *)"brick"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "volume%d.brick%d.uuid", i, index); + ret = dict_get_str(dict, key, &uuid); if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"transport", - "%d", transport); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatAttribute( + local->writer, (xmlChar *)"uuid", "%s", uuid); + XML_RET_CHECK_AND_GOTO(ret, out); -#ifdef HAVE_BD_XLATOR - /* <xlators> */ - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *)"xlators"); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (k = 0; ; k++) { - snprintf (key, sizeof (key),"volume%d.xlator%d", i, k); - ret = dict_get_str (dict, key, &caps); - if (ret) - break; - - /* <xlator> */ - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *)"xlator"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"name", "%s", caps); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* <capabilities> */ - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *) - "capabilities"); - XML_RET_CHECK_AND_GOTO (ret, out); - - j = 0; - for (j = 0; ;j++) { - snprintf (key, sizeof (key), - "volume%d.xlator%d.caps%d", i, k, j); - ret = dict_get_str (dict, key, &caps); - if (ret) - break; - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"capability", - "%s", caps); - XML_RET_CHECK_AND_GOTO (ret, out); - } - /* </capabilities> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); - /* </xlator> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } - ret = xmlTextWriterFullEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); - /* </xlators> */ -#endif - j = 1; - - /* <bricks> */ - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *)"bricks"); - XML_RET_CHECK_AND_GOTO (ret, out); - - if (type == GF_CLUSTER_TYPE_TIER) { - /*the values for hot stripe, disperse and redundancy - * should not be looped in here as they are zero - * always */ - for (c = COLD_BRICK_COUNT; c < MAX; c++) { - - snprintf (key, 256, keys[c], i); - ret = dict_get_int32 (dict, key, &value[c]); - if (ret) - goto out; - } - - hot_dist_count = (value[HOT_REPLICA_COUNT] ? - value[HOT_REPLICA_COUNT] : 1); - - tier_vol_type = get_vol_type (value[HOT_TYPE], - hot_dist_count, - value[HOT_BRICK_COUNT]); - - if ((value[HOT_TYPE] != GF_CLUSTER_TYPE_TIER) && - (value[HOT_TYPE] > 0) && - (hot_dist_count < value[HOT_BRICK_COUNT])) - tier_vol_type = value[HOT_TYPE] + - GF_CLUSTER_TYPE_MAX - 1; - - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *) - "hotBricks"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"hotBrickType", - "%s", vol_type_str[tier_vol_type]); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"hotreplicaCount", - "%d", - value[HOT_REPLICA_COUNT]); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"hotbrickCount", - "%d", - value[HOT_BRICK_COUNT]); - XML_RET_CHECK_AND_GOTO (ret, out); - - if (value[HOT_TYPE] == GF_CLUSTER_TYPE_NONE || - value[HOT_TYPE] == - GF_CLUSTER_TYPE_TIER) { - ret = xmlTextWriterWriteFormatElement - (local->writer, - (xmlChar *)"numberOfBricks", - "%d", value[HOT_BRICK_COUNT]); - } else { - ret = xmlTextWriterWriteFormatElement - (local->writer, - (xmlChar *)"numberOfBricks", - "%d x %d = %d", - (value[HOT_BRICK_COUNT] / - hot_dist_count), - hot_dist_count, - value[HOT_BRICK_COUNT]); - } - XML_RET_CHECK_AND_GOTO (ret, out); - - while (index <= value[HOT_BRICK_COUNT]) { - snprintf (key, 1024, "volume%d.brick%d", i, - index); - ret = dict_get_str (dict, key, &brick); - if (ret) - goto out; - - ret = xmlTextWriterStartElement - (local->writer, (xmlChar *)"brick"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), - "volume%d.brick%d.uuid", i, index); - ret = dict_get_str (dict, key, &uuid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatAttribute - (local->writer, (xmlChar *)"uuid", "%s", - uuid); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatString - (local->writer, "%s", brick); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"name", "%s", - brick); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"hostUuid", - "%s", uuid); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - index++; - } - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - tier_vol_type = get_vol_type (value[COLD_TYPE], - value[COLD_DIST_COUNT], - value[COLD_BRICK_COUNT]); - - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *) - "coldBricks"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"coldBrickType", - "%s", vol_type_str[tier_vol_type]); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"coldreplicaCount", - "%d", value[COLD_REPLICA_COUNT]); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"coldarbiterCount", - "%d", value[COLD_ARBITER_COUNT]); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"coldbrickCount", - "%d", - value[COLD_BRICK_COUNT]); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"colddisperseCount", - "%d", value[COLD_DISPERSE_COUNT]); - XML_RET_CHECK_AND_GOTO (ret, out); - - if (value[COLD_TYPE] == GF_CLUSTER_TYPE_NONE || - value[COLD_TYPE] == - GF_CLUSTER_TYPE_TIER) { - ret = xmlTextWriterWriteFormatElement - (local->writer, - (xmlChar *)"numberOfBricks", - "%d", value[COLD_BRICK_COUNT]); - } else if (value[COLD_TYPE] == - GF_CLUSTER_TYPE_DISPERSE) { - ret = xmlTextWriterWriteFormatElement - (local->writer, - (xmlChar *)"numberOfBricks", - " %d x (%d + %d) = %d", - (value[COLD_BRICK_COUNT] / - value[COLD_DIST_COUNT]), - value[COLD_DISPERSE_COUNT] - - value[COLD_REDUNDANCY_COUNT], - value[COLD_REDUNDANCY_COUNT], - value[COLD_BRICK_COUNT]); - } else { - ret = xmlTextWriterWriteFormatElement - (local->writer, - (xmlChar *)"numberOfBricks", - "%d x %d = %d", - (value[COLD_BRICK_COUNT] / - value[COLD_DIST_COUNT]), + ret = xmlTextWriterWriteFormatString(local->writer, "%s", + brick); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"name", "%s", brick); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"hostUuid", "%s", uuid); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + index++; + } + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + tier_vol_type = get_vol_type(value[COLD_TYPE], value[COLD_DIST_COUNT], value[COLD_BRICK_COUNT]); - } - XML_RET_CHECK_AND_GOTO (ret, out); - index = value[HOT_BRICK_COUNT] + 1; - - while (index <= brick_count) { - snprintf (key, 1024, "volume%d.brick%d", i, - index); - ret = dict_get_str (dict, key, &brick); - if (ret) - goto out; - - ret = xmlTextWriterStartElement - (local->writer, (xmlChar *)"brick"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), - "volume%d.brick%d.uuid", i, index); - ret = dict_get_str (dict, key, &uuid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatAttribute - (local->writer, (xmlChar *)"uuid", "%s", - uuid); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatString - (local->writer, "%s", brick); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"name", "%s", - brick); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"hostUuid", - "%s", uuid); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), - "volume%d.brick%d.isArbiter", i, - index); - if (dict_get (dict, key)) - isArbiter = 1; - else - isArbiter = 0; - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"isArbiter", - "%d", isArbiter); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - index++; - } - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - } else { - while (j <= brick_count) { - ret = xmlTextWriterStartElement - (local->writer, (xmlChar *)"brick"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), - "volume%d.brick%d.uuid", i, j); - ret = dict_get_str (dict, key, &uuid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatAttribute - (local->writer, (xmlChar *)"uuid", "%s", - uuid); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), - "volume%d.brick%d", i, j); - ret = dict_get_str (dict, key, &brick); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatString - (local->writer, "%s", brick); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"name", "%s", - brick); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"hostUuid", - "%s", uuid); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), - "volume%d.brick%d.isArbiter", i, j); - if (dict_get (dict, key)) - isArbiter = 1; - else - isArbiter = 0; - ret = xmlTextWriterWriteFormatElement - (local->writer, (xmlChar *)"isArbiter", - "%d", isArbiter); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </brick> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - j++; - } - } - /* </bricks> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); - snprintf (key, sizeof (key), "volume%d", i); - ret = cli_xml_output_vol_info_options (local->writer, dict, - key); + ret = xmlTextWriterStartElement(local->writer, + (xmlChar *)"coldBricks"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"coldBrickType", "%s", + vol_type_str[tier_vol_type]); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"coldreplicaCount", "%d", + value[COLD_REPLICA_COUNT]); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"coldarbiterCount", "%d", + value[COLD_ARBITER_COUNT]); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"coldbrickCount", "%d", + value[COLD_BRICK_COUNT]); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"colddisperseCount", "%d", + value[COLD_DISPERSE_COUNT]); + XML_RET_CHECK_AND_GOTO(ret, out); + + if (value[COLD_TYPE] == GF_CLUSTER_TYPE_NONE || + value[COLD_TYPE] == GF_CLUSTER_TYPE_TIER) { + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"numberOfBricks", "%d", + value[COLD_BRICK_COUNT]); + } else if (value[COLD_TYPE] == GF_CLUSTER_TYPE_DISPERSE) { + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"numberOfBricks", + " %d x (%d + %d) = %d", + (value[COLD_BRICK_COUNT] / value[COLD_DIST_COUNT]), + value[COLD_DISPERSE_COUNT] - value[COLD_REDUNDANCY_COUNT], + value[COLD_REDUNDANCY_COUNT], value[COLD_BRICK_COUNT]); + } else { + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"numberOfBricks", "%d x %d = %d", + (value[COLD_BRICK_COUNT] / value[COLD_DIST_COUNT]), + value[COLD_DIST_COUNT], value[COLD_BRICK_COUNT]); + } + XML_RET_CHECK_AND_GOTO(ret, out); + index = value[HOT_BRICK_COUNT] + 1; + + while (index <= brick_count) { + snprintf(key, 1024, "volume%d.brick%d", i, index); + ret = dict_get_str(dict, key, &brick); if (ret) - goto out; + goto out; - /* </volume> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + ret = xmlTextWriterStartElement(local->writer, + (xmlChar *)"brick"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "volume%d.brick%d.uuid", i, index); + ret = dict_get_str(dict, key, &uuid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatAttribute( + local->writer, (xmlChar *)"uuid", "%s", uuid); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatString(local->writer, "%s", + brick); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"name", "%s", brick); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"hostUuid", "%s", uuid); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "volume%d.brick%d.isArbiter", i, + index); + if (dict_get(dict, key)) + isArbiter = 1; + else + isArbiter = 0; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"isArbiter", "%d", isArbiter); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + index++; + } + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + } else { + while (j <= brick_count) { + ret = xmlTextWriterStartElement(local->writer, + (xmlChar *)"brick"); + XML_RET_CHECK_AND_GOTO(ret, out); - if (volname) { - GF_FREE (local->get_vol.volname); - local->get_vol.volname = gf_strdup (volname); - local->vol_count += count; + snprintf(key, sizeof(key), "volume%d.brick%d.uuid", i, j); + ret = dict_get_str(dict, key, &uuid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatAttribute( + local->writer, (xmlChar *)"uuid", "%s", uuid); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "volume%d.brick%d", i, j); + ret = dict_get_str(dict, key, &brick); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatString(local->writer, "%s", + brick); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"name", "%s", brick); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"hostUuid", "%s", uuid); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "volume%d.brick%d.isArbiter", i, j); + if (dict_get(dict, key)) + isArbiter = 1; + else + isArbiter = 0; + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"isArbiter", "%d", isArbiter); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </brick> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + j++; + } } + /* </bricks> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "volume%d", i); + ret = cli_xml_output_vol_info_options(local->writer, dict, key); + if (ret) + goto out; + + /* </volume> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + + if (volname) { + GF_FREE(local->get_vol.volname); + local->get_vol.volname = gf_strdup(volname); + local->vol_count += count; + } out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_vol_info_begin (cli_local_t *local, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_vol_info_begin(cli_local_t *local, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; + int ret = -1; - GF_ASSERT (local); + GF_ASSERT(local); - ret = cli_begin_xml_output (&(local->writer), &(local->doc)); - if (ret) - goto out; + ret = cli_begin_xml_output(&(local->writer), &(local->doc)); + if (ret) + goto out; - ret = cli_xml_output_common (local->writer, op_ret, op_errno, - op_errstr); - if (ret) - goto out; + ret = cli_xml_output_common(local->writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; - /* <volInfo> */ - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"volInfo"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <volInfo> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"volInfo"); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <volumes> */ - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"volumes"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <volumes> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"volumes"); + XML_RET_CHECK_AND_GOTO(ret, out); - /* Init vol count */ - local->vol_count = 0; + /* Init vol count */ + local->vol_count = 0; out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_vol_info_end (cli_local_t *local) +cli_xml_output_vol_info_end(cli_local_t *local) { #if (HAVE_LIB_XML) - int ret = -1; + int ret = -1; - GF_ASSERT (local); + GF_ASSERT(local); - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"count", - "%d", local->vol_count); - XML_RET_CHECK_AND_GOTO (ret, out); - /* </volumes> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"count", + "%d", local->vol_count); + XML_RET_CHECK_AND_GOTO(ret, out); + /* </volumes> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </volInfo> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </volInfo> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_end_xml_output (local->writer, local->doc); + ret = cli_end_xml_output(local->writer, local->doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_vol_quota_limit_list_end (cli_local_t *local) +cli_xml_output_vol_quota_limit_list_end(cli_local_t *local) { #if (HAVE_LIB_XML) - int ret = -1; + int ret = -1; - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_end_xml_output (local->writer, local->doc); + ret = cli_end_xml_output(local->writer, local->doc); out: - return ret; + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_vol_quota_limit_list_begin (cli_local_t *local, int op_ret, - int op_errno, char *op_errstr) +cli_xml_output_vol_quota_limit_list_begin(cli_local_t *local, int op_ret, + int op_errno, char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; + int ret = -1; - ret = cli_begin_xml_output (&(local->writer), &(local->doc)); - if (ret) - goto out; - - ret = cli_xml_output_common (local->writer, op_ret, op_errno, - op_errstr); - if (ret) - goto out; + ret = cli_begin_xml_output(&(local->writer), &(local->doc)); + if (ret) + goto out; - /* <volQuota> */ - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"volQuota"); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = cli_xml_output_common(local->writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; + /* <volQuota> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"volQuota"); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } #if (HAVE_LIB_XML) static int -cli_xml_output_peer_hostnames (xmlTextWriterPtr writer, dict_t *dict, - const char *prefix, int count) +cli_xml_output_peer_hostnames(xmlTextWriterPtr writer, dict_t *dict, + const char *prefix, int count) { - int ret = -1; - int i = 0; - char *hostname = NULL; - char key[1024] = {0,}; - - /* <hostnames> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"hostnames"); - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i = 0; i < count; i++) { - snprintf (key, sizeof (key), "%s.hostname%d", prefix, i); - ret = dict_get_str (dict, key, &hostname); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"hostname", "%s", hostname); - XML_RET_CHECK_AND_GOTO (ret, out); - hostname = NULL; - } + int ret = -1; + int i = 0; + char *hostname = NULL; + char key[1024] = { + 0, + }; + + /* <hostnames> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"hostnames"); + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 0; i < count; i++) { + snprintf(key, sizeof(key), "%s.hostname%d", prefix, i); + ret = dict_get_str(dict, key, &hostname); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hostname", + "%s", hostname); + XML_RET_CHECK_AND_GOTO(ret, out); + hostname = NULL; + } - /* </hostnames> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </hostnames> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } #endif int -cli_xml_output_peer_status (dict_t *dict, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_peer_status(dict_t *dict, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; - int count = 0; - char *uuid = NULL; - char *hostname = NULL; - int connected = 0; - int state_id = 0; - char *state_str = NULL; - int hostname_count = 0; - int i = 1; - char key[1024] = {0,}; - - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; + int count = 0; + char *uuid = NULL; + char *hostname = NULL; + int connected = 0; + int state_id = 0; + char *state_str = NULL; + int hostname_count = 0; + int i = 1; + char key[1024] = { + 0, + }; + + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; + + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; + + /* <peerStatus> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"peerStatus"); + XML_RET_CHECK_AND_GOTO(ret, out); + + if (!dict) + goto cont; + + ret = dict_get_int32(dict, "count", &count); + if (ret) + goto out; + + while (i <= count) { + /* <peer> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"peer"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); + snprintf(key, sizeof(key), "friend%d.uuid", i); + ret = dict_get_str(dict, key, &uuid); if (ret) - goto out; + goto out; - /* <peerStatus> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"peerStatus"); - XML_RET_CHECK_AND_GOTO (ret, out); - - if (!dict) - goto cont; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s", + uuid); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_int32 (dict, "count", &count); + snprintf(key, sizeof(key), "friend%d.hostname", i); + ret = dict_get_str(dict, key, &hostname); if (ret) - goto out; + goto out; - while (i <= count) { - /* <peer> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"peer"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "friend%d.uuid", i); - ret = dict_get_str (dict, key, &uuid); - if (ret) - goto out; - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"uuid", - "%s", uuid); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "friend%d.hostname", i); - ret = dict_get_str (dict, key, &hostname); - if (ret) - goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hostname", + "%s", hostname); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"hostname", - "%s", hostname); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "friend%d.hostname_count", i); - ret = dict_get_int32 (dict, key, &hostname_count); - if ((ret == 0) && (hostname_count > 0)) { - snprintf (key, sizeof (key), "friend%d", i); - ret = cli_xml_output_peer_hostnames (writer, dict, key, - hostname_count); - XML_RET_CHECK_AND_GOTO (ret, out); - } + snprintf(key, sizeof(key), "friend%d.hostname_count", i); + ret = dict_get_int32(dict, key, &hostname_count); + if ((ret == 0) && (hostname_count > 0)) { + snprintf(key, sizeof(key), "friend%d", i); + ret = cli_xml_output_peer_hostnames(writer, dict, key, + hostname_count); + XML_RET_CHECK_AND_GOTO(ret, out); + } - snprintf (key, sizeof (key), "friend%d.connected", i); - ret = dict_get_int32 (dict, key, &connected); - if (ret) - goto out; + snprintf(key, sizeof(key), "friend%d.connected", i); + ret = dict_get_int32(dict, key, &connected); + if (ret) + goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"connected", - "%d", connected); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"connected", + "%d", connected); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "friend%d.stateId", i); - ret = dict_get_int32 (dict, key, &state_id); - if (!ret) { - /* ignore */ + snprintf(key, sizeof(key), "friend%d.stateId", i); + ret = dict_get_int32(dict, key, &state_id); + if (!ret) { + /* ignore */ - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"state", "%d", state_id); - XML_RET_CHECK_AND_GOTO (ret, out); - } + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"state", + "%d", state_id); + XML_RET_CHECK_AND_GOTO(ret, out); + } - snprintf (key, sizeof (key), "friend%d.state", i); - ret = dict_get_str (dict, key, &state_str); - if (!ret) { - /* ignore */ + snprintf(key, sizeof(key), "friend%d.state", i); + ret = dict_get_str(dict, key, &state_str); + if (!ret) { + /* ignore */ - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"stateStr", "%s", state_str); - XML_RET_CHECK_AND_GOTO (ret, out); - } + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"stateStr", + "%s", state_str); + XML_RET_CHECK_AND_GOTO(ret, out); + } - /* </peer> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </peer> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - i++; - } + i++; + } cont: - /* </peerStatus> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </peerStatus> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_end_xml_output (writer, doc); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } #if (HAVE_LIB_XML) /* Used for rebalance stop/status, remove-brick status */ int -cli_xml_output_vol_rebalance_status (xmlTextWriterPtr writer, dict_t *dict, - enum gf_task_types task_type) +cli_xml_output_vol_rebalance_status(xmlTextWriterPtr writer, dict_t *dict, + enum gf_task_types task_type) { - int ret = -1; - int count = 0; - char *node_name = NULL; - char *node_uuid = NULL; - uint64_t files = 0; - uint64_t size = 0; - uint64_t lookups = 0; - int status_rcd = 0; - uint64_t failures = 0; - uint64_t skipped = 0; - uint64_t total_files = 0; - uint64_t total_size = 0; - uint64_t total_lookups = 0; - uint64_t total_failures = 0; - uint64_t total_skipped = 0; - char key[1024] = {0,}; - int i = 0; - int overall_status = -1; - double elapsed = 0; - double overall_elapsed = 0; - - if (!dict) { - ret = 0; - goto out; - } + int ret = -1; + int count = 0; + char *node_name = NULL; + char *node_uuid = NULL; + uint64_t files = 0; + uint64_t size = 0; + uint64_t lookups = 0; + int status_rcd = 0; + uint64_t failures = 0; + uint64_t skipped = 0; + uint64_t total_files = 0; + uint64_t total_size = 0; + uint64_t total_lookups = 0; + uint64_t total_failures = 0; + uint64_t total_skipped = 0; + char key[1024] = { + 0, + }; + int i = 0; + int overall_status = -1; + double elapsed = 0; + double overall_elapsed = 0; + + if (!dict) { + ret = 0; + goto out; + } + + ret = dict_get_int32(dict, "count", &count); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"nodeCount", "%d", + count); + XML_RET_CHECK_AND_GOTO(ret, out); + + while (i < count) { + i++; + /* Getting status early, to skip nodes that don't have the + * rebalance process started + */ + snprintf(key, sizeof(key), "status-%d", i); + ret = dict_get_int32(dict, key, &status_rcd); - ret = dict_get_int32 (dict, "count", &count); + /* If glusterd is down it fails to get the status, try + getting status from other nodes */ if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"nodeCount", - "%d", count); - XML_RET_CHECK_AND_GOTO (ret, out); - - while (i < count) { - i++; - /* Getting status early, to skip nodes that don't have the - * rebalance process started - */ - snprintf (key, sizeof (key), "status-%d", i); - ret = dict_get_int32 (dict, key, &status_rcd); - - /* If glusterd is down it fails to get the status, try - getting status from other nodes */ - if (ret) - continue; - if (GF_DEFRAG_STATUS_NOT_STARTED == status_rcd) - continue; + continue; + if (GF_DEFRAG_STATUS_NOT_STARTED == status_rcd) + continue; - /* <node> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"node"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <node> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"node"); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "node-name-%d", i); - ret = dict_get_str (dict, key, &node_name); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"nodeName", - "%s", node_name); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "node-name-%d", i); + ret = dict_get_str(dict, key, &node_name); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"nodeName", + "%s", node_name); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "node-uuid-%d", i); - ret = dict_get_str (dict, key, &node_uuid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"id", - "%s", node_uuid); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "node-uuid-%d", i); + ret = dict_get_str(dict, key, &node_uuid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"id", "%s", + node_uuid); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "files-%d", i); - ret = dict_get_uint64 (dict, key, &files); - if (ret) - goto out; - total_files += files; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"files", - "%"PRIu64, files); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "size-%d", i); - ret = dict_get_uint64 (dict, key, &size); - if (ret) - goto out; - total_size += size; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"size", - "%"PRIu64,size); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "lookups-%d", i); - ret = dict_get_uint64 (dict, key, &lookups); - if (ret) - goto out; - total_lookups += lookups; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"lookups", - "%"PRIu64, lookups); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "failures-%d", i); - ret = dict_get_uint64 (dict, key, &failures); - if (ret) - goto out; + snprintf(key, sizeof(key), "files-%d", i); + ret = dict_get_uint64(dict, key, &files); + if (ret) + goto out; + total_files += files; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"files", + "%" PRIu64, files); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "skipped-%d", i); + snprintf(key, sizeof(key), "size-%d", i); + ret = dict_get_uint64(dict, key, &size); + if (ret) + goto out; + total_size += size; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"size", + "%" PRIu64, size); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_uint64 (dict, key, &skipped); - if (ret) - goto out; + snprintf(key, sizeof(key), "lookups-%d", i); + ret = dict_get_uint64(dict, key, &lookups); + if (ret) + goto out; + total_lookups += lookups; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"lookups", + "%" PRIu64, lookups); + XML_RET_CHECK_AND_GOTO(ret, out); - if (task_type == GF_TASK_TYPE_REMOVE_BRICK) { - failures += skipped; - skipped = 0; - } + snprintf(key, sizeof(key), "failures-%d", i); + ret = dict_get_uint64(dict, key, &failures); + if (ret) + goto out; - total_failures += failures; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"failures", - "%"PRIu64, failures); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "skipped-%d", i); - total_skipped += skipped; + ret = dict_get_uint64(dict, key, &skipped); + if (ret) + goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"skipped", - "%"PRIu64, skipped); - XML_RET_CHECK_AND_GOTO (ret, out); + if (task_type == GF_TASK_TYPE_REMOVE_BRICK) { + failures += skipped; + skipped = 0; + } - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"status", - "%d", status_rcd); - XML_RET_CHECK_AND_GOTO (ret, out); + total_failures += failures; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"failures", + "%" PRIu64, failures); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"statusStr", - "%s", - cli_vol_task_status_str[status_rcd]); - XML_RET_CHECK_AND_GOTO (ret, out); + total_skipped += skipped; - snprintf (key, sizeof (key), "run-time-%d", i); - ret = dict_get_double (dict, key, &elapsed); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"runtime", - "%.2f", elapsed); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"skipped", + "%" PRIu64, skipped); + XML_RET_CHECK_AND_GOTO(ret, out); - if (elapsed > overall_elapsed) { - overall_elapsed = elapsed; - } + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status", "%d", + status_rcd); + XML_RET_CHECK_AND_GOTO(ret, out); - /* Rebalance has 5 states, - * NOT_STARTED, STARTED, STOPPED, COMPLETE, FAILED - * The precedence used to determine the aggregate status is as - * below, - * STARTED > FAILED > STOPPED > COMPLETE > NOT_STARTED - */ - /* TODO: Move this to a common place utilities that both CLI and - * glusterd need. - * Till then if the below algorithm is changed, change it in - * glusterd_volume_status_aggregate_tasks_status in - * glusterd-utils.c - */ - - if (-1 == overall_status) - overall_status = status_rcd; - int rank[] = { - [GF_DEFRAG_STATUS_STARTED] = 1, - [GF_DEFRAG_STATUS_FAILED] = 2, - [GF_DEFRAG_STATUS_STOPPED] = 3, - [GF_DEFRAG_STATUS_COMPLETE] = 4, - [GF_DEFRAG_STATUS_NOT_STARTED] = 5 - }; - if (rank[status_rcd] <= rank[overall_status]) - overall_status = status_rcd; - - /* </node> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"statusStr", "%s", + cli_vol_task_status_str[status_rcd]); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "run-time-%d", i); + ret = dict_get_double(dict, key, &elapsed); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"runtime", + "%.2f", elapsed); + XML_RET_CHECK_AND_GOTO(ret, out); + + if (elapsed > overall_elapsed) { + overall_elapsed = elapsed; } - /* Aggregate status */ - /* <aggregate> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"aggregate"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* Rebalance has 5 states, + * NOT_STARTED, STARTED, STOPPED, COMPLETE, FAILED + * The precedence used to determine the aggregate status is as + * below, + * STARTED > FAILED > STOPPED > COMPLETE > NOT_STARTED + */ + /* TODO: Move this to a common place utilities that both CLI and + * glusterd need. + * Till then if the below algorithm is changed, change it in + * glusterd_volume_status_aggregate_tasks_status in + * glusterd-utils.c + */ + + if (-1 == overall_status) + overall_status = status_rcd; + int rank[] = {[GF_DEFRAG_STATUS_STARTED] = 1, + [GF_DEFRAG_STATUS_FAILED] = 2, + [GF_DEFRAG_STATUS_STOPPED] = 3, + [GF_DEFRAG_STATUS_COMPLETE] = 4, + [GF_DEFRAG_STATUS_NOT_STARTED] = 5}; + if (rank[status_rcd] <= rank[overall_status]) + overall_status = status_rcd; + + /* </node> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + + /* Aggregate status */ + /* <aggregate> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"aggregate"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer,(xmlChar *)"files", - "%"PRIu64, total_files); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"files", + "%" PRIu64, total_files); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer,(xmlChar *)"size", - "%"PRIu64, total_size); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"size", "%" PRIu64, + total_size); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer,(xmlChar *)"lookups", - "%"PRIu64, total_lookups); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"lookups", + "%" PRIu64, total_lookups); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer,(xmlChar *)"failures", - "%"PRIu64, total_failures); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"failures", + "%" PRIu64, total_failures); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer,(xmlChar *)"skipped", - "%"PRIu64, total_skipped); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"skipped", + "%" PRIu64, total_skipped); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer,(xmlChar *)"status", - "%d", overall_status); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status", "%d", + overall_status); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer,(xmlChar *)"statusStr", - "%s", - cli_vol_task_status_str[overall_status]); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"statusStr", "%s", + cli_vol_task_status_str[overall_status]); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer,(xmlChar *)"runtime", - "%.2f", overall_elapsed); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"runtime", "%.2f", + overall_elapsed); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </aggregate> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </aggregate> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } int -cli_xml_output_vol_tier_status (xmlTextWriterPtr writer, dict_t *dict, - enum gf_task_types task_type) +cli_xml_output_vol_tier_status(xmlTextWriterPtr writer, dict_t *dict, + enum gf_task_types task_type) { - int ret = -1; - int count = 0; - char *node_name = NULL; - char *status_str = NULL; - uint64_t promoted = 0; - uint64_t demoted = 0; - int i = 1; - char key[1024] = {0,}; - gf_defrag_status_t status_rcd = GF_DEFRAG_STATUS_NOT_STARTED; - - - GF_VALIDATE_OR_GOTO ("cli", dict, out); - - ret = dict_get_int32 (dict, "count", &count); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "count not set"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"nodeCount", - "%d", count); - XML_RET_CHECK_AND_GOTO (ret, out); - - while (i <= count) { - promoted = 0; - node_name = NULL; - demoted = 0; - - ret = xmlTextWriterStartElement (writer, (xmlChar *)"node"); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + int count = 0; + char *node_name = NULL; + char *status_str = NULL; + uint64_t promoted = 0; + uint64_t demoted = 0; + int i = 1; + char key[1024] = { + 0, + }; + gf_defrag_status_t status_rcd = GF_DEFRAG_STATUS_NOT_STARTED; + + GF_VALIDATE_OR_GOTO("cli", dict, out); + + ret = dict_get_int32(dict, "count", &count); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "count not set"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"nodeCount", "%d", + count); + XML_RET_CHECK_AND_GOTO(ret, out); + + while (i <= count) { + promoted = 0; + node_name = NULL; + demoted = 0; + + ret = xmlTextWriterStartElement(writer, (xmlChar *)"node"); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "node-name-%d", i); - ret = dict_get_str (dict, key, &node_name); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"nodeName", - "%s", node_name); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "node-name-%d", i); + ret = dict_get_str(dict, key, &node_name); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"nodeName", + "%s", node_name); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "promoted-%d", i); - ret = dict_get_uint64 (dict, key, &promoted); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, + snprintf(key, sizeof(key), "promoted-%d", i); + ret = dict_get_uint64(dict, key, &promoted); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"promoted" "Files", "%"PRIu64, promoted); - XML_RET_CHECK_AND_GOTO (ret, out); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "demoted-%d", i); - ret = dict_get_uint64 (dict, key, &demoted); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, + snprintf(key, sizeof(key), "demoted-%d", i); + ret = dict_get_uint64(dict, key, &demoted); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"demoted" "Files", "%"PRIu64, demoted); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "status-%d", i); - ret = dict_get_int32 (dict, key, (int32_t *)&status_rcd); + XML_RET_CHECK_AND_GOTO(ret, out); - status_str = cli_vol_task_status_str[status_rcd]; + snprintf(key, sizeof(key), "status-%d", i); + ret = dict_get_int32(dict, key, (int32_t *)&status_rcd); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"statusStr", - "%s", status_str); - XML_RET_CHECK_AND_GOTO (ret, out); + status_str = cli_vol_task_status_str[status_rcd]; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"statusStr", + "%s", status_str); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - i++; - } + i++; + } out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } #endif int -cli_xml_output_vol_rebalance (gf_cli_defrag_type op, dict_t *dict, int op_ret, - int op_errno, char *op_errstr) +cli_xml_output_vol_rebalance(gf_cli_defrag_type op, dict_t *dict, int op_ret, + int op_errno, char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; - char *task_id_str = NULL; + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; + char *task_id_str = NULL; + + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; + + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; + + /* <volRebalance> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volRebalance"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, GF_REBALANCE_TID_KEY, &task_id_str); + if (ret == 0) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"task-id", + "%s", task_id_str); + XML_RET_CHECK_AND_GOTO(ret, out); + } - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"op", "%d", op); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); + if (GF_DEFRAG_CMD_STATUS_TIER == op) { + ret = cli_xml_output_vol_tier_status(writer, dict, + GF_TASK_TYPE_REBALANCE); if (ret) - goto out; - - /* <volRebalance> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volRebalance"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, GF_REBALANCE_TID_KEY, &task_id_str); - if (ret == 0) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"task-id", - "%s", task_id_str); - XML_RET_CHECK_AND_GOTO (ret, out); - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"op", - "%d", op); - XML_RET_CHECK_AND_GOTO (ret, out); - - if (GF_DEFRAG_CMD_STATUS_TIER == op) { - ret = cli_xml_output_vol_tier_status (writer, - dict, GF_TASK_TYPE_REBALANCE); - if (ret) - goto out; - } - if ((GF_DEFRAG_CMD_STOP == op) || (GF_DEFRAG_CMD_STATUS == op)) { - - ret = cli_xml_output_vol_rebalance_status (writer, dict, - GF_TASK_TYPE_REBALANCE); - if (ret) - goto out; - } - - /* </volRebalance> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + } + if ((GF_DEFRAG_CMD_STOP == op) || (GF_DEFRAG_CMD_STATUS == op)) { + ret = cli_xml_output_vol_rebalance_status(writer, dict, + GF_TASK_TYPE_REBALANCE); + if (ret) + goto out; + } + /* </volRebalance> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_end_xml_output (writer, doc); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_vol_remove_brick_detach_tier (gf_boolean_t status_op, - dict_t *dict, int op_ret, - int op_errno, char *op_errstr, - const char *op) +cli_xml_output_vol_remove_brick_detach_tier(gf_boolean_t status_op, + dict_t *dict, int op_ret, + int op_errno, char *op_errstr, + const char *op) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; - char *task_id_str = NULL; - - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; + char *task_id_str = NULL; + + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; + + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; + + ret = xmlTextWriterStartElement(writer, (xmlChar *)op); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, GF_REMOVE_BRICK_TID_KEY, &task_id_str); + if (ret == 0) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"task-id", + "%s", task_id_str); + XML_RET_CHECK_AND_GOTO(ret, out); + } - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); + if (status_op) { + ret = cli_xml_output_vol_rebalance_status(writer, dict, + GF_TASK_TYPE_REMOVE_BRICK); if (ret) - goto out; + goto out; + } - ret = xmlTextWriterStartElement (writer, (xmlChar *) op); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_str (dict, GF_REMOVE_BRICK_TID_KEY, &task_id_str); - if (ret == 0) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"task-id", - "%s", task_id_str); - XML_RET_CHECK_AND_GOTO (ret, out); - } - - if (status_op) { - ret = cli_xml_output_vol_rebalance_status (writer, dict, - GF_TASK_TYPE_REMOVE_BRICK); - if (ret) - goto out; - } - - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - - ret = cli_end_xml_output (writer, doc); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_vol_replace_brick (dict_t *dict, - int op_ret, int op_errno, char *op_errstr) +cli_xml_output_vol_replace_brick(dict_t *dict, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); - if (ret) - goto out; + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; - ret = cli_end_xml_output (writer, doc); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_vol_create (dict_t *dict, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_vol_create(dict_t *dict, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; - char *volname = NULL; - char *volid = NULL; + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; + char *volname = NULL; + char *volid = NULL; + + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; + + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; + + if (dict) { + /* <volCreate> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volCreate"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; + /* <volume> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); + ret = dict_get_str(dict, "volname", &volname); if (ret) - goto out; - - if (dict) { - /* <volCreate> */ - ret = xmlTextWriterStartElement (writer, - (xmlChar *)"volCreate"); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* <volume> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volume"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "name", - "%s", volname); - XML_RET_CHECK_AND_GOTO (ret, out); + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + volname); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_str (dict, "volume-id", &volid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"id", - "%s", volid); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = dict_get_str(dict, "volume-id", &volid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"id", "%s", + volid); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </volume> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </volume> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </volCreate> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + /* </volCreate> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } - ret = cli_end_xml_output (writer, doc); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_generic_volume (char *op, dict_t *dict, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_generic_volume(char *op, dict_t *dict, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; - char *volname = NULL; - char *volid = NULL; + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; + char *volname = NULL; + char *volid = NULL; - GF_ASSERT (op); + GF_ASSERT(op); - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); - if (ret) - goto out; + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; - if (dict) { - /* <"op"> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)op); - XML_RET_CHECK_AND_GOTO (ret, out); + if (dict) { + /* <"op"> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)op); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <volume> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volume"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <volume> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_str (dict, "volname", &volname); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "name", - "%s", volname); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = dict_get_str(dict, "volname", &volname); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + volname); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_str (dict, "vol-id", &volid); - if (ret) - goto out; - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"id", - "%s", volid); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = dict_get_str(dict, "vol-id", &volid); + if (ret) + goto out; + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"id", "%s", + volid); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </volume> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </volume> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </"op"> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + /* </"op"> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } - ret = cli_end_xml_output (writer, doc); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } #if (HAVE_LIB_XML) int -_output_gsync_config (FILE *fp, xmlTextWriterPtr writer, char *op_name) +_output_gsync_config(FILE *fp, xmlTextWriterPtr writer, char *op_name) { - char resbuf[256 + PATH_MAX] = {0,}; - char *ptr = NULL; - char *v = NULL; - int blen = sizeof(resbuf); - int ret = 0; - - for (;;) { - ptr = fgets (resbuf, blen, fp); - if (!ptr) - break; - - v = resbuf + strlen (resbuf) - 1; - while (isspace (*v)) { - /* strip trailing space */ - *v-- = '\0'; - } - if (v == resbuf) { - /* skip empty line */ - continue; - } + char resbuf[256 + PATH_MAX] = { + 0, + }; + char *ptr = NULL; + char *v = NULL; + int blen = sizeof(resbuf); + int ret = 0; + + for (;;) { + ptr = fgets(resbuf, blen, fp); + if (!ptr) + break; - if (op_name!= NULL){ - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)op_name, - "%s", resbuf); - XML_RET_CHECK_AND_GOTO (ret, out); - goto out; - } + v = resbuf + strlen(resbuf) - 1; + while (isspace(*v)) { + /* strip trailing space */ + *v-- = '\0'; + } + if (v == resbuf) { + /* skip empty line */ + continue; + } - v = strchr (resbuf, ':'); - if (!v) { - ret = -1; - goto out; - } - *v++ = '\0'; - while (isspace (*v)) - v++; - v = gf_strdup (v); - if (!v) { - ret = -1; - goto out; - } + if (op_name != NULL) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)op_name, + "%s", resbuf); + XML_RET_CHECK_AND_GOTO(ret, out); + goto out; + } - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)resbuf, - "%s", v); - XML_RET_CHECK_AND_GOTO (ret, out); + v = strchr(resbuf, ':'); + if (!v) { + ret = -1; + goto out; } + *v++ = '\0'; + while (isspace(*v)) + v++; + v = gf_strdup(v); + if (!v) { + ret = -1; + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)resbuf, "%s", + v); + XML_RET_CHECK_AND_GOTO(ret, out); + } out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } #endif #if (HAVE_LIB_XML) int -get_gsync_config (runner_t *runner, - int (*op_conf)(FILE *fp, - xmlTextWriterPtr writer, - char *op_name), - xmlTextWriterPtr writer, char *op_name) +get_gsync_config(runner_t *runner, + int (*op_conf)(FILE *fp, xmlTextWriterPtr writer, + char *op_name), + xmlTextWriterPtr writer, char *op_name) { - int ret = 0; + int ret = 0; - runner_redir (runner, STDOUT_FILENO, RUN_PIPE); - if (runner_start (runner) != 0) { - gf_log ("cli", GF_LOG_ERROR, "spawning child failed"); - return -1; - } + runner_redir(runner, STDOUT_FILENO, RUN_PIPE); + if (runner_start(runner) != 0) { + gf_log("cli", GF_LOG_ERROR, "spawning child failed"); + return -1; + } - ret = op_conf (runner_chio (runner, STDOUT_FILENO), writer, op_name); + ret = op_conf(runner_chio(runner, STDOUT_FILENO), writer, op_name); - ret |= runner_end (runner); - if (ret) - gf_log ("cli", GF_LOG_ERROR, "reading data from child failed"); + ret |= runner_end(runner); + if (ret) + gf_log("cli", GF_LOG_ERROR, "reading data from child failed"); - return ret ? -1 : 0; + return ret ? -1 : 0; } #endif #if (HAVE_LIB_XML) int -cli_xml_generate_gsync_config (dict_t *dict, xmlTextWriterPtr writer) +cli_xml_generate_gsync_config(dict_t *dict, xmlTextWriterPtr writer) { - runner_t runner = {0,}; - char *subop = NULL; - char *gwd = NULL; - char *slave = NULL; - char *confpath = NULL; - char *master = NULL; - char *op_name = NULL; - int ret = -1; - char conf_path[PATH_MAX] = ""; - - if (dict_get_str (dict, "subop", &subop) != 0) { - ret = -1; - goto out; - } - - if (strcmp (subop, "get") != 0 && strcmp (subop, "get-all") != 0) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"message", - "%s",GEOREP" config updated successfully" ); - XML_RET_CHECK_AND_GOTO (ret, out); - ret = 0; - goto out; - } + runner_t runner = { + 0, + }; + char *subop = NULL; + char *gwd = NULL; + char *slave = NULL; + char *confpath = NULL; + char *master = NULL; + char *op_name = NULL; + int ret = -1; + char conf_path[PATH_MAX] = ""; + + if (dict_get_str(dict, "subop", &subop) != 0) { + ret = -1; + goto out; + } + + if (strcmp(subop, "get") != 0 && strcmp(subop, "get-all") != 0) { + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"message", "%s", + GEOREP " config updated successfully"); + XML_RET_CHECK_AND_GOTO(ret, out); + ret = 0; + goto out; + } - if (dict_get_str (dict, "glusterd_workdir", &gwd) != 0 || - dict_get_str (dict, "slave", &slave) != 0) { - ret = -1; - goto out; - } + if (dict_get_str(dict, "glusterd_workdir", &gwd) != 0 || + dict_get_str(dict, "slave", &slave) != 0) { + ret = -1; + goto out; + } - if (dict_get_str (dict, "master", &master) != 0) - master = NULL; + if (dict_get_str(dict, "master", &master) != 0) + master = NULL; - if (dict_get_str (dict, "op_name", &op_name) != 0) - op_name = NULL; + if (dict_get_str(dict, "op_name", &op_name) != 0) + op_name = NULL; - ret = dict_get_str (dict, "conf_path", &confpath); - if (!confpath) { - ret = snprintf (conf_path, sizeof (conf_path) - 1, - "%s/"GEOREP"/gsyncd_template.conf", gwd); - conf_path[ret] = '\0'; - confpath = conf_path; - } + ret = dict_get_str(dict, "conf_path", &confpath); + if (!confpath) { + ret = snprintf(conf_path, sizeof(conf_path) - 1, + "%s/" GEOREP "/gsyncd_template.conf", gwd); + conf_path[ret] = '\0'; + confpath = conf_path; + } - runinit (&runner); - runner_add_args (&runner, GSYNCD_PREFIX"/gsyncd", "-c", NULL); - runner_argprintf (&runner, "%s", confpath); - runner_argprintf (&runner, "--iprefix=%s", DATADIR); + runinit(&runner); + runner_add_args(&runner, GSYNCD_PREFIX "/gsyncd", "-c", NULL); + runner_argprintf(&runner, "%s", confpath); + runner_argprintf(&runner, "--iprefix=%s", DATADIR); - if (master) - runner_argprintf (&runner, ":%s", master); + if (master) + runner_argprintf(&runner, ":%s", master); - runner_add_arg (&runner, slave); - runner_argprintf (&runner, "--config-%s", subop); + runner_add_arg(&runner, slave); + runner_argprintf(&runner, "--config-%s", subop); - if (op_name) - runner_add_arg (&runner, op_name); + if (op_name) + runner_add_arg(&runner, op_name); - ret = get_gsync_config (&runner, _output_gsync_config, - writer, op_name); + ret = get_gsync_config(&runner, _output_gsync_config, writer, op_name); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } #endif #if (HAVE_LIB_XML) int -cli_xml_output_vol_gsync_status (dict_t *dict, - xmlTextWriterPtr writer) +cli_xml_output_vol_gsync_status(dict_t *dict, xmlTextWriterPtr writer) { - int ret = -1; - int i = 1; - int j = 0; - int count = 0; - const int number_of_fields = 20; - int closed = 1; - int session_closed = 1; - gf_gsync_status_t **status_values = NULL; - char status_value_name[PATH_MAX] = ""; - char *tmp = NULL; - char *volume = NULL; - char *volume_next = NULL; - char *slave = NULL; - char *slave_next = NULL; - char *title_values[] = {"master_node", - "", - "master_brick", - "slave_user", - "slave", - "slave_node", - "status", - "crawl_status", - /* last_synced */ - "", - "entry", - "data", - "meta", - "failures", - /* checkpoint_time */ - "", - "checkpoint_completed", - /* checkpoint_completion_time */ - "", - "master_node_uuid", - /* last_synced_utc */ - "last_synced", - /* checkpoint_time_utc */ - "checkpoint_time", - /* checkpoint_completion_time_utc */ - "checkpoint_completion_time"}; - - GF_ASSERT (dict); - - ret = dict_get_int32 (dict, "gsync-count", &count); - if (ret) - goto out; - - status_values = GF_MALLOC (count * sizeof (gf_gsync_status_t *), + int ret = -1; + int i = 1; + int j = 0; + int count = 0; + const int number_of_fields = 20; + int closed = 1; + int session_closed = 1; + gf_gsync_status_t **status_values = NULL; + char status_value_name[PATH_MAX] = ""; + char *tmp = NULL; + char *volume = NULL; + char *volume_next = NULL; + char *slave = NULL; + char *slave_next = NULL; + char *title_values[] = {"master_node", "", "master_brick", "slave_user", + "slave", "slave_node", "status", "crawl_status", + /* last_synced */ + "", "entry", "data", "meta", "failures", + /* checkpoint_time */ + "", "checkpoint_completed", + /* checkpoint_completion_time */ + "", "master_node_uuid", + /* last_synced_utc */ + "last_synced", + /* checkpoint_time_utc */ + "checkpoint_time", + /* checkpoint_completion_time_utc */ + "checkpoint_completion_time"}; + + GF_ASSERT(dict); + + ret = dict_get_int32(dict, "gsync-count", &count); + if (ret) + goto out; + + status_values = GF_MALLOC(count * sizeof(gf_gsync_status_t *), gf_common_mt_char); - if (!status_values) { - ret = -1; - goto out; - } + if (!status_values) { + ret = -1; + goto out; + } - for (i = 0; i < count; i++) { - status_values[i] = GF_CALLOC (1, sizeof (gf_gsync_status_t), - gf_common_mt_char); - if (!status_values[i]) { - ret = -1; - goto out; - } + for (i = 0; i < count; i++) { + status_values[i] = GF_CALLOC(1, sizeof(gf_gsync_status_t), + gf_common_mt_char); + if (!status_values[i]) { + ret = -1; + goto out; + } - snprintf (status_value_name, sizeof (status_value_name), - "status_value%d", i); + snprintf(status_value_name, sizeof(status_value_name), "status_value%d", + i); - ret = dict_get_bin (dict, status_value_name, - (void **)&(status_values[i])); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "struct member empty."); - goto out; - } + ret = dict_get_bin(dict, status_value_name, + (void **)&(status_values[i])); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "struct member empty."); + goto out; } + } - qsort(status_values, count, sizeof (gf_gsync_status_t *), - gf_gsync_status_t_comparator); - - for (i = 0; i < count; i++) { - if (closed) { - ret = xmlTextWriterStartElement (writer, - (xmlChar *)"volume"); - XML_RET_CHECK_AND_GOTO (ret, out); - - tmp = get_struct_variable (1, status_values[i]); - if (!tmp) { - gf_log ("cli", GF_LOG_ERROR, - "struct member empty."); - ret = -1; - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"name", - "%s",tmp); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterStartElement (writer, - (xmlChar *)"sessions"); - XML_RET_CHECK_AND_GOTO (ret, out); - - closed = 0; - } + qsort(status_values, count, sizeof(gf_gsync_status_t *), + gf_gsync_status_t_comparator); - if (session_closed) { - ret = xmlTextWriterStartElement (writer, - (xmlChar *)"session"); - XML_RET_CHECK_AND_GOTO (ret, out); + for (i = 0; i < count; i++) { + if (closed) { + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume"); + XML_RET_CHECK_AND_GOTO(ret, out); - session_closed = 0; + tmp = get_struct_variable(1, status_values[i]); + if (!tmp) { + gf_log("cli", GF_LOG_ERROR, "struct member empty."); + ret = -1; + goto out; + } - tmp = get_struct_variable (21, status_values[i]); - if (!tmp) { - gf_log ("cli", GF_LOG_ERROR, - "struct member empty."); - ret = -1; - goto out; - } + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", + "%s", tmp); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement - (writer, (xmlChar *)"session_slave", "%s", tmp); - XML_RET_CHECK_AND_GOTO (ret, out); - } + ret = xmlTextWriterStartElement(writer, (xmlChar *)"sessions"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterStartElement (writer, (xmlChar *)"pair"); - XML_RET_CHECK_AND_GOTO (ret, out); + closed = 0; + } - for (j = 0; j < number_of_fields; j++) { - /* XML ignore fields */ - if (strcmp(title_values[j], "") == 0) - continue; + if (session_closed) { + ret = xmlTextWriterStartElement(writer, (xmlChar *)"session"); + XML_RET_CHECK_AND_GOTO(ret, out); - tmp = get_struct_variable (j, status_values[i]); - if (!tmp) { - gf_log ("cli", GF_LOG_ERROR, - "struct member empty."); - ret = -1; - goto out; - } + session_closed = 0; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)title_values[j], - "%s", tmp); - XML_RET_CHECK_AND_GOTO (ret, out); - } + tmp = get_struct_variable(21, status_values[i]); + if (!tmp) { + gf_log("cli", GF_LOG_ERROR, "struct member empty."); + ret = -1; + goto out; + } - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"session_slave", "%s", tmp); + XML_RET_CHECK_AND_GOTO(ret, out); + } - if (i+1 < count) { - slave = get_struct_variable (20, status_values[i]); - slave_next = get_struct_variable (20, - status_values[i+1]); - volume = get_struct_variable (1, status_values[i]); - volume_next = get_struct_variable (1, - status_values[i+1]); - if (!slave || !slave_next || !volume || !volume_next) { - gf_log ("cli", GF_LOG_ERROR, - "struct member empty."); - ret = -1; - goto out; - } + ret = xmlTextWriterStartElement(writer, (xmlChar *)"pair"); + XML_RET_CHECK_AND_GOTO(ret, out); - if (strcmp (volume, volume_next)!=0) { - closed = 1; - session_closed = 1; + for (j = 0; j < number_of_fields; j++) { + /* XML ignore fields */ + if (strcmp(title_values[j], "") == 0) + continue; - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + tmp = get_struct_variable(j, status_values[i]); + if (!tmp) { + gf_log("cli", GF_LOG_ERROR, "struct member empty."); + ret = -1; + goto out; + } - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)title_values[j], "%s", tmp); + XML_RET_CHECK_AND_GOTO(ret, out); + } - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } else if (strcmp (slave, slave_next)!=0) { + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - session_closed = 1; + if (i + 1 < count) { + slave = get_struct_variable(20, status_values[i]); + slave_next = get_struct_variable(20, status_values[i + 1]); + volume = get_struct_variable(1, status_values[i]); + volume_next = get_struct_variable(1, status_values[i + 1]); + if (!slave || !slave_next || !volume || !volume_next) { + gf_log("cli", GF_LOG_ERROR, "struct member empty."); + ret = -1; + goto out; + } - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } - } else { + if (strcmp(volume, volume_next) != 0) { + closed = 1; + session_closed = 1; - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } else if (strcmp(slave, slave_next) != 0) { + session_closed = 1; + + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + } else { + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); } + } out: - gf_log ("cli",GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } #endif int -cli_xml_output_vol_gsync (dict_t *dict, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_vol_gsync(dict_t *dict, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; - char *master = NULL; - char *slave = NULL; - int type = 0; - - GF_ASSERT (dict); - - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; - - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); - if (ret) - goto out; - - /* <geoRep> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"geoRep"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_int32 (dict, "type", &type); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get type"); - goto out; - } - - switch (type) { + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; + char *master = NULL; + char *slave = NULL; + int type = 0; + + GF_ASSERT(dict); + + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; + + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; + + /* <geoRep> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"geoRep"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_int32(dict, "type", &type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get type"); + goto out; + } + + switch (type) { case GF_GSYNC_OPTION_TYPE_START: case GF_GSYNC_OPTION_TYPE_STOP: case GF_GSYNC_OPTION_TYPE_PAUSE: case GF_GSYNC_OPTION_TYPE_RESUME: case GF_GSYNC_OPTION_TYPE_CREATE: case GF_GSYNC_OPTION_TYPE_DELETE: - if (dict_get_str (dict, "master", &master) != 0) - master = "???"; - if (dict_get_str (dict, "slave", &slave) != 0) - slave = "???"; + if (dict_get_str(dict, "master", &master) != 0) + master = "???"; + if (dict_get_str(dict, "slave", &slave) != 0) + slave = "???"; - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"master", - "%s", master); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"master", + "%s", master); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"slave", - "%s", slave); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"slave", + "%s", slave); + XML_RET_CHECK_AND_GOTO(ret, out); - break; + break; case GF_GSYNC_OPTION_TYPE_CONFIG: - if (op_ret == 0) { - ret = xmlTextWriterStartElement (writer, (xmlChar *)"config"); - XML_RET_CHECK_AND_GOTO (ret, out); + if (op_ret == 0) { + ret = xmlTextWriterStartElement(writer, (xmlChar *)"config"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_xml_generate_gsync_config (dict, writer); - if (ret) - goto out; + ret = cli_xml_generate_gsync_config(dict, writer); + if (ret) + goto out; - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } - break; + break; case GF_GSYNC_OPTION_TYPE_STATUS: - ret = cli_xml_output_vol_gsync_status (dict, writer); - break; + ret = cli_xml_output_vol_gsync_status(dict, writer); + break; default: - ret = 0; - break; - } + ret = 0; + break; + } - /* </geoRep> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </geoRep> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_end_xml_output (writer, doc); + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli",GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } @@ -4391,54 +4207,54 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_create (xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) +cli_xml_snapshot_create(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) { - int ret = -1; - char *str_value = NULL; - - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); - - /* <snapCreate> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapCreate"); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* <snapshot> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapshot"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "snapname", &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap name"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "name", - "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "snapuuid", &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap uuid"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "uuid", - "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </snapshot> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </snapCreate> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = 0; + int ret = -1; + char *str_value = NULL; + + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); + + /* <snapCreate> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapCreate"); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* <snapshot> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "snapname", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "snapuuid", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </snapshot> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </snapCreate> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = 0; out: - return ret; + return ret; } /* This function will generate snapshot clone output in xml format. @@ -4450,57 +4266,55 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_clone (xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) +cli_xml_snapshot_clone(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) { - int ret = -1; - char *str_value = NULL; - - GF_VALIDATE_OR_GOTO ("cli", writer, out); - GF_VALIDATE_OR_GOTO ("cli", doc, out); - GF_VALIDATE_OR_GOTO ("cli", dict, out); - - /* <CloneCreate> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"CloneCreate"); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* <volume> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volume"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "clonename", &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get clone name"); - goto out; - } - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "name", - "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); - - - ret = dict_get_str (dict, "snapuuid", &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get clone uuid"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "uuid", - "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </volume> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </CloneCreate> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = 0; + int ret = -1; + char *str_value = NULL; + + GF_VALIDATE_OR_GOTO("cli", writer, out); + GF_VALIDATE_OR_GOTO("cli", doc, out); + GF_VALIDATE_OR_GOTO("cli", dict, out); + + /* <CloneCreate> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"CloneCreate"); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* <volume> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "clonename", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get clone name"); + goto out; + } + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "snapuuid", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get clone uuid"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </volume> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </CloneCreate> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = 0; out: - return ret; + return ret; } - /* This function will generate snapshot restore output in xml format. * * @param writer xmlTextWriterPtr @@ -4510,84 +4324,83 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_restore (xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) +cli_xml_snapshot_restore(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) { - int ret = -1; - char *str_value = NULL; - - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); - - /* <snapRestore> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapRestore"); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* <volume> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volume"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "volname", &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get vol name"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "name", - "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "volid", &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get volume id"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "uuid", - "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </volume> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - - /* <snapshot> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapshot"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "snapname", &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap name"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "name", - "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "snapuuid", &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap uuid"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "uuid", - "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </snapshot> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </snapRestore> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = 0; + int ret = -1; + char *str_value = NULL; + + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); + + /* <snapRestore> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapRestore"); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* <volume> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "volname", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get vol name"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "volid", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get volume id"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </volume> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* <snapshot> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "snapname", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "snapuuid", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </snapshot> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </snapRestore> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = 0; out: - return ret; + return ret; } /* This function will generate snapshot list output in xml format. @@ -4599,57 +4412,57 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_list (xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) +cli_xml_snapshot_list(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) { - int ret = -1; - int i = 0; - int snapcount = 0; - char *str_value = NULL; - char key[PATH_MAX] = ""; + int ret = -1; + int i = 0; + int snapcount = 0; + char *str_value = NULL; + char key[PATH_MAX] = ""; - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); - /* <snapList> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapList"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <snapList> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapList"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_int32 (dict, "snapcount", &snapcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snapcount"); - goto out; - } + ret = dict_get_int32(dict, "snapcount", &snapcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snapcount"); + goto out; + } - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "count", - "%d", snapcount); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d", + snapcount); + XML_RET_CHECK_AND_GOTO(ret, out); - for (i = 1; i <= snapcount; ++i) { - ret = snprintf (key, sizeof (key), "snapname%d", i); - if (ret < 0) { - goto out; - } + for (i = 1; i <= snapcount; ++i) { + ret = snprintf(key, sizeof(key), "snapname%d", i); + if (ret < 0) { + goto out; + } - ret = dict_get_str (dict, key, &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not get %s ", key); - goto out; - } else { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"snapshot", "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); - } + ret = dict_get_str(dict, key, &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not get %s ", key); + goto out; + } else { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"snapshot", + "%s", str_value); + XML_RET_CHECK_AND_GOTO(ret, out); } + } - /* </snapList> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </snapList> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = 0; + ret = 0; out: - return ret; + return ret; } /* This function will generate xml output for origin volume @@ -4663,66 +4476,66 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_info_orig_vol (xmlTextWriterPtr writer, xmlDocPtr doc, - dict_t *dict, char *keyprefix) +cli_xml_snapshot_info_orig_vol(xmlTextWriterPtr writer, xmlDocPtr doc, + dict_t *dict, char *keyprefix) { - int ret = -1; - int value = 0; - char *buffer = NULL; - char key [PATH_MAX] = ""; + int ret = -1; + int value = 0; + char *buffer = NULL; + char key[PATH_MAX] = ""; - GF_ASSERT (dict); - GF_ASSERT (keyprefix); - GF_ASSERT (writer); - GF_ASSERT (doc); + GF_ASSERT(dict); + GF_ASSERT(keyprefix); + GF_ASSERT(writer); + GF_ASSERT(doc); - /* <originVolume> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"originVolume"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <originVolume> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"originVolume"); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%sorigin-volname", keyprefix); + snprintf(key, sizeof(key), "%sorigin-volname", keyprefix); - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_WARNING, "Failed to get %s", key); - goto out; - } + ret = dict_get_str(dict, key, &buffer); + if (ret) { + gf_log("cli", GF_LOG_WARNING, "Failed to get %s", key); + goto out; + } - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "name", - "%s", buffer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + buffer); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%ssnapcount", keyprefix); + snprintf(key, sizeof(key), "%ssnapcount", keyprefix); - ret = dict_get_int32 (dict, key, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get %s", key); - goto out; - } + ret = dict_get_int32(dict, key, &value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key); + goto out; + } - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "snapCount", - "%d", value); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"snapCount", "%d", + value); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%ssnaps-available", keyprefix); + snprintf(key, sizeof(key), "%ssnaps-available", keyprefix); - ret = dict_get_int32 (dict, key, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get %s", key); - goto out; - } + ret = dict_get_int32(dict, key, &value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key); + goto out; + } - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "snapRemaining", "%d", value); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"snapRemaining", + "%d", value); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </originVolume> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </originVolume> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = 0; + ret = 0; out: - return ret; + return ret; } /* This function will generate xml output of snapshot volume info. @@ -4737,66 +4550,67 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_info_snap_vol (xmlTextWriterPtr writer, xmlDocPtr doc, - dict_t *dict, char *keyprefix, - gf_boolean_t snap_driven) +cli_xml_snapshot_info_snap_vol(xmlTextWriterPtr writer, xmlDocPtr doc, + dict_t *dict, char *keyprefix, + gf_boolean_t snap_driven) { - char key [PATH_MAX] = ""; - char *buffer = NULL; - int ret = -1; - - GF_ASSERT (dict); - GF_ASSERT (keyprefix); - GF_ASSERT (writer); - GF_ASSERT (doc); - - /* <snapVolume> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapVolume"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.volname", keyprefix); - - ret = dict_get_str (dict, key, &buffer); + char key[PATH_MAX] = ""; + char *buffer = NULL; + int ret = -1; + + GF_ASSERT(dict); + GF_ASSERT(keyprefix); + GF_ASSERT(writer); + GF_ASSERT(doc); + + /* <snapVolume> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapVolume"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.volname", keyprefix); + + ret = dict_get_str(dict, key, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + buffer); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.vol-status", keyprefix); + + ret = dict_get_str(dict, key, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get %s", key); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status", "%s", + buffer); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* If the command is snap_driven then we need to show origin volume + * info. Else this is shown in the start of info display.*/ + if (snap_driven) { + snprintf(key, sizeof(key), "%s.", keyprefix); + ret = cli_xml_snapshot_info_orig_vol(writer, doc, dict, key); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get %s", key); - goto out; + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for snapshot's origin volume"); + goto out; } + } - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "name", - "%s", buffer); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.vol-status", keyprefix); - - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get %s", key); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "status", - "%s", buffer); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* If the command is snap_driven then we need to show origin volume - * info. Else this is shown in the start of info display.*/ - if (snap_driven) { - snprintf (key, sizeof (key), "%s.", keyprefix); - ret = cli_xml_snapshot_info_orig_vol (writer, doc, dict, key); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for snapshot's origin volume"); - goto out; - } - } + /* </snapVolume> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </snapVolume> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = 0; + ret = 0; out: - return ret; + return ret; } /* This function will generate snapshot info of individual snapshot @@ -4812,112 +4626,104 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_info_per_snap (xmlTextWriterPtr writer, xmlDocPtr doc, - dict_t *dict, char *keyprefix, - gf_boolean_t snap_driven) +cli_xml_snapshot_info_per_snap(xmlTextWriterPtr writer, xmlDocPtr doc, + dict_t *dict, char *keyprefix, + gf_boolean_t snap_driven) { - char key_buffer[PATH_MAX] = ""; - char *buffer = NULL; - int volcount = 0; - int ret = -1; - int i = 0; - - GF_ASSERT (dict); - GF_ASSERT (keyprefix); - GF_ASSERT (writer); - GF_ASSERT (doc); - - /* <snapshot> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapshot"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key_buffer, sizeof (key_buffer), "%s.snapname", - keyprefix); - - ret = dict_get_str (dict, key_buffer, &buffer); + char key_buffer[PATH_MAX] = ""; + char *buffer = NULL; + int volcount = 0; + int ret = -1; + int i = 0; + + GF_ASSERT(dict); + GF_ASSERT(keyprefix); + GF_ASSERT(writer); + GF_ASSERT(doc); + + /* <snapshot> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key_buffer, sizeof(key_buffer), "%s.snapname", keyprefix); + + ret = dict_get_str(dict, key_buffer, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to fetch snapname %s ", key_buffer); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + buffer); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key_buffer, sizeof(key_buffer), "%s.snap-id", keyprefix); + + ret = dict_get_str(dict, key_buffer, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to fetch snap-id %s ", key_buffer); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s", + buffer); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key_buffer, sizeof(key_buffer), "%s.snap-desc", keyprefix); + + ret = dict_get_str(dict, key_buffer, &buffer); + if (!ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"description", + "%s", buffer); + } else { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"description", + "%s", ""); + } + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key_buffer, sizeof(key_buffer), "%s.snap-time", keyprefix); + + ret = dict_get_str(dict, key_buffer, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to fetch snap-time %s ", keyprefix); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"createTime", "%s", + buffer); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key_buffer, sizeof(key_buffer), "%s.vol-count", keyprefix); + ret = dict_get_int32(dict, key_buffer, &volcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Fail to get snap vol count"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"volCount", "%d", + volcount); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_int32(dict, key_buffer, &volcount); + /* Display info of each snapshot volume */ + for (i = 1; i <= volcount; i++) { + snprintf(key_buffer, sizeof(key_buffer), "%s.vol%d", keyprefix, i); + + ret = cli_xml_snapshot_info_snap_vol(writer, doc, dict, key_buffer, + snap_driven); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to fetch snapname %s ", - key_buffer); - goto out; + gf_log("cli", GF_LOG_ERROR, + "Could not list " + "details of volume in a snap"); + goto out; } + } - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "name", - "%s", buffer); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key_buffer, sizeof (key_buffer), "%s.snap-id", keyprefix); - - ret = dict_get_str (dict, key_buffer, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to fetch snap-id %s ", - key_buffer); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "uuid", - "%s", buffer); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key_buffer, sizeof (key_buffer), "%s.snap-desc", keyprefix); - - ret = dict_get_str (dict, key_buffer, &buffer); - if (!ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "description", - "%s", buffer); - } else { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "description", - "%s", ""); - } - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key_buffer, sizeof (key_buffer), "%s.snap-time", keyprefix); - - ret = dict_get_str (dict, key_buffer, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to fetch snap-time %s ", - keyprefix); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "createTime", - "%s", buffer); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key_buffer, sizeof (key_buffer), "%s.vol-count", keyprefix); - ret = dict_get_int32 (dict, key_buffer, &volcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Fail to get snap vol count"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "volCount", - "%d", volcount); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_int32 (dict, key_buffer, &volcount); - /* Display info of each snapshot volume */ - for (i = 1 ; i <= volcount ; i++) { - snprintf (key_buffer, sizeof (key_buffer), "%s.vol%d", - keyprefix, i); - - ret = cli_xml_snapshot_info_snap_vol (writer, doc, dict, - key_buffer, snap_driven); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not list " - "details of volume in a snap"); - goto out; - } - } - - /* </snapshot> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </snapshot> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - return ret; + return ret; } /* This function will generate snapshot info output in xml format. @@ -4929,73 +4735,74 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_info (xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) +cli_xml_snapshot_info(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) { - int ret = -1; - int i = 0; - int snapcount = 0; - char key [PATH_MAX] = ""; - gf_boolean_t snap_driven = _gf_false; - - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); - - /* <snapInfo> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapInfo"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snap_driven = dict_get_str_boolean (dict, "snap-driven", _gf_false); - - /* If the approach is volume based then we should display origin volume - * information first followed by per snap info*/ - if (!snap_driven) { - ret = cli_xml_snapshot_info_orig_vol (writer, doc, dict, ""); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for snapshot's origin volume"); - goto out; - } - } - - ret = dict_get_int32 (dict, "snapcount", &snapcount); + int ret = -1; + int i = 0; + int snapcount = 0; + char key[PATH_MAX] = ""; + gf_boolean_t snap_driven = _gf_false; + + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); + + /* <snapInfo> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapInfo"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snap_driven = dict_get_str_boolean(dict, "snap-driven", _gf_false); + + /* If the approach is volume based then we should display origin volume + * information first followed by per snap info*/ + if (!snap_driven) { + ret = cli_xml_snapshot_info_orig_vol(writer, doc, dict, ""); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snapcount"); - goto out; + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for snapshot's origin volume"); + goto out; } + } - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "count", - "%d", snapcount); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = dict_get_int32(dict, "snapcount", &snapcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snapcount"); + goto out; + } - /* <snapshots> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapshots"); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d", + snapcount); + XML_RET_CHECK_AND_GOTO(ret, out); - /* Get snapshot info of individual snapshots */ - for (i = 1; i <= snapcount; ++i) { - snprintf (key, sizeof (key), "snap%d", i); + /* <snapshots> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshots"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_xml_snapshot_info_per_snap (writer, doc, dict, - key, snap_driven); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not get %s ", key); - goto out; - } + /* Get snapshot info of individual snapshots */ + for (i = 1; i <= snapcount; ++i) { + snprintf(key, sizeof(key), "snap%d", i); + + ret = cli_xml_snapshot_info_per_snap(writer, doc, dict, key, + snap_driven); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not get %s ", key); + goto out; } + } - /* </snapshots> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </snapshots> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </snapInfo> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </snapInfo> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = 0; + ret = 0; out: - return ret; + return ret; } /* This function will generate snapshot status of individual @@ -5009,139 +4816,133 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_volume_status (xmlTextWriterPtr writer, xmlDocPtr doc, - dict_t *dict, const char *keyprefix) +cli_xml_snapshot_volume_status(xmlTextWriterPtr writer, xmlDocPtr doc, + dict_t *dict, const char *keyprefix) { - int ret = -1; - int brickcount = 0; - int i = 0; - int pid = 0; - char *buffer = NULL; - char key[PATH_MAX] = ""; + int ret = -1; + int brickcount = 0; + int i = 0; + int pid = 0; + char *buffer = NULL; + char key[PATH_MAX] = ""; + + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); + GF_ASSERT(keyprefix); + + snprintf(key, sizeof(key), "%s.brickcount", keyprefix); + + ret = dict_get_int32(dict, key, &brickcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to fetch brickcount"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"brickCount", "%d", + brickcount); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* Get status of every brick belonging to the snapshot volume */ + for (i = 0; i < brickcount; i++) { + /* <snapInfo> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"brick"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.brick%d.path", keyprefix, i); + + ret = dict_get_str(dict, key, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get Brick Path"); + /* + * If path itself is not present, then end * + * this brick's status and continue to the * + * brick * + */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + continue; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"path", "%s", + buffer); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.brick%d.vgname", keyprefix, i); + + ret = dict_get_str(dict, key, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get Volume Group"); + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"volumeGroup", "N/A"); + } else + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"volumeGroup", "%s", buffer); - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); - GF_ASSERT (keyprefix); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%s.brickcount", keyprefix); + snprintf(key, sizeof(key), "%s.brick%d.status", keyprefix, i); - ret = dict_get_int32 (dict, key, &brickcount); + ret = dict_get_str(dict, key, &buffer); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to fetch brickcount"); - goto out; - } + gf_log("cli", GF_LOG_INFO, "Unable to get Brick Running"); + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"brick_running", "N/A"); + } else + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"brick_running", "%s", buffer); - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "brickCount", - "%d", brickcount); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* Get status of every brick belonging to the snapshot volume */ - for (i = 0 ; i < brickcount ; i++) { - /* <snapInfo> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"brick"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.brick%d.path", keyprefix, i); - - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Unable to get Brick Path"); - /* - * If path itself is not present, then end * - * this brick's status and continue to the * - * brick * - */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - continue; - } + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "path", "%s", buffer); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.brick%d.vgname", - keyprefix, i); - - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Unable to get Volume Group"); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "volumeGroup", "N/A"); - } else - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "volumeGroup", "%s", buffer); - - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.brick%d.status", keyprefix, i); - - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_INFO, - "Unable to get Brick Running"); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "brick_running", "N/A"); - } else - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "brick_running", "%s", buffer); - - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.brick%d.pid", keyprefix, i); - - ret = dict_get_int32 (dict, key, &pid); - if (ret) { - gf_log ("cli", GF_LOG_INFO, "Unable to get pid"); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "pid", "N/A"); - } else - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "pid", "%d", pid); - - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.brick%d.data", keyprefix, i); - - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Unable to get Data Percent"); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "data_percentage", "N/A"); - } else - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "data_percentage", "%s", buffer); - - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.brick%d.lvsize", - keyprefix, i); - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to get LV Size"); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "lvSize", "N/A"); - } else { - /* Truncate any newline character */ - buffer = strtok (buffer, "\n"); - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "lvSize", "%s", buffer); - } + snprintf(key, sizeof(key), "%s.brick%d.pid", keyprefix, i); + + ret = dict_get_int32(dict, key, &pid); + if (ret) { + gf_log("cli", GF_LOG_INFO, "Unable to get pid"); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"pid", + "N/A"); + } else + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"pid", + "%d", pid); - XML_RET_CHECK_AND_GOTO (ret, out); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </brick> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + snprintf(key, sizeof(key), "%s.brick%d.data", keyprefix, i); + + ret = dict_get_str(dict, key, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get Data Percent"); + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"data_percentage", "N/A"); + } else + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"data_percentage", "%s", buffer); + + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.brick%d.lvsize", keyprefix, i); + ret = dict_get_str(dict, key, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get LV Size"); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"lvSize", + "N/A"); + } else { + /* Truncate any newline character */ + buffer = strtok(buffer, "\n"); + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"lvSize", + "%s", buffer); } + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </brick> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + out: - return ret; + return ret; } /* This function will generate snapshot status of individual @@ -5154,87 +4955,85 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_status_per_snap (xmlTextWriterPtr writer, xmlDocPtr doc, - dict_t *dict, const char *keyprefix) +cli_xml_snapshot_status_per_snap(xmlTextWriterPtr writer, xmlDocPtr doc, + dict_t *dict, const char *keyprefix) { - int ret = -1; - int volcount = 0; - int i = 0; - char *buffer = NULL; - char key [PATH_MAX] = ""; - - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); - GF_ASSERT (keyprefix); - - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapshot"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.snapname", keyprefix); - - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to get snapname"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "name", - "%s", buffer); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.uuid", keyprefix); - - ret = dict_get_str (dict, key, &buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to get snap UUID"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "uuid", - "%s", buffer); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + int volcount = 0; + int i = 0; + char *buffer = NULL; + char key[PATH_MAX] = ""; + + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); + GF_ASSERT(keyprefix); + + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot"); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.snapname", keyprefix); + + ret = dict_get_str(dict, key, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get snapname"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + buffer); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.uuid", keyprefix); + + ret = dict_get_str(dict, key, &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get snap UUID"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s", + buffer); + XML_RET_CHECK_AND_GOTO(ret, out); + + snprintf(key, sizeof(key), "%s.volcount", keyprefix); + + ret = dict_get_int32(dict, key, &volcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Unable to get volume count"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"volCount", "%d", + volcount); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* Get snapshot status of individual snapshot volume */ + for (i = 0; i < volcount; i++) { + /* <volume> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume"); + XML_RET_CHECK_AND_GOTO(ret, out); - snprintf (key, sizeof (key), "%s.volcount", keyprefix); + snprintf(key, sizeof(key), "%s.vol%d", keyprefix, i); - ret = dict_get_int32 (dict, key, &volcount); + ret = cli_xml_snapshot_volume_status(writer, doc, dict, key); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Unable to get volume count"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Could not get snap volume status"); + goto out; } - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "volCount", - "%d", volcount); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* Get snapshot status of individual snapshot volume */ - for (i = 0 ; i < volcount ; i++) { - /* <volume> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volume"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (key, sizeof (key), "%s.vol%d", keyprefix, i); - - ret = cli_xml_snapshot_volume_status (writer, doc, - dict, key); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Could not get snap volume status"); - goto out; - } - - /* </volume> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + /* </volume> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } - /* </snapshot> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </snapshot> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = 0; + ret = 0; out: - return ret; + return ret; } /* This function will generate snapshot status output in xml format. @@ -5246,64 +5045,63 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_status (xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) +cli_xml_snapshot_status(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) { - int ret = -1; - int snapcount = 0; - int i = 0; - int status_cmd = 0; - char key [PATH_MAX] = ""; - - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); - - /* <snapStatus> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapStatus"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_int32 (dict, "sub-cmd", &status_cmd); + int ret = -1; + int snapcount = 0; + int i = 0; + int status_cmd = 0; + char key[PATH_MAX] = ""; + + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); + + /* <snapStatus> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapStatus"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_int32(dict, "sub-cmd", &status_cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch status type"); + goto out; + } + + if ((GF_SNAP_STATUS_TYPE_SNAP == status_cmd) || + (GF_SNAP_STATUS_TYPE_ITER == status_cmd)) { + snapcount = 1; + } else { + ret = dict_get_int32(dict, "status.snapcount", &snapcount); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch status type"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Could not get snapcount"); + goto out; } - if ((GF_SNAP_STATUS_TYPE_SNAP == status_cmd) || - (GF_SNAP_STATUS_TYPE_ITER == status_cmd)) { - snapcount = 1; - } else { - ret = dict_get_int32 (dict, "status.snapcount", &snapcount); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not get snapcount"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "count", - "%d", snapcount); - XML_RET_CHECK_AND_GOTO (ret, out); - } + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d", + snapcount); + XML_RET_CHECK_AND_GOTO(ret, out); + } - for (i = 0 ; i < snapcount; i++) { - snprintf (key, sizeof (key), "status.snap%d", i); + for (i = 0; i < snapcount; i++) { + snprintf(key, sizeof(key), "status.snap%d", i); - ret = cli_xml_snapshot_status_per_snap (writer, doc, - dict, key); - if (ret < 0) { - gf_log ("cli", GF_LOG_ERROR, "failed to create xml " - "output for snapshot status"); - goto out; - } + ret = cli_xml_snapshot_status_per_snap(writer, doc, dict, key); + if (ret < 0) { + gf_log("cli", GF_LOG_ERROR, + "failed to create xml " + "output for snapshot status"); + goto out; } + } - /* </snapStatus> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </snapStatus> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = 0; + ret = 0; out: - return ret; + return ret; } /* This function will generate snapshot config show output in xml format. @@ -5315,153 +5113,149 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_config_show (xmlTextWriterPtr writer, - xmlDocPtr doc, dict_t *dict) +cli_xml_snapshot_config_show(xmlTextWriterPtr writer, xmlDocPtr doc, + dict_t *dict) { - int ret = -1; - uint64_t i = 0; - uint64_t value = 0; - uint64_t volcount = 0; - char buf[PATH_MAX] = ""; - char *str_value = NULL; - - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); - - /* <systemConfig> */ - ret = xmlTextWriterStartElement (writer, - (xmlChar *)"systemConfig"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_uint64 (dict, "snap-max-hard-limit", &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get " - "snap-max-hard-limit"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "hardLimit", "%"PRIu64, value); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + uint64_t i = 0; + uint64_t value = 0; + uint64_t volcount = 0; + char buf[PATH_MAX] = ""; + char *str_value = NULL; + + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); + + /* <systemConfig> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"systemConfig"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_uint64(dict, "snap-max-hard-limit", &value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to get " + "snap-max-hard-limit"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hardLimit", + "%" PRIu64, value); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_uint64(dict, "snap-max-soft-limit", &value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to get " + "snap-max-soft-limit"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"softLimit", + "%" PRIu64 "%%", value); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "auto-delete", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch auto-delete"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"autoDelete", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "snap-activate-on-create", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Could not fetch snap-activate-on-create-delete"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"activateOnCreate", + "%s", str_value); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </systemConfig> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* <volumeConfig> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volumeConfig"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_uint64(dict, "voldisplaycount", &volcount); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch volcount"); + goto out; + } + + /* Get config of all the volumes */ + for (i = 0; i < volcount; i++) { + /* <volume> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volume"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_uint64 (dict, "snap-max-soft-limit", &value); + snprintf(buf, sizeof(buf), "volume%" PRIu64 "-volname", i); + ret = dict_get_str(dict, buf, &str_value); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get " - "snap-max-soft-limit"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Could not fetch %s", buf); + goto out; } - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "softLimit", - "%"PRIu64"%%", value); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_str (dict, "auto-delete", &str_value); + snprintf(buf, sizeof(buf), "volume%" PRIu64 "-snap-max-hard-limit", i); + ret = dict_get_uint64(dict, buf, &value); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch auto-delete"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Could not fetch %s", buf); + goto out; } - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "autoDelete", "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"hardLimit", + "%" PRIu64, value); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_str (dict, "snap-activate-on-create", &str_value); + snprintf(buf, sizeof(buf), "volume%" PRIu64 "-active-hard-limit", i); + ret = dict_get_uint64(dict, buf, &value); if (ret) { - gf_log ("cli", GF_LOG_ERROR, - "Could not fetch snap-activate-on-create-delete"); - goto out; + gf_log("cli", GF_LOG_ERROR, + "Could not fetch" + " effective snap_max_hard_limit for " + "%s", + str_value); + goto out; } - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "activateOnCreate", "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </systemConfig> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* <volumeConfig> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volumeConfig"); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"effectiveHardLimit", "%" PRIu64, value); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_uint64 (dict, "voldisplaycount", &volcount); + snprintf(buf, sizeof(buf), "volume%" PRIu64 "-snap-max-soft-limit", i); + ret = dict_get_uint64(dict, buf, &value); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch volcount"); - goto out; + gf_log("cli", GF_LOG_ERROR, "Could not fetch %s", buf); + goto out; } - /* Get config of all the volumes */ - for (i = 0; i < volcount; i++) { - /* <volume> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volume"); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (buf, sizeof(buf), "volume%"PRIu64"-volname", i); - ret = dict_get_str (dict, buf, &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch %s", buf); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "name", "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); - - - snprintf (buf, sizeof(buf), - "volume%"PRIu64"-snap-max-hard-limit", i); - ret = dict_get_uint64 (dict, buf, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch %s", buf); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "hardLimit", "%"PRIu64, value); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (buf, sizeof(buf), - "volume%"PRIu64"-active-hard-limit", i); - ret = dict_get_uint64 (dict, buf, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch" - " effective snap_max_hard_limit for " - "%s", str_value); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "effectiveHardLimit", - "%"PRIu64, value); - XML_RET_CHECK_AND_GOTO (ret, out); - - snprintf (buf, sizeof(buf), - "volume%"PRIu64"-snap-max-soft-limit", i); - ret = dict_get_uint64 (dict, buf, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch %s", buf); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "softLimit", - "%"PRIu64, value); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </volume> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"softLimit", + "%" PRIu64, value); + XML_RET_CHECK_AND_GOTO(ret, out); /* </volume> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } - ret = 0; + /* </volume> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = 0; out: - return ret; + return ret; } /* This function will generate snapshot config set output in xml format. @@ -5473,87 +5267,84 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_config_set (xmlTextWriterPtr writer, xmlDocPtr doc, - dict_t *dict) +cli_xml_snapshot_config_set(xmlTextWriterPtr writer, xmlDocPtr doc, + dict_t *dict) { - int ret = -1; - uint64_t hard_limit = 0; - uint64_t soft_limit = 0; - char *volname = NULL; - char *auto_delete = NULL; - char *snap_activate = NULL; - - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); - - /* This is optional parameter therefore ignore the error */ - ret = dict_get_uint64 (dict, "snap-max-hard-limit", &hard_limit); - /* This is optional parameter therefore ignore the error */ - ret = dict_get_uint64 (dict, "snap-max-soft-limit", &soft_limit); - ret = dict_get_str (dict, "auto-delete", &auto_delete); - ret = dict_get_str (dict, "snap-activate-on-create", &snap_activate); - - if (!hard_limit && !soft_limit && !auto_delete && !snap_activate) { - ret = -1; - gf_log ("cli", GF_LOG_ERROR, "At least one option from " - "snap-max-hard-limit, snap-max-soft-limit, auto-delete" - " and snap-activate-on-create should be set"); - goto out; - } - - /* Ignore the error, as volname is optional */ - ret = dict_get_str (dict, "volname", &volname); - - if (NULL == volname) { - /* <systemConfig> */ - ret = xmlTextWriterStartElement (writer, - (xmlChar *)"systemConfig"); - } else { - /* <volumeConfig> */ - ret = xmlTextWriterStartElement (writer, - (xmlChar *)"volumeConfig"); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + uint64_t hard_limit = 0; + uint64_t soft_limit = 0; + char *volname = NULL; + char *auto_delete = NULL; + char *snap_activate = NULL; + + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); + + /* This is optional parameter therefore ignore the error */ + ret = dict_get_uint64(dict, "snap-max-hard-limit", &hard_limit); + /* This is optional parameter therefore ignore the error */ + ret = dict_get_uint64(dict, "snap-max-soft-limit", &soft_limit); + ret = dict_get_str(dict, "auto-delete", &auto_delete); + ret = dict_get_str(dict, "snap-activate-on-create", &snap_activate); + + if (!hard_limit && !soft_limit && !auto_delete && !snap_activate) { + ret = -1; + gf_log("cli", GF_LOG_ERROR, + "At least one option from " + "snap-max-hard-limit, snap-max-soft-limit, auto-delete" + " and snap-activate-on-create should be set"); + goto out; + } + + /* Ignore the error, as volname is optional */ + ret = dict_get_str(dict, "volname", &volname); + + if (NULL == volname) { + /* <systemConfig> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"systemConfig"); + } else { + /* <volumeConfig> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volumeConfig"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "name", "%s", volname); - } + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + volname); + } - XML_RET_CHECK_AND_GOTO (ret, out); + XML_RET_CHECK_AND_GOTO(ret, out); - if (hard_limit) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "newHardLimit", - "%"PRIu64, hard_limit); - XML_RET_CHECK_AND_GOTO (ret, out); - } + if (hard_limit) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"newHardLimit", + "%" PRIu64, hard_limit); + XML_RET_CHECK_AND_GOTO(ret, out); + } - if (soft_limit) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "newSoftLimit", - "%"PRIu64, soft_limit); - XML_RET_CHECK_AND_GOTO (ret, out); - } + if (soft_limit) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"newSoftLimit", + "%" PRIu64, soft_limit); + XML_RET_CHECK_AND_GOTO(ret, out); + } - if (auto_delete) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "autoDelete", "%s", auto_delete); - XML_RET_CHECK_AND_GOTO (ret, out); - } + if (auto_delete) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"autoDelete", + "%s", auto_delete); + XML_RET_CHECK_AND_GOTO(ret, out); + } - if (snap_activate) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "activateOnCreate", "%s", snap_activate); - XML_RET_CHECK_AND_GOTO (ret, out); - } + if (snap_activate) { + ret = xmlTextWriterWriteFormatElement( + writer, (xmlChar *)"activateOnCreate", "%s", snap_activate); + XML_RET_CHECK_AND_GOTO(ret, out); + } - /* </volumeConfig> or </systemConfig> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </volumeConfig> or </systemConfig> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = 0; + ret = 0; out: - return ret; + return ret; } /* This function will generate snapshot config output in xml format. @@ -5565,58 +5356,60 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_config (xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) +cli_xml_snapshot_config(xmlTextWriterPtr writer, xmlDocPtr doc, dict_t *dict) { - int ret = -1; - int config_command = 0; + int ret = -1; + int config_command = 0; - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); - /* <snapConfig> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapConfig"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <snapConfig> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapConfig"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_int32 (dict, "config-command", &config_command); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Could not fetch config type"); - goto out; - } + ret = dict_get_int32(dict, "config-command", &config_command); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Could not fetch config type"); + goto out; + } - switch (config_command) { + switch (config_command) { case GF_SNAP_CONFIG_TYPE_SET: - ret = cli_xml_snapshot_config_set (writer, doc, dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create xml " - "output for snapshot config set command"); - goto out; - } + ret = cli_xml_snapshot_config_set(writer, doc, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create xml " + "output for snapshot config set command"); + goto out; + } - break; + break; case GF_SNAP_CONFIG_DISPLAY: - ret = cli_xml_snapshot_config_show (writer, doc, dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create xml " - "output for snapshot config show command"); - goto out; - } - break; + ret = cli_xml_snapshot_config_show(writer, doc, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create xml " + "output for snapshot config show command"); + goto out; + } + break; default: - gf_log ("cli", GF_LOG_ERROR, "Unknown config command :%d", - config_command); - ret = -1; - goto out; - } + gf_log("cli", GF_LOG_ERROR, "Unknown config command :%d", + config_command); + ret = -1; + goto out; + } - /* </snapConfig> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </snapConfig> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = 0; + ret = 0; out: - return ret; + return ret; } /* This function will generate snapshot activate or @@ -5629,67 +5422,66 @@ out: * @return 0 on success and -1 on failure */ static int -cli_xml_snapshot_activate_deactivate (xmlTextWriterPtr writer, xmlDocPtr doc, - dict_t *dict, int cmd) +cli_xml_snapshot_activate_deactivate(xmlTextWriterPtr writer, xmlDocPtr doc, + dict_t *dict, int cmd) { - int ret = -1; - char *buffer = NULL; - char *tag = NULL; - - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); - - if (GF_SNAP_OPTION_TYPE_ACTIVATE == cmd) { - tag = "snapActivate"; - } else if (GF_SNAP_OPTION_TYPE_DEACTIVATE == cmd) { - tag = "snapDeactivate"; - } else { - gf_log ("cli", GF_LOG_ERROR, "invalid command %d", cmd); - goto out; - } - - /* <snapActivate> or <snapDeactivate> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)tag); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* <snapshot> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapshot"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "snapname", &buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap name"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "name", - "%s", buffer); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "snapuuid", &buffer); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap uuid"); - goto out; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "uuid", - "%s", buffer); - XML_RET_CHECK_AND_GOTO (ret, out); - - /* </snapshot> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - - /* </snapActivate> or </snapDeactivate> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = 0; + int ret = -1; + char *buffer = NULL; + char *tag = NULL; + + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); + + if (GF_SNAP_OPTION_TYPE_ACTIVATE == cmd) { + tag = "snapActivate"; + } else if (GF_SNAP_OPTION_TYPE_DEACTIVATE == cmd) { + tag = "snapDeactivate"; + } else { + gf_log("cli", GF_LOG_ERROR, "invalid command %d", cmd); + goto out; + } + + /* <snapActivate> or <snapDeactivate> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)tag); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* <snapshot> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "snapname", &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + buffer); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "snapuuid", &buffer); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid"); + goto out; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s", + buffer); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </snapshot> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + /* </snapActivate> or </snapDeactivate> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = 0; out: - return ret; + return ret; } #endif /* HAVE_LIB_XML */ @@ -5703,190 +5495,183 @@ out: * @return 0 on success and -1 on failure */ int -cli_xml_snapshot_delete (cli_local_t *local, dict_t *dict, gf_cli_rsp *rsp) +cli_xml_snapshot_delete(cli_local_t *local, dict_t *dict, gf_cli_rsp *rsp) { - int ret = -1; + int ret = -1; #ifdef HAVE_LIB_XML - char *str_value = NULL; - xmlTextWriterPtr writer = local->writer; - xmlDocPtr doc = local->doc; - - GF_ASSERT (writer); - GF_ASSERT (doc); - GF_ASSERT (dict); - - /* <snapshot> */ - ret = xmlTextWriterStartElement (writer, (xmlChar *)"snapshot"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_str (dict, "snapname", &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap name"); - goto xmlend; - } - - if (!rsp->op_ret) { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "status", - "Success"); - } else { - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *) "status", - "Failure"); - XML_RET_CHECK_AND_GOTO (ret, xmlend); - - ret = cli_xml_output_common (writer, rsp->op_ret, - rsp->op_errno, - rsp->op_errstr); - } - XML_RET_CHECK_AND_GOTO (ret, xmlend); - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "name", - "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, xmlend); - - ret = dict_get_str (dict, "snapuuid", &str_value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snap uuid"); - goto xmlend; - } - - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *) "uuid", - "%s", str_value); - XML_RET_CHECK_AND_GOTO (ret, out); + char *str_value = NULL; + xmlTextWriterPtr writer = local->writer; + xmlDocPtr doc = local->doc; + + GF_ASSERT(writer); + GF_ASSERT(doc); + GF_ASSERT(dict); + + /* <snapshot> */ + ret = xmlTextWriterStartElement(writer, (xmlChar *)"snapshot"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_str(dict, "snapname", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap name"); + goto xmlend; + } + + if (!rsp->op_ret) { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status", + "Success"); + } else { + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"status", + "Failure"); + XML_RET_CHECK_AND_GOTO(ret, xmlend); + + ret = cli_xml_output_common(writer, rsp->op_ret, rsp->op_errno, + rsp->op_errstr); + } + XML_RET_CHECK_AND_GOTO(ret, xmlend); + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"name", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, xmlend); + + ret = dict_get_str(dict, "snapuuid", &str_value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get snap uuid"); + goto xmlend; + } + + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"uuid", "%s", + str_value); + XML_RET_CHECK_AND_GOTO(ret, out); xmlend: - /* </snapshot> */ - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </snapshot> */ + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); #endif /* HAVE_LIB_XML */ - ret = 0; + ret = 0; out: - return ret; + return ret; } int -cli_xml_output_snap_status_begin (cli_local_t *local, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_snap_status_begin(cli_local_t *local, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; + int ret = -1; - GF_ASSERT (local); + GF_ASSERT(local); - ret = cli_begin_xml_output (&(local->writer), &(local->doc)); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = cli_begin_xml_output(&(local->writer), &(local->doc)); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_xml_output_common (local->writer, op_ret, op_errno, - op_errstr); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = cli_xml_output_common(local->writer, op_ret, op_errno, op_errstr); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <snapStatus> */ - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *) "snapStatus"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <snapStatus> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"snapStatus"); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <snapshots> */ - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"snapshots"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <snapshots> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"snapshots"); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_TRACE, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_TRACE, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_snap_status_end (cli_local_t *local) +cli_xml_output_snap_status_end(cli_local_t *local) { #if (HAVE_LIB_XML) - int ret = -1; + int ret = -1; - GF_ASSERT (local); + GF_ASSERT(local); - /* </snapshots> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </snapshots> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </snapStatus> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO(ret, out); + /* </snapStatus> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_end_xml_output (local->writer, local->doc); + ret = cli_end_xml_output(local->writer, local->doc); out: - gf_log ("cli", GF_LOG_TRACE, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_TRACE, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_snap_delete_begin (cli_local_t *local, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_snap_delete_begin(cli_local_t *local, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - int delete_cmd = -1; + int ret = -1; + int delete_cmd = -1; - GF_ASSERT (local); + GF_ASSERT(local); - ret = cli_begin_xml_output (&(local->writer), &(local->doc)); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = cli_begin_xml_output(&(local->writer), &(local->doc)); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = dict_get_int32 (local->dict, "sub-cmd", &delete_cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get sub-cmd"); - goto out; - } + ret = dict_get_int32(local->dict, "sub-cmd", &delete_cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Failed to get sub-cmd"); + goto out; + } - ret = cli_xml_output_common (local->writer, op_ret, op_errno, - op_errstr); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = cli_xml_output_common(local->writer, op_ret, op_errno, op_errstr); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <snapStatus> */ - ret = xmlTextWriterStartElement (local->writer, - (xmlChar *) "snapDelete"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <snapStatus> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"snapDelete"); + XML_RET_CHECK_AND_GOTO(ret, out); - /* <snapshots> */ - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"snapshots"); - XML_RET_CHECK_AND_GOTO (ret, out); + /* <snapshots> */ + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"snapshots"); + XML_RET_CHECK_AND_GOTO(ret, out); out: - gf_log ("cli", GF_LOG_TRACE, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_TRACE, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } int -cli_xml_output_snap_delete_end (cli_local_t *local) +cli_xml_output_snap_delete_end(cli_local_t *local) { #if (HAVE_LIB_XML) - int ret = -1; + int ret = -1; - GF_ASSERT (local); + GF_ASSERT(local); - /* </snapshots> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + /* </snapshots> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); - /* </snapDelete> */ - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO(ret, out); + /* </snapDelete> */ + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = cli_end_xml_output (local->writer, local->doc); + ret = cli_end_xml_output(local->writer, local->doc); out: - gf_log ("cli", GF_LOG_TRACE, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_TRACE, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif } /* This function will generate xml output for all the snapshot commands @@ -5900,493 +5685,484 @@ out: * @return 0 on success and -1 on failure */ int -cli_xml_output_snapshot (int cmd_type, dict_t *dict, int op_ret, - int op_errno, char *op_errstr) +cli_xml_output_snapshot(int cmd_type, dict_t *dict, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int ret = -1; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; - - GF_ASSERT (dict); - - ret = cli_begin_xml_output (&writer, &doc); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to output " - "xml begin block"); - goto out; - } - - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to output " - "xml common block"); - goto out; - } - - /* In case of command failure just printing the error message is good - * enough */ - if (0 != op_ret) { - goto end; - } - - switch (cmd_type) { + int ret = -1; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; + + GF_ASSERT(dict); + + ret = cli_begin_xml_output(&writer, &doc); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to output " + "xml begin block"); + goto out; + } + + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to output " + "xml common block"); + goto out; + } + + /* In case of command failure just printing the error message is good + * enough */ + if (0 != op_ret) { + goto end; + } + + switch (cmd_type) { case GF_SNAP_OPTION_TYPE_CREATE: - ret = cli_xml_snapshot_create (writer, doc, dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for snapshot create command"); - goto out; - } - break; + ret = cli_xml_snapshot_create(writer, doc, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for snapshot create command"); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_CLONE: - ret = cli_xml_snapshot_clone (writer, doc, dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for snapshot clone command"); - goto out; - } - break; + ret = cli_xml_snapshot_clone(writer, doc, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for snapshot clone command"); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_RESTORE: - ret = cli_xml_snapshot_restore (writer, doc, dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for snapshot restore command"); - goto out; - } - break; + ret = cli_xml_snapshot_restore(writer, doc, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for snapshot restore command"); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_LIST: - ret = cli_xml_snapshot_list (writer, doc, dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for snapshot list command"); - goto out; - } - break; + ret = cli_xml_snapshot_list(writer, doc, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for snapshot list command"); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_STATUS: - ret = cli_xml_snapshot_status (writer, doc, dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create" - "xml output for snapshot status command"); - goto out; - } - break; + ret = cli_xml_snapshot_status(writer, doc, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create" + "xml output for snapshot status command"); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_INFO: - ret = cli_xml_snapshot_info (writer, doc, dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for snapshot info command"); - goto out; - } - break; + ret = cli_xml_snapshot_info(writer, doc, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for snapshot info command"); + goto out; + } + break; case GF_SNAP_OPTION_TYPE_ACTIVATE: case GF_SNAP_OPTION_TYPE_DEACTIVATE: - ret = cli_xml_snapshot_activate_deactivate (writer, doc, - dict, cmd_type); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for snapshot config command"); - } - break; + ret = cli_xml_snapshot_activate_deactivate(writer, doc, dict, + cmd_type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for snapshot config command"); + } + break; case GF_SNAP_OPTION_TYPE_CONFIG: - ret = cli_xml_snapshot_config (writer, doc, dict); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to create " - "xml output for snapshot config command"); - } - break; + ret = cli_xml_snapshot_config(writer, doc, dict); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to create " + "xml output for snapshot config command"); + } + break; default: - gf_log ("cli", GF_LOG_ERROR, - "Unexpected snapshot command: %d", cmd_type); - goto out; - } + gf_log("cli", GF_LOG_ERROR, "Unexpected snapshot command: %d", + cmd_type); + goto out; + } end: - ret = cli_end_xml_output (writer, doc); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to output " - "xml end block"); - goto out; - } - - ret = 0; + ret = cli_end_xml_output(writer, doc); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to output " + "xml end block"); + goto out; + } + + ret = 0; out: - return ret; + return ret; #else - return 0; + return 0; #endif /* HAVE_LIB_XML */ } int -cli_xml_snapshot_begin_composite_op (cli_local_t *local) +cli_xml_snapshot_begin_composite_op(cli_local_t *local) { - int ret = -1; + int ret = -1; #ifdef HAVE_LIB_XML - int cmd = -1; - int type = -1; - - ret = dict_get_int32 (local->dict, "sub-cmd", &cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get " - "sub-cmd"); - ret = 0; - goto out; - } - - if (cmd == GF_SNAP_STATUS_TYPE_ITER || - cmd == GF_SNAP_DELETE_TYPE_SNAP){ - ret = 0; - goto out; - } - - ret = dict_get_int32 (local->dict, "type", &type); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snapshot " - "command type from dictionary"); - goto out; - } - - if (GF_SNAP_OPTION_TYPE_STATUS == type) - ret = cli_xml_output_snap_status_begin (local, 0, 0, NULL); - else if (GF_SNAP_OPTION_TYPE_DELETE == type) - ret = cli_xml_output_snap_delete_begin (local, 0, 0, NULL); + int cmd = -1; + int type = -1; + + ret = dict_get_int32(local->dict, "sub-cmd", &cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to get " + "sub-cmd"); + ret = 0; + goto out; + } - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Error creating xml output"); - goto out; - } + if (cmd == GF_SNAP_STATUS_TYPE_ITER || cmd == GF_SNAP_DELETE_TYPE_SNAP) { + ret = 0; + goto out; + } + + ret = dict_get_int32(local->dict, "type", &type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to get snapshot " + "command type from dictionary"); + goto out; + } + + if (GF_SNAP_OPTION_TYPE_STATUS == type) + ret = cli_xml_output_snap_status_begin(local, 0, 0, NULL); + else if (GF_SNAP_OPTION_TYPE_DELETE == type) + ret = cli_xml_output_snap_delete_begin(local, 0, 0, NULL); + + if (ret) { + gf_log("cli", GF_LOG_ERROR, "Error creating xml output"); + goto out; + } #endif /* HAVE_LIB_XML */ - ret = 0; + ret = 0; out: - return ret; + return ret; } int -cli_xml_snapshot_end_composite_op (cli_local_t *local) +cli_xml_snapshot_end_composite_op(cli_local_t *local) { - int ret = -1; + int ret = -1; #ifdef HAVE_LIB_XML - int cmd = -1; - int type = -1; - - ret = dict_get_int32 (local->dict, "sub-cmd", &cmd); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get " - "sub-cmd"); - ret = 0; - goto out; - } - - if (cmd == GF_SNAP_STATUS_TYPE_ITER || - cmd == GF_SNAP_DELETE_TYPE_SNAP){ - ret = 0; - goto out; - } - - ret = dict_get_int32 (local->dict, "type", &type); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to get snapshot " - "command type from dictionary"); - goto out; - } - - if (GF_SNAP_OPTION_TYPE_STATUS == type) - ret = cli_xml_output_snap_status_end (local); - else if (GF_SNAP_OPTION_TYPE_DELETE == type) - ret = cli_xml_output_snap_delete_end (local); + int cmd = -1; + int type = -1; + + ret = dict_get_int32(local->dict, "sub-cmd", &cmd); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to get " + "sub-cmd"); + ret = 0; + goto out; + } - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Error creating xml " - "output"); - goto out; - } -#endif /* HAVE_LIB_XML */ + if (cmd == GF_SNAP_STATUS_TYPE_ITER || cmd == GF_SNAP_DELETE_TYPE_SNAP) { ret = 0; + goto out; + } + + ret = dict_get_int32(local->dict, "type", &type); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to get snapshot " + "command type from dictionary"); + goto out; + } + + if (GF_SNAP_OPTION_TYPE_STATUS == type) + ret = cli_xml_output_snap_status_end(local); + else if (GF_SNAP_OPTION_TYPE_DELETE == type) + ret = cli_xml_output_snap_delete_end(local); + + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Error creating xml " + "output"); + goto out; + } +#endif /* HAVE_LIB_XML */ + ret = 0; out: - return ret; + return ret; } int -cli_xml_snapshot_status_single_snap (cli_local_t *local, dict_t *dict, - char *key) +cli_xml_snapshot_status_single_snap(cli_local_t *local, dict_t *dict, char *key) { #if (HAVE_LIB_XML) - int ret = -1; + int ret = -1; - GF_VALIDATE_OR_GOTO ("cli", (local != NULL), out); - GF_VALIDATE_OR_GOTO ("cli", (dict != NULL), out); - GF_VALIDATE_OR_GOTO ("cli", (key != NULL), out); + GF_VALIDATE_OR_GOTO("cli", (local != NULL), out); + GF_VALIDATE_OR_GOTO("cli", (dict != NULL), out); + GF_VALIDATE_OR_GOTO("cli", (key != NULL), out); - ret = cli_xml_snapshot_status_per_snap (local->writer, local->doc, dict, - key); + ret = cli_xml_snapshot_status_per_snap(local->writer, local->doc, dict, + key); out: - return ret; + return ret; #else - return 0; + return 0; #endif /* HAVE_LIB_XML */ } int -cli_xml_output_vol_getopts (dict_t *dict, int op_ret, int op_errno, - char *op_errstr) +cli_xml_output_vol_getopts(dict_t *dict, int op_ret, int op_errno, + char *op_errstr) { #if (HAVE_LIB_XML) - int i = 0; - int ret = -1; - int count = 0; - xmlTextWriterPtr writer = NULL; - xmlDocPtr doc = NULL; - char *key = NULL; - char *value = NULL; - char dict_key[50] = {0,}; - - ret = cli_begin_xml_output (&writer, &doc); - if (ret) - goto out; - - ret = cli_xml_output_common (writer, op_ret, op_errno, op_errstr); - if (ret) - goto out; - - ret = xmlTextWriterStartElement (writer, (xmlChar *)"volGetopts"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = dict_get_int32 (dict, "count", &count); + int i = 0; + int ret = -1; + int count = 0; + xmlTextWriterPtr writer = NULL; + xmlDocPtr doc = NULL; + char *key = NULL; + char *value = NULL; + char dict_key[50] = { + 0, + }; + + ret = cli_begin_xml_output(&writer, &doc); + if (ret) + goto out; + + ret = cli_xml_output_common(writer, op_ret, op_errno, op_errstr); + if (ret) + goto out; + + ret = xmlTextWriterStartElement(writer, (xmlChar *)"volGetopts"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = dict_get_int32(dict, "count", &count); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to retrieve count " + "from the dictionary"); + goto out; + } + if (count <= 0) { + gf_log("cli", GF_LOG_ERROR, + "Value of count :%d is " + "invalid", + count); + ret = -1; + goto out; + } + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"count", "%d", + count); + + XML_RET_CHECK_AND_GOTO(ret, out); + + for (i = 1; i <= count; i++) { + sprintf(dict_key, "key%d", i); + ret = dict_get_str(dict, dict_key, &key); if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to retrieve count " - "from the dictionary"); - goto out; - } - if (count <= 0) { - gf_log ("cli", GF_LOG_ERROR, "Value of count :%d is " - "invalid", count); - ret = -1; - goto out; - } - ret = xmlTextWriterWriteFormatElement (writer, (xmlChar *)"count", - "%d", count); - - XML_RET_CHECK_AND_GOTO (ret, out); - - for (i=1; i<=count; i++) { - sprintf (dict_key, "key%d", i); - ret = dict_get_str (dict, dict_key, &key); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to" - " retrieve %s from the " - "dictionary", dict_key); - goto out; - } - sprintf (dict_key, "value%d", i); - ret = dict_get_str (dict, dict_key, &value); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "Failed to " - "retrieve key value for %s from" - "the dictionary", dict_key); - goto out; - } - ret = xmlTextWriterStartElement (writer, (xmlChar *)"Opt"); - XML_RET_CHECK_AND_GOTO (ret, out); + gf_log("cli", GF_LOG_ERROR, + "Failed to" + " retrieve %s from the " + "dictionary", + dict_key); + goto out; + } + sprintf(dict_key, "value%d", i); + ret = dict_get_str(dict, dict_key, &value); + if (ret) { + gf_log("cli", GF_LOG_ERROR, + "Failed to " + "retrieve key value for %s from" + "the dictionary", + dict_key); + goto out; + } + ret = xmlTextWriterStartElement(writer, (xmlChar *)"Opt"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"Option", - "%s", key); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"Option", "%s", + key); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (writer, - (xmlChar *)"Value", - "%s", value); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(writer, (xmlChar *)"Value", "%s", + value); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterEndElement (writer); - XML_RET_CHECK_AND_GOTO (ret, out); - } - ret = cli_end_xml_output (writer, doc); + ret = xmlTextWriterEndElement(writer); + XML_RET_CHECK_AND_GOTO(ret, out); + } + ret = cli_end_xml_output(writer, doc); out: - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; #else - return 0; + return 0; #endif /* HAVE_LIB_XML */ } int -cli_quota_list_xml_error (cli_local_t *local, char *path, - char *errstr) +cli_quota_list_xml_error(cli_local_t *local, char *path, char *errstr) { #if (HAVE_LIB_XML) - int ret = -1; + int ret = -1; - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"limit"); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"limit"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"path", - "%s", path); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"path", + "%s", path); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"errstr", - "%s", errstr); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"errstr", + "%s", errstr); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - return ret; + return ret; #else - return 0; + return 0; #endif } int -cli_quota_xml_output (cli_local_t *local, char *path, int64_t hl_str, - char *sl_final, int64_t sl_num, int64_t used, - int64_t avail, char *sl, char *hl, - gf_boolean_t limit_set) +cli_quota_xml_output(cli_local_t *local, char *path, int64_t hl_str, + char *sl_final, int64_t sl_num, int64_t used, + int64_t avail, char *sl, char *hl, gf_boolean_t limit_set) { #if (HAVE_LIB_XML) - int ret = -1; - - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"limit"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"path", - "%s", path); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"hard_limit", - !limit_set ? "N/A" : - "%"PRId64, hl_str); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"soft_limit_percent", - !limit_set ? "N/A" : - "%s", sl_final); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"soft_limit_value", - !limit_set ? "N/A" : - "%"PRId64, sl_num); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"used_space", - "%"PRId64, used); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"avail_space", - !limit_set ? "N/A" : - "%"PRId64, avail); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"sl_exceeded", - !limit_set ? "N/A" : - "%s", sl); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"hl_exceeded", - !limit_set ? "N/A" : - "%s", hl); - XML_RET_CHECK_AND_GOTO (ret, out); - - - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; + + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"limit"); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"path", + "%s", path); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"hard_limit", !limit_set ? "N/A" : "%" PRId64, + hl_str); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement(local->writer, + (xmlChar *)"soft_limit_percent", + !limit_set ? "N/A" : "%s", sl_final); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"soft_limit_value", + !limit_set ? "N/A" : "%" PRId64, sl_num); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"used_space", "%" PRId64, used); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"avail_space", + !limit_set ? "N/A" : "%" PRId64, avail); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"sl_exceeded", !limit_set ? "N/A" : "%s", sl); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"hl_exceeded", !limit_set ? "N/A" : "%s", hl); + XML_RET_CHECK_AND_GOTO(ret, out); + + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - return ret; + return ret; #else - return 0; + return 0; #endif /* HAVE_LIB_XML */ } int -cli_quota_object_xml_output (cli_local_t *local, char *path, char *sl_str, - int64_t sl_val, quota_limits_t *limits, - quota_meta_t *used_space, int64_t avail, - char *sl, char *hl, gf_boolean_t limit_set) +cli_quota_object_xml_output(cli_local_t *local, char *path, char *sl_str, + int64_t sl_val, quota_limits_t *limits, + quota_meta_t *used_space, int64_t avail, char *sl, + char *hl, gf_boolean_t limit_set) { #if (HAVE_LIB_XML) - int ret = -1; - - ret = xmlTextWriterStartElement (local->writer, (xmlChar *)"limit"); - XML_RET_CHECK_AND_GOTO (ret, out); - - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"path", - "%s", path); - XML_RET_CHECK_AND_GOTO (ret, out); + int ret = -1; - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"hard_limit", - !limit_set ? "N/A" : - "%"PRId64, limits->hl); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterStartElement(local->writer, (xmlChar *)"limit"); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"soft_limit_percent", - !limit_set ? "N/A" : - "%s", sl_str); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"path", + "%s", path); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"soft_limit_value", - !limit_set ? "N/A" : - "%"PRIu64, sl_val); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"hard_limit", !limit_set ? "N/A" : "%" PRId64, + limits->hl); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"file_count", - "%"PRId64, - used_space->file_count); + ret = xmlTextWriterWriteFormatElement(local->writer, + (xmlChar *)"soft_limit_percent", + !limit_set ? "N/A" : "%s", sl_str); + XML_RET_CHECK_AND_GOTO(ret, out); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"soft_limit_value", + !limit_set ? "N/A" : "%" PRIu64, sl_val); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"dir_count", - "%"PRIu64, - used_space->dir_count); + ret = xmlTextWriterWriteFormatElement(local->writer, + (xmlChar *)"file_count", "%" PRId64, + used_space->file_count); - XML_RET_CHECK_AND_GOTO (ret, out); + XML_RET_CHECK_AND_GOTO(ret, out); + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"dir_count", + "%" PRIu64, used_space->dir_count); - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"available", - !limit_set ? "N/A" : - "%"PRId64, avail); + XML_RET_CHECK_AND_GOTO(ret, out); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement(local->writer, (xmlChar *)"available", + !limit_set ? "N/A" : "%" PRId64, + avail); - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"sl_exceeded", - !limit_set ? "N/A" : - "%s", sl); - XML_RET_CHECK_AND_GOTO (ret, out); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterWriteFormatElement (local->writer, - (xmlChar *)"hl_exceeded", - !limit_set ? "N/A" : - "%s", hl); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"sl_exceeded", !limit_set ? "N/A" : "%s", sl); + XML_RET_CHECK_AND_GOTO(ret, out); + ret = xmlTextWriterWriteFormatElement( + local->writer, (xmlChar *)"hl_exceeded", !limit_set ? "N/A" : "%s", hl); + XML_RET_CHECK_AND_GOTO(ret, out); - ret = xmlTextWriterEndElement (local->writer); - XML_RET_CHECK_AND_GOTO (ret, out); + ret = xmlTextWriterEndElement(local->writer); + XML_RET_CHECK_AND_GOTO(ret, out); out: - return ret; + return ret; #else - return 0; + return 0; #endif /* HAVE_LIB_XML */ } diff --git a/cli/src/cli.c b/cli/src/cli.c index 025f72c9748..39a0984a134 100644 --- a/cli/src/cli.c +++ b/cli/src/cli.c @@ -64,16 +64,17 @@ extern int connected; /* using argp for command line parsing */ -const char *argp_program_version = "" \ - PACKAGE_NAME" "PACKAGE_VERSION \ - "\nRepository revision: " GLUSTERFS_REPOSITORY_REVISION "\n" \ - "Copyright (c) 2006-2016 Red Hat, Inc. " \ - "<https://www.gluster.org/>\n" \ - "GlusterFS comes with ABSOLUTELY NO WARRANTY.\n" \ - "It is licensed to you under your choice of the GNU Lesser\n" \ - "General Public License, version 3 or any later version (LGPLv3\n" \ - "or later), or the GNU General Public License, version 2 (GPLv2),\n" \ - "in all cases as published by the Free Software Foundation."; +const char *argp_program_version = + "" PACKAGE_NAME " " PACKAGE_VERSION + "\nRepository revision: " GLUSTERFS_REPOSITORY_REVISION + "\n" + "Copyright (c) 2006-2016 Red Hat, Inc. " + "<https://www.gluster.org/>\n" + "GlusterFS comes with ABSOLUTELY NO WARRANTY.\n" + "It is licensed to you under your choice of the GNU Lesser\n" + "General Public License, version 3 or any later version (LGPLv3\n" + "or later), or the GNU General Public License, version 2 (GPLv2),\n" + "in all cases as published by the Free Software Foundation."; const char *argp_program_bug_address = "<" PACKAGE_BUGREPORT ">"; struct rpc_clnt *global_quotad_rpc; @@ -81,231 +82,228 @@ struct rpc_clnt *global_rpc; rpc_clnt_prog_t *cli_rpc_prog; - extern struct rpc_clnt_program cli_prog; static int -glusterfs_ctx_defaults_init (glusterfs_ctx_t *ctx) +glusterfs_ctx_defaults_init(glusterfs_ctx_t *ctx) { - cmd_args_t *cmd_args = NULL; - struct rlimit lim = {0, }; - call_pool_t *pool = NULL; - int ret = -1; - - ret = xlator_mem_acct_init (THIS, cli_mt_end); - if (ret != 0) { - return ret; - } + cmd_args_t *cmd_args = NULL; + struct rlimit lim = { + 0, + }; + call_pool_t *pool = NULL; + int ret = -1; + + ret = xlator_mem_acct_init(THIS, cli_mt_end); + if (ret != 0) { + return ret; + } - ctx->process_uuid = generate_glusterfs_ctx_id (); - if (!ctx->process_uuid) - return -1; + ctx->process_uuid = generate_glusterfs_ctx_id(); + if (!ctx->process_uuid) + return -1; - ctx->page_size = 128 * GF_UNIT_KB; + ctx->page_size = 128 * GF_UNIT_KB; - ctx->iobuf_pool = iobuf_pool_new (); - if (!ctx->iobuf_pool) - return -1; + ctx->iobuf_pool = iobuf_pool_new(); + if (!ctx->iobuf_pool) + return -1; - ctx->event_pool = event_pool_new (DEFAULT_EVENT_POOL_SIZE, - STARTING_EVENT_THREADS); - if (!ctx->event_pool) - return -1; + ctx->event_pool = event_pool_new(DEFAULT_EVENT_POOL_SIZE, + STARTING_EVENT_THREADS); + if (!ctx->event_pool) + return -1; - pool = GF_CALLOC (1, sizeof (call_pool_t), - cli_mt_call_pool_t); - if (!pool) - return -1; + pool = GF_CALLOC(1, sizeof(call_pool_t), cli_mt_call_pool_t); + if (!pool) + return -1; - /* frame_mem_pool size 112 * 64 */ - pool->frame_mem_pool = mem_pool_new (call_frame_t, 32); - if (!pool->frame_mem_pool) - return -1; + /* frame_mem_pool size 112 * 64 */ + pool->frame_mem_pool = mem_pool_new(call_frame_t, 32); + if (!pool->frame_mem_pool) + return -1; - /* stack_mem_pool size 256 * 128 */ - pool->stack_mem_pool = mem_pool_new (call_stack_t, 16); + /* stack_mem_pool size 256 * 128 */ + pool->stack_mem_pool = mem_pool_new(call_stack_t, 16); - if (!pool->stack_mem_pool) - return -1; + if (!pool->stack_mem_pool) + return -1; - ctx->stub_mem_pool = mem_pool_new (call_stub_t, 16); - if (!ctx->stub_mem_pool) - return -1; + ctx->stub_mem_pool = mem_pool_new(call_stub_t, 16); + if (!ctx->stub_mem_pool) + return -1; - ctx->dict_pool = mem_pool_new (dict_t, 32); - if (!ctx->dict_pool) - return -1; + ctx->dict_pool = mem_pool_new(dict_t, 32); + if (!ctx->dict_pool) + return -1; - ctx->dict_pair_pool = mem_pool_new (data_pair_t, 512); - if (!ctx->dict_pair_pool) - return -1; + ctx->dict_pair_pool = mem_pool_new(data_pair_t, 512); + if (!ctx->dict_pair_pool) + return -1; - ctx->dict_data_pool = mem_pool_new (data_t, 512); - if (!ctx->dict_data_pool) - return -1; + ctx->dict_data_pool = mem_pool_new(data_t, 512); + if (!ctx->dict_data_pool) + return -1; - ctx->logbuf_pool = mem_pool_new (log_buf_t, 256); - if (!ctx->logbuf_pool) - return -1; + ctx->logbuf_pool = mem_pool_new(log_buf_t, 256); + if (!ctx->logbuf_pool) + return -1; - INIT_LIST_HEAD (&pool->all_frames); - LOCK_INIT (&pool->lock); - ctx->pool = pool; + INIT_LIST_HEAD(&pool->all_frames); + LOCK_INIT(&pool->lock); + ctx->pool = pool; - cmd_args = &ctx->cmd_args; + cmd_args = &ctx->cmd_args; - INIT_LIST_HEAD (&cmd_args->xlator_options); + INIT_LIST_HEAD(&cmd_args->xlator_options); - lim.rlim_cur = RLIM_INFINITY; - lim.rlim_max = RLIM_INFINITY; - setrlimit (RLIMIT_CORE, &lim); + lim.rlim_cur = RLIM_INFINITY; + lim.rlim_max = RLIM_INFINITY; + setrlimit(RLIMIT_CORE, &lim); - return 0; + return 0; } - static int -logging_init (glusterfs_ctx_t *ctx, struct cli_state *state) +logging_init(glusterfs_ctx_t *ctx, struct cli_state *state) { - char *log_file = state->log_file ? state->log_file : - DEFAULT_CLI_LOG_FILE_DIRECTORY "/cli.log"; - - /* passing ident as NULL means to use default ident for syslog */ - if (gf_log_init (ctx, log_file, NULL) == -1) { - fprintf (stderr, "ERROR: failed to open logfile %s\n", - log_file); - return -1; - } + char *log_file = state->log_file ? state->log_file + : DEFAULT_CLI_LOG_FILE_DIRECTORY + "/cli.log"; - /* CLI should not have something to DEBUG after the release, - hence defaulting to INFO loglevel */ - gf_log_set_loglevel (ctx, (state->log_level == GF_LOG_NONE) ? - GF_LOG_INFO : state->log_level); + /* passing ident as NULL means to use default ident for syslog */ + if (gf_log_init(ctx, log_file, NULL) == -1) { + fprintf(stderr, "ERROR: failed to open logfile %s\n", log_file); + return -1; + } - return 0; + /* CLI should not have something to DEBUG after the release, + hence defaulting to INFO loglevel */ + gf_log_set_loglevel(ctx, (state->log_level == GF_LOG_NONE) + ? GF_LOG_INFO + : state->log_level); + + return 0; } int -cli_submit_request (struct rpc_clnt *rpc, void *req, call_frame_t *frame, - rpc_clnt_prog_t *prog, - int procnum, struct iobref *iobref, - xlator_t *this, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc) +cli_submit_request(struct rpc_clnt *rpc, void *req, call_frame_t *frame, + rpc_clnt_prog_t *prog, int procnum, struct iobref *iobref, + xlator_t *this, fop_cbk_fn_t cbkfn, xdrproc_t xdrproc) { - int ret = -1; - int count = 0; - struct iovec iov = {0, }; - struct iobuf *iobuf = NULL; - char new_iobref = 0; - ssize_t xdr_size = 0; - - GF_ASSERT (this); - - if (req) { - xdr_size = xdr_sizeof (xdrproc, req); - iobuf = iobuf_get2 (this->ctx->iobuf_pool, xdr_size); - if (!iobuf) { - goto out; - }; - - if (!iobref) { - iobref = iobref_new (); - if (!iobref) { - goto out; - } - - new_iobref = 1; - } - - iobref_add (iobref, iobuf); - - iov.iov_base = iobuf->ptr; - iov.iov_len = iobuf_size (iobuf); - - - /* Create the xdr payload */ - ret = xdr_serialize_generic (iov, req, xdrproc); - if (ret == -1) { - goto out; - } - iov.iov_len = ret; - count = 1; + int ret = -1; + int count = 0; + struct iovec iov = { + 0, + }; + struct iobuf *iobuf = NULL; + char new_iobref = 0; + ssize_t xdr_size = 0; + + GF_ASSERT(this); + + if (req) { + xdr_size = xdr_sizeof(xdrproc, req); + iobuf = iobuf_get2(this->ctx->iobuf_pool, xdr_size); + if (!iobuf) { + goto out; + }; + + if (!iobref) { + iobref = iobref_new(); + if (!iobref) { + goto out; + } + + new_iobref = 1; + } + + iobref_add(iobref, iobuf); + + iov.iov_base = iobuf->ptr; + iov.iov_len = iobuf_size(iobuf); + + /* Create the xdr payload */ + ret = xdr_serialize_generic(iov, req, xdrproc); + if (ret == -1) { + goto out; } + iov.iov_len = ret; + count = 1; + } - if (!rpc) - rpc = global_rpc; - /* Send the msg */ - ret = rpc_clnt_submit (rpc, prog, procnum, cbkfn, - &iov, count, - NULL, 0, iobref, frame, NULL, 0, NULL, 0, NULL); - ret = 0; + if (!rpc) + rpc = global_rpc; + /* Send the msg */ + ret = rpc_clnt_submit(rpc, prog, procnum, cbkfn, &iov, count, NULL, 0, + iobref, frame, NULL, 0, NULL, 0, NULL); + ret = 0; out: - if (new_iobref) - iobref_unref (iobref); - if (iobuf) - iobuf_unref (iobuf); - return ret; + if (new_iobref) + iobref_unref(iobref); + if (iobuf) + iobuf_unref(iobuf); + return ret; } int -cli_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event, - void *data) +cli_rpc_notify(struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event, + void *data) { - xlator_t *this = NULL; - int ret = 0; - - this = mydata; + xlator_t *this = NULL; + int ret = 0; - switch (event) { - case RPC_CLNT_CONNECT: - { + this = mydata; - cli_cmd_broadcast_connected (); - gf_log (this->name, GF_LOG_TRACE, "got RPC_CLNT_CONNECT"); - break; + switch (event) { + case RPC_CLNT_CONNECT: { + cli_cmd_broadcast_connected(); + gf_log(this->name, GF_LOG_TRACE, "got RPC_CLNT_CONNECT"); + break; } - case RPC_CLNT_DISCONNECT: - { - gf_log (this->name, GF_LOG_TRACE, "got RPC_CLNT_DISCONNECT"); - connected = 0; - if (!global_state->prompt && global_state->await_connected) { - ret = 1; - cli_out ("Connection failed. Please check if gluster " - "daemon is operational."); - exit (ret); - } - break; + case RPC_CLNT_DISCONNECT: { + gf_log(this->name, GF_LOG_TRACE, "got RPC_CLNT_DISCONNECT"); + connected = 0; + if (!global_state->prompt && global_state->await_connected) { + ret = 1; + cli_out( + "Connection failed. Please check if gluster " + "daemon is operational."); + exit(ret); + } + break; } default: - gf_log (this->name, GF_LOG_TRACE, - "got some other RPC event %d", event); - ret = 0; - break; - } + gf_log(this->name, GF_LOG_TRACE, "got some other RPC event %d", + event); + ret = 0; + break; + } - return ret; + return ret; } static gf_boolean_t -is_valid_int (char *str) +is_valid_int(char *str) { - if (*str == '-') - ++str; + if (*str == '-') + ++str; - /* Handle empty string or just "-".*/ - if (!*str) - return _gf_false; + /* Handle empty string or just "-".*/ + if (!*str) + return _gf_false; - /* Check for non-digit chars in the rest of the string */ - while (*str) { - if (!isdigit(*str)) - return _gf_false; + /* Check for non-digit chars in the rest of the string */ + while (*str) { + if (!isdigit(*str)) + return _gf_false; else - ++str; - } - return _gf_true; + ++str; + } + return _gf_true; } /* @@ -315,527 +313,528 @@ is_valid_int (char *str) * -2: parsing issue (avoid unknown option error) */ int -cli_opt_parse (char *opt, struct cli_state *state) +cli_opt_parse(char *opt, struct cli_state *state) { - char *oarg = NULL; - gf_boolean_t secure_mgmt_tmp = 0; + char *oarg = NULL; + gf_boolean_t secure_mgmt_tmp = 0; - if (strcmp (opt, "") == 0) - return 1; + if (strcmp(opt, "") == 0) + return 1; - if (strcmp (opt, "version") == 0) { - cli_out ("%s", argp_program_version); - exit (0); - } + if (strcmp(opt, "version") == 0) { + cli_out("%s", argp_program_version); + exit(0); + } - if (strcmp (opt, "print-logdir") == 0) { - cli_out ("%s", DEFAULT_LOG_FILE_DIRECTORY); - exit (0); - } + if (strcmp(opt, "print-logdir") == 0) { + cli_out("%s", DEFAULT_LOG_FILE_DIRECTORY); + exit(0); + } - if (strcmp (opt, "print-statedumpdir") == 0) { - cli_out ("%s", DEFAULT_VAR_RUN_DIRECTORY); - exit (0); - } + if (strcmp(opt, "print-statedumpdir") == 0) { + cli_out("%s", DEFAULT_VAR_RUN_DIRECTORY); + exit(0); + } - if (strcmp (opt, "xml") == 0) { + if (strcmp(opt, "xml") == 0) { #if (HAVE_LIB_XML) - state->mode |= GLUSTER_MODE_XML; + state->mode |= GLUSTER_MODE_XML; #else - cli_err ("XML output not supported. Ignoring '--xml' option"); + cli_err("XML output not supported. Ignoring '--xml' option"); #endif - return 0; - } - - if (strcmp (opt, "wignore-partition") == 0) { - state->mode |= GLUSTER_MODE_WIGNORE_PARTITION; - return 0; - } - - if (strcmp (opt, "wignore") == 0) { - state->mode |= GLUSTER_MODE_WIGNORE; - return 0; - } + return 0; + } - oarg = strtail (opt, "mode="); - if (oarg) { - if (strcmp (oarg, "script") == 0) { - state->mode |= GLUSTER_MODE_SCRIPT; - return 0; - } + if (strcmp(opt, "wignore-partition") == 0) { + state->mode |= GLUSTER_MODE_WIGNORE_PARTITION; + return 0; + } - if (strcmp (oarg, "interactive") == 0) - return 0; + if (strcmp(opt, "wignore") == 0) { + state->mode |= GLUSTER_MODE_WIGNORE; + return 0; + } - return -1; + oarg = strtail(opt, "mode="); + if (oarg) { + if (strcmp(oarg, "script") == 0) { + state->mode |= GLUSTER_MODE_SCRIPT; + return 0; } - oarg = strtail (opt, "remote-host="); - if (oarg) { - state->remote_host = oarg; - return 0; - } + if (strcmp(oarg, "interactive") == 0) + return 0; - oarg = strtail (opt, "log-file="); - if (oarg) { - state->log_file = oarg; - return 0; - } - oarg = strtail (opt, "timeout="); - if (oarg) { - if (!is_valid_int (oarg) || atoi(oarg) <= 0) { - cli_err ("timeout value should be a positive integer"); - return -2; /* -2 instead of -1 to avoid unknown option - error */ - } - cli_default_conn_timeout = atoi(oarg); - return 0; - } + return -1; + } - oarg = strtail (opt, "log-level="); - if (oarg) { - int log_level = glusterd_check_log_level(oarg); - if (log_level == -1) - return -1; - state->log_level = (gf_loglevel_t) log_level; - return 0; - } + oarg = strtail(opt, "remote-host="); + if (oarg) { + state->remote_host = oarg; + return 0; + } - oarg = strtail (opt, "glusterd-sock="); - if (oarg) { - state->glusterd_sock = oarg; - return 0; - } + oarg = strtail(opt, "log-file="); + if (oarg) { + state->log_file = oarg; + return 0; + } + oarg = strtail(opt, "timeout="); + if (oarg) { + if (!is_valid_int(oarg) || atoi(oarg) <= 0) { + cli_err("timeout value should be a positive integer"); + return -2; /* -2 instead of -1 to avoid unknown option + error */ + } + cli_default_conn_timeout = atoi(oarg); + return 0; + } + + oarg = strtail(opt, "log-level="); + if (oarg) { + int log_level = glusterd_check_log_level(oarg); + if (log_level == -1) + return -1; + state->log_level = (gf_loglevel_t)log_level; + return 0; + } + + oarg = strtail(opt, "glusterd-sock="); + if (oarg) { + state->glusterd_sock = oarg; + return 0; + } - oarg = strtail (opt, "secure-mgmt="); - if (oarg) { - if (gf_string2boolean(oarg,&secure_mgmt_tmp) == 0) { - if (secure_mgmt_tmp) { - /* See declaration for why this is an int. */ - state->ctx->secure_mgmt = 1; - } - } - else { - cli_err ("invalid secure-mgmt value (ignored)"); - } - return 0; + oarg = strtail(opt, "secure-mgmt="); + if (oarg) { + if (gf_string2boolean(oarg, &secure_mgmt_tmp) == 0) { + if (secure_mgmt_tmp) { + /* See declaration for why this is an int. */ + state->ctx->secure_mgmt = 1; + } + } else { + cli_err("invalid secure-mgmt value (ignored)"); } + return 0; + } - return -1; + return -1; } int -parse_cmdline (int argc, char *argv[], struct cli_state *state) +parse_cmdline(int argc, char *argv[], struct cli_state *state) { - int ret = 0; - int i = 0; - int j = 0; - char *opt = NULL; - gf_boolean_t geo_rep_config = _gf_false; - - state->argc=argc-1; - state->argv=&argv[1]; - - /* Do this first so that an option can override. */ - if (sys_access (SECURE_ACCESS_FILE, F_OK) == 0) { - state->ctx->secure_mgmt = 1; - state->ctx->ssl_cert_depth = glusterfs_read_secure_access_file (); - } - - if (state->argc > GEO_REP_CMD_CONFIG_INDEX && - strtail (state->argv[GEO_REP_CMD_INDEX], "geo") && - strtail (state->argv[GEO_REP_CMD_CONFIG_INDEX], "co")) - geo_rep_config = _gf_true; - - for (i = 0; i < state->argc; i++) { - opt = strtail (state->argv[i], "--"); - if (opt && !geo_rep_config) { - ret = cli_opt_parse (opt, state); - if (ret == -1) { - cli_out ("unrecognized option --%s", opt); - return ret; - } else if (ret == -2) { - return ret; - } - for (j = i; j < state->argc - 1; j++) - state->argv[j] = state->argv[j + 1]; - state->argc--; - /* argv shifted, next check should be at i again */ - i--; - if (ret == 1) { - /* end of cli options */ - ret = 0; - break; - } - } + int ret = 0; + int i = 0; + int j = 0; + char *opt = NULL; + gf_boolean_t geo_rep_config = _gf_false; + + state->argc = argc - 1; + state->argv = &argv[1]; + + /* Do this first so that an option can override. */ + if (sys_access(SECURE_ACCESS_FILE, F_OK) == 0) { + state->ctx->secure_mgmt = 1; + state->ctx->ssl_cert_depth = glusterfs_read_secure_access_file(); + } + + if (state->argc > GEO_REP_CMD_CONFIG_INDEX && + strtail(state->argv[GEO_REP_CMD_INDEX], "geo") && + strtail(state->argv[GEO_REP_CMD_CONFIG_INDEX], "co")) + geo_rep_config = _gf_true; + + for (i = 0; i < state->argc; i++) { + opt = strtail(state->argv[i], "--"); + if (opt && !geo_rep_config) { + ret = cli_opt_parse(opt, state); + if (ret == -1) { + cli_out("unrecognized option --%s", opt); + return ret; + } else if (ret == -2) { + return ret; + } + for (j = i; j < state->argc - 1; j++) + state->argv[j] = state->argv[j + 1]; + state->argc--; + /* argv shifted, next check should be at i again */ + i--; + if (ret == 1) { + /* end of cli options */ + ret = 0; + break; + } } + } - state->argv[state->argc] = NULL; + state->argv[state->argc] = NULL; - return ret; + return ret; } - int -cli_cmd_tree_init (struct cli_cmd_tree *tree) +cli_cmd_tree_init(struct cli_cmd_tree *tree) { - struct cli_cmd_word *root = NULL; - int ret = 0; + struct cli_cmd_word *root = NULL; + int ret = 0; - root = &tree->root; - root->tree = tree; + root = &tree->root; + root->tree = tree; - return ret; + return ret; } - int -cli_state_init (struct cli_state *state) +cli_state_init(struct cli_state *state) { - struct cli_cmd_tree *tree = NULL; - int ret = 0; - + struct cli_cmd_tree *tree = NULL; + int ret = 0; - state->log_level = GF_LOG_NONE; + state->log_level = GF_LOG_NONE; - tree = &state->tree; - tree->state = state; + tree = &state->tree; + tree->state = state; - ret = cli_cmd_tree_init (tree); + ret = cli_cmd_tree_init(tree); - return ret; + return ret; } int -cli_usage_out (const char *usage) +cli_usage_out(const char *usage) { - GF_ASSERT (usage); + GF_ASSERT(usage); - if (!usage || usage[0] == '\0') - return -1; + if (!usage || usage[0] == '\0') + return -1; - cli_err ("\nUsage:\n%s\n", usage); - return 0; + cli_err("\nUsage:\n%s\n", usage); + return 0; } int -_cli_err (const char *fmt, ...) +_cli_err(const char *fmt, ...) { - va_list ap; - int ret = 0; + va_list ap; + int ret = 0; #ifdef HAVE_READLINE - struct cli_state *state = global_state; + struct cli_state *state = global_state; #endif - va_start (ap, fmt); + va_start(ap, fmt); #ifdef HAVE_READLINE - if (state->rl_enabled && !state->rl_processing) { - ret = cli_rl_err (state, fmt, ap); - va_end (ap); - return ret; - } + if (state->rl_enabled && !state->rl_processing) { + ret = cli_rl_err(state, fmt, ap); + va_end(ap); + return ret; + } #endif - ret = vfprintf (stderr, fmt, ap); - fprintf (stderr, "\n"); - va_end (ap); + ret = vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); - return ret; + return ret; } - int -_cli_out (const char *fmt, ...) +_cli_out(const char *fmt, ...) { - va_list ap; - int ret = 0; + va_list ap; + int ret = 0; #ifdef HAVE_READLINE - struct cli_state *state = global_state; + struct cli_state *state = global_state; #endif - va_start (ap, fmt); + va_start(ap, fmt); #ifdef HAVE_READLINE - if (state->rl_enabled && !state->rl_processing) { - ret = cli_rl_out (state, fmt, ap); - va_end (ap); - return ret; - } + if (state->rl_enabled && !state->rl_processing) { + ret = cli_rl_out(state, fmt, ap); + va_end(ap); + return ret; + } #endif - ret = vprintf (fmt, ap); - printf ("\n"); - va_end (ap); + ret = vprintf(fmt, ap); + printf("\n"); + va_end(ap); - return ret; + return ret; } struct rpc_clnt * -cli_quotad_clnt_rpc_init (void) +cli_quotad_clnt_rpc_init(void) { - struct rpc_clnt *rpc = NULL; - dict_t *rpc_opts = NULL; - int ret = -1; - - rpc_opts = dict_new (); - if (!rpc_opts) { - ret = -1; - goto out; - } - - ret = dict_set_str (rpc_opts, "transport.address-family", "unix"); - if (ret) - goto out; - - ret = dict_set_str (rpc_opts, "transport-type", "socket"); - if (ret) - goto out; - - ret = dict_set_str (rpc_opts, "transport.socket.connect-path", - "/var/run/gluster/quotad.socket"); - if (ret) - goto out; - - rpc = cli_quotad_clnt_init (THIS, rpc_opts); - if (!rpc) - goto out; - - global_quotad_rpc = rpc; + struct rpc_clnt *rpc = NULL; + dict_t *rpc_opts = NULL; + int ret = -1; + + rpc_opts = dict_new(); + if (!rpc_opts) { + ret = -1; + goto out; + } + + ret = dict_set_str(rpc_opts, "transport.address-family", "unix"); + if (ret) + goto out; + + ret = dict_set_str(rpc_opts, "transport-type", "socket"); + if (ret) + goto out; + + ret = dict_set_str(rpc_opts, "transport.socket.connect-path", + "/var/run/gluster/quotad.socket"); + if (ret) + goto out; + + rpc = cli_quotad_clnt_init(THIS, rpc_opts); + if (!rpc) + goto out; + + global_quotad_rpc = rpc; out: - if (ret) { - if (rpc_opts) - dict_unref(rpc_opts); - } - return rpc; + if (ret) { + if (rpc_opts) + dict_unref(rpc_opts); + } + return rpc; } struct rpc_clnt * -cli_rpc_init (struct cli_state *state) +cli_rpc_init(struct cli_state *state) { - struct rpc_clnt *rpc = NULL; - dict_t *options = NULL; - int ret = -1; - int port = CLI_GLUSTERD_PORT; - xlator_t *this = NULL; + struct rpc_clnt *rpc = NULL; + dict_t *options = NULL; + int ret = -1; + int port = CLI_GLUSTERD_PORT; + xlator_t *this = NULL; #ifdef IPV6_DEFAULT - char *addr_family = "inet6"; + char *addr_family = "inet6"; #else - char *addr_family = "inet"; + char *addr_family = "inet"; #endif - this = THIS; - cli_rpc_prog = &cli_prog; - options = dict_new (); - if (!options) - goto out; - - /* Connect to glusterd using the specified method, giving preference - * to a unix socket connection. If nothing is specified, connect to - * the default glusterd socket. - */ - if (state->glusterd_sock) { - gf_log ("cli", GF_LOG_INFO, "Connecting to glusterd using " - "sockfile %s", state->glusterd_sock); - ret = rpc_transport_unix_options_build (&options, - state->glusterd_sock, - 0); - if (ret) - goto out; - } - else if (state->remote_host) { - gf_log ("cli", GF_LOG_INFO, "Connecting to remote glusterd at " - "%s", state->remote_host); - ret = dict_set_str (options, "remote-host", state->remote_host); - if (ret) - goto out; + this = THIS; + cli_rpc_prog = &cli_prog; + options = dict_new(); + if (!options) + goto out; + + /* Connect to glusterd using the specified method, giving preference + * to a unix socket connection. If nothing is specified, connect to + * the default glusterd socket. + */ + if (state->glusterd_sock) { + gf_log("cli", GF_LOG_INFO, + "Connecting to glusterd using " + "sockfile %s", + state->glusterd_sock); + ret = rpc_transport_unix_options_build(&options, state->glusterd_sock, + 0); + if (ret) + goto out; + } else if (state->remote_host) { + gf_log("cli", GF_LOG_INFO, + "Connecting to remote glusterd at " + "%s", + state->remote_host); + ret = dict_set_str(options, "remote-host", state->remote_host); + if (ret) + goto out; - if (state->remote_port) - port = state->remote_port; + if (state->remote_port) + port = state->remote_port; - ret = dict_set_int32 (options, "remote-port", port); - if (ret) - goto out; + ret = dict_set_int32(options, "remote-port", port); + if (ret) + goto out; - ret = dict_set_str (options, "transport.address-family", - addr_family); + ret = dict_set_str(options, "transport.address-family", addr_family); - if (ret) - goto out; - } - else { - gf_log ("cli", GF_LOG_DEBUG, "Connecting to glusterd using " - "default socket"); - ret = rpc_transport_unix_options_build - (&options, DEFAULT_GLUSTERD_SOCKFILE, 0); - if (ret) - goto out; - } + if (ret) + goto out; + } else { + gf_log("cli", GF_LOG_DEBUG, + "Connecting to glusterd using " + "default socket"); + ret = rpc_transport_unix_options_build(&options, + DEFAULT_GLUSTERD_SOCKFILE, 0); + if (ret) + goto out; + } - rpc = rpc_clnt_new (options, this, this->name, 16); - if (!rpc) - goto out; + rpc = rpc_clnt_new(options, this, this->name, 16); + if (!rpc) + goto out; - ret = rpc_clnt_register_notify (rpc, cli_rpc_notify, this); - if (ret) { - gf_log ("cli", GF_LOG_ERROR, "failed to register notify"); - goto out; - } + ret = rpc_clnt_register_notify(rpc, cli_rpc_notify, this); + if (ret) { + gf_log("cli", GF_LOG_ERROR, "failed to register notify"); + goto out; + } - ret = rpc_clnt_start (rpc); + ret = rpc_clnt_start(rpc); out: - if (ret) { - if (rpc) - rpc_clnt_unref (rpc); - rpc = NULL; - } - return rpc; + if (ret) { + if (rpc) + rpc_clnt_unref(rpc); + rpc = NULL; + } + return rpc; } cli_local_t * -cli_local_get () +cli_local_get() { - cli_local_t *local = NULL; + cli_local_t *local = NULL; - local = GF_CALLOC (1, sizeof (*local), cli_mt_cli_local_t); - LOCK_INIT (&local->lock); - INIT_LIST_HEAD (&local->dict_list); + local = GF_CALLOC(1, sizeof(*local), cli_mt_cli_local_t); + LOCK_INIT(&local->lock); + INIT_LIST_HEAD(&local->dict_list); - return local; + return local; } void -cli_local_wipe (cli_local_t *local) +cli_local_wipe(cli_local_t *local) { - if (local) { - GF_FREE (local->get_vol.volname); - if (local->dict) - dict_unref (local->dict); - GF_FREE (local); - } - - return; + if (local) { + GF_FREE(local->get_vol.volname); + if (local->dict) + dict_unref(local->dict); + GF_FREE(local); + } + + return; } struct cli_state *global_state; int -main (int argc, char *argv[]) +main(int argc, char *argv[]) { - struct cli_state state = {0, }; - int ret = -1; - glusterfs_ctx_t *ctx = NULL; + struct cli_state state = { + 0, + }; + int ret = -1; + glusterfs_ctx_t *ctx = NULL; - mem_pools_init_early (); - mem_pools_init_late (); + mem_pools_init_early(); + mem_pools_init_late(); - ctx = glusterfs_ctx_new (); - if (!ctx) - return ENOMEM; + ctx = glusterfs_ctx_new(); + if (!ctx) + return ENOMEM; #ifdef DEBUG - gf_mem_acct_enable_set (ctx); + gf_mem_acct_enable_set(ctx); #endif - ret = glusterfs_globals_init (ctx); - if (ret) - return ret; + ret = glusterfs_globals_init(ctx); + if (ret) + return ret; - THIS->ctx = ctx; + THIS->ctx = ctx; - ret = glusterfs_ctx_defaults_init (ctx); - if (ret) - goto out; + ret = glusterfs_ctx_defaults_init(ctx); + if (ret) + goto out; - cli_default_conn_timeout = 120; - cli_ten_minutes_timeout = 600; + cli_default_conn_timeout = 120; + cli_ten_minutes_timeout = 600; - ret = cli_state_init (&state); - if (ret) - goto out; + ret = cli_state_init(&state); + if (ret) + goto out; - state.ctx = ctx; - global_state = &state; + state.ctx = ctx; + global_state = &state; - ret = parse_cmdline (argc, argv, &state); - if (ret) - goto out; + ret = parse_cmdline(argc, argv, &state); + if (ret) + goto out; - ret = logging_init (ctx, &state); - if (ret) - goto out; + ret = logging_init(ctx, &state); + if (ret) + goto out; - gf_log ("cli", GF_LOG_INFO, "Started running %s with version %s", - argv[0], PACKAGE_VERSION); + gf_log("cli", GF_LOG_INFO, "Started running %s with version %s", argv[0], + PACKAGE_VERSION); - global_rpc = cli_rpc_init (&state); - if (!global_rpc) - goto out; + global_rpc = cli_rpc_init(&state); + if (!global_rpc) + goto out; - global_quotad_rpc = cli_quotad_clnt_rpc_init (); - if (!global_quotad_rpc) - goto out; + global_quotad_rpc = cli_quotad_clnt_rpc_init(); + if (!global_quotad_rpc) + goto out; - ret = cli_cmds_register (&state); - if (ret) - goto out; + ret = cli_cmds_register(&state); + if (ret) + goto out; - ret = cli_cmd_cond_init (); - if (ret) - goto out; + ret = cli_cmd_cond_init(); + if (ret) + goto out; - ret = cli_input_init (&state); - if (ret) - goto out; + ret = cli_input_init(&state); + if (ret) + goto out; - ret = event_dispatch (ctx->event_pool); + ret = event_dispatch(ctx->event_pool); out: -// glusterfs_ctx_destroy (ctx); + // glusterfs_ctx_destroy (ctx); - mem_pools_fini (); + mem_pools_fini(); - return ret; + return ret; } void -cli_print_line (int len) +cli_print_line(int len) { - GF_ASSERT (len > 0); + GF_ASSERT(len > 0); - while (len--) - printf ("-"); + while (len--) + printf("-"); - printf ("\n"); + printf("\n"); } void -print_quota_list_header (int type) +print_quota_list_header(int type) { - if (type == GF_QUOTA_OPTION_TYPE_LIST) { - cli_out (" Path Hard-limit " - " Soft-limit Used Available Soft-limit " - "exceeded? Hard-limit exceeded?"); - cli_out ("-----------------------------------------------------" - "-----------------------------------------------------" - "---------------------"); - } else { - cli_out (" Path Hard-limit " - " Soft-limit Files Dirs Available " - "Soft-limit exceeded? Hard-limit exceeded?"); - cli_out ("-----------------------------------------------------" - "-----------------------------------------------------" - "-------------------------------------"); - } + if (type == GF_QUOTA_OPTION_TYPE_LIST) { + cli_out( + " Path Hard-limit " + " Soft-limit Used Available Soft-limit " + "exceeded? Hard-limit exceeded?"); + cli_out( + "-----------------------------------------------------" + "-----------------------------------------------------" + "---------------------"); + } else { + cli_out( + " Path Hard-limit " + " Soft-limit Files Dirs Available " + "Soft-limit exceeded? Hard-limit exceeded?"); + cli_out( + "-----------------------------------------------------" + "-----------------------------------------------------" + "-------------------------------------"); + } } void -print_quota_list_empty (char *path, int type) +print_quota_list_empty(char *path, int type) { - if (type == GF_QUOTA_OPTION_TYPE_LIST) - cli_out ("%-40s %7s %9s %10s %7s %15s %20s", path, - "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"); - else - cli_out ("%-40s %9s %9s %12s %10s %10s %15s %20s", path, - "N/A", "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"); + if (type == GF_QUOTA_OPTION_TYPE_LIST) + cli_out("%-40s %7s %9s %10s %7s %15s %20s", path, "N/A", "N/A", "N/A", + "N/A", "N/A", "N/A"); + else + cli_out("%-40s %9s %9s %12s %10s %10s %15s %20s", path, "N/A", "N/A", + "N/A", "N/A", "N/A", "N/A", "N/A"); } - diff --git a/cli/src/input.c b/cli/src/input.c index 10fc39cd6b4..0583f648f95 100644 --- a/cli/src/input.c +++ b/cli/src/input.c @@ -19,74 +19,72 @@ #define CMDBUFSIZ 1024 void * -cli_batch (void *d) +cli_batch(void *d) { - struct cli_state *state = NULL; - int ret = 0; + struct cli_state *state = NULL; + int ret = 0; - state = d; + state = d; - ret = cli_cmd_process (state, state->argc, state->argv); + ret = cli_cmd_process(state, state->argc, state->argv); - gf_log ("", GF_LOG_INFO, "Exiting with: %d", ret); - exit (-ret); + gf_log("", GF_LOG_INFO, "Exiting with: %d", ret); + exit(-ret); - return NULL; + return NULL; } - void * -cli_input (void *d) +cli_input(void *d) { - struct cli_state *state = NULL; - int ret = 0; - char cmdbuf[CMDBUFSIZ]; - char *cmd = NULL; - size_t len = 0; - - state = d; - - for (;;) { - printf ("%s", state->prompt); - - cmd = fgets (cmdbuf, CMDBUFSIZ, stdin); - if (!cmd) - break; - len = strlen(cmd); - if (len > 0 && cmd[len - 1] == '\n') //strip trailing \n - cmd[len - 1] = '\0'; - ret = cli_cmd_process_line (state, cmd); - if (ret != 0 && state->mode & GLUSTER_MODE_ERR_FATAL) - break; - } - - exit (-ret); - - return NULL; + struct cli_state *state = NULL; + int ret = 0; + char cmdbuf[CMDBUFSIZ]; + char *cmd = NULL; + size_t len = 0; + + state = d; + + for (;;) { + printf("%s", state->prompt); + + cmd = fgets(cmdbuf, CMDBUFSIZ, stdin); + if (!cmd) + break; + len = strlen(cmd); + if (len > 0 && cmd[len - 1] == '\n') // strip trailing \n + cmd[len - 1] = '\0'; + ret = cli_cmd_process_line(state, cmd); + if (ret != 0 && state->mode & GLUSTER_MODE_ERR_FATAL) + break; + } + + exit(-ret); + + return NULL; } - int -cli_input_init (struct cli_state *state) +cli_input_init(struct cli_state *state) { - int ret = 0; + int ret = 0; - if (state->argc) { - ret = pthread_create (&state->input, NULL, cli_batch, state); - return ret; - } + if (state->argc) { + ret = pthread_create(&state->input, NULL, cli_batch, state); + return ret; + } - if (isatty (STDIN_FILENO)) { - state->prompt = "gluster> "; + if (isatty(STDIN_FILENO)) { + state->prompt = "gluster> "; - cli_rl_enable (state); - } else { - state->prompt = ""; - state->mode |= GLUSTER_MODE_SCRIPT | GLUSTER_MODE_ERR_FATAL; - } + cli_rl_enable(state); + } else { + state->prompt = ""; + state->mode |= GLUSTER_MODE_SCRIPT | GLUSTER_MODE_ERR_FATAL; + } - if (!state->rl_enabled) - ret = pthread_create (&state->input, NULL, cli_input, state); + if (!state->rl_enabled) + ret = pthread_create(&state->input, NULL, cli_input, state); - return ret; + return ret; } diff --git a/cli/src/registry.c b/cli/src/registry.c index 1adf7d6e572..85f7686ade1 100644 --- a/cli/src/registry.c +++ b/cli/src/registry.c @@ -15,20 +15,18 @@ #include "cli.h" #include "cli-cmd.h" - static int -__is_spc (int ch) +__is_spc(int ch) { - if (ch == ' ') - return 1; - return 0; + if (ch == ' ') + return 1; + return 0; } - static int -__is_div (int ch) +__is_div(int ch) { - switch (ch) { + switch (ch) { case '(': case ')': case '<': @@ -38,369 +36,356 @@ __is_div (int ch) case '{': case '}': case '|': - return 1; - } + return 1; + } - return 0; + return 0; } - static int -__is_word (const char *word) +__is_word(const char *word) { - return (!__is_div (*word) && !__is_spc (*word)); + return (!__is_div(*word) && !__is_spc(*word)); } - int -counter_char (int ch) +counter_char(int ch) { - switch (ch) { + switch (ch) { case '(': - return ')'; + return ')'; case '<': - return '>'; + return '>'; case '[': - return ']'; + return ']'; case '{': - return '}'; - } + return '}'; + } - return -1; + return -1; } - const char * -__is_template_balanced (const char *template) +__is_template_balanced(const char *template) { - const char *trav = NULL; - int ch = 0; - - trav = template; - - while (*trav) { - ch = *trav; - - switch (ch) { - case '<': - case '(': - case '[': - trav = __is_template_balanced (trav+1); - if (!trav) - return NULL; - if (*trav != counter_char (ch)) - return NULL; - break; - case '>': - case ')': - case ']': - return trav; - } + const char *trav = NULL; + int ch = 0; - trav++; + trav = template; + + while (*trav) { + ch = *trav; + + switch (ch) { + case '<': + case '(': + case '[': + trav = __is_template_balanced(trav + 1); + if (!trav) + return NULL; + if (*trav != counter_char(ch)) + return NULL; + break; + case '>': + case ')': + case ']': + return trav; } - return trav; -} + trav++; + } + return trav; +} int -is_template_balanced (const char *template) +is_template_balanced(const char *template) { - const char *trav = NULL; + const char *trav = NULL; - trav = __is_template_balanced (template); - if (!trav || *trav) - return -1; + trav = __is_template_balanced(template); + if (!trav || *trav) + return -1; - return 0; + return 0; } - int -cli_cmd_token_count (const char *template) +cli_cmd_token_count(const char *template) { - int count = 0; - const char *trav = NULL; - int is_alnum = 0; - - for (trav = template; *trav; trav++) { - switch (*trav) { - case '<': - case '>': - case '(': - case ')': - case '[': - case ']': - case '{': - case '}': - case '|': - count++; - /* fall through */ - case ' ': - is_alnum = 0; - break; - default: - if (!is_alnum) { - is_alnum = 1; - count++; - } + int count = 0; + const char *trav = NULL; + int is_alnum = 0; + + for (trav = template; *trav; trav++) { + switch (*trav) { + case '<': + case '>': + case '(': + case ')': + case '[': + case ']': + case '{': + case '}': + case '|': + count++; + /* fall through */ + case ' ': + is_alnum = 0; + break; + default: + if (!is_alnum) { + is_alnum = 1; + count++; } } + } - return count + 1; + return count + 1; } - void -cli_cmd_tokens_destroy (char **tokens) +cli_cmd_tokens_destroy(char **tokens) { - char **tokenp = NULL; + char **tokenp = NULL; - if (!tokens) - return; + if (!tokens) + return; - tokenp = tokens; - while (*tokenp) { - free (*tokenp); - tokenp++; - } + tokenp = tokens; + while (*tokenp) { + free(*tokenp); + tokenp++; + } - free (tokens); + free(tokens); } - int -cli_cmd_tokens_fill (char **tokens, const char *template) +cli_cmd_tokens_fill(char **tokens, const char *template) { - const char *trav = NULL; - char **tokenp = NULL; - char *token = NULL; - int ret = 0; - int ch = 0; + const char *trav = NULL; + char **tokenp = NULL; + char *token = NULL; + int ret = 0; + int ch = 0; - tokenp = tokens; + tokenp = tokens; - for (trav = template; *trav; trav++) { - ch = *trav; + for (trav = template; *trav; trav++) { + ch = *trav; - if (__is_spc (ch)) - continue; + if (__is_spc(ch)) + continue; - if (__is_div (ch)) { - token = calloc (2, 1); - if (!token) - return -1; - token[0] = ch; + if (__is_div(ch)) { + token = calloc(2, 1); + if (!token) + return -1; + token[0] = ch; - *tokenp = token; - tokenp++; + *tokenp = token; + tokenp++; - continue; - } + continue; + } - token = strdup (trav); - *tokenp = token; - tokenp++; + token = strdup(trav); + *tokenp = token; + tokenp++; - for (token++; *token; token++) { - if (__is_spc (*token) || __is_div (*token)) { - *token = 0; - break; - } - trav++; - } + for (token++; *token; token++) { + if (__is_spc(*token) || __is_div(*token)) { + *token = 0; + break; + } + trav++; } + } - return ret; + return ret; } - char ** -cli_cmd_tokenize (const char *template) +cli_cmd_tokenize(const char *template) { - char **tokens = NULL; - int ret = 0; - int count = 0; + char **tokens = NULL; + int ret = 0; + int count = 0; - ret = is_template_balanced (template); - if (ret) - return NULL; + ret = is_template_balanced(template); + if (ret) + return NULL; - count = cli_cmd_token_count (template); - if (count <= 0) - return NULL; + count = cli_cmd_token_count(template); + if (count <= 0) + return NULL; - tokens = calloc (count + 1, sizeof (char *)); - if (!tokens) - return NULL; + tokens = calloc(count + 1, sizeof(char *)); + if (!tokens) + return NULL; - ret = cli_cmd_tokens_fill (tokens, template); - if (ret) - goto err; + ret = cli_cmd_tokens_fill(tokens, template); + if (ret) + goto err; - return tokens; + return tokens; err: - cli_cmd_tokens_destroy (tokens); - return NULL; + cli_cmd_tokens_destroy(tokens); + return NULL; } void * -cli_getunamb (const char *tok, void **choices, cli_selector_t sel) +cli_getunamb(const char *tok, void **choices, cli_selector_t sel) { - void **wcon = NULL; - char *w = NULL; - unsigned mn = 0; - void *ret = NULL; - - if (!choices || !tok || !*tok) - return NULL; - - for (wcon = choices; *wcon; wcon++) { - w = strtail ((char *)sel (*wcon), tok); - if (!w) - /* no match */ - continue; - if (!*w) - /* exact match */ - return *wcon; - - ret = *wcon; - mn++; - } + void **wcon = NULL; + char *w = NULL; + unsigned mn = 0; + void *ret = NULL; -#ifdef FORCE_MATCH_EXACT + if (!choices || !tok || !*tok) return NULL; + + for (wcon = choices; *wcon; wcon++) { + w = strtail((char *)sel(*wcon), tok); + if (!w) + /* no match */ + continue; + if (!*w) + /* exact match */ + return *wcon; + + ret = *wcon; + mn++; + } + +#ifdef FORCE_MATCH_EXACT + return NULL; #else - return (mn == 1) ? ret : NULL; + return (mn == 1) ? ret : NULL; #endif } static const char * -sel_cmd_word (void *wcon) +sel_cmd_word(void *wcon) { - return ((struct cli_cmd_word *)wcon)->word; + return ((struct cli_cmd_word *)wcon)->word; } struct cli_cmd_word * -cli_cmd_nextword (struct cli_cmd_word *word, const char *token) +cli_cmd_nextword(struct cli_cmd_word *word, const char *token) { - return (struct cli_cmd_word *)cli_getunamb (token, - (void **)word->nextwords, - sel_cmd_word); + return (struct cli_cmd_word *)cli_getunamb(token, (void **)word->nextwords, + sel_cmd_word); } - struct cli_cmd_word * -cli_cmd_newword (struct cli_cmd_word *word, const char *token) +cli_cmd_newword(struct cli_cmd_word *word, const char *token) { - struct cli_cmd_word **nextwords = NULL; - struct cli_cmd_word *nextword = NULL; + struct cli_cmd_word **nextwords = NULL; + struct cli_cmd_word *nextword = NULL; - nextwords = realloc (word->nextwords, - (word->nextwords_cnt + 2) * sizeof (*nextwords)); - if (!nextwords) - return NULL; + nextwords = realloc(word->nextwords, + (word->nextwords_cnt + 2) * sizeof(*nextwords)); + if (!nextwords) + return NULL; - word->nextwords = nextwords; + word->nextwords = nextwords; - nextword = calloc (1, sizeof (*nextword)); - if (!nextword) - return NULL; + nextword = calloc(1, sizeof(*nextword)); + if (!nextword) + return NULL; - nextword->word = strdup (token); - if (!nextword->word) { - free (nextword); - return NULL; - } + nextword->word = strdup(token); + if (!nextword->word) { + free(nextword); + return NULL; + } - nextword->tree = word->tree; - nextwords[word->nextwords_cnt++] = nextword; - nextwords[word->nextwords_cnt] = NULL; + nextword->tree = word->tree; + nextwords[word->nextwords_cnt++] = nextword; + nextwords[word->nextwords_cnt] = NULL; - return nextword; + return nextword; } - int -cli_cmd_ingest (struct cli_cmd_tree *tree, char **tokens, cli_cmd_cbk_t *cbkfn, - const char *desc, const char *pattern) +cli_cmd_ingest(struct cli_cmd_tree *tree, char **tokens, cli_cmd_cbk_t *cbkfn, + const char *desc, const char *pattern) { - int ret = 0; - char **tokenp = NULL; - char *token = NULL; - struct cli_cmd_word *word = NULL; - struct cli_cmd_word *next = NULL; - - word = &tree->root; + int ret = 0; + char **tokenp = NULL; + char *token = NULL; + struct cli_cmd_word *word = NULL; + struct cli_cmd_word *next = NULL; - for (tokenp = tokens; (token = *tokenp); tokenp++) { - if (!__is_word (token)) - break; + word = &tree->root; - next = cli_cmd_nextword (word, token); - if (!next) - next = cli_cmd_newword (word, token); + for (tokenp = tokens; (token = *tokenp); tokenp++) { + if (!__is_word(token)) + break; - word = next; - if (!word) - break; - } + next = cli_cmd_nextword(word, token); + if (!next) + next = cli_cmd_newword(word, token); + word = next; if (!word) - return -1; + break; + } - if (word->cbkfn) { - /* warning - command already registered */ - } + if (!word) + return -1; - word->cbkfn = cbkfn; - word->desc = desc; - word->pattern = pattern; + if (word->cbkfn) { + /* warning - command already registered */ + } - /* end of static strings in command template */ + word->cbkfn = cbkfn; + word->desc = desc; + word->pattern = pattern; - /* TODO: autocompletion beyond this point is just "nice to have" */ + /* end of static strings in command template */ - return ret; -} + /* TODO: autocompletion beyond this point is just "nice to have" */ + return ret; +} int -cli_cmd_register (struct cli_cmd_tree *tree, struct cli_cmd *cmd) +cli_cmd_register(struct cli_cmd_tree *tree, struct cli_cmd *cmd) { - char **tokens = NULL; - int ret = 0; + char **tokens = NULL; + int ret = 0; - GF_ASSERT (cmd); + GF_ASSERT(cmd); - if (cmd->reg_cbk) - cmd->reg_cbk (cmd); + if (cmd->reg_cbk) + cmd->reg_cbk(cmd); - if (cmd->disable) { - ret = 0; - goto out; - } + if (cmd->disable) { + ret = 0; + goto out; + } - tokens = cli_cmd_tokenize (cmd->pattern); - if (!tokens) { - ret = -1; - goto out; - } + tokens = cli_cmd_tokenize(cmd->pattern); + if (!tokens) { + ret = -1; + goto out; + } - ret = cli_cmd_ingest (tree, tokens, cmd->cbk, cmd->desc, cmd->pattern); - if (ret) { - ret = -1; - goto out; - } + ret = cli_cmd_ingest(tree, tokens, cmd->cbk, cmd->desc, cmd->pattern); + if (ret) { + ret = -1; + goto out; + } - ret = 0; + ret = 0; out: - if (tokens) - cli_cmd_tokens_destroy (tokens); + if (tokens) + cli_cmd_tokens_destroy(tokens); - gf_log ("cli", GF_LOG_DEBUG, "Returning %d", ret); - return ret; + gf_log("cli", GF_LOG_DEBUG, "Returning %d", ret); + return ret; } - |