From adc1ccf1f7ff7b8c25849bfc4a36f3708829a4db Mon Sep 17 00:00:00 2001 From: Kaushal M Date: Wed, 17 Aug 2011 10:44:17 +0530 Subject: glusterd: fix for volume stop causing inconsistent volume status This fixes problem caused by race between glusterd and glusterfsd occuring when they try to unlink pidfile during volume stop, which led to the volume being stopped, but the status of the volume remained in started state. Change-Id: Ibf88b61dc66be4ddff9050a0359636675de558a2 BUG: 3147 Reviewed-on: http://review.gluster.com/246 Reviewed-by: Vijay Bellur Tested-by: Gluster Build System --- glusterfsd/src/glusterfsd.c | 12 ++++++------ xlators/mgmt/glusterd/src/glusterd-utils.c | 5 ++++- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index bbd9515df1a..057f8909b91 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -1162,7 +1162,7 @@ glusterfs_pidfile_setup (glusterfs_ctx_t *ctx) int glusterfs_pidfile_cleanup (glusterfs_ctx_t *ctx) { - cmd_args_t *cmd_args = NULL; + cmd_args_t *cmd_args = NULL; cmd_args = &ctx->cmd_args; @@ -1170,18 +1170,18 @@ glusterfs_pidfile_cleanup (glusterfs_ctx_t *ctx) return 0; gf_log ("glusterfsd", GF_LOG_TRACE, - "pidfile %s unlocking", + "pidfile %s cleanup", cmd_args->pid_file); - lockf (fileno (ctx->pidfp), F_ULOCK, 0); - fclose (ctx->pidfp); - ctx->pidfp = NULL; - if (ctx->cmd_args.pid_file) { unlink (ctx->cmd_args.pid_file); ctx->cmd_args.pid_file = NULL; } + lockf (fileno (ctx->pidfp), F_ULOCK, 0); + fclose (ctx->pidfp); + ctx->pidfp = NULL; + return 0; } diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index 1884c2169d4..a84f72bf242 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -885,6 +885,9 @@ glusterd_service_stop (const char *service, char *pidfile, int sig, if (ret && (ENOENT != errno)) { gf_log ("", GF_LOG_ERROR, "Unable to " "unlink stale pidfile: %s", pidfile); + } else if (ret && (ENOENT == errno)){ + ret = 0; + gf_log ("", GF_LOG_INFO, "Brick already stopped"); } goto out; } @@ -1222,7 +1225,7 @@ glusterd_volume_stop_glusterfs (glusterd_volinfo_t *volinfo, ret = glusterd_service_stop ("brick", pidfile, SIGTERM, _gf_false); if (ret == 0) { glusterd_set_brick_status (brickinfo, GF_BRICK_STOPPED); - ret = glusterd_brick_unlink_socket_file (volinfo, brickinfo); + (void) glusterd_brick_unlink_socket_file (volinfo, brickinfo); } return ret; } -- cgit