This is the mail archive of the cluster-cvs@sourceware.org mailing list for the cluster.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

master - rgmanager: Avoid status checks during reconfiguration


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=6f0d24469715359fd592e9bbd674cf6f3fb79eb9
Commit:        6f0d24469715359fd592e9bbd674cf6f3fb79eb9
Parent:        0ddc3564bf2a6a23932515ffad7ea7bcf83dd191
Author:        Lon Hohberger <lhh@redhat.com>
AuthorDate:    Mon Nov 17 14:53:41 2008 -0500
Committer:     Lon Hohberger <lhh@redhat.com>
CommitterDate: Mon Nov 17 14:53:41 2008 -0500

rgmanager: Avoid status checks during reconfiguration

Ignore queued status checks if a configuration update
is pending.  Basically, a queued status check during
reconfiguration could get a status check done before
the update is complete, causing an erroneous service
restart.
---
 rgmanager/include/rg_locks.h      |    9 ++++++---
 rgmanager/src/daemons/groups.c    |   10 +++++++++-
 rgmanager/src/daemons/main.c      |    4 ++--
 rgmanager/src/daemons/rg_locks.c  |   24 +++++++++++++++++-------
 rgmanager/src/daemons/rg_thread.c |    4 ++++
 5 files changed, 38 insertions(+), 13 deletions(-)

diff --git a/rgmanager/include/rg_locks.h b/rgmanager/include/rg_locks.h
index ef30a96..50b181e 100644
--- a/rgmanager/include/rg_locks.h
+++ b/rgmanager/include/rg_locks.h
@@ -16,9 +16,12 @@ int rg_dec_threads(void);
 int rg_wait_threads(void);
 
 int rg_initialized(void);
-int rg_set_initialized(void);
-int rg_set_uninitialized(void);
-int rg_wait_initialized(void);
+int rg_set_initialized(int);
+int rg_clear_initialized(int);
+int rg_wait_initialized(int);
+
+#define FL_INIT 0x1
+#define FL_CONFIG 0x2
 
 int rg_inc_status(void);
 int rg_dec_status(void);
diff --git a/rgmanager/src/daemons/groups.c b/rgmanager/src/daemons/groups.c
index b17cdc2..620ff92 100644
--- a/rgmanager/src/daemons/groups.c
+++ b/rgmanager/src/daemons/groups.c
@@ -1585,6 +1585,7 @@ init_resource_groups(int reconfigure, int do_init)
 
 	if (reconfigure)
 		log_printf(LOG_NOTICE, "Reconfiguring\n");
+
 	log_printf(LOG_INFO, "Loading Service Data\n");
 	log_printf(LOG_DEBUG, "Loading Resource Rules\n");
 	if (load_resource_rules(RESOURCE_ROOTDIR, &rulelist) != 0) {
@@ -1613,6 +1614,12 @@ init_resource_groups(int reconfigure, int do_init)
 		free(val);
 	}
 
+	/* Wait for any pending requests */
+	rg_wait_threads();
+	/* Block operations that would break during configuration
+	   changes */
+	rg_clear_initialized(FL_CONFIG);
+
 	log_printf(LOG_DEBUG, "Building Resource Trees\n");
 	/* About to update the entire resource tree... */
 	if (load_resources(fd, &reslist, &rulelist) != 0) {
@@ -1706,8 +1713,9 @@ init_resource_groups(int reconfigure, int do_init)
 		} else {
 			log_printf(LOG_INFO, "Skipping stop-before-start: overridden by administrator\n");
 		}
-		rg_set_initialized();
+		rg_set_initialized(FL_INIT);
 	}
+	rg_set_initialized(FL_CONFIG);
 
 	return 0;
 }
diff --git a/rgmanager/src/daemons/main.c b/rgmanager/src/daemons/main.c
index d7ce08b..49d208f 100644
--- a/rgmanager/src/daemons/main.c
+++ b/rgmanager/src/daemons/main.c
@@ -147,7 +147,7 @@ membership_update(void)
 #endif
 		log_printf(LOG_DEBUG, "Flushing resource group cache\n");
 		kill_resource_groups();
-		rg_set_uninitialized();
+		rg_clear_initialized(0);
 		return -1;
 	} else if (!rg_quorate()) {
 
@@ -656,7 +656,7 @@ handle_cluster_event(msgctx_t *ctx)
 		log_printf(LOG_WARNING, "#67: Shutting down uncleanly\n");
 		rg_set_inquorate();
 		rg_doall(RG_INIT, 1, "Emergency stop of %s");
-		rg_set_uninitialized();
+		rg_clear_initialized(0);
 #if defined(LIBCMAN_VERSION) && LIBCMAN_VERSION >= 2
 		/* cman_replyto_shutdown() */
 #endif
diff --git a/rgmanager/src/daemons/rg_locks.c b/rgmanager/src/daemons/rg_locks.c
index f5f8d6b..e66cf1c 100644
--- a/rgmanager/src/daemons/rg_locks.c
+++ b/rgmanager/src/daemons/rg_locks.c
@@ -47,10 +47,13 @@ rg_initialized(void)
 
 
 int
-rg_set_initialized(void)
+rg_set_initialized(int flag)
 {
+	if (!flag)
+		flag = ~0;
+
 	pthread_mutex_lock(&locks_mutex);
-	__rg_initialized = 1;
+	__rg_initialized |= flag;
 	pthread_cond_broadcast(&init_cond);
 	pthread_mutex_unlock(&locks_mutex);
 	return 0;
@@ -58,21 +61,28 @@ rg_set_initialized(void)
 
 
 int
-rg_set_uninitialized(void)
+rg_clear_initialized(int flag)
 {
+	if (!flag)
+		flag = ~0;
 	pthread_mutex_lock(&locks_mutex);
-	__rg_initialized = 0;
+	__rg_initialized &= ~flag;
 	pthread_mutex_unlock(&locks_mutex);
 	return 0;
 }
 
 
 int
-rg_wait_initialized(void)
+rg_wait_initialized(int flag)
 {
 	pthread_mutex_lock(&locks_mutex);
-	while (!__rg_initialized)
-		pthread_cond_wait(&init_cond, &locks_mutex);
+	if (flag) {
+		while ((__rg_initialized & flag) != flag)
+			pthread_cond_wait(&init_cond, &locks_mutex);
+	} else {
+		while (!__rg_initialized)
+			pthread_cond_wait(&init_cond, &locks_mutex);
+	}
 	pthread_mutex_unlock(&locks_mutex);
 	return 0;
 }
diff --git a/rgmanager/src/daemons/rg_thread.c b/rgmanager/src/daemons/rg_thread.c
index 51d8199..fdcca30 100644
--- a/rgmanager/src/daemons/rg_thread.c
+++ b/rgmanager/src/daemons/rg_thread.c
@@ -416,6 +416,10 @@ resgroup_thread_main(void *arg)
 			break;
 
 		case RG_STATUS:
+			if (!(rg_initialized()&FL_CONFIG)) {
+				ret = RG_SUCCESS;
+				break;
+			}
 			/* Need to make sure we don't check status of
 			   resource groups we don't own */
 			error = svc_status(myname);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]