[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