diff options
author | Kotresh HR <khiremat@redhat.com> | 2015-06-15 17:20:46 +0530 |
---|---|---|
committer | Krishnan Parthasarathi <kparthas@redhat.com> | 2015-06-17 23:58:42 -0700 |
commit | daf22a3b59f42c897f345dab74c3852ddf9bddef (patch) | |
tree | 4a20356e095246048181e243b031d7f67f5463ea /cli | |
parent | ba7d5d914b2c897aef0616f3d95beb4d17bc51a8 (diff) |
glusterd: Fix snapshot of a volume with geo-rep
Problem:
Snapshot fails for a volume configured with geo-rep
if geo-rep is created with root user with the following
syntax.
gluster vol geo-rep <master_vol> root@<slave_host>::<slave_vol>
It works fine if created with following syntax.
gluster vol geo-rep <master_vol> <slave_host>::<slave_vol>
Cause:
Geo-rep maintains persistent dictionary of slave associated
with master volume. The dictionary saves the slave info
along with 'root@' as sent from cli.
Snapshot while constructing the working dir path to copy
configuration files, constructs using this dictionary.
But the actual working dir is created with out considering
'root@'. Hence the issue.
Fix:
Fix is done at two layers.
1. Parse and negelect 'root@' in cli itself.
2. For existing geo-rep sessions and upgrade scenarios,
parse and neglect 'root@' in snapshot code as well.
Change-Id: If4e04f7f776ef71df4dd1e7e053ef75db98762b2
BUG: 1231789
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Reviewed-on: http://review.gluster.org/11233
Reviewed-by: Avra Sengupta <asengupt@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
Diffstat (limited to 'cli')
-rw-r--r-- | cli/src/cli-cmd-parser.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index f0f428a795b..a243a3542e9 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -2422,6 +2422,9 @@ cli_cmd_gsync_set_parse (const char **words, int wordcount, dict_t **options) "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); @@ -2578,14 +2581,29 @@ cli_cmd_gsync_set_parse (const char **words, int wordcount, dict_t **options) ret = dict_set_str (dict, "volname", (char *)words[masteri]); } - if (!ret && slavei) - ret = dict_set_str (dict, "slave", (char *)words[slavei]); + 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]); + 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_destroy (dict); |