summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohit Agrawal <moagrawal@redhat.com>2018-08-04 12:05:03 +0530
committerAtin Mukherjee <amukherj@redhat.com>2018-08-10 17:51:37 +0000
commitbd8fc26a278697c30537d879ea5402db7ebab577 (patch)
tree65772cd64d48429c9e8ee90a9e1ee934cdee04b0
parenta6900e829484435c5bd5d8efe38490cab54ac442 (diff)
glusterd: Compare volume_id before start/attach a brick
Problem: After reboot a node brick is not coming up because fsid comparison is failed before start a brick Solution: Instead of comparing fsid compare volume_id to resolve the same because fsid is changed after reboot a node but volume_id persist as a xattr on brick_root path at the time of creating a volume. Change-Id: Ic289aab1b4ebfd83bbcae8438fee26ae61a0fff4 fixes: bz#1612418 Signed-off-by: Mohit Agrawal <moagrawal@redhat.com>
-rw-r--r--tests/bugs/glusterd/bug-1595320.t (renamed from tests/basic/bug-1595320.t)9
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-utils.c47
2 files changed, 32 insertions, 24 deletions
diff --git a/tests/basic/bug-1595320.t b/tests/bugs/glusterd/bug-1595320.t
index 9d856eeadec..f41df9d0ffa 100644
--- a/tests/basic/bug-1595320.t
+++ b/tests/bugs/glusterd/bug-1595320.t
@@ -1,8 +1,8 @@
#!/bin/bash
-. $(dirname $0)/../include.rc
-. $(dirname $0)/../volume.rc
-. $(dirname $0)/../snapshot.rc
+. $(dirname $0)/../../include.rc
+. $(dirname $0)/../../volume.rc
+. $(dirname $0)/../../snapshot.rc
cleanup
@@ -52,7 +52,7 @@ EXPECT 0 count_brick_processes
# Unmount 3rd brick root from node
brick_root=$L3
-TEST umount -l $brick_root 2>/dev/null
+_umount_lv 3
# Start the volume only 2 brick should be start
TEST $CLI volume start $V0 force
@@ -70,6 +70,7 @@ n=`ls -lrth /proc/$brick_pid/fd | grep -iw $L3 | grep -v ".glusterfs" | wc -l`
TEST [ $n -eq 0 ]
# Mount the brick root
+TEST mkdir -p $brick_root
TEST mount -t xfs -o nouuid /dev/test_vg_3/brick_lvm $brick_root
# Replace brick_pid file to test brick_attach code
diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c
index 0ac075bcc87..352e445e28b 100644
--- a/xlators/mgmt/glusterd/src/glusterd-utils.c
+++ b/xlators/mgmt/glusterd/src/glusterd-utils.c
@@ -5522,6 +5522,12 @@ attach_brick_callback (struct rpc_req *req, struct iovec *iov, int count,
frame->local = NULL;
frame->cookie = NULL;
+ if (!iov) {
+ gf_log (frame->this->name, GF_LOG_ERROR, "iov is NULL");
+ ret = -1;
+ goto out;
+ }
+
ret = xdr_to_generic (*iov, &rsp, (xdrproc_t)xdr_gf_getspec_rsp);
if (ret < 0) {
gf_log (frame->this->name, GF_LOG_ERROR, "XDR decoding error");
@@ -6164,17 +6170,19 @@ glusterd_brick_start (glusterd_volinfo_t *volinfo,
gf_boolean_t wait,
gf_boolean_t only_connect)
{
- int ret = -1;
+ int ret = -1;
xlator_t *this = NULL;
glusterd_brickinfo_t *other_brick;
glusterd_conf_t *conf = NULL;
- int32_t pid = -1;
- char pidfile[PATH_MAX] = {0};
- char socketpath[PATH_MAX] = {0};
- char *brickpath = NULL;
+ int32_t pid = -1;
+ char pidfile[PATH_MAX] = {0};
+ char socketpath[PATH_MAX] = {0};
+ char *brickpath = NULL;
glusterd_volinfo_t *other_vol;
- struct statvfs brickstat = {0,};
gf_boolean_t is_service_running = _gf_false;
+ uuid_t volid = {0,};
+ ssize_t size = -1;
+
this = THIS;
GF_ASSERT (this);
@@ -6221,24 +6229,23 @@ glusterd_brick_start (glusterd_volinfo_t *volinfo,
GLUSTERD_GET_BRICK_PIDFILE (pidfile, volinfo, brickinfo, conf);
- ret = sys_statvfs (brickinfo->path, &brickstat);
- if (ret) {
- gf_msg (this->name, GF_LOG_ERROR,
- errno, GD_MSG_BRICKINFO_CREATE_FAIL,
- "failed to get statfs() call on brick %s",
- brickinfo->path);
+ /* Compare volume-id xattr is helpful to ensure the existence of a brick_root
+ path before the start/attach a brick
+ */
+ size = sys_lgetxattr (brickinfo->path, GF_XATTR_VOL_ID_KEY, volid, 16);
+ if (size != 16) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "Missing %s extended attribute on brick root (%s),"
+ " brick is deemed not to be a part of the volume (%s) ",
+ GF_XATTR_VOL_ID_KEY, brickinfo->path, volinfo->volname);
goto out;
}
- /* Compare fsid is helpful to ensure the existence of a brick_root
- path before the start/attach a brick
- */
- if (brickinfo->statfs_fsid &&
- (brickinfo->statfs_fsid != brickstat.f_fsid)) {
+ if (strncmp (uuid_utoa (volinfo->volume_id), uuid_utoa(volid), GF_UUID_BUF_SIZE)) {
gf_log (this->name, GF_LOG_ERROR,
- "fsid comparison is failed it means Brick root path"
- " %s is not created by glusterd, start/attach will also fail",
- brickinfo->path);
+ "Mismatching %s extended attribute on brick root (%s),"
+ " brick is deemed not to be a part of the volume (%s)",
+ GF_XATTR_VOL_ID_KEY, brickinfo->path, volinfo->volname);
goto out;
}
is_service_running = gf_is_service_running (pidfile, &pid);