commit: r357 - in trunk: daemon docs

[email protected]
Newsgroups gmane.network.spread.cvs
Message-ID <[email protected]>
Author: jonathan
Date: 2006-11-13 18:13:29 -0500 (Mon, 13 Nov 2006)
New Revision: 357

Modified:
   trunk/daemon/Changelog
   trunk/daemon/membership.c
   trunk/daemon/prot_body.h
   trunk/daemon/protocol.c
   trunk/daemon/spread_params.h
   trunk/docs/sample.spread.conf
Log:
Patch to trigger a membership change if the token continues
to rotate too many times during EVS state (something that should not occur).
Original patch by John Schultz.



Modified: trunk/daemon/Changelog
===================================================================
--- trunk/daemon/Changelog	2006-11-13 21:23:58 UTC (rev 356)
+++ trunk/daemon/Changelog	2006-11-13 23:13:29 UTC (rev 357)
@@ -1,3 +1,12 @@
+Tue Sep 12 18:06:27 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 Jun  4 01:01:51 2006  Jonathan Stanton  <[email protected]>
 
 	* Makefile.in (SHARED_STDUTIL): Change libspread.so target

Modified: trunk/daemon/membership.c
===================================================================
--- trunk/daemon/membership.c	2006-11-13 21:23:58 UTC (rev 356)
+++ trunk/daemon/membership.c	2006-11-13 23:13:29 UTC (rev 357)
@@ -2005,6 +2005,8 @@
 	{
 		Net_send_token( &send_scat );
 		Net_send_token( &send_scat );
+		Token_rounds = 0;
+
 	}else{
 		/* build first regular token */
 		send_scat.num_elements = 1;
@@ -2016,6 +2018,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: trunk/daemon/prot_body.h
===================================================================
--- trunk/daemon/prot_body.h	2006-11-13 21:23:58 UTC (rev 356)
+++ trunk/daemon/prot_body.h	2006-11-13 23:13:29 UTC (rev 357)
@@ -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: trunk/daemon/protocol.c
===================================================================
--- trunk/daemon/protocol.c	2006-11-13 21:23:58 UTC (rev 356)
+++ trunk/daemon/protocol.c	2006-11-13 23:13:29 UTC (rev 357)
@@ -621,6 +621,8 @@
 		}
 	}
 
+	Token_rounds++;
+
 	if( Conf_leader( Memb_active_ptr() ) == My.id ) 
 		E_queue( Prot_token_hurry, 0, NULL, Hurry_timeout );
 
@@ -647,9 +649,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_ERROR, PRINT, "Prot_handle_token: BUG WORKAROUND: Too many rounds in EVS state; swallowing token; state:\n" );
+		Alarmp( SPLOG_ERROR, PRINT, "\tAru:              %d\n",   Aru );
+		Alarmp( SPLOG_ERROR, PRINT, "\tMy_aru:           %d\n",   My_aru );
+		Alarmp( SPLOG_ERROR, PRINT, "\tHighest_seq:      %d\n",   Highest_seq );
+		Alarmp( SPLOG_ERROR, PRINT, "\tHighest_fifo_seq: %d\n",   Highest_fifo_seq );
+		Alarmp( SPLOG_ERROR, PRINT, "\tLast_discarded:   %d\n",   Last_discarded );
+		Alarmp( SPLOG_ERROR, PRINT, "\tLast_delivered:   %d\n",   Last_delivered );
+		Alarmp( SPLOG_ERROR, PRINT, "\tLast_seq:         %d\n",   Last_seq );
+		Alarmp( SPLOG_ERROR, PRINT, "\tToken_rounds:     %d\n",   Token_rounds );
+		Alarmp( SPLOG_ERROR, PRINT, "Last Token:\n" );
+		Alarmp( SPLOG_ERROR, PRINT, "\ttype:             0x%x\n", Last_token->type );
+		Alarmp( SPLOG_ERROR, PRINT, "\ttransmiter_id:    %d\n",   Last_token->transmiter_id );
+		Alarmp( SPLOG_ERROR, PRINT, "\tseq:              %d\n",   Last_token->seq );
+		Alarmp( SPLOG_ERROR, PRINT, "\tproc_id:          %d\n",   Last_token->proc_id );
+		Alarmp( SPLOG_ERROR, PRINT, "\taru:              %d\n",   Last_token->aru );
+		Alarmp( SPLOG_ERROR, PRINT, "\taru_last_id:      %d\n",   Last_token->aru_last_id );
+		Alarmp( SPLOG_ERROR, PRINT, "\tflow_control:     %d\n",   Last_token->flow_control );
+		Alarmp( SPLOG_ERROR, PRINT, "\trtr_len:          %d\n",   Last_token->rtr_len );
+		Alarmp( SPLOG_ERROR, 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;
 }
 
 /* Basic algorithm:

Modified: trunk/daemon/spread_params.h
===================================================================
--- trunk/daemon/spread_params.h	2006-11-13 21:23:58 UTC (rev 356)
+++ trunk/daemon/spread_params.h	2006-11-13 23:13:29 UTC (rev 357)
@@ -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 */

Modified: trunk/docs/sample.spread.conf
===================================================================
--- trunk/docs/sample.spread.conf	2006-11-13 21:23:58 UTC (rev 356)
+++ trunk/docs/sample.spread.conf	2006-11-13 23:13:29 UTC (rev 357)
@@ -47,7 +47,7 @@
 #
 # The default level used if nothing is set is INFO.
 	
-#EventPriority = { INFO }
+#EventPriority =  INFO
 
 #Set whether to log to a file as opposed to stdout/stderr and what 
 # file to log to.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.