ACK On 17/01/12 13:38, Fabio M. Di Nitto wrote:
From: "Fabio M. Di Nitto"<fdinitto@xxxxxxxxxx> the problem is that votequorum was listed as part of default services. At service_link_and_init, votequorum library and exec were being made available, even when votequorum was not in used at all, creating all kind of problems. By changing the service_link_and_init to be clever, we restore the original and wanted behavior to link the service only when required. This also fixed N*votequorum API calls segfaults, init segfaults and a few dozen other small issues... Signed-off-by: Fabio M. Di Nitto<fdinitto@xxxxxxxxxx> --- exec/service.c | 11 ----------- exec/service.h | 6 +++++- exec/votequorum.c | 25 +++++++++++++------------ exec/vsf_ykd.c | 8 -------- 4 files changed, 18 insertions(+), 32 deletions(-) diff --git a/exec/service.c b/exec/service.c index 1432146..4cd9d8e 100644 --- a/exec/service.c +++ b/exec/service.c @@ -58,12 +58,6 @@ LOGSYS_DECLARE_SUBSYS ("SERV"); -struct default_service { - const char *name; - int ver; - struct corosync_service_engine *(*loader)(void); -}; - static struct default_service default_services[] = { { .name = "corosync_evs", @@ -100,11 +94,6 @@ static struct default_service default_services[] = { }, #endif { - .name = "corosync_votequorum", - .ver = 0, - .loader = votequorum_get_service_engine_ver0 - }, - { .name = "corosync_quorum", .ver = 0, .loader = vsf_quorum_get_service_engine_ver0 diff --git a/exec/service.h b/exec/service.h index 5309174..67d4b94 100644 --- a/exec/service.h +++ b/exec/service.h @@ -39,7 +39,11 @@ struct corosync_api_v1; -struct default_service; +struct default_service { + const char *name; + int ver; + struct corosync_service_engine *(*loader)(void); +}; /** * Link and initialize a service diff --git a/exec/votequorum.c b/exec/votequorum.c index 0f4f05a..ef0e3a7 100644 --- a/exec/votequorum.c +++ b/exec/votequorum.c @@ -58,7 +58,6 @@ LOGSYS_DECLARE_SUBSYS ("VOTEQ"); */ static struct corosync_api_v1 *corosync_api; -static int votequorum_configured = 0; /* * votequorum global config vars @@ -222,6 +221,8 @@ static quorum_set_quorate_fn_t quorum_callback; * votequorum_exec handler and definitions */ +static int votequorum_exec_init_fn (struct corosync_api_v1 *api); + static void message_handler_req_exec_votequorum_nodeinfo ( const void *message, unsigned int nodeid); @@ -328,6 +329,7 @@ static struct corosync_service_engine votequorum_service_engine = { .lib_exit_fn = quorum_lib_exit_fn, .lib_engine = quorum_lib_service, .lib_engine_count = sizeof (quorum_lib_service) / sizeof (struct corosync_lib_handler), + .exec_init_fn = votequorum_exec_init_fn, .exec_engine = votequorum_exec_engine, .exec_engine_count = sizeof (votequorum_exec_engine) / sizeof (struct corosync_exec_handler), .confchg_fn = votequorum_confchg_fn, @@ -339,6 +341,14 @@ struct corosync_service_engine *votequorum_get_service_engine_ver0 (void) return (&votequorum_service_engine); } +static struct default_service votequorum_service[] = { + { + .name = "corosync_votequorum", + .ver = 0, + .loader = votequorum_get_service_engine_ver0 + }, +}; + /* * common/utility macros/functions */ @@ -1131,11 +1141,6 @@ static void votequorum_confchg_fn ( ENTER(); - if (votequorum_configured == 0) { - LEAVE(); - return; - } - if (member_list_entries> 1) { first_trans = 0; } @@ -1205,12 +1210,8 @@ cs_error_t votequorum_init(struct corosync_api_v1 *api, votequorum_readconfig_static(); - if (votequorum_exec_init_fn(api) != 0) { - LEAVE(); - return CS_ERR_NO_MEMORY; - } - - votequorum_configured = 1; + corosync_service_link_and_init(corosync_api, + &votequorum_service[0]); LEAVE(); diff --git a/exec/vsf_ykd.c b/exec/vsf_ykd.c index 282ba7f..e021ad1 100644 --- a/exec/vsf_ykd.c +++ b/exec/vsf_ykd.c @@ -146,8 +146,6 @@ hdb_handle_t schedwrk_state_send_callback_handle; static struct corosync_api_v1 *api; -static int ykd_configured = 0; - static void (*ykd_primary_callback_fn) ( const unsigned int *view_list, size_t view_list_entries, @@ -465,10 +463,6 @@ static void ykd_confchg_fn ( { int i; - if (ykd_configured == 0) { - return; - } - if (configuration_type != TOTEM_CONFIGURATION_REGULAR) { return; } @@ -525,8 +519,6 @@ cs_error_t ykd_init ( return CS_ERR_INVALID_PARAM; } - ykd_configured = 1; - api->tpg_init ( &ykd_group_handle, ykd_deliver_fn,
_______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss