On Fri, Mar 04, 2011 at 01:06:27PM -0700, Steven Dake wrote: > A commit token should be rejected when a token is lost in the recovery > state. This occurs naturally because the ring id increases by 4 for > every new ring. Prior to this patch, if the token was lost, the old > ring id information was restored, causing a commit token to be accepted > when it should be rejected. This erronously accepted commit token would > lead to an assertion which is fixed by this patch. >
Looks good Steve, you may as well remove the last references to "old_ring_state_saved". exec/totemsrp.c: int old_ring_state_saved; exec/totemsrp.c: instance->old_ring_state_saved = 1; exec/totemsrp.c: instance->old_ring_state_saved = 0; Reviewed-by: Angus Salkeld <[email protected]> > Signed-off-by: Steven Dake <[email protected]> > --- > exec/totemsrp.c | 59 +++++++++++++++++++++--------------------------------- > 1 files changed, 23 insertions(+), 36 deletions(-) > > diff --git a/exec/totemsrp.c b/exec/totemsrp.c > index c0e21b5..1296afe 100644 > --- a/exec/totemsrp.c > +++ b/exec/totemsrp.c > @@ -1395,30 +1395,23 @@ static void cancel_merge_detect_timeout (struct > totemsrp_instance *instance) > */ > 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_debug, > - "Saving state aru %x high seq received %x\n", > - instance->my_aru, instance->my_high_seq_received); > - } > + 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 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_debug, > - "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_debug, > + "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) > @@ -1527,6 +1520,13 @@ static void timer_function_pause_timeout (void *data) > reset_pause_timeout (instance); > } > > +static void memb_recovery_state_token_loss (struct totemsrp_instance > *instance) > +{ > + old_ring_state_restore (instance); > + memb_state_gather_enter (instance, 5); > + instance->stats.recovery_token_lost++; > +} > + > static void timer_function_orf_token_timeout (void *data) > { > struct totemsrp_instance *instance = data; > @@ -1560,9 +1560,7 @@ static void timer_function_orf_token_timeout (void > *data) > case MEMB_STATE_RECOVERY: > log_printf (instance->totemsrp_log_level_debug, > "The token was lost in the RECOVERY state.\n"); > - ring_state_restore (instance); > - memb_state_gather_enter (instance, 5); > - instance->stats.recovery_token_lost++; > + memb_recovery_state_token_loss (instance); > break; > } > } > @@ -2364,16 +2362,6 @@ static int orf_token_mcast ( > break; > } > message_item = (struct message_item *)cs_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++; > @@ -4222,9 +4210,8 @@ static int message_handler_memb_join ( > > 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; > -- > 1.7.4 > > _______________________________________________ > Openais mailing list > [email protected] > https://lists.linux-foundation.org/mailman/listinfo/openais _______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
