From 26c153bec24c0c0a37e788707f6ca793890279f0 Mon Sep 17 00:00:00 2001 From: Saravanakumar Arumugam Date: Wed, 29 Jun 2016 15:36:06 +0530 Subject: glusterd/geo-rep: Handle empty monitor.status during upgrade Problem: Consider geo-replication is in Stopped state. Following which, glusterfs is upgraded (where monitor.status is the new status file). Now, When geo-replication status command is run, empty monitor status file gets created. Now, if glusterd is restarted, it reads empty monitor status and starts geo-replication session. This is incorrect as session was in Stopped state earlier. Solution: If monitor status is empty, error out and avoid starting geo-replication session. Note: if monitor status is empty, geo-rep session is displayed as Stopped state. Change-Id: Ifb3db896e5ed92b927764cf1163503765cb08bb4 BUG: 1368055 Signed-off-by: Saravanakumar Arumugam > Reviewed-on: http://review.gluster.org/14830 > Smoke: Gluster Build System > CentOS-regression: Gluster Build System > NetBSD-regression: NetBSD Build System > Reviewed-by: Jeff Darcy (cherry picked from commit f938b3a26ffab9482d5f910ee76d2bb2b370517f) Reviewed-on: http://review.gluster.org/15197 NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Smoke: Gluster Build System Reviewed-by: Aravinda VK --- xlators/mgmt/glusterd/src/glusterd-geo-rep.c | 5 ++++- xlators/mgmt/glusterd/src/glusterd-utils.c | 8 ++++---- 2 files changed, 8 insertions(+), 5 deletions(-) (limited to 'xlators') diff --git a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c index 594ea124c10..123fdc11655 100644 --- a/xlators/mgmt/glusterd/src/glusterd-geo-rep.c +++ b/xlators/mgmt/glusterd/src/glusterd-geo-rep.c @@ -4258,7 +4258,10 @@ glusterd_gsync_read_frm_status (char *path, char *buf, size_t blen) while (isspace (*p)) *p-- = '\0'; } - } else if (ret < 0) + } else if (ret == 0) + gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_GSYNCD_ERROR, + "Status file of gsyncd is empty"); + else /* ret < 0 */ gf_msg (this->name, GF_LOG_ERROR, 0, GD_MSG_GSYNCD_ERROR, "Status file of gsyncd is corrupt"); diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index b9145b58408..1f3c1a471a4 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -4975,7 +4975,7 @@ _local_gsyncd_start (dict_t *this, char *key, data_t *value, void *data) } ret = glusterd_gsync_read_frm_status (statefile, buf, sizeof (buf)); - if (ret < 0) { + if (ret <= 0) { gf_msg (this1->name, GF_LOG_ERROR, 0, GD_MSG_STAT_FILE_READ_FAILED, "Unable to read the status"); @@ -4986,9 +4986,9 @@ _local_gsyncd_start (dict_t *this, char *key, data_t *value, void *data) if ((key1 = strchr (slave, '/'))) key1 = key1 + 2; - /* Looks for the last status, to find if the sessiom was running - * when the node went down. If the session was not started or - * not started, do not restart the geo-rep session */ + /* Looks for the last status, to find if the session was running + * when the node went down. If the session was just created or + * stopped, do not restart the geo-rep session */ if ((!strcmp (buf, "Created")) || (!strcmp (buf, "Stopped"))) { gf_msg (this1->name, GF_LOG_INFO, 0, -- cgit