From 84479bfa28f91c993b4e4a1f0f259a3ae1576791 Mon Sep 17 00:00:00 2001 From: Kotresh HR Date: Mon, 15 Jun 2015 17:20:46 +0530 Subject: 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 root@:: It works fine if created with following syntax. gluster vol geo-rep :: 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. BUG: 1233056 Change-Id: Ic666e43a1c4ac2f3f0fb957caa77770e1eee4129 Signed-off-by: Kotresh HR Reviewed-on: http://review.gluster.org/11233 Reviewed-on: http://review.gluster.org/11310 Tested-by: Gluster Build System Reviewed-by: Krishnan Parthasarathi --- cli/src/cli-cmd-parser.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'cli') diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index e72b8a36b6b..aec5384bd01 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -2427,6 +2427,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); @@ -2583,14 +2586,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 root@ ... + * pass down only 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); -- cgit