diff options
author | Kaushal M <kaushal@redhat.com> | 2012-02-01 14:44:07 +0530 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2012-02-17 00:57:02 -0800 |
commit | 489a7a10fe2e00d00d86f0304145a4910bb94070 (patch) | |
tree | 1e2c28f5e124ae781a1c6dbbb3b33f3ad3d77ee8 | |
parent | 7fa06c4ce1a44bbd89d3798193f173c057533bb6 (diff) |
cli: Fix for statedump crashing gluster processes
1. Fixes the bug in statedump causing the gluster process to crash when an unknown
option was given in the 'glusterdump.*.options' file.
2. Also fixes cli, making it send full statedump option strings even when only
partial option strings are given in 'volume statedump' command.
3. Minor change to order of operations during statedump to allow option parsing
errors to be written to the dump file.
Change-Id: Ic878cbca4dbf46b83fba0fd88fcb3c03f05ae46d
BUG: 772586
Signed-off-by: Kaushal M <kaushal@redhat.com>
Reviewed-on: http://review.gluster.com/2706
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Vijay Bellur <vijay@gluster.com>
-rw-r--r-- | cli/src/cli-cmd-parser.c | 16 | ||||
-rw-r--r-- | libglusterfs/src/statedump.c | 12 |
2 files changed, 13 insertions, 15 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index b169b77c68d..090a7246913 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -1976,18 +1976,19 @@ cli_cmd_volume_status_parse (const char **words, int wordcount, } gf_boolean_t -cli_cmd_validate_dumpoption (const char *option) +cli_cmd_validate_dumpoption (const char *arg, char **option) { char *opwords[] = {"all", "nfs", "mem", "iobuf", "callpool", "priv", - "fd", "inode", NULL}; + "fd", "inode", NULL}; char *w = NULL; - w = str_getunamb (option, opwords); + w = str_getunamb (arg, opwords); if (!w) { gf_log ("cli", GF_LOG_DEBUG, "Unknown statedump option %s", - option); + arg); return _gf_false; } + *option = w; return _gf_true; } @@ -1999,14 +2000,15 @@ cli_cmd_volume_statedump_options_parse (const char **words, int wordcount, int i = 0; dict_t *dict = NULL; int option_cnt = 0; + char *option = NULL; char option_str[100] = {0,}; for (i = 3; i < wordcount; i++, option_cnt++) { - if (!cli_cmd_validate_dumpoption (words[i])) { + if (!cli_cmd_validate_dumpoption (words[i], &option)) { ret = -1; goto out; } - strncat (option_str, words[i], sizeof (words [i])); + strncat (option_str, option, strlen (option)); strncat (option_str, " ", 1); } @@ -2014,7 +2016,7 @@ cli_cmd_volume_statedump_options_parse (const char **words, int wordcount, if (!dict) goto out; - ret = dict_set_str (dict, "options", gf_strdup (option_str)); + ret = dict_set_dynstr (dict, "options", gf_strdup (option_str)); if (ret) goto out; diff --git a/libglusterfs/src/statedump.c b/libglusterfs/src/statedump.c index 8c6fe92158d..3811ef69234 100644 --- a/libglusterfs/src/statedump.c +++ b/libglusterfs/src/statedump.c @@ -529,12 +529,8 @@ gf_proc_dump_parse_set_option (char *key, char *value) "matched key : %s\n", key); ret = write (gf_dump_fd, buf, strlen (buf)); - /* warning suppression */ - if (ret >= 0) { - ret = -1; - goto out; - } - + ret = -1; + goto out; } opt_value = (strncasecmp (value, "yes", 3) ? @@ -618,11 +614,11 @@ gf_proc_dump_info (int signum) } else strncpy (brick_name, "glusterdump", sizeof (brick_name)); - ret = gf_proc_dump_options_init (brick_name); + ret = gf_proc_dump_open (ctx->statedump_path, brick_name); if (ret < 0) goto out; - ret = gf_proc_dump_open (ctx->statedump_path, brick_name); + ret = gf_proc_dump_options_init (brick_name); if (ret < 0) goto out; |