[Debian-ha-svn-commits] [SCM] corosync Debian packaging branch, master, updated. debian/1.1.2-1

Guido Günther agx at sigxcpu.org
Thu Dec 10 16:21:40 UTC 2009


The following commit has been merged in the master branch:
commit 993b95134ffc9720ee21ec4af0cb8f370b1eeafe
Author: Guido Günther <agx at sigxcpu.org>
Date:   Wed Dec 9 18:47:21 2009 +0100

    Imported Upstream version 1.1.2

diff --git a/CHANGELOG b/CHANGELOG
index 425c09a..85729e9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,4 +1,91 @@
 ------------------------------------------------------------------------
+r2539 | sdake | 2009-10-22 15:34:49 -0700 (Thu, 22 Oct 2009) | 6 lines
+
+Merge trunk revision 2537:
+r2537 | sdake | 2009-10-22 15:30:59 -0700 (Thu, 22 Oct 2009) | 2 lines
+
+Bump version to 1.1.2.
+
+
+------------------------------------------------------------------------
+r2538 | sdake | 2009-10-22 15:31:47 -0700 (Thu, 22 Oct 2009) | 6 lines
+
+Merge trunk revision 2536:
+r2536 | sdake | 2009-10-22 15:29:02 -0700 (Thu, 22 Oct 2009) | 2 lines
+
+Revert commit 2523 which results in segfaults under some workloads.
+
+
+------------------------------------------------------------------------
+r2534 | sdake | 2009-10-20 15:42:55 -0700 (Tue, 20 Oct 2009) | 7 lines
+
+Merge trunk revision 2533:
+------------------------------------------------------------------------
+r2533 | sdake | 2009-10-20 15:40:29 -0700 (Tue, 20 Oct 2009) | 2 lines
+
+Bump revision to 1.1.1.
+
+
+------------------------------------------------------------------------
+r2532 | sdake | 2009-10-20 15:38:50 -0700 (Tue, 20 Oct 2009) | 7 lines
+
+Merge trunk revision 2531 (their's conflict) :
+------------------------------------------------------------------------
+r2531 | sdake | 2009-10-20 14:07:50 -0700 (Tue, 20 Oct 2009) | 2 lines
+
+Resolve shutdown problems for pacemaker use case.
+
+
+------------------------------------------------------------------------
+r2528 | sdake | 2009-10-14 15:14:32 -0700 (Wed, 14 Oct 2009) | 7 lines
+
+Merge trunk revision 2524:
+r2524 | sdake | 2009-10-14 12:06:37 -0700 (Wed, 14 Oct 2009) | 3 lines
+
+Patch from jflesch to fix segfault when using sysv semaphores that the thread
+state is checked prior to the semaphore operation, not after it has completed.
+
+
+------------------------------------------------------------------------
+r2527 | sdake | 2009-10-14 15:13:17 -0700 (Wed, 14 Oct 2009) | 8 lines
+
+Merge trunk revision 2523:
+r2523 | sdake | 2009-10-14 11:56:54 -0700 (Wed, 14 Oct 2009) | 4 lines
+
+totem process group optimization to not copy data into staging buffer if
+it is to be immediately ordered by totemsrp.  Instead pass that data as an
+iovector element.
+
+
+------------------------------------------------------------------------
+r2526 | sdake | 2009-10-14 15:11:38 -0700 (Wed, 14 Oct 2009) | 6 lines
+
+Merge trunk revision 2520:
+r2520 | beekhof | 2009-10-12 23:16:14 -0700 (Mon, 12 Oct 2009) | 1 line
+
+Add SIGTERM support and have the init script wait for corosync to actually terminate. Bud rh#525552
+
+
+------------------------------------------------------------------------
+r2525 | sdake | 2009-10-14 15:05:45 -0700 (Wed, 14 Oct 2009) | 16 lines
+
+Merge trunk revision 2510:
+r2510 | chrissie | 2009-10-06 05:57:35 -0700 (Tue, 06 Oct 2009) | 13 lines
+
+This patche fixes a couple of small problems with votequorum:
+
+- if a single node is booted with votequorum loaded then
+   corosync-quorumtool shows zero nodes and no votes.
+- votequorum doesn't always tell the main quorum module when a new node
+has joined the cluster (principally itself. this bug is actually tied
+into the above)
+
+I've also added quorum to the default list of services. As quorum has
+been decoupled from sync it will not interfere with normal operations as
+it used to do and it makes more sense to have it there than not.
+
+
+------------------------------------------------------------------------
 r2508 | sdake | 2009-09-25 02:22:25 -0700 (Fri, 25 Sep 2009) | 6 lines
 
 Merge trunk revision 2507:
diff --git a/configure b/configure
index b7bd3fe..1e4689a 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.63 for corosync 1.1.0.
+# Generated by GNU Autoconf 2.63 for corosync 1.1.2.
 #
 # Report bugs to <openais at lists.osdl.org>.
 #
@@ -596,8 +596,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='corosync'
 PACKAGE_TARNAME='corosync'
-PACKAGE_VERSION='1.1.0'
-PACKAGE_STRING='corosync 1.1.0'
+PACKAGE_VERSION='1.1.2'
+PACKAGE_STRING='corosync 1.1.2'
 PACKAGE_BUGREPORT='openais at lists.osdl.org'
 
 ac_unique_file="lib/coroipcc.c"
@@ -1345,7 +1345,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures corosync 1.1.0 to adapt to many kinds of systems.
+\`configure' configures corosync 1.1.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1415,7 +1415,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of corosync 1.1.0:";;
+     short | recursive ) echo "Configuration of corosync 1.1.2:";;
    esac
   cat <<\_ACEOF
 
@@ -1525,7 +1525,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-corosync configure 1.1.0
+corosync configure 1.1.2
 generated by GNU Autoconf 2.63
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1539,7 +1539,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by corosync $as_me 1.1.0, which was
+It was created by corosync $as_me 1.1.2, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   $ $0 $@
@@ -2388,7 +2388,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='corosync'
- VERSION='1.1.0'
+ VERSION='1.1.2'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -2527,7 +2527,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 # Define SVN revision
 
 cat >>confdefs.h <<\_ACEOF
-#define SVN_REVISION "2508"
+#define SVN_REVISION "2539"
 _ACEOF
 
 
@@ -11411,7 +11411,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by corosync $as_me 1.1.0, which was
+This file was extended by corosync $as_me 1.1.2, which was
 generated by GNU Autoconf 2.63.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -11478,7 +11478,7 @@ Report bugs to <bug-autoconf at gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_version="\\
-corosync config.status 1.1.0
+corosync config.status 1.1.2
 configured by $0, generated by GNU Autoconf 2.63,
   with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
diff --git a/configure.ac b/configure.ac
index f4ed733..9487103 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,7 @@
 # bootstrap / init
 AC_PREREQ([2.61])
 
-AC_INIT([corosync], [1.1.0], [openais at lists.osdl.org])
+AC_INIT([corosync], [1.1.2], [openais at lists.osdl.org])
 AM_INIT_AUTOMAKE([-Wno-portability])
 
 AC_CONFIG_SRCDIR([lib/coroipcc.c])
diff --git a/exec/coroipcs.c b/exec/coroipcs.c
index ab7be0b..5f87bae 100644
--- a/exec/coroipcs.c
+++ b/exec/coroipcs.c
@@ -596,11 +596,11 @@ retry_semwait:
 		sop.sem_op = -1;
 		sop.sem_flg = 0;
 retry_semop:
+		res = semop (conn_info->semid, &sop, 1);
 		if (ipc_thread_active (conn_info) == 0) {
 			coroipcs_refcount_dec (conn_info);
 			pthread_exit (0);
 		}
-		res = semop (conn_info->semid, &sop, 1);
 		if ((res == -1) && (errno == EINTR || errno == EAGAIN)) {
 			goto retry_semop;
 		} else
diff --git a/exec/main.c b/exec/main.c
index ede12dd..33adacb 100644
--- a/exec/main.c
+++ b/exec/main.c
@@ -145,6 +145,27 @@ void corosync_state_dump (void)
 	}
 }
 
+static void unlink_all_completed (void)
+{
+	poll_stop (0);
+	totempg_finalize ();
+	coroipcs_ipc_exit ();
+
+	corosync_exit_error (AIS_DONE_EXIT);
+}
+
+void corosync_shutdown_request (void)
+{
+	static int called = 0;
+	if (called) {
+		return;
+	}
+	if (called == 0) {
+		called = 1;
+	}
+	corosync_service_unlink_all (api, unlink_all_completed);
+}
+
 static void sigusr2_handler (int num)
 {
 	/*
@@ -154,20 +175,9 @@ static void sigusr2_handler (int num)
 	corosync_state_dump ();
 }
 
-/*
- * TODO this function needs some love
- */
-void corosync_shutdown_request (void)
+static void sigterm_handler (int num)
 {
-	if (api) {
-		corosync_service_unlink_all (api);
-	}
-
-	poll_stop (0);
-	totempg_finalize ();
-	coroipcs_ipc_exit ();
-
-	corosync_exit_error (AIS_DONE_EXIT);
+	corosync_shutdown_request ();
 }
 
 static void sigquit_handler (int num)
@@ -820,6 +830,7 @@ int main (int argc, char **argv)
 	(void)signal (SIGSEGV, sigsegv_handler);
 	(void)signal (SIGABRT, sigabrt_handler);
 	(void)signal (SIGQUIT, sigquit_handler);
+	(void)signal (SIGTERM, sigterm_handler);
 #if MSG_NOSIGNAL != 0
 	(void)signal (SIGPIPE, SIG_IGN);
 #endif
diff --git a/exec/service.c b/exec/service.c
index ea58efb..d2bcd0f 100644
--- a/exec/service.c
+++ b/exec/service.c
@@ -82,6 +82,10 @@ static struct default_service default_services[] = {
 	{
 		.name			 = "corosync_pload",
 		.ver			 = 0,
+	},
+	{
+		.name			 = "corosync_quorum",
+		.ver			 = 0,
 	}
 };
 
@@ -89,6 +93,10 @@ struct corosync_service_engine *ais_service[SERVICE_HANDLER_MAXIMUM_COUNT];
 
 static hdb_handle_t object_internal_configuration_handle;
 
+static void (*service_unlink_all_complete) (void) = NULL;
+
+static hdb_handle_t unlink_all_handle;
+
 
 static unsigned int default_services_requested (struct corosync_api_v1 *corosync_api)
 {
@@ -203,99 +211,102 @@ unsigned int corosync_service_link_and_init (
 		&service->id,
 		sizeof (service->id));
 
-	log_printf (LOGSYS_LEVEL_NOTICE, "Service initialized '%s'\n", service->name);
+	log_printf (LOGSYS_LEVEL_NOTICE, "Service engine loaded: %s\n", service->name);
 	return (res);
 }
 
 static int service_priority_max(void)
 {
-    int lpc = 0, max = 0;
-    for(; lpc < SERVICE_HANDLER_MAXIMUM_COUNT; lpc++) {
-	if(ais_service[lpc] != NULL && ais_service[lpc]->priority > max) {
-	    max = ais_service[lpc]->priority;
+	int lpc = 0, max = 0;
+	for(; lpc < SERVICE_HANDLER_MAXIMUM_COUNT; lpc++) {
+		if(ais_service[lpc] != NULL && ais_service[lpc]->priority > max) {
+			max = ais_service[lpc]->priority;
+		}
 	}
-    }
-    return max;
+	return max;
 }
 
-extern unsigned int corosync_service_unlink_priority (struct corosync_api_v1 *corosync_api, int priority)
+/*
+ * use the force
+ */
+static unsigned int
+corosync_service_unlink_priority (
+	struct corosync_api_v1 *corosync_api,
+	int lowest_priority,
+	int *current_priority,
+	int *current_service_engine)
 {
-	char *service_name;
-	unsigned int *service_ver;
 	unsigned short *service_id;
 	hdb_handle_t object_service_handle;
 	hdb_handle_t object_find_handle;
-	int p = service_priority_max();
-	int lpc = 0;
-
-	if(priority == 0) {
-	    log_printf(LOGSYS_LEVEL_NOTICE, "Unloading all corosync components\n");
-	} else {
-	    log_printf(LOGSYS_LEVEL_NOTICE, "Unloading corosync components up to (and including) priority %d\n", priority);
-	}
-
-	for( ; p >= priority; p--) {
-	    for(lpc = 0; lpc < SERVICE_HANDLER_MAXIMUM_COUNT; lpc++) {
-		if(ais_service[lpc] == NULL || ais_service[lpc]->priority != p) {
-		    continue;
-		}
-
-		/* unload
-		 *
-		 * If we had a pointer to the objdb entry, we'd not need to go looking again...
-		 */
- 		corosync_api->object_find_create (
-		    object_internal_configuration_handle,
-		    "service", strlen ("service"), &object_find_handle);
-
-		while(corosync_api->object_find_next (
-			  object_find_handle, &object_service_handle) == 0) {
-
-		    int res = corosync_api->object_key_get (
-			object_service_handle,
-			"service_id", strlen ("service_id"), (void *)&service_id, NULL);
-
-		    service_name = NULL;
-		    if(res == 0 && *service_id == ais_service[lpc]->id) {
-			hdb_handle_t *found_service_handle;
-			corosync_api->object_key_get (
-			    object_service_handle,
-			    "name", strlen ("name"), (void *)&service_name, NULL);
+	hdb_handle_t *found_service_handle;
 
-			corosync_api->object_key_get (
-			    object_service_handle,
-			    "ver", strlen ("ver"), (void *)&service_ver, NULL);
+	for(; *current_priority >= lowest_priority; *current_priority = *current_priority - 1) {
+		for(*current_service_engine = 0;
+			*current_service_engine < SERVICE_HANDLER_MAXIMUM_COUNT;
+			*current_service_engine = *current_service_engine + 1) {
 
-			res = corosync_api->object_key_get (
-			    object_service_handle,
-			    "handle", strlen ("handle"), (void *)&found_service_handle, NULL);
-
-			res = corosync_api->object_key_get (
-			    object_service_handle,
-			    "service_id", strlen ("service_id"), (void *)&service_id, NULL);
-
-			log_printf(LOGSYS_LEVEL_NOTICE, "Unloading corosync component: %s v%u\n",
-				   service_name, *service_ver);
-
-			if (ais_service[*service_id]->exec_exit_fn) {
-			    ais_service[*service_id]->exec_exit_fn ();
+			if(ais_service[*current_service_engine] == NULL ||
+				ais_service[*current_service_engine]->priority != *current_priority) {
+				continue;
 			}
-			ais_service[*service_id] = NULL;
 
-			lcr_ifact_release (*found_service_handle);
+			/*
+			 * find service object in object database by service id
+			 * and unload it if possible.
+			 *
+			 * If the service engine's exec_exit_fn returns -1 indicating
+			 * it was busy, this function returns -1 and can be called again
+			 * at a later time (usually via the schedwrk api).
+			 */
+			corosync_api->object_find_create (
+			    object_internal_configuration_handle,
+			    "service", strlen ("service"), &object_find_handle);
+
+			while (corosync_api->object_find_next (
+				  object_find_handle, &object_service_handle) == 0) {
+
+				int res = corosync_api->object_key_get (
+					object_service_handle,
+					"service_id", strlen ("service_id"),
+					(void *)&service_id, NULL);
+
+				if (res == 0 && *service_id ==
+					 ais_service[*current_service_engine]->id) {
+
+					if (ais_service[*service_id]->exec_exit_fn) {
+						res = ais_service[*service_id]->exec_exit_fn ();
+						if (res == -1) {
+							corosync_api->object_find_destroy (object_find_handle);
+							return (-1);
+						}
+					}
+					log_printf(LOGSYS_LEVEL_NOTICE,
+						"Service engine unloaded: %s\n",
+						   ais_service[*current_service_engine]->name);
+
+					ais_service[*current_service_engine] = NULL;
+
+					res = corosync_api->object_key_get (
+						object_service_handle,
+						"handle", strlen ("handle"),
+						(void *)&found_service_handle,
+						NULL);
+
+					lcr_ifact_release (*found_service_handle);
+
+					corosync_api->object_destroy (object_service_handle);
+					break;
+				}
+			}
 
-			corosync_api->object_destroy (object_service_handle);
-			break;
-		    }
+			corosync_api->object_find_destroy (object_find_handle);
 		}
-
-		corosync_api->object_find_destroy (object_find_handle);
-	    }
 	}
 	return 0;
 }
 
-extern unsigned int corosync_service_unlink_and_exit (
+static unsigned int service_unlink_and_exit (
 	struct corosync_api_v1 *corosync_api,
 	const char *service_name,
 	unsigned int service_ver)
@@ -305,6 +316,8 @@ extern unsigned int corosync_service_unlink_and_exit (
 	unsigned short *service_id;
 	unsigned int *found_service_ver;
 	hdb_handle_t object_find_handle;
+	hdb_handle_t *found_service_handle;
+	int res;
 
 	corosync_api->object_find_create (
 		object_internal_configuration_handle,
@@ -336,33 +349,49 @@ extern unsigned int corosync_service_unlink_and_exit (
 		 * If service found and linked exit it
 		 */
 		if (service_ver != *found_service_ver) {
-		    continue;
+			continue;
 		}
 
 		corosync_api->object_key_get (
-		    object_service_handle,
-		    "service_id", strlen ("service_id"),
-		    (void *)&service_id, NULL);
+			object_service_handle,
+			"service_id", strlen ("service_id"),
+			(void *)&service_id, NULL);
 
 		if(service_id != NULL
-		   && *service_id > 0
-		   && *service_id < SERVICE_HANDLER_MAXIMUM_COUNT
-		   && ais_service[*service_id] != NULL) {
+			&& *service_id > 0
+			&& *service_id < SERVICE_HANDLER_MAXIMUM_COUNT
+			&& ais_service[*service_id] != NULL) {
+
+			corosync_api->object_find_destroy (object_find_handle);
+
+			if (ais_service[*service_id]->exec_exit_fn) {
+				res = ais_service[*service_id]->exec_exit_fn ();
+				if (res == -1) {
+					return (-1);
+				}
+			}
+
+			log_printf(LOGSYS_LEVEL_NOTICE,
+				"Service engine unloaded: %s\n",
+				   ais_service[*service_id]->name);
+
+			ais_service[*service_id] = NULL;
 
-		    corosync_api->object_find_destroy (object_find_handle);
-		    return corosync_service_unlink_priority (corosync_api, ais_service[*service_id]->priority);
+			res = corosync_api->object_key_get (
+				object_service_handle,
+				"handle", strlen ("handle"),
+				(void *)&found_service_handle,
+				NULL);
+
+			lcr_ifact_release (*found_service_handle);
+
+			corosync_api->object_destroy (object_service_handle);
 		}
 	}
 
 	corosync_api->object_find_destroy (object_find_handle);
 
-	return (-1);
-}
-
-extern unsigned int corosync_service_unlink_all (
-	struct corosync_api_v1 *corosync_api)
-{
-    return corosync_service_unlink_priority (corosync_api, 0);
+	return (0);
 }
 
 /*
@@ -432,3 +461,97 @@ unsigned int corosync_service_defaults_link_and_init (struct corosync_api_v1 *co
 
 	return (0);
 }
+
+static int unlink_all_schedwrk_handler (const void *data) {
+	int res;
+	static int current_priority = 0;
+	static int current_service_engine = 0;
+	static int called = 0;
+	struct corosync_api_v1 *api = (struct corosync_api_v1 *)data;
+
+	if (called == 0) {
+		log_printf(LOGSYS_LEVEL_NOTICE,
+			"Unloading all Corosync service engines.\n");
+ 		current_priority = service_priority_max ();
+		called = 1;
+	}
+
+	res = corosync_service_unlink_priority (
+		api,
+		0,
+		&current_priority,
+		&current_service_engine);
+	if (res == 0) {
+		service_unlink_all_complete();
+	}
+	return (res);
+}
+		
+void corosync_service_unlink_all (
+	struct corosync_api_v1 *api,
+	void (*unlink_all_complete) (void))
+{
+	static int called = 0;
+
+	assert (api);
+
+	service_unlink_all_complete = unlink_all_complete;
+
+	if (called) {
+		return;
+	}
+	if (called == 0) {
+		called = 1;
+	}
+	
+	api->schedwrk_create (
+		&unlink_all_handle,
+		&unlink_all_schedwrk_handler,
+		api);
+}
+
+struct service_unlink_and_exit_data {
+	hdb_handle_t handle;
+	struct corosync_api_v1 *api;
+	const char *name;
+	unsigned int ver;
+};
+
+static int service_unlink_and_exit_schedwrk_handler (void *data)
+{
+	struct service_unlink_and_exit_data *service_unlink_and_exit_data =
+		data;
+	int res;
+
+	res = service_unlink_and_exit (
+		service_unlink_and_exit_data->api,
+		service_unlink_and_exit_data->name,
+		service_unlink_and_exit_data->ver);
+
+	if (res == 0) {
+		free (service_unlink_and_exit_data);
+	}
+	return (res);
+}
+
+typedef int (*schedwrk_cast) (const void *);
+
+unsigned int corosync_service_unlink_and_exit (
+        struct corosync_api_v1 *api,
+        const char *service_name,
+        unsigned int service_ver)
+{
+	struct service_unlink_and_exit_data *service_unlink_and_exit_data;
+
+	assert (api);
+	service_unlink_and_exit_data = malloc (sizeof (struct service_unlink_and_exit_data));
+	service_unlink_and_exit_data->api = api;
+	service_unlink_and_exit_data->name = strdup (service_name);
+	service_unlink_and_exit_data->ver = service_ver;
+	
+	api->schedwrk_create (
+		&service_unlink_and_exit_data->handle,
+		(schedwrk_cast)service_unlink_and_exit_schedwrk_handler,
+		service_unlink_and_exit_data);
+	return (0);
+}
diff --git a/exec/service.h b/exec/service.h
index 7e331b0..9f1b724 100644
--- a/exec/service.h
+++ b/exec/service.h
@@ -46,13 +46,6 @@ extern unsigned int corosync_service_link_and_init (
 	unsigned int service_ver);
 
 /*
- * Unlink and exit a service based on service priority
- */
-extern unsigned int corosync_service_unlink_priority (
-	struct corosync_api_v1 *corosync_api,
-	int priority);
-
-/*
  * Unlink and exit a service
  */
 extern unsigned int corosync_service_unlink_and_exit (
@@ -63,8 +56,9 @@ extern unsigned int corosync_service_unlink_and_exit (
 /*
  * Unlink and exit all corosync services
  */
-extern unsigned int corosync_service_unlink_all (
-	struct corosync_api_v1 *objdb);
+extern void corosync_service_unlink_all (
+        struct corosync_api_v1 *api,
+        void (*unlink_all_complete) (void));
 
 /*
  * Load all of the default services
diff --git a/init/redhat b/init/redhat
index 2d91763..dc516e3 100755
--- a/init/redhat
+++ b/init/redhat
@@ -27,11 +27,23 @@ start() {
 
 stop() {
     echo -n $"Stopping Corosync Cluster Engine ($prog): "
-    killproc $prog
-    retval=$?
-    [ "$retval" -eq 0 ] && rm -f "$lockfile"
+    # If no signal is specified, -TERM is used but _also_ -KILL 3s later
+    # This is far too aggressive for a cluster resource manager running on top of Corosync
+    killproc $prog -TERM
     echo
-    return $retval
+
+    echo -n $"Waiting for services to unload:"
+    while
+        pidofproc $prog > /dev/null 2>&1
+    do
+        sleep 2
+    done
+
+    success $"$base shutdown"
+    echo
+
+    rm -f "$lockfile"
+    return 0
 }
 
 restart() {
diff --git a/services/votequorum.c b/services/votequorum.c
index 97e4f2d..5b89359 100644
--- a/services/votequorum.c
+++ b/services/votequorum.c
@@ -535,6 +535,9 @@ static int votequorum_exec_init_fn (struct corosync_api_v1 *api)
 	add_votequorum_config_notification(object_handle);
 	corosync_api->object_find_destroy(find_handle);
 
+	/* Start us off with one node */
+	quorum_exec_send_nodeinfo();
+
 	LEAVE();
 	return (0);
 }
@@ -1046,7 +1049,8 @@ static void message_handler_req_exec_votequorum_nodeinfo (
 	}
 	node->flags &= ~NODE_FLAGS_BEENDOWN;
 
-	if (new_node || old_votes != node->votes || old_expected != node->expected_votes || old_state != node->state)
+	if (new_node || req_exec_quorum_nodeinfo->first_trans || 
+	    old_votes != node->votes || old_expected != node->expected_votes || old_state != node->state)
 		recalculate_quorum(0, 0);
 	LEAVE();
 }

-- 
corosync Debian packaging



More information about the Debian-ha-svn-commits mailing list