Blob Blame History Raw
From 66aeea6bcf367f936ca0c8ad7f1b56d239fe68f7 Mon Sep 17 00:00:00 2001
From: Kotresh HR <khiremat@redhat.com>
Date: Mon, 15 Jun 2015 17:20:46 +0530
Subject: [PATCH 103/129] 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.

BUG: 1230646
Change-Id: Ibd83816a9b48de8c25a07cdd9a813d930fd01950
Signed-off-by: Kotresh HR <khiremat@redhat.com>
Reviewed-on: http://review.gluster.org/11233
Reviewed-on: http://review.gluster.org/11310
Reviewed-on: https://code.engineering.redhat.com/gerrit/51070
Reviewed-by: Krishnan Parthasarathi <kparthas@redhat.com>
Tested-by: Krishnan Parthasarathi <kparthas@redhat.com>
---
 cli/src/cli-cmd-parser.c                           |   22 ++++++++++++++++++-
 .../mgmt/glusterd/src/glusterd-snapshot-utils.c    |   17 ++++++++++++++-
 2 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c
index 917be53..a506c9b 100644
--- a/cli/src/cli-cmd-parser.c
+++ b/cli/src/cli-cmd-parser.c
@@ -2426,6 +2426,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);
@@ -2582,14 +2585,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);
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
index 6e4b363..8e17e44 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
@@ -3245,8 +3245,11 @@ glusterd_get_geo_rep_session (char *slave_key, char *origin_volname,
 {
         int32_t         ret             =       -1;
         char            *token          =       NULL;
+        char            *tok            =       NULL;
         char            *temp           =       NULL;
         char            *ip             =       NULL;
+        char            *ip_i           =       NULL;
+        char            *ip_temp        =       NULL;
         char            *buffer         =       NULL;
         xlator_t        *this           =       NULL;
         char            *slave_temp     =       NULL;
@@ -3287,6 +3290,7 @@ glusterd_get_geo_rep_session (char *slave_key, char *origin_volname,
                 ret = -1;
                 goto out;
         }
+        ip_i = ip;
 
         token = strtok_r (NULL, "\0", &save_ptr);
         if (!token) {
@@ -3301,8 +3305,16 @@ glusterd_get_geo_rep_session (char *slave_key, char *origin_volname,
                 goto out;
         }
 
+        /* If 'ip' has 'root@slavehost', point to 'slavehost' as
+         * working directory for root users are created without
+         * 'root@' */
+        ip_temp = gf_strdup (ip);
+        tok = strtok_r (ip_temp, "@", &save_ptr);
+        if (tok && !strcmp (tok, "root"))
+                ip_i = ip + 5;
+
         ret = snprintf (session, PATH_MAX, "%s_%s_%s",
-                        origin_volname, ip, slave_temp);
+                        origin_volname, ip_i, slave_temp);
         if (ret < 0) /* Negative value is an error */
                 goto out;
 
@@ -3320,6 +3332,9 @@ out:
         if (ip)
                 GF_FREE (ip);
 
+        if (ip_temp)
+                GF_FREE (ip_temp);
+
         if (slave_temp)
                 GF_FREE (slave_temp);
 
-- 
1.7.1