commit: r383 - branches/branch_3_17/daemon
[email protected] Mon, 20 Nov 2006 16:17:30 -0500
| Newsgroups | gmane.network.spread.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: jonathan Date: 2006-11-20 16:17:29 -0500 (Mon, 20 Nov 2006) New Revision: 383 Modified: branches/branch_3_17/daemon/Changelog branches/branch_3_17/daemon/membership.c branches/branch_3_17/daemon/prot_body.h branches/branch_3_17/daemon/protocol.c branches/branch_3_17/daemon/spread_params.h Log: If token rotates too many times during EVS state, trigger a membership change to recover. This works-around a rare case of the daemon getting stuck in EVS state for an unknown reason. Original patch by John Schultz. Modified: branches/branch_3_17/daemon/Changelog =================================================================== --- branches/branch_3_17/daemon/Changelog 2006-11-20 21:08:13 UTC (rev 382) +++ branches/branch_3_17/daemon/Changelog 2006-11-20 21:17:29 UTC (rev 383) @@ -1,3 +1,12 @@ +Mon Nov 20 16:16:45 2006 Jonathan Stanton <[email protected]> + + * protocol.c, membership.c, prot_body.h, spread_params.h + (Prot_handle_token,Read_form2): If token rotates too many + times during EVS state, trigger a membership change to + recover. This works-around a rare case of the daemon getting + stuck in EVS state for an unknown reason. + Original patch by John Schultz. + Sun Nov 19 16:54:47 2006 Jonathan Stanton <[email protected]> * sp.c (SP_scat_receive): Add missing Mutex_unlock() calls Modified: branches/branch_3_17/daemon/membership.c =================================================================== --- branches/branch_3_17/daemon/membership.c 2006-11-20 21:08:13 UTC (rev 382) +++ branches/branch_3_17/daemon/membership.c 2006-11-20 21:17:29 UTC (rev 383) @@ -1985,6 +1985,8 @@ { Net_send_token( &send_scat ); Net_send_token( &send_scat ); + Token_rounds = 0; + }else{ /* build first regular token */ send_scat.num_elements = 1; @@ -1996,6 +1998,7 @@ form_token->rtr_len = 0; Net_send_token( &send_scat ); + Token_rounds = 1; } Token_alive = 1; E_queue( Memb_token_loss, 0, NULL, Token_timeout ); Modified: branches/branch_3_17/daemon/prot_body.h =================================================================== --- branches/branch_3_17/daemon/prot_body.h 2006-11-20 21:08:13 UTC (rev 382) +++ branches/branch_3_17/daemon/prot_body.h 2006-11-20 21:17:29 UTC (rev 383) @@ -73,6 +73,7 @@ ext int32 Last_discarded; ext int32 Last_delivered; ext int32 Last_seq; +ext int32 Token_rounds; ext token_header *Last_token; ext int Transitional; Modified: branches/branch_3_17/daemon/protocol.c =================================================================== --- branches/branch_3_17/daemon/protocol.c 2006-11-20 21:08:13 UTC (rev 382) +++ branches/branch_3_17/daemon/protocol.c 2006-11-20 21:17:29 UTC (rev 383) @@ -605,6 +605,8 @@ } } + Token_rounds++; + if( Conf_leader( Memb_active_ptr() ) == My.id ) E_queue( Prot_token_hurry, 0, NULL, Hurry_timeout ); @@ -631,9 +633,34 @@ Deliver_agreed_packets(); Deliver_reliable_packets( Highest_seq-num_sent+1, num_sent ); + if( Memb_state() == EVS && Token_rounds > MAX_EVS_ROUNDS ) + { + Alarmp( SPLOG_WARNING, PRINT, "Prot_handle_token: BUG WORKAROUND: Too many rounds in EVS state; swallowing token; state:\n" ); + Alarmp( SPLOG_WARNING, PRINT, "\tAru: %d\n", Aru ); + Alarmp( SPLOG_WARNING, PRINT, "\tMy_aru: %d\n", My_aru ); + Alarmp( SPLOG_WARNING, PRINT, "\tHighest_seq: %d\n", Highest_seq ); + Alarmp( SPLOG_WARNING, PRINT, "\tHighest_fifo_seq: %d\n", Highest_fifo_seq ); + Alarmp( SPLOG_WARNING, PRINT, "\tLast_discarded: %d\n", Last_discarded ); + Alarmp( SPLOG_WARNING, PRINT, "\tLast_delivered: %d\n", Last_delivered ); + Alarmp( SPLOG_WARNING, PRINT, "\tLast_seq: %d\n", Last_seq ); + Alarmp( SPLOG_WARNING, PRINT, "\tToken_rounds: %d\n", Token_rounds ); + Alarmp( SPLOG_WARNING, PRINT, "Last Token:\n" ); + Alarmp( SPLOG_WARNING, PRINT, "\ttype: 0x%x\n", Last_token->type ); + Alarmp( SPLOG_WARNING, PRINT, "\ttransmiter_id: %d\n", Last_token->transmiter_id ); + Alarmp( SPLOG_WARNING, PRINT, "\tseq: %d\n", Last_token->seq ); + Alarmp( SPLOG_WARNING, PRINT, "\tproc_id: %d\n", Last_token->proc_id ); + Alarmp( SPLOG_WARNING, PRINT, "\taru: %d\n", Last_token->aru ); + Alarmp( SPLOG_WARNING, PRINT, "\taru_last_id: %d\n", Last_token->aru_last_id ); + Alarmp( SPLOG_WARNING, PRINT, "\tflow_control: %d\n", Last_token->flow_control ); + Alarmp( SPLOG_WARNING, PRINT, "\trtr_len: %d\n", Last_token->rtr_len ); + /*Alarmp( SPLOG_WARNING, PRINT, "\tconf_hash: %d\n", Last_token->conf_hash );*/ + + Memb_token_loss(); + } + GlobalStatus.highest_seq = Highest_seq; GlobalStatus.aru = Aru; - GlobalStatus.token_rounds++; + GlobalStatus.token_rounds = Token_rounds; } void Prot_new_message( down_link *down_ptr, int not_used_in_spread3_p ) Modified: branches/branch_3_17/daemon/spread_params.h =================================================================== --- branches/branch_3_17/daemon/spread_params.h 2006-11-20 21:08:13 UTC (rev 382) +++ branches/branch_3_17/daemon/spread_params.h 2006-11-20 21:17:29 UTC (rev 383) @@ -67,6 +67,8 @@ #define MAX_SEQ_GAP 1600 /* used in flow control to limit difference between highest_seq and aru */ +#define MAX_EVS_ROUNDS 500 /* used in EVS state to limit total # of rounds to complete EVS */ + #define WATER_MARK 500 /* used to limit incoming user messages */ #define MAX_PRIVATE_NAME 10 /* not including the null, look for it if changed */