[Spread-cvs] commit: r273 - trunk/daemon
jonathan at spread.org
jonathan at spread.org
Tue Aug 30 09:19:47 EDT 2005
Author: jonathan
Date: 2005-08-30 09:19:47 -0400 (Tue, 30 Aug 2005)
New Revision: 273
Modified:
trunk/daemon/configuration.c
trunk/daemon/network.c
Log:
Fix for dynamic conf bug that caused crash with corrupted Cn struct.
Reported by Jacob Green.
Modified: trunk/daemon/configuration.c
===================================================================
--- trunk/daemon/configuration.c 2005-08-30 01:51:05 UTC (rev 272)
+++ trunk/daemon/configuration.c 2005-08-30 13:19:47 UTC (rev 273)
@@ -110,6 +110,7 @@
static char *Conf_MyName;
static int Conf_prev_proc_by_id( int32u id, proc *p );
+static void Conf_config_copy( configuration *src_conf, configuration *dst_conf, proc *src_procs, proc *dst_procs);
/* Hash function for string to 32 bit int */
static LOC_INLINE int32u conf_hash_string(const void * key, int32u key_len)
@@ -188,15 +189,17 @@
Config_Previous = Config;
Config_Previous_Procs = Config_procs;
- Config = Mem_alloc( sizeof( configuration ) );
- if (Config == NULL) {
- Alarmp( SPLOG_FATAL, CONF, "Conf_reload_initiate: Failed to allocate memory for configuration structure\n");
+ Config_Previous = Mem_alloc( sizeof( configuration ) );
+ if (Config_Previous == NULL) {
+ Alarmp( SPLOG_FATAL, CONF, "Conf_reload_initiate: Failed to allocate memory for old configuration structure\n");
}
- Config_procs = Mem_alloc( MAX_PROCS_RING * sizeof( proc ) );
- if (Config_procs == NULL) {
- Alarmp( SPLOG_FATAL, CONF, "Conf_reload_initiate: Failed to allocate memory for configuration procs array\n");
+ Config_Previous_Procs = Mem_alloc( MAX_PROCS_RING * sizeof( proc ) );
+ if (Config_Previous_Procs == NULL) {
+ Alarmp( SPLOG_FATAL, CONF, "Conf_reload_initiate: Failed to allocate memory for old configuration procs array\n");
}
+ Conf_config_copy( Config, Config_Previous, Config_procs, Config_Previous_Procs );
+
Conf_load_conf_file( Conf_FileName, Conf_MyName );
/* Exit if:
@@ -515,6 +518,56 @@
}
return( -1 );
}
+static int Conf_config_lookup_id( configuration *conf, proc *procs, int32u id)
+{
+ int i,j;
+
+ for ( i=0; i < conf->num_total_procs; i++ )
+ {
+ for ( j=0; j < procs[i].num_if; j++)
+ {
+ if ( procs[i].ifc[j].ip == id )
+ {
+ return( i );
+ }
+ }
+ }
+ return( -1 );
+}
+
+static void Conf_config_copy( configuration *src_conf, configuration *dst_conf, proc *src_procs, proc *dst_procs)
+{
+ int i,j,p_index;
+
+ *dst_conf = *src_conf;
+
+ for (i=0; i < src_conf->num_total_procs; i++ )
+ {
+ dst_procs[i] = src_procs[i];
+ }
+
+ for (i=0; i < src_conf->num_segments; i++ )
+ {
+ for ( j=0; j < src_conf->segments[i].num_procs; j++ )
+ {
+ p_index = Conf_config_lookup_id(dst_conf, dst_procs, src_conf->segments[i].procs[j]->id);
+ assert(p_index != -1);
+ dst_conf->segments[i].procs[j] = &dst_procs[p_index];
+ }
+ }
+
+#ifndef NDEBUG
+ /* Verify correct state after copy */
+ for (i=0; i < dst_conf->num_segments; i++ )
+ {
+ for ( j=0; j < dst_conf->segments[i].num_procs; j++ )
+ {
+ assert( dst_conf->segments[i].procs[j]->id == src_conf->segments[i].procs[j]->id );
+ }
+ }
+#endif
+}
+
static int Conf_proc_ref_by_id( int32u id, proc **p )
{
int i,j;
Modified: trunk/daemon/network.c
===================================================================
--- trunk/daemon/network.c 2005-08-30 01:51:05 UTC (rev 272)
+++ trunk/daemon/network.c 2005-08-30 13:19:47 UTC (rev 273)
@@ -199,8 +199,8 @@
assert(my_next_index != -1);
for( i=0; i < Num_send_needed; i++ )
Alarm( NETWORK,
- "Net_set_membership: Send_addr[%d] is (%d,%d)\n",
- i, Send_address[i], Send_ports[i] );
+ "Net_set_membership: Send_addr[%d] is (%u.%u.%u.%u:%d)\n",
+ i, IP1(Send_address[i]), IP2(Send_address[i]), IP3(Send_address[i]), IP4(Send_address[i]), Send_ports[i] );
/* Calculate where to send the token */
Token_address = 0;
@@ -235,8 +235,8 @@
}
}
- Alarm( NETWORK, "Net_set_membership: Token_address : (%d, %d)\n",
- Token_address, Token_port );
+ Alarm( NETWORK, "Net_set_membership: Token_address : (%u.%u.%u.%u:%d)\n",
+ IP1(Token_address), IP2(Token_address), IP3(Token_address), IP4(Token_address), Token_port );
}
int Net_bcast( sys_scatter *scat )
More information about the Spread-cvs
mailing list