Re: [PATCH 2/2] quorum: fix votequorum service initialization

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Reviewed-by:  Steven Dake <sdake@xxxxxxxxxx>

On 01/17/2012 06:38 AM, 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


[Index of Archives]     [Linux Clusters]     [Corosync Project]     [Linux USB Devel]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Linux Kernel]     [Linux SCSI]     [X.Org]

  Powered by Linux