[Spread-cvs] commit: r383 - branches/branch_3_17/daemon
jonathan at spread.org
jonathan at spread.org
Mon Nov 20 16:17:30 EST 2006
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 <jonathan at cnds.jhu.edu>
+
+ * 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 <jonathan at cnds.jhu.edu>
* 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 */
More information about the Spread-cvs
mailing list