Просмотр исходного кода

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>
Fabio M. Di Nitto 14 лет назад
Родитель
Сommit
74619e9550
4 измененных файлов с 18 добавлено и 32 удалено
  1. 0 11
      exec/service.c
  2. 5 1
      exec/service.h
  3. 13 12
      exec/votequorum.c
  4. 0 8
      exec/vsf_ykd.c

+ 0 - 11
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",
@@ -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,

+ 5 - 1
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

+ 13 - 12
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();
 

+ 0 - 8
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,