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