commit: r374 - trunk/daemon
[email protected] Sun, 19 Nov 2006 16:02:17 -0500
| Newsgroups | gmane.network.spread.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: jonathan Date: 2006-11-19 16:02:16 -0500 (Sun, 19 Nov 2006) New Revision: 374 Modified: trunk/daemon/Changelog trunk/daemon/groups.c trunk/daemon/groups.h trunk/daemon/sess_body.h Log: Fix big-endian bug caused by int->char memcpy. Bug reported by Ryan Caudy. group->changed field is now a boolean instead of int. Value sent in GROUPS message is an int16u to have fixed size. Use GROUPS_BUF_* macros instead of recalcuating size. Split into a version that returns changed status as a bool and a void return for G_eliminate_partitioned_members(). Rename G_check_synced_set to void G_update_synced_set() and bool G_update_synced_set_status(). Change return value of G_check_if_changed_by_cascade() to bool. Use bool types for all 'changed' type variables. Modified: trunk/daemon/Changelog =================================================================== --- trunk/daemon/Changelog 2006-11-19 19:38:49 UTC (rev 373) +++ trunk/daemon/Changelog 2006-11-19 21:02:16 UTC (rev 374) @@ -1,3 +1,18 @@ +Sun Nov 19 15:13:47 2006 Jonathan Stanton <[email protected]> + + * sess_body.h, groups.h, groups.c (group,G_build_groups_buf): + Fix big-endian bug caused by int->char memcpy. + group->changed field is now a boolean instead of int. + Value sent in GROUPS message is an int16u to have fixed size. + Use GROUPS_BUF_* macros instead of recalcuating size. + + Split into a version that returns changed status as a bool + and a void return for G_eliminate_partitioned_members(). + Rename G_check_synced_set to void G_update_synced_set() and + bool G_update_synced_set_status(). + Change return value of G_check_if_changed_by_cascade() to bool. + Use bool types for all 'changed' type variables. + Fri Nov 17 13:43:42 2006 Jonathan Stanton <[email protected]> * network.c (Net_init): Do not bind to broadcast address Modified: trunk/daemon/groups.c =================================================================== --- trunk/daemon/groups.c 2006-11-19 19:38:49 UTC (rev 373) +++ trunk/daemon/groups.c 2006-11-19 21:02:16 UTC (rev 374) @@ -162,11 +162,13 @@ static void G_update_daemon_memb_ids( group *grp ); static void G_add_to_synced_set( synced_set *s ); -static int G_check_synced_set( synced_set *s, configuration *m ); +static void G_update_synced_set( synced_set *s, configuration *m ); +static bool G_update_synced_set_status( synced_set *s, configuration *m ); static void G_print_synced_set( int priority, synced_set *s, char *func_name ); -static int G_eliminate_partitioned_daemons( group *grp ); -static int G_check_if_changed_by_cascade( group *grp ); +static void G_eliminate_partitioned_daemons( group *grp ); +static bool G_eliminate_partitioned_daemons_status( group *grp ); +static bool G_check_if_changed_by_cascade( group *grp ); static void G_remove_daemon( group *grp, daemon_members *dmn ); static void G_remove_group( group *grp ); static void G_remove_mailbox( group *grp, mailbox m ); @@ -301,7 +303,7 @@ synced_set sset; int ret; char ip_string[16]; - int group_changed, synced_set_changed; + bool group_changed, synced_set_changed; stdit it; IP_to_STR( reg_memb_id.proc_id, ip_string ); @@ -365,7 +367,7 @@ G_print_group_id( SPLOG_DEBUG, grp->grp_id, "G_handle_reg_memb" ); grp->grp_id.memb_id = Reg_memb_id; grp->grp_id.index = 1; - grp->changed = 0; + grp->changed = FALSE; G_print_group_id( SPLOG_DEBUG, grp->grp_id, "G_handle_reg_memb" ); G_update_daemon_memb_ids( grp ); if( !stdarr_empty(&grp->mboxes) ) @@ -500,7 +502,7 @@ grp = *(group**) stdskl_it_key(&it); stdskl_it_next(&it); /* NOTE: need to do advancement before potential erasure below */ - group_changed = G_eliminate_partitioned_daemons( grp ); + group_changed = G_eliminate_partitioned_daemons_status( grp ); if( group_changed ) { Groups_bufs_fresh = 0; @@ -509,11 +511,11 @@ /* discard this empty group */ G_remove_group( grp ); } else { - grp->changed = 1; + grp->changed = TRUE; } } } - synced_set_changed = G_check_synced_set( &MySyncedSet, &Trans_memb ); + synced_set_changed = G_update_synced_set_status( &MySyncedSet, &Trans_memb ); G_print_synced_set( SPLOG_INFO, &MySyncedSet, "G_handle_reg_memb" ); /* Since one of the groups bufs holds the synced set... */ if( synced_set_changed ) @@ -548,7 +550,7 @@ { group *grp; daemon_members *dmn; - int group_changed; + bool group_changed; char ip_string[16]; stdit git, dit; @@ -578,7 +580,7 @@ grp = *(group**) stdskl_it_key(&git); stdskl_it_next(&git); /* NOTE: need to do advancement before potential erasure below */ - group_changed = 0; + group_changed = FALSE; for (stdskl_begin(&grp->DaemonsList, &dit); !stdskl_is_end(&grp->DaemonsList, &dit); ) { @@ -589,7 +591,7 @@ { /* mark this daemon as partitioned - proc no longer in membership */ dmn->memb_id = unknown_memb_id; - group_changed = 1; + group_changed = TRUE; } } if( group_changed ) @@ -603,7 +605,7 @@ G_print_group_id( SPLOG_DEBUG, grp->grp_id, "G_handle_trans_memb" ); grp->grp_id.memb_id = Trans_memb_id; grp->grp_id.index = 1; - grp->changed = 1; + grp->changed = TRUE; G_print_group_id( SPLOG_DEBUG, grp->grp_id, "G_handle_trans_memb" ); /* Here, we mark everyone who we are synced with as having the new memb_id * Specifically, that is, everyone who isn't partitioned from us now in the GroupsList */ @@ -614,7 +616,7 @@ Gstate = GTRANS; GlobalStatus.gstate = Gstate; - G_check_synced_set( &MySyncedSet, &Trans_memb ); + G_update_synced_set( &MySyncedSet, &Trans_memb ); G_print_synced_set( SPLOG_INFO, &MySyncedSet, "G_handle_trans_memb" ); break; @@ -664,7 +666,7 @@ group_changed = G_check_if_changed_by_cascade( grp ); if( group_changed ) { - grp->changed = 1; + grp->changed = TRUE; } } @@ -754,7 +756,7 @@ /* NOTE: Older versions of groups do mark a new group as changed if it's * created in GTRANS. This is only needed if the joiner is partitioned * from us [handled below]. */ - new_grp->changed = 0; + new_grp->changed = FALSE; if( Gstate == GOP) { new_grp->grp_id.memb_id = Reg_memb_id; @@ -837,7 +839,7 @@ new_mbox = -1; if( Is_partitioned_daemon( dmn ) && !grp->changed ) - grp->changed = 1; + grp->changed = TRUE; if( !stdarr_empty(&grp->mboxes) ) { if( grp->changed ) @@ -1523,7 +1525,7 @@ /* the group has changed */ grp->grp_id.memb_id = Reg_memb_id; grp->grp_id.index = 1; - grp->changed = 0; + grp->changed = FALSE; if( !stdarr_empty(&grp->mboxes) ) G_send_heavyweight_memb( grp ); G_update_daemon_memb_ids( grp ); @@ -1854,6 +1856,7 @@ int32u size_needed; int couldnt_fit_daemon; stdit mit; + int16u send_group_changed; /* A GROUPS message looks like this: * (Representative's name is in header, so we can get his proc id) @@ -1871,7 +1874,7 @@ * changed in any respect by this membership) or this ID can be * discarded. This is here so that daemons that don't know about * the group at all can get the correct ID in the unchanged case.] - * changed flag (byte) + * changed flag (int16u --boolean so always 0 or 1) * number of daemons for this group (in this message) (int16u) * For each daemon: * daemon proc id (int32) @@ -1917,7 +1920,7 @@ /* To have information about this group, we need to be able to fit * its name, ID, and the number of daemons it has in this message. */ - size_needed = MAX_GROUP_NAME + sizeof(group_id) + sizeof(byte) + sizeof(int16u) + Message_get_data_header_size(); + size_needed = GROUPS_BUF_GROUP_INFO_SIZE + Message_get_data_header_size(); if( size_needed > GROUPS_BUF_SIZE - num_bytes ) break; memcpy( &buf[num_bytes], grp->name, MAX_GROUP_NAME ); @@ -1926,8 +1929,9 @@ memcpy( &buf[num_bytes], &grp->grp_id, sizeof(group_id) ); num_bytes += sizeof(group_id); - memcpy( &buf[num_bytes], &grp->changed, sizeof(byte) ); - num_bytes += sizeof(byte); + send_group_changed = grp->changed; + memcpy( &buf[num_bytes], &send_group_changed, sizeof(int16u) ); + num_bytes += sizeof(int16u); num_dmns_ptr = &buf[num_bytes]; num_bytes += sizeof(int16u); @@ -1939,7 +1943,7 @@ /* To store this daemon's information about the current group, * we need to be able to store its proc_id, memb_id, number of * local members, and the private group names of its local members. */ - size_needed = sizeof(int32) + sizeof(membership_id) + sizeof(int16u) + + size_needed = GROUPS_BUF_DAEMON_INFO_SIZE + (stdskl_size(&dmn->MembersList) * MAX_GROUP_NAME) + Message_get_data_header_size(); /* This requires that the number of local group members be limited. */ if( size_needed > GROUPS_BUF_SIZE - num_bytes ) @@ -2085,7 +2089,7 @@ int i,j; char ip_string[16]; stdit it; - char sent_group_changed; + int16u sent_group_changed; total_bytes = 0; msg = mess_link->mess; @@ -2143,7 +2147,7 @@ Alarmp( SPLOG_FATAL, GROUPS, "%s: %d: memory allocation failed\n", __FILE__, __LINE__ ); } - grp->changed = 0; + grp->changed = FALSE; grp->num_members = 0; /* Set a group id here, so that if the group isn't changed, @@ -2166,11 +2170,11 @@ } num_bytes += sizeof(group_id); /* Get the changed flag for sent group and set local group changed flag if sent group was marked changed */ - memcpy( &sent_group_changed, &Temp_buf[num_bytes], sizeof(byte) ); - num_bytes += sizeof(byte); + memcpy( &sent_group_changed, &Temp_buf[num_bytes], sizeof(int16u) ); + num_bytes += sizeof(int16u); if (sent_group_changed) - grp->changed = 1; + grp->changed = TRUE; memcpy( &num_dmns, &Temp_buf[num_bytes], sizeof(int16u) ); num_bytes += sizeof(int16u); @@ -2216,7 +2220,7 @@ if( !grp->changed && !Memb_is_equal( dmn->memb_id, grp->grp_id.memb_id ) ) - grp->changed = 1; + grp->changed = TRUE; /* creating members */ for( j = 0; j < num_memb; ++j ) @@ -2574,22 +2578,33 @@ } /* Remove members who aren't in the membership. */ -static int G_check_synced_set( synced_set *s, configuration *memb_p ) { - int i, j = 0, changed = 0; +static void G_update_synced_set( synced_set *s, configuration *memb_p ) { + bool ret; + ret = G_update_synced_set_status( s, memb_p ); + return; +} +/* Remove members who aren't in the membership and + * return true if group changed membership or false otherwise */ +static bool G_update_synced_set_status( synced_set *s, configuration *memb_p ) +{ + int i, j = 0; + bool changed = FALSE; + for( i = 0; i < s->size; ++i ) if( Conf_id_in_conf( memb_p, s->proc_ids[i] ) >= 0 ) s->proc_ids[j++] = s->proc_ids[i]; /* If we lost members. */ if( j != s->size ) { s->size = j; - changed = 1; + changed = TRUE; } return changed; } /* Print the synced set. For debugging. */ -static void G_print_synced_set( int priority, synced_set *s, char *func_name ) { +static void G_print_synced_set( int priority, synced_set *s, char *func_name ) +{ int i; proc p; Alarmp( priority, GROUPS, "%s: Synced Set (with %u members):\n", func_name, s->size ); @@ -2599,12 +2614,20 @@ } } +/* Eliminate the partitioned daemons of a group. */ +static void G_eliminate_partitioned_daemons( group *grp ) +{ + bool ret; + ret = G_eliminate_partitioned_daemons_status( grp ); + return; +} + /* Eliminate the partitioned daemons of a group. Return true if we changed the * group. */ -static int G_eliminate_partitioned_daemons( group *grp ) +static bool G_eliminate_partitioned_daemons_status( group *grp ) { daemon_members *dmn; - int group_changed = 0; + bool group_changed = FALSE; int needed; stdit it; @@ -2635,7 +2658,7 @@ { /* discard this daemon and its members - proc no longer in membership */ G_remove_daemon( grp, dmn ); - group_changed = 1; + group_changed = TRUE; } } return group_changed; @@ -2643,10 +2666,10 @@ /* This function is only called when we handle a cascading transitional membership. * Gstate should be GGATHER, about to change to GGT */ -static int G_check_if_changed_by_cascade( group *grp ) +static bool G_check_if_changed_by_cascade( group *grp ) { daemon_members *dmn; - int group_changed = 0; + bool group_changed = FALSE; stdit it; for (stdskl_begin(&grp->DaemonsList, &it); !stdskl_is_end(&grp->DaemonsList, &it); stdskl_it_next(&it)) @@ -2654,7 +2677,7 @@ dmn = *(daemon_members**) stdskl_it_key(&it); if( Conf_id_in_conf( &Trans_memb, dmn->proc_id ) == -1 ) { - group_changed = 1; + group_changed = TRUE; break; } } Modified: trunk/daemon/groups.h =================================================================== --- trunk/daemon/groups.h 2006-11-19 19:38:49 UTC (rev 373) +++ trunk/daemon/groups.h 2006-11-19 21:02:16 UTC (rev 374) @@ -45,7 +45,7 @@ #define GROUPS_BUF_SIZE 100000 #define GROUPS_BUF_PREAMBLE_SIZE ( sizeof(membership_id) + sizeof(char) ) #define GROUPS_BUF_GROUP_INFO_SIZE ( MAX_GROUP_NAME + sizeof(group_id) + \ - sizeof(int16u) ) + sizeof(int16u) + sizeof(int16u) ) #define GROUPS_BUF_DAEMON_INFO_SIZE ( sizeof(int32) + sizeof(membership_id) + \ sizeof(int16u) ) #define MAX_LOCAL_GROUP_MEMBERS (( GROUPS_BUF_SIZE - GROUPS_BUF_PREAMBLE_SIZE \ Modified: trunk/daemon/sess_body.h =================================================================== --- trunk/daemon/sess_body.h 2006-11-19 19:38:49 UTC (rev 373) +++ trunk/daemon/sess_body.h 2006-11-19 21:02:16 UTC (rev 374) @@ -84,7 +84,7 @@ typedef struct dummy_group { char name[MAX_GROUP_NAME]; /* NOTE: groups.c depends on 'name' being the first member (GroupsList) */ group_id grp_id; - int changed; + bool changed; int num_members; /* sums over all daemons in DaemonsList */ stdskl DaemonsList; /* (daemon_members*) -> nil */ stdarr mboxes; /* (mailbox): local clients unordered */