From ef05817ce5b9af6e4bfdd9c88f8e20c2297b08d7 Mon Sep 17 00:00:00 2001 From: Steven Dake Date: Thu, 24 Mar 2011 08:46:24 -0700 Subject: [PATCH] totemsrp: Only restore old ring id information one time 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 Reviewed-by: Jan Friesse --- exec/totemsrp.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/exec/totemsrp.c b/exec/totemsrp.c index 8df60028..7c2a6a15 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)