Index: exec/totemsrp.c =================================================================== --- exec/totemsrp.c (revision 2164) +++ exec/totemsrp.c (revision 2165) @@ -477,8 +477,6 @@ unsigned int set_aru; - int old_ring_state_saved; - int old_ring_state_aru; unsigned int old_ring_state_high_seq_received; @@ -1310,16 +1308,13 @@ */ static void old_ring_state_save (struct totemsrp_instance *instance) { - 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_notice, - "Saving state aru %x high seq received %x\n", - instance->my_aru, instance->my_high_seq_received); - } + 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 ring_save (struct totemsrp_instance *instance) @@ -1336,25 +1331,19 @@ instance->ring_saved = 0; } -static void ring_state_restore (struct totemsrp_instance *instance) +static void old_ring_state_restore (struct totemsrp_instance *instance) { - if (instance->old_ring_state_saved) { - memcpy (&instance->my_ring_id, &instance->my_old_ring_id, - sizeof (struct memb_ring_id)); - - instance->my_aru = instance->old_ring_state_aru; - instance->my_high_seq_received = instance->old_ring_state_high_seq_received; - log_printf (instance->totemsrp_log_level_notice, - "Restoring instance->my_aru %x my high seq received %x\n", - instance->my_aru, instance->my_high_seq_received); - } + instance->my_aru = instance->old_ring_state_aru; + instance->my_high_seq_received = instance->old_ring_state_high_seq_received; + log_printf (instance->totemsrp_log_level_notice, + "Restoring instance->my_aru %x my high seq received %x\n", + instance->my_aru, instance->my_high_seq_received); } 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_token_timeout (struct totemsrp_instance *instance) { @@ -1434,6 +1423,12 @@ static void memb_merge_detect_transmit (struct totemsrp_instance *instance); +static void memb_recovery_state_token_loss (struct totemsrp_instance *instance) +{ + old_ring_state_restore (instance); + memb_state_gather_enter (instance, 5); +} + /* * Timers used for various states of the membership algorithm */ @@ -1465,8 +1460,7 @@ case MEMB_STATE_RECOVERY: log_printf (instance->totemsrp_log_level_notice, "The token was lost in the RECOVERY state.\n"); - ring_state_restore (instance); - memb_state_gather_enter (instance, 5); + memb_recovery_state_token_loss (instance); break; } } @@ -2309,17 +2303,7 @@ break; } message_item = (struct message_item *)queue_item_get (mcast_queue); - /* preincrement required by algo */ - if (instance->old_ring_state_saved && - (instance->memb_state == MEMB_STATE_GATHER || - instance->memb_state == MEMB_STATE_COMMIT)) { - log_printf (instance->totemsrp_log_level_debug, - "not multicasting at seqno is %d\n", - token->seq); - return (0); - } - message_item->mcast->seq = ++token->seq; message_item->mcast->this_seqno = instance->global_seqno++; @@ -4130,9 +4114,8 @@ memb_join->ring_seq >= instance->my_ring_id.seq) { - ring_state_restore (instance); - memb_join_process (instance, memb_join); + memb_recovery_state_token_loss (instance); memb_state_gather_enter (instance, 14); } break;