[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,
+ ¤t_priority,
+ ¤t_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