diff options
author | Mohit Agrawal <moagrawal@redhat.com> | 2018-08-04 12:05:03 +0530 |
---|---|---|
committer | Atin Mukherjee <amukherj@redhat.com> | 2018-08-10 17:51:37 +0000 |
commit | bd8fc26a278697c30537d879ea5402db7ebab577 (patch) | |
tree | 65772cd64d48429c9e8ee90a9e1ee934cdee04b0 /xlators/mgmt | |
parent | a6900e829484435c5bd5d8efe38490cab54ac442 (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>
Diffstat (limited to 'xlators/mgmt')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-utils.c | 47 |
1 files changed, 27 insertions, 20 deletions
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); |