[Openais] [PATCH] totemsrp: Only restore old ring id information one time

Jan Friesse jfriesse at redhat.com
Thu Mar 24 09:16:19 PDT 2011


Reviewed-by: Jan Friesse <jfriesse at redhat.com>

Steven Dake wrote:
> The current code stores the current ring information every time a commit
> token is generated.  This causes the old ring id used for comparison purposes
> to increase if a token is lost in commit or recovery, resulting in failure of
> totem.  This patch changes the behavior to only store the old ring id one
> time when the commit token is received, and then further commit token ring
> id saves are not done until OPERATIONAL is reached.
> 
> Signed-off-by: Steven Dake <sdake at redhat.com>
> ---
>  exec/totemsrp.c |   20 +++++++++++++-------
>  1 files changed, 13 insertions(+), 7 deletions(-)
> 
> diff --git a/exec/totemsrp.c b/exec/totemsrp.c
> index 6ea5bc0..7314616 100644
> --- a/exec/totemsrp.c
> +++ b/exec/totemsrp.c
> @@ -475,6 +475,8 @@ struct totemsrp_instance {
>  
>  	unsigned int set_aru;
>  
> +	int old_ring_state_saved;
> +
>  	int old_ring_state_aru;
>  
>  	unsigned int old_ring_state_high_seq_received;
> @@ -1411,13 +1413,16 @@ static void cancel_merge_detect_timeout (struct totemsrp_instance *instance)
>   */
>  static void old_ring_state_save (struct totemsrp_instance *instance)
>  {
> -	memcpy (&instance->my_old_ring_id, &instance->my_ring_id,
> -		sizeof (struct memb_ring_id));
> -	instance->old_ring_state_aru = instance->my_aru;
> -	instance->old_ring_state_high_seq_received = instance->my_high_seq_received;
> -	log_printf (instance->totemsrp_log_level_debug,
> -		"Saving state aru %x high seq received %x\n",
> -		instance->my_aru, instance->my_high_seq_received);
> +	if (instance->old_ring_state_saved == 0) {
> +		instance->old_ring_state_saved = 1;
> +		memcpy (&instance->my_old_ring_id, &instance->my_ring_id,
> +			sizeof (struct memb_ring_id));
> +		instance->old_ring_state_aru = instance->my_aru;
> +		instance->old_ring_state_high_seq_received = instance->my_high_seq_received;
> +		log_printf (instance->totemsrp_log_level_debug,
> +			"Saving state aru %x high seq received %x\n",
> +			instance->my_aru, instance->my_high_seq_received);
> +	}
>  }
>  
>  static void old_ring_state_restore (struct totemsrp_instance *instance)
> @@ -1433,6 +1438,7 @@ static void old_ring_state_reset (struct totemsrp_instance *instance)
>  {
>  	log_printf (instance->totemsrp_log_level_debug,
>  		"Resetting old ring state\n");
> +	instance->old_ring_state_saved = 0;
>  }
>  
>  static void reset_pause_timeout (struct totemsrp_instance *instance)



More information about the Openais mailing list