[Spread-cvs] commit: r265 - trunk/daemon

jonathan at spread.org jonathan at spread.org
Tue Aug 16 13:45:56 EDT 2005


Author: jonathan
Date: 2005-08-16 13:45:55 -0400 (Tue, 16 Aug 2005)
New Revision: 265

Modified:
   trunk/daemon/config_parse.y
   trunk/daemon/configuration.c
   trunk/daemon/membership.c
   trunk/daemon/monitor.c
   trunk/daemon/net_types.h
   trunk/daemon/network.c
Log:
Fix bugs in hash checks that prevented some memberships from completing.
Allow monitor messages to always pass hash checks.


Modified: trunk/daemon/config_parse.y
===================================================================
--- trunk/daemon/config_parse.y	2005-08-10 02:07:49 UTC (rev 264)
+++ trunk/daemon/config_parse.y	2005-08-16 17:45:55 UTC (rev 265)
@@ -250,8 +250,8 @@
 
     if (curlen > strsize) {
         /* ran out of space in string -- should never happen. */
-        Alarmp( SPLOG_ERROR, CONF, "The segment string is too long! %d characters attemped is more then %d characters allowed", curlen, strsize);
-        Alarmp( SPLOG_ERROR, CONF, "The error occured on segment %d.%d.%d.%d. Successful string was: %s\n",
+        Alarmp( SPLOG_ERROR, CONF, "config_parse.y:convert_segment_to_string: The segment string is too long! %d characters attemped is more then %d characters allowed", curlen, strsize);
+        Alarmp( SPLOG_ERROR, CONF, "config_parse.y:convert_segment_to_string:The error occured on segment %d.%d.%d.%d. Successful string was: %s\n",
                 (seg->bcast_address & 0xff000000)>>24, 
                 (seg->bcast_address & 0xff0000)>>16, 
                 (seg->bcast_address & 0xff00)>>8, 
@@ -260,7 +260,7 @@
         return(-1);
     }
 
-    Alarmp( SPLOG_DEBUG, CONF, "The segment string is %d characters long:\n%s", curlen, segstr);
+    Alarmp( SPLOG_DEBUG, CONF, "config_parse.y:convert_segment_to_string:The segment string is %d characters long:\n%s", curlen, segstr);
     return(curlen);
 }
 
@@ -327,7 +327,7 @@
 			  Config->num_segments = segments;
 			  Config->num_total_procs = num_procs;
 			  Alarm(CONF, "Finished configuration file.\n");
-                          Alarmp( SPLOG_INFO, CONF, "The full segment string is %d characters long:\n%s", strlen(ConfStringRep), ConfStringRep);
+                          Alarmp( SPLOG_DEBUG, CONF, "config_parse.y:The full segment string is %d characters long:\n%s", strlen(ConfStringRep), ConfStringRep);
 			}
 
 

Modified: trunk/daemon/configuration.c
===================================================================
--- trunk/daemon/configuration.c	2005-08-10 02:07:49 UTC (rev 264)
+++ trunk/daemon/configuration.c	2005-08-16 17:45:55 UTC (rev 265)
@@ -377,7 +377,7 @@
          */
         Config->hash_code = conf_hash_string(ConfStringRep, ConfStringLen);
         Alarmp( SPLOG_DEBUG, CONF, "Full hash string is %d characters long:\n%s", ConfStringLen, ConfStringRep);
-        Alarmp( SPLOG_DEBUG, CONF, "Hash value for this configuration is: %u\n", Config->hash_code);
+        Alarmp( SPLOG_INFO, CONF, "Hash value for this configuration is: %u\n", Config->hash_code);
 
         /* Match my IP address to entry in configuration file */
 	if( my_name == NULL ){

Modified: trunk/daemon/membership.c
===================================================================
--- trunk/daemon/membership.c	2005-08-10 02:07:49 UTC (rev 264)
+++ trunk/daemon/membership.c	2005-08-16 17:45:55 UTC (rev 265)
@@ -257,19 +257,6 @@
 
 	pack_ptr = (packet_header *)scat->elements[0].buf;
 
-        /* First reject any message whose daemon has a different configuration */
-        if (pack_ptr->conf_hash != Cn->hash_code) {
-            Alarmp( SPLOG_WARNING, MEMB, "Memb_handle_message: Received message (pkthdr_len = %u) from host %d.%d.%d.%d with different spread configuration file (hash %u != local hash %u)\n", 
-                    scat->elements[0].len,
-                    IP1(pack_ptr->proc_id),
-                    IP2(pack_ptr->proc_id),
-                    IP3(pack_ptr->proc_id),
-                    IP4(pack_ptr->proc_id),
-                    pack_ptr->conf_hash, 
-                    Cn->hash_code);
-            return;
-        }
-
 	if( 	  Is_alive( pack_ptr->type ) )
 	{
 		Alarm( MEMB, "Memb_handle_message: handling alive message\n");
@@ -315,18 +302,6 @@
 
 	token_ptr = (token_header *)scat->elements[0].buf;
 
-        /* First reject any token whose daemon has a different configuration */
-        if (token_ptr->conf_hash != Cn->hash_code) {
-            Alarmp( SPLOG_WARNING, MEMB, "Memb_handle_token: Received token from host %d.%d.%d.%d with different spread configuration file (hash %u != local hash %u)\n", 
-                    IP1(token_ptr->proc_id),
-                    IP2(token_ptr->proc_id),
-                    IP3(token_ptr->proc_id),
-                    IP4(token_ptr->proc_id),
-                    token_ptr->conf_hash, 
-                    Cn->hash_code);
-            return;
-        }
-
 	if( 	  Is_form1( token_ptr->type ) )
 	{
 		Alarm( MEMB, "Memb_handle_token: handling form1 token\n");
@@ -987,7 +962,6 @@
 
 	pack_ptr = (packet_header *)Send_pack.elements[0].buf;
 	pack_ptr->type = ALIVE_TYPE;
-        pack_ptr->conf_hash = Cn->hash_code;
 	pack_ptr->data_len = 
 		2*sizeof(int16) + (F_members.num_members)*sizeof(int32);
 
@@ -1008,7 +982,6 @@
 
 	pack_ptr = (packet_header *)Send_pack.elements[0].buf;
 	pack_ptr->type = JOIN_TYPE;
-        pack_ptr->conf_hash = Cn->hash_code;
 	Send_pack.elements[1].buf = (char *)&F_members;
 	Send_pack.elements[1].len = 
 		2*sizeof(int16) + (F_members.num_members)*sizeof(int32);
@@ -1054,7 +1027,6 @@
 
 	pack_ptr = (packet_header *)Send_pack.elements[0].buf;
 	pack_ptr->type = JOIN_TYPE;
-        pack_ptr->conf_hash = Cn->hash_code;
 	Send_pack.elements[1].buf = (char *)&F_members;
 	Send_pack.elements[1].len = 
 		2*sizeof(int16) + (F_members.num_members)*sizeof(int32);
@@ -1318,7 +1290,6 @@
 	form_token.seq = Highest_seq+3333;
 	form_token.proc_id = My.id;
 	form_token.type = FORM1_TYPE;
-        form_token.conf_hash = Cn->hash_code;
 
 	/* if I am a ring leader - update my F_members */
 	if( F_reps.reps[0].type == RING_REP )
@@ -2121,6 +2092,7 @@
             snprintf(&form_name[0], 10, "FORM 2");
 
         Alarmp( SPLOG_PRINT, PRINT, "%s Token, sent by %u.%u.%u.%u. Seq: %d\n", form_name, IP1(form_token->transmiter_id), IP2(form_token->transmiter_id), IP3(form_token->transmiter_id), IP4(form_token->transmiter_id), form_token->seq);
+        Alarmp( SPLOG_PRINT, PRINT, "Configuration hash: %u (local hash %u)\n", form_token->conf_hash, Cn->hash_code);
         Alarmp( SPLOG_PRINT, PRINT, "ProcID: %u.%u.%u.%u\t ARU: %d, ARU LastID: %u.%u.%u.%u\n", IP1(form_token->proc_id), IP2(form_token->proc_id), IP3(form_token->proc_id), IP4(form_token->proc_id), form_token->aru, IP1(form_token->aru_last_id), IP2(form_token->aru_last_id), IP3(form_token->aru_last_id), IP4(form_token->aru_last_id) );
         Alarmp( SPLOG_PRINT, PRINT, "FlowControl: %hd\tRTR Len: %hd\n", form_token->flow_control, form_token->rtr_len);
         /* Print members list */

Modified: trunk/daemon/monitor.c
===================================================================
--- trunk/daemon/monitor.c	2005-08-10 02:07:49 UTC (rev 264)
+++ trunk/daemon/monitor.c	2005-08-16 17:45:55 UTC (rev 265)
@@ -85,8 +85,6 @@
 
 static	int		Status_vector[MAX_PROCS_RING];
 
-static	int		Status_vector[MAX_PROCS_RING];
-
 static	configuration	Cn;
 static  proc            My;
 static	int		My_port;
@@ -542,6 +540,7 @@
 
 	Pack.type    = PARTITION_TYPE;
 	Pack.type    = Set_endian( Pack.type );
+        Pack.conf_hash = MONITOR_HASH;
 	Pack.data_len= sizeof( Partition );;
 
 	Pack_scat.num_elements    = 2;
@@ -694,6 +693,7 @@
 
 	Pack.type    = FC_TYPE;
 	Pack.type    = Set_endian( Pack.type );
+        Pack.conf_hash = MONITOR_HASH;
 	Pack.data_len= sizeof( Fc_buf );;
 
 	Pack_scat.num_elements    = 2;
@@ -790,6 +790,7 @@
 
 	Pack.type    = STATUS_TYPE;
 	Pack.type    = Set_endian( Pack.type );
+        Pack.conf_hash = MONITOR_HASH;
 	Pack.data_len= 0;
 
 	Pack_scat.num_elements    = 1;
@@ -894,6 +895,7 @@
 	}
 	Pack.type    = PARTITION_TYPE;
 	Pack.type    = Set_endian( Pack.type );
+        Pack.conf_hash = MONITOR_HASH;
 	Pack.data_len= sizeof( Kill_partition );;
 
 	Pack_scat.num_elements    = 2;
@@ -1011,10 +1013,13 @@
 
 	Pack.type    = RELOAD_TYPE;
 	Pack.type    = Set_endian( Pack.type );
+        Pack.conf_hash = MONITOR_HASH;
 	Pack.data_len = 0;
 
 	Pack_scat.num_elements    = 1;
 
+        Alarm( PRINT, "Old configuration hash is: %u\n", Cn.hash_code);
+
 	Alarm( PRINT  , "Monitor: send conf reload command\n");
 	for( i=0; i < Cn.num_segments ; i++ )
 	{
@@ -1031,6 +1036,33 @@
 
         read_configuration();
 
+        for( i=0; i < Conf_num_procs( &Cn ); i++ )
+	{
+            Partition[i] = 0;
+            Work_partition[i] = 0;
+            Fc_buf[i] = 0;
+            Work_fc_buf[i] = 0;
+            Status_vector[i] = 0;
+	}
+        Mutex_lock( &Partition_mutex );
+        Partition_active = 0;
+        Mutex_unlock( &Partition_mutex );
+        
+#ifndef _REENTRANT
+        E_dequeue( Send_partition, 0, NULL );
+#endif
+
+        Mutex_lock( &Status_mutex );
+        Status_active = 0;
+        Mutex_unlock( &Status_mutex );
+
+#ifndef _REENTRANT
+	E_dequeue( Send_status_query, 0, NULL );
+#endif
+
+        Alarm( PRINT, "New configuration hash is: %u\n", Cn.hash_code);
+        Alarm( PRINT, "All Status, Partition, FC, etc commands are reset by configuration reload!\n");
+
 }
 
 static	void	Usage(int argc, char *argv[])

Modified: trunk/daemon/net_types.h
===================================================================
--- trunk/daemon/net_types.h	2005-08-10 02:07:49 UTC (rev 264)
+++ trunk/daemon/net_types.h	2005-08-16 17:45:55 UTC (rev 265)
@@ -104,6 +104,8 @@
 #define		Is_control( type )	( type &  CONTROL_TYPE    )
 
 
+#define MONITOR_HASH    1100    /* Conf_hash code for packets from spmonitor program */
+
 typedef	struct	dummy_packet_header {
 	int32		type;
 	int32		transmiter_id;

Modified: trunk/daemon/network.c
===================================================================
--- trunk/daemon/network.c	2005-08-10 02:07:49 UTC (rev 264)
+++ trunk/daemon/network.c	2005-08-16 17:45:55 UTC (rev 265)
@@ -249,6 +249,7 @@
 	pack_ptr = (packet_header *)scat->elements[0].buf;
 	pack_ptr->type  = Set_routed( pack_ptr->type );
 	pack_ptr->type  = Set_endian( pack_ptr->type );
+        pack_ptr->conf_hash = Cn->hash_code;
 	pack_ptr->transmiter_id = My.id;
 	for ( i=0; i< Num_send_needed; i++ )
 	{
@@ -318,6 +319,7 @@
                 pack_ptr = (packet_header *)scat->elements[0].buf;
                 pack_ptr->type  = Set_routed( pack_ptr->type );
                 pack_ptr->type  = Set_endian( pack_ptr->type );
+                pack_ptr->conf_hash = Cn->hash_code;
                 pack_ptr->transmiter_id = My.id;
         }
 
@@ -384,6 +386,7 @@
 	ret = 0;
 	pack_ptr = (packet_header *)scat->elements[0].buf;
 	pack_ptr->type = Set_endian( pack_ptr->type );
+        pack_ptr->conf_hash = Cn->hash_code;
 	pack_ptr->transmiter_id = My.id;
 	if( seg_index == My.seg_index )
 	{
@@ -419,6 +422,7 @@
 
 	pack_ptr = (packet_header *)scat->elements[0].buf;
 	pack_ptr->type = Set_endian( pack_ptr->type );
+        pack_ptr->conf_hash = Cn->hash_code;
 	pack_ptr->transmiter_id = My.id;
 	ret = Conf_proc_by_id( proc_id, &p );
 	if( ret < 0 )
@@ -468,6 +472,19 @@
 	/* Fliping packet header to my form if needed */
 	if( !Same_endian( pack_ptr->type ) ) Flip_pack( pack_ptr );
 
+        /* First reject any message whose daemon has a different configuration */
+        if ( (pack_ptr->conf_hash != Cn->hash_code) && (pack_ptr->conf_hash != MONITOR_HASH) ){
+            Alarmp( SPLOG_WARNING, NETWORK, "Net_recv: Received message (pkthdr_len = %u) from host %d.%d.%d.%d with different spread configuration file (hash %u != local hash %u)\n", 
+                    scat->elements[0].len,
+                    IP1(pack_ptr->proc_id),
+                    IP2(pack_ptr->proc_id),
+                    IP3(pack_ptr->proc_id),
+                    IP4(pack_ptr->proc_id),
+                    pack_ptr->conf_hash, 
+                    Cn->hash_code);
+            return( 0 );
+        }
+
 	if( Is_partition( pack_ptr->type ) )
 	{
 		/* Monitor : updating partition */
@@ -616,6 +633,7 @@
 
 	token_ptr = (token_header *)scat->elements[0].buf;
 	token_ptr->type = Set_endian( token_ptr->type );
+        token_ptr->conf_hash = Cn->hash_code;
 	token_ptr->transmiter_id = My.id;
 
         if ( token_ptr->rtr_len > (MAX_PACKET_SIZE - sizeof(token_header) ) )
@@ -655,6 +673,18 @@
 	/* Fliping token header to my form if needed */
 	if( !Same_endian( token_ptr->type ) ) Flip_token( token_ptr );
 
+        /* First reject any token whose daemon has a different configuration */
+        if (token_ptr->conf_hash != Cn->hash_code) {
+            Alarmp( SPLOG_WARNING, NETWORK, "Net_recv_token: Received token from host %d.%d.%d.%d with different spread configuration file (hash %u != local hash %u)\n", 
+                    IP1(token_ptr->proc_id),
+                    IP2(token_ptr->proc_id),
+                    IP3(token_ptr->proc_id),
+                    IP4(token_ptr->proc_id),
+                    token_ptr->conf_hash, 
+                    Cn->hash_code);
+            return( 0 );
+        }
+
 	/* Monitor : drop token from daemon in different monitor-caused partition */
 	if( !In_my_component( token_ptr->transmiter_id ) )
 		return( 0 );
@@ -670,6 +700,7 @@
 
 	token_ptr = (token_header *)scat->elements[0].buf;
 	token_ptr->type = Set_endian( token_ptr->type );
+        token_ptr->conf_hash = Cn->hash_code;
 	token_ptr->transmiter_id = My.id;
 	ret = Conf_proc_by_id( proc_id, &p );
 	if( ret < 0 )




More information about the Spread-cvs mailing list