summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaushal M <kaushal@redhat.com>2012-02-01 14:44:07 +0530
committerVijay Bellur <vijay@gluster.com>2012-02-17 00:57:02 -0800
commit489a7a10fe2e00d00d86f0304145a4910bb94070 (patch)
tree1e2c28f5e124ae781a1c6dbbb3b33f3ad3d77ee8
parent7fa06c4ce1a44bbd89d3798193f173c057533bb6 (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.c16
-rw-r--r--libglusterfs/src/statedump.c12
2 files changed, 13 insertions, 15 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c
index b169b77c6..090a72469 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 8c6fe9215..3811ef692 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;