public inbox for cluster-cvs@sourceware.org
help / color / mirror / Atom feed
* cluster: RHEL5 - rgmanager: Avoid status checks during reconfiguration
@ 2009-03-27 14:27 Lon Hohberger
0 siblings, 0 replies; only message in thread
From: Lon Hohberger @ 2009-03-27 14:27 UTC (permalink / raw)
To: cluster-cvs-relay
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=638f8dbcfc5c9e81ef6f6da324f6a532fa5a71f7
Commit: 638f8dbcfc5c9e81ef6f6da324f6a532fa5a71f7
Parent: 9ee39052aa3655ea76b50a5805b30ceb0bb62983
Author: Lon Hohberger <lhh@redhat.com>
AuthorDate: Mon Nov 17 14:53:41 2008 -0500
Committer: Lon Hohberger <lhh@redhat.com>
CommitterDate: Fri Mar 27 10:25:08 2009 -0400
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 | 9 ++++++++-
rgmanager/src/daemons/main.c | 4 ++--
rgmanager/src/daemons/rg_locks.c | 24 +++++++++++++++++-------
rgmanager/src/daemons/rg_thread.c | 4 ++++
5 files changed, 37 insertions(+), 13 deletions(-)
diff --git a/rgmanager/include/rg_locks.h b/rgmanager/include/rg_locks.h
index 78d6096..c40607f 100644
--- a/rgmanager/include/rg_locks.h
+++ b/rgmanager/include/rg_locks.h
@@ -33,9 +33,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 2c23cd5..e02a3dc 100644
--- a/rgmanager/src/daemons/groups.c
+++ b/rgmanager/src/daemons/groups.c
@@ -1673,6 +1673,12 @@ init_resource_groups(int reconfigure, int do_init, int new_config_version)
free(val);
}
+ /* Wait for any pending requests */
+ rg_wait_threads();
+ /* Block operations that would break during configuration
+ changes */
+ rg_clear_initialized(FL_CONFIG);
+
clulog(LOG_DEBUG, "Building Resource Trees\n");
/* About to update the entire resource tree... */
if (load_resources(fd, &reslist, &rulelist) != 0) {
@@ -1771,8 +1777,9 @@ init_resource_groups(int reconfigure, int do_init, int new_config_version)
} else {
clulog(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 6a5a8b4..dcfa26c 100644
--- a/rgmanager/src/daemons/main.c
+++ b/rgmanager/src/daemons/main.c
@@ -165,7 +165,7 @@ membership_update(void)
#endif
clulog(LOG_DEBUG, "Flushing resource group cache\n");
kill_resource_groups();
- rg_set_uninitialized();
+ rg_clear_initialized(0);
return -1;
} else if (!rg_quorate()) {
@@ -677,7 +677,7 @@ handle_cluster_event(msgctx_t *ctx)
clulog(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 ef60748..5f2f342 100644
--- a/rgmanager/src/daemons/rg_locks.c
+++ b/rgmanager/src/daemons/rg_locks.c
@@ -65,10 +65,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;
@@ -76,21 +79,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 bcd6eee..d0c0b50 100644
--- a/rgmanager/src/daemons/rg_thread.c
+++ b/rgmanager/src/daemons/rg_thread.c
@@ -434,6 +434,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);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-03-27 14:27 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-03-27 14:27 cluster: RHEL5 - rgmanager: Avoid status checks during reconfiguration Lon Hohberger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).