quorum: fix votequorum service initialization

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@redhat.com>
Reviewed-by: Christine Caulfield <ccaulfie@redhat.com>
This commit is contained in:
Fabio M. Di Nitto 2012-01-17 14:32:19 +01:00
parent af7be8d972
commit 74619e9550
4 changed files with 18 additions and 32 deletions

View File

@ -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",
@ -99,11 +93,6 @@ static struct default_service default_services[] = {
.loader = wd_get_service_engine_ver0
},
#endif
{
.name = "corosync_votequorum",
.ver = 0,
.loader = votequorum_get_service_engine_ver0
},
{
.name = "corosync_quorum",
.ver = 0,

View File

@ -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

View File

@ -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();

View File

@ -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,