Blob Blame History Raw
From 7aefe6fa80cfb59d891831b8a1cb0f0055ea2801 Mon Sep 17 00:00:00 2001
From: Gaurav Yadav <gyadav@redhat.com>
Date: Fri, 27 Oct 2017 16:04:46 +0530
Subject: [PATCH 631/631] glusterd: persist brickinfo's port change into
 glusterd's store

Problem:
Consider a case where node reboot is performed and prior to reboot
brick was listening to 49153. Post reboot glusterd assigned 49152
to brick and started the brick process but the new port was never
persisted. Now when glusterd restarts glusterd always read the port
from its persisted store i.e 49153 however pmap signin happens with
the correct port i.e 49152.

Fix:
Make sure when glusterd_brick_start is called, glusterd_store_volinfo is
eventually invoked.

>upstream mainline patch : https://review.gluster.org/#/c/18579/

Change-Id: Ic0efbd48c51d39729ed951a42922d0e59f7115a1
BUG: 1505433
Signed-off-by: Gaurav Yadav <gyadav@redhat.com>
Reviewed-on: https://code.engineering.redhat.com/gerrit/121878
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Tested-by: Atin Mukherjee <amukherj@redhat.com>
Tested-by: RHGS Build Bot <nigelb@redhat.com>
---
 xlators/mgmt/glusterd/src/glusterd-handshake.c      | 18 +++++++++---------
 xlators/mgmt/glusterd/src/glusterd-op-sm.c          |  9 ++++++++-
 xlators/mgmt/glusterd/src/glusterd-server-quorum.c  | 16 ++++++++++++++++
 xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c | 10 ++++++++++
 xlators/mgmt/glusterd/src/glusterd-utils.c          | 19 +++++++++++++++++++
 5 files changed, 62 insertions(+), 10 deletions(-)

diff --git a/xlators/mgmt/glusterd/src/glusterd-handshake.c b/xlators/mgmt/glusterd/src/glusterd-handshake.c
index 0cd1a29f4..a09437e82 100644
--- a/xlators/mgmt/glusterd/src/glusterd-handshake.c
+++ b/xlators/mgmt/glusterd/src/glusterd-handshake.c
@@ -626,6 +626,15 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo,
         }
 
         brickinfo->snap_status = 0;
+        ret = glusterd_brick_start (snap_vol, brickinfo, _gf_false);
+        if (ret) {
+                gf_msg (this->name, GF_LOG_WARNING, 0,
+                        GD_MSG_BRICK_DISCONNECTED, "starting the "
+                        "brick %s:%s for the snap %s failed",
+                        brickinfo->hostname, brickinfo->path,
+                        snap->snapname);
+                goto out;
+        }
         ret = glusterd_store_volinfo (snap_vol,
                                       GLUSTERD_VOLINFO_VER_AC_NONE);
         if (ret) {
@@ -636,15 +645,6 @@ glusterd_create_missed_snap (glusterd_missed_snap_info *missed_snapinfo,
                 goto out;
         }
 
-        ret = glusterd_brick_start (snap_vol, brickinfo, _gf_false);
-        if (ret) {
-                gf_msg (this->name, GF_LOG_WARNING, 0,
-                        GD_MSG_BRICK_DISCONNECTED, "starting the "
-                        "brick %s:%s for the snap %s failed",
-                        brickinfo->hostname, brickinfo->path,
-                        snap->snapname);
-                goto out;
-        }
 out:
         if (device)
                 GF_FREE (device);
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
index 52f7505e0..2ee9af48f 100644
--- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c
+++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c
@@ -2359,8 +2359,15 @@ glusterd_start_bricks (glusterd_volinfo_t *volinfo)
                                   brickinfo->path);
                         goto out;
                 }
-        }
 
+        }
+        ret = glusterd_store_volinfo (volinfo, GLUSTERD_VOLINFO_VER_AC_NONE);
+        if (ret) {
+                gf_msg (THIS->name, GF_LOG_ERROR, 0, GD_MSG_VOLINFO_STORE_FAIL,
+                        "Failed to write volinfo for volume %s",
+                        volinfo->volname);
+                goto out;
+        }
         ret = 0;
 out:
         return ret;
diff --git a/xlators/mgmt/glusterd/src/glusterd-server-quorum.c b/xlators/mgmt/glusterd/src/glusterd-server-quorum.c
index 35f6ad19f..b37f8084e 100644
--- a/xlators/mgmt/glusterd/src/glusterd-server-quorum.c
+++ b/xlators/mgmt/glusterd/src/glusterd-server-quorum.c
@@ -12,6 +12,7 @@
 #include "glusterd-utils.h"
 #include "glusterd-messages.h"
 #include "glusterd-server-quorum.h"
+#include "glusterd-store.h"
 #include "glusterd-syncop.h"
 #include "glusterd-op-sm.h"
 
@@ -299,6 +300,7 @@ void
 glusterd_do_volume_quorum_action (xlator_t *this, glusterd_volinfo_t *volinfo,
                                   gf_boolean_t meets_quorum)
 {
+        int                   ret           = -1;
         glusterd_brickinfo_t *brickinfo     = NULL;
         glusterd_conf_t      *conf          = NULL;
         gd_quorum_status_t   quorum_status  = NOT_APPLICABLE_QUORUM;
@@ -357,6 +359,20 @@ glusterd_do_volume_quorum_action (xlator_t *this, glusterd_volinfo_t *volinfo,
                         glusterd_brick_start (volinfo, brickinfo, _gf_false);
         }
         volinfo->quorum_status = quorum_status;
+        if (quorum_status == MEETS_QUORUM) {
+                /* bricks might have been restarted and so as the port change
+                 * might have happened
+                 */
+                ret = glusterd_store_volinfo (volinfo,
+                                              GLUSTERD_VOLINFO_VER_AC_NONE);
+                if (ret) {
+                        gf_msg (this->name, GF_LOG_ERROR, 0,
+                                GD_MSG_VOLINFO_STORE_FAIL,
+                                "Failed to write volinfo for volume %s",
+                                volinfo->volname);
+                        goto out;
+                }
+        }
 out:
         return;
 }
diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
index e833cc98c..3fe424a6f 100644
--- a/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-snapshot-utils.c
@@ -1681,6 +1681,16 @@ glusterd_import_friend_snap (dict_t *peer_data, int32_t snap_count,
                 }
                 if (glusterd_is_volume_started (snap_vol)) {
                         (void) glusterd_start_bricks (snap_vol);
+                        ret = glusterd_store_volinfo
+                                               (snap_vol,
+                                                GLUSTERD_VOLINFO_VER_AC_NONE);
+                        if (ret) {
+                                gf_msg (this->name, GF_LOG_ERROR, 0,
+                                        GD_MSG_VOLINFO_STORE_FAIL, "Failed to "
+                                        "write volinfo for volume %s",
+                                        snap_vol->volname);
+                                goto out;
+                        }
                 } else {
                         (void) glusterd_stop_bricks(snap_vol);
                 }
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index 02ba0d637..7b57884d2 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -5950,6 +5950,15 @@ glusterd_restart_bricks (glusterd_conf_t *conf)
                                 glusterd_brick_start (volinfo, brickinfo,
                                                      _gf_false);
                         }
+                        ret = glusterd_store_volinfo
+                                (volinfo, GLUSTERD_VOLINFO_VER_AC_NONE);
+                        if (ret) {
+                                gf_msg (this->name, GF_LOG_ERROR, 0,
+                                        GD_MSG_VOLINFO_STORE_FAIL, "Failed to "
+                                        "write volinfo for volume %s",
+                                        volinfo->volname);
+                                goto out;
+                        }
                 }
         }
 
@@ -5981,6 +5990,16 @@ glusterd_restart_bricks (glusterd_conf_t *conf)
                                 glusterd_brick_start (volinfo, brickinfo,
                                                       _gf_false);
                         }
+                        ret = glusterd_store_volinfo
+                                (volinfo, GLUSTERD_VOLINFO_VER_AC_NONE);
+                        if (ret) {
+                                gf_msg (this->name, GF_LOG_ERROR, 0,
+                                        GD_MSG_VOLINFO_STORE_FAIL, "Failed to "
+                                        "write volinfo for volume %s",
+                                        volinfo->volname);
+                                goto out;
+                        }
+
                 }
         }
         ret = 0;
-- 
2.13.6