50dc83
From b1a4947e382c5e2ba1137ed606ecffc69fcf00e9 Mon Sep 17 00:00:00 2001
50dc83
From: Mohit Agrawal <moagrawa@redhat.com>
50dc83
Date: Tue, 25 Jun 2019 17:30:17 +0530
50dc83
Subject: [PATCH 205/221] glusterd: Can't run rebalance due to long unix socket
50dc83
50dc83
Problem: glusterd populate unix socket file name based
50dc83
         on volname and if volname is lengthy socket
50dc83
         system call's are failed due to breach maximum length
50dc83
         is defined in the kernel.
50dc83
50dc83
Solution:Convert unix socket name to hash to resolve the issue
50dc83
50dc83
> Change-Id: I5072e8184013095587537dbfa4767286307fff65
50dc83
> fixes: bz#1720566
50dc83
> (Cherry pick from commit 2d7b77eb971700c1073db2b74f5877c1ae8293fc)
50dc83
> (Reviewed on upstream link https://review.gluster.org/#/c/glusterfs/+/22869/)
50dc83
50dc83
BUG: 1720192
50dc83
Change-Id: I5072e8184013095587537dbfa4767286307fff65
50dc83
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
50dc83
Reviewed-on: https://code.engineering.redhat.com/gerrit/174557
50dc83
Tested-by: RHGS Build Bot <nigelb@redhat.com>
50dc83
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
50dc83
---
50dc83
 tests/bugs/glusterd/bug-1720566.t              | 50 ++++++++++++++++++++++++++
50dc83
 xlators/mgmt/glusterd/src/glusterd-rebalance.c | 38 +-------------------
50dc83
 xlators/mgmt/glusterd/src/glusterd.h           | 23 +++++-------
50dc83
 3 files changed, 59 insertions(+), 52 deletions(-)
50dc83
 create mode 100644 tests/bugs/glusterd/bug-1720566.t
50dc83
50dc83
diff --git a/tests/bugs/glusterd/bug-1720566.t b/tests/bugs/glusterd/bug-1720566.t
50dc83
new file mode 100644
50dc83
index 0000000..99bcf6f
50dc83
--- /dev/null
50dc83
+++ b/tests/bugs/glusterd/bug-1720566.t
50dc83
@@ -0,0 +1,50 @@
50dc83
+#!/bin/bash
50dc83
+
50dc83
+. $(dirname $0)/../../include.rc
50dc83
+. $(dirname $0)/../../cluster.rc
50dc83
+. $(dirname $0)/../../volume.rc
50dc83
+
50dc83
+
50dc83
+cleanup;
50dc83
+V0="TestLongVolnamec363b7b536700ff06eedeae0dd9037fec363b7b536700ff06eedeae0dd9037fec363b7b536700ff06eedeae0dd9abcd"
50dc83
+V1="TestLongVolname3102bd28a16c49440bd5210e4ec4d5d93102bd28a16c49440bd5210e4ec4d5d933102bd28a16c49440bd5210e4ebbcd"
50dc83
+TEST launch_cluster 2;
50dc83
+TEST $CLI_1 peer probe $H2;
50dc83
+
50dc83
+EXPECT_WITHIN $PROBE_TIMEOUT 1 peer_count
50dc83
+
50dc83
+$CLI_1 volume create $V0 $H1:$B1/$V0  $H2:$B2/$V0
50dc83
+EXPECT 'Created' cluster_volinfo_field 1 $V0 'Status';
50dc83
+$CLI_1 volume create $V1 $H1:$B1/$V1  $H2:$B2/$V1
50dc83
+EXPECT 'Created' cluster_volinfo_field 1 $V1 'Status';
50dc83
+
50dc83
+$CLI_1 volume start $V0
50dc83
+EXPECT 'Started' cluster_volinfo_field 1 $V0 'Status';
50dc83
+
50dc83
+$CLI_1 volume start $V1
50dc83
+EXPECT 'Started' cluster_volinfo_field 1 $V1 'Status';
50dc83
+
50dc83
+#Mount FUSE
50dc83
+TEST glusterfs -s $H1 --volfile-id=$V0 $M0;
50dc83
+
50dc83
+
50dc83
+#Mount FUSE
50dc83
+TEST glusterfs -s $H1 --volfile-id=$V1 $M1;
50dc83
+
50dc83
+TEST mkdir $M0/dir{1..4};
50dc83
+TEST touch $M0/dir{1..4}/files{1..4};
50dc83
+
50dc83
+TEST mkdir $M1/dir{1..4};
50dc83
+TEST touch $M1/dir{1..4}/files{1..4};
50dc83
+
50dc83
+TEST $CLI_1 volume add-brick $V0 $H1:$B1/${V0}_1 $H2:$B2/${V0}_1
50dc83
+TEST $CLI_1 volume add-brick $V1 $H1:$B1/${V1}_1 $H2:$B2/${V1}_1
50dc83
+
50dc83
+
50dc83
+TEST $CLI_1 volume rebalance $V0 start
50dc83
+TEST $CLI_1 volume rebalance $V1  start
50dc83
+
50dc83
+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 1 $V0
50dc83
+EXPECT_WITHIN $REBALANCE_TIMEOUT "completed" cluster_rebalance_status_field 1  $V1
50dc83
+
50dc83
+cleanup;
50dc83
diff --git a/xlators/mgmt/glusterd/src/glusterd-rebalance.c b/xlators/mgmt/glusterd/src/glusterd-rebalance.c
50dc83
index cbed9a9..b419a89 100644
50dc83
--- a/xlators/mgmt/glusterd/src/glusterd-rebalance.c
50dc83
+++ b/xlators/mgmt/glusterd/src/glusterd-rebalance.c
50dc83
@@ -266,18 +266,7 @@ glusterd_handle_defrag_start(glusterd_volinfo_t *volinfo, char *op_errstr,
50dc83
 
50dc83
     if (dict_get_strn(this->options, "transport.socket.bind-address",
50dc83
                       SLEN("transport.socket.bind-address"),
50dc83
-                      &volfileserver) == 0) {
50dc83
-        /*In the case of running multiple glusterds on a single machine,
50dc83
-         *we should ensure that log file and unix socket file should be
50dc83
-         *unique in given cluster */
50dc83
-
50dc83
-        GLUSTERD_GET_DEFRAG_SOCK_FILE_OLD(sockfile, volinfo, priv);
50dc83
-        snprintf(logfile, PATH_MAX, "%s/%s-%s-%s.log",
50dc83
-                 DEFAULT_LOG_FILE_DIRECTORY, volinfo->volname,
50dc83
-                 (cmd == GF_DEFRAG_CMD_START_TIER ? "tier" : "rebalance"),
50dc83
-                 uuid_utoa(MY_UUID));
50dc83
-
50dc83
-    } else {
50dc83
+                      &volfileserver) != 0) {
50dc83
         volfileserver = "localhost";
50dc83
     }
50dc83
 
50dc83
@@ -378,9 +367,6 @@ glusterd_rebalance_rpc_create(glusterd_volinfo_t *volinfo)
50dc83
     glusterd_defrag_info_t *defrag = volinfo->rebal.defrag;
50dc83
     glusterd_conf_t *priv = NULL;
50dc83
     xlator_t *this = NULL;
50dc83
-    struct stat buf = {
50dc83
-        0,
50dc83
-    };
50dc83
 
50dc83
     this = THIS;
50dc83
     GF_ASSERT(this);
50dc83
@@ -396,28 +382,6 @@ glusterd_rebalance_rpc_create(glusterd_volinfo_t *volinfo)
50dc83
         goto out;
50dc83
 
50dc83
     GLUSTERD_GET_DEFRAG_SOCK_FILE(sockfile, volinfo);
50dc83
-    /* Check if defrag sockfile exists in the new location
50dc83
-     * in /var/run/ , if it does not try the old location
50dc83
-     */
50dc83
-    ret = sys_stat(sockfile, &buf;;
50dc83
-    /* TODO: Remove this once we don't need backward compatibility
50dc83
-     * with the older path
50dc83
-     */
50dc83
-    if (ret && (errno == ENOENT)) {
50dc83
-        gf_msg(this->name, GF_LOG_WARNING, errno, GD_MSG_FILE_OP_FAILED,
50dc83
-               "Rebalance sockfile "
50dc83
-               "%s does not exist. Trying old path.",
50dc83
-               sockfile);
50dc83
-        GLUSTERD_GET_DEFRAG_SOCK_FILE_OLD(sockfile, volinfo, priv);
50dc83
-        ret = sys_stat(sockfile, &buf;;
50dc83
-        if (ret && (ENOENT == errno)) {
50dc83
-            gf_msg(this->name, GF_LOG_ERROR, 0, GD_MSG_REBAL_NO_SOCK_FILE,
50dc83
-                   "Rebalance "
50dc83
-                   "sockfile %s does not exist",
50dc83
-                   sockfile);
50dc83
-            goto out;
50dc83
-        }
50dc83
-    }
50dc83
 
50dc83
     /* Setting frame-timeout to 10mins (600seconds).
50dc83
      * Unix domain sockets ensures that the connection is reliable. The
50dc83
diff --git a/xlators/mgmt/glusterd/src/glusterd.h b/xlators/mgmt/glusterd/src/glusterd.h
50dc83
index f96bca3..7d07d33 100644
50dc83
--- a/xlators/mgmt/glusterd/src/glusterd.h
50dc83
+++ b/xlators/mgmt/glusterd/src/glusterd.h
50dc83
@@ -910,30 +910,23 @@ typedef ssize_t (*gd_serialize_t)(struct iovec outmsg, void *args);
50dc83
         }                                                                      \
50dc83
     } while (0)
50dc83
 
50dc83
-#define GLUSTERD_GET_DEFRAG_SOCK_FILE_OLD(path, volinfo, priv)                 \
50dc83
-    do {                                                                       \
50dc83
-        char defrag_path[PATH_MAX];                                            \
50dc83
-        int32_t _sockfile_old_len;                                             \
50dc83
-        GLUSTERD_GET_DEFRAG_DIR(defrag_path, volinfo, priv);                   \
50dc83
-        _sockfile_old_len = snprintf(path, PATH_MAX, "%s/%s.sock",             \
50dc83
-                                     defrag_path, uuid_utoa(MY_UUID));         \
50dc83
-        if ((_sockfile_old_len < 0) || (_sockfile_old_len >= PATH_MAX)) {      \
50dc83
-            path[0] = 0;                                                       \
50dc83
-        }                                                                      \
50dc83
-    } while (0)
50dc83
-
50dc83
 #define GLUSTERD_GET_DEFRAG_SOCK_FILE(path, volinfo)                           \
50dc83
     do {                                                                       \
50dc83
         char operation[NAME_MAX];                                              \
50dc83
+        char tmppath[PATH_MAX] = {                                             \
50dc83
+            0,                                                                 \
50dc83
+        };                                                                     \
50dc83
         int32_t _defrag_sockfile_len;                                          \
50dc83
         GLUSTERD_GET_DEFRAG_PROCESS(operation, volinfo);                       \
50dc83
         _defrag_sockfile_len = snprintf(                                       \
50dc83
-            path, UNIX_PATH_MAX,                                               \
50dc83
-            DEFAULT_VAR_RUN_DIRECTORY "/gluster-%s-%s.sock", operation,        \
50dc83
-            uuid_utoa(volinfo->volume_id));                                    \
50dc83
+            tmppath, PATH_MAX,                                                 \
50dc83
+            DEFAULT_VAR_RUN_DIRECTORY "/gluster-%s-%s-%s.sock", operation,     \
50dc83
+            volinfo->volname, uuid_utoa(MY_UUID));                             \
50dc83
         if ((_defrag_sockfile_len < 0) ||                                      \
50dc83
             (_defrag_sockfile_len >= PATH_MAX)) {                              \
50dc83
             path[0] = 0;                                                       \
50dc83
+        } else {                                                               \
50dc83
+            glusterd_set_socket_filepath(tmppath, path, sizeof(path));         \
50dc83
         }                                                                      \
50dc83
     } while (0)
50dc83
 
50dc83
-- 
50dc83
1.8.3.1
50dc83