This is the mail archive of the
cluster-cvs@sourceware.org
mailing list for the cluster.
master - rgmanager: Avoid status checks during reconfiguration
- From: Lon Hohberger <lon at fedoraproject dot org>
- To: cluster-cvs-relay at redhat dot com
- Date: Mon, 17 Nov 2008 19:55:17 +0000 (UTC)
- Subject: 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);