void Stat_init() { int16 dummy_port = 0; Start_time = E_get_time(); Report_channel = DL_init_channel( SEND_CHANNEL, dummy_port, 0, Conf_my().id ); Report_scat.num_elements = 2; Report_scat.elements[0].len = sizeof( packet_header ); Report_scat.elements[0].buf = (char *)&Pack; Report_scat.elements[1].len = sizeof( status ); Report_scat.elements[1].buf = (char *)&GlobalStatus; Pack.type = STATUS_TYPE; Pack.type = Set_endian( Pack.type ); Pack.data_len = sizeof( status ); Pack.proc_id = Conf_my().id; GlobalStatus.major_version = SP_MAJOR_VERSION; GlobalStatus.minor_version = SP_MINOR_VERSION; GlobalStatus.patch_version = SP_PATCH_VERSION; Alarm( STATUS, "Stat_init: went ok\n" ); }
static void read_configuration(void) { Conf_init( Config_file, My_name ); Cn = Conf(); My = Conf_my(); Alarm_clear_types(ALL); Alarm_set_types(PRINT | EXIT ); }
void FC_handle_message( sys_scatter *scat ) { int16 *cur_fc_buf; packet_header *pack_ptr; proc dummy_proc; int my_index; int16 temp_window,temp_personal_window; configuration *Cn; Cn = Conf_ref(); pack_ptr = (packet_header *)scat->elements[0].buf; if ( ! Conf_get_dangerous_monitor_state() ) { Alarm( FLOW_CONTROL, "FC_handle_message: Request to change flow control from (%d.%d.%d.%d) denied. Monitor in safe mode\n", IP1(pack_ptr->proc_id), IP2(pack_ptr->proc_id), IP3(pack_ptr->proc_id), IP4(pack_ptr->proc_id) ); return; } if( ! ( pack_ptr->memb_id.proc_id == 15051963 && Conf_id_in_conf( Cn, pack_ptr->proc_id ) != -1 ) ) { Alarm( FLOW_CONTROL, "FC_handle_message: Illegal monitor request\n"); return; } cur_fc_buf = (int16 *)scat->elements[1].buf; my_index = Conf_proc_by_id( Conf_my().id, &dummy_proc ); if( Same_endian( pack_ptr->type ) ) { temp_window = cur_fc_buf[Conf_num_procs( Cn )]; temp_personal_window = cur_fc_buf[my_index]; }else{ temp_window = Flip_int16( cur_fc_buf[Conf_num_procs( Cn )] ); temp_personal_window = Flip_int16( cur_fc_buf[my_index] ); } if( temp_window != -1 ) Window = temp_window; if( temp_personal_window != -1 ) Personal_window = temp_personal_window; GlobalStatus.window = Window; GlobalStatus.personal_window = Personal_window; Alarm( FLOW_CONTROL, "FC_handle_message: Got monitor mess, Window %d Personal %d\n", Window, Personal_window ); }
/* Basic algorithm: * 1) have configuration code load new conf file and check for modifications to conf. * 2) If only add/sub of daemons, then initiate membership change with token_loss and return; * 3) else, then set Conf_reload_state, create singleton partition, and schedule token_loss. * 4) When membership completes in Discard_packets() cleanup partition and probe for new members. */ void Prot_initiate_conf_reload( int code, void *data ) { bool need_memb_partition; int16 singleton_partition[MAX_PROCS_RING]; int i; if (Memb_state() != OP ) { /* This is a race condition, that the Prot_initiate_conf_reload was scheduled when OP state, * but another membership occured before it was executed. * The membership system will requeue this function when it reaches OP state again. */ return; } /* Disable queueing of this function when OP state reached in membership */ Prot_clear_need_conf_reload(); need_memb_partition = Conf_reload_initiate(); /* Signal all subsystems to update Conf and My strucures */ Net_signal_conf_reload(); Memb_signal_conf_reload(); Sess_signal_conf_reload(); /* update protocol varialbes with new conf */ My = Conf_my(); My_index = Conf_proc_by_id( My.id, &My ); if (need_memb_partition) { /* make partition */ for ( i = 0 ; i < Conf_num_procs( Conf_ref() ); i++ ) { singleton_partition[i] = i; } Net_set_partition(singleton_partition); Conf_reload_singleton_state_begin(); } E_queue( Memb_token_loss, 0, NULL, Zero_timeout ); }
void Prot_init(void) { int i, num_bcast, num_token; channel *bcast_channels; channel *token_channels; Mem_init_object( PACK_HEAD_OBJ, sizeof( packet_header ), MAX_PACKETS_IN_STRUCT, 0 ); Mem_init_object( PACKET_BODY, sizeof( packet_body ), MAX_PACKETS_IN_STRUCT, 0 ); Mem_init_object( TOKEN_HEAD_OBJ, sizeof( token_header ), 10, 0 ); Mem_init_object( TOKEN_BODY_OBJ, sizeof( token_body ), 10, 0 ); Mem_init_object( SCATTER, sizeof( scatter ), 200+MAX_PROCS_RING, 0 ); My = Conf_my(); My_index = Conf_proc_by_id( My.id, &My ); GlobalStatus.my_id = My.id; GlobalStatus.packet_delivered = 0; for( i=0; i < MAX_PROCS_RING+1; i++ ) Up_queue[i].exist = 0; for( i=0; i < MAX_PACKETS_IN_STRUCT; i++ ) Packets[i].exist = 0; if ( Conf_debug_initial_sequence() ) { Highest_seq = INITIAL_SEQUENCE_NEAR_WRAP; Highest_fifo_seq = INITIAL_SEQUENCE_NEAR_WRAP; My_aru = INITIAL_SEQUENCE_NEAR_WRAP; Aru = INITIAL_SEQUENCE_NEAR_WRAP; Set_aru = INITIAL_SEQUENCE_NEAR_WRAP -1; Last_discarded = INITIAL_SEQUENCE_NEAR_WRAP; Last_delivered = INITIAL_SEQUENCE_NEAR_WRAP; } else { Highest_seq = 0; Highest_fifo_seq = 0; My_aru = 0; Aru = 0; Set_aru = -1; Last_discarded = 0; Last_delivered = 0; } New_pack.num_elements = 2; New_pack.elements[0].len = sizeof(packet_header); New_pack.elements[0].buf = (char *) new(PACK_HEAD_OBJ); New_pack.elements[1].len = sizeof(packet_body); New_pack.elements[1].buf = (char *) new(PACKET_BODY); New_token.num_elements = 2; New_token.elements[0].len = sizeof(token_header); New_token.elements[0].buf = (char *) new(TOKEN_HEAD_OBJ); New_token.elements[1].len = sizeof(token_body); New_token.elements[1].buf = (char *) new(TOKEN_BODY_OBJ); Send_pack.num_elements = 2; Send_pack.elements[0].len = sizeof(packet_header); Token = (token_header *)New_token.elements[0].buf; Last_token = new(TOKEN_HEAD_OBJ); Last_token->type = 0; Last_token->seq = 0; Last_token->aru = 0; Last_token->flow_control = 0; Last_token->conf_hash = 0; Hurry_pack.num_elements = 1; Hurry_pack.elements[0].len = sizeof(packet_header); Hurry_pack.elements[0].buf = (char *) new(PACKET_BODY); Hurry_head = (packet_header *)Hurry_pack.elements[0].buf; Hurry_head->proc_id = My.id; Hurry_head->type = HURRY_TYPE; Net_init(); bcast_channels = Net_bcast_channel(); token_channels = Net_token_channel(); Net_num_channels( &num_bcast, &num_token); for ( i = 0; i < num_bcast; i++) { E_attach_fd( *bcast_channels, READ_FD, Prot_handle_bcast, 0, NULL, HIGH_PRIORITY ); bcast_channels++; } for ( i = 0; i < num_token; i++) { E_attach_fd( *token_channels, READ_FD, Prot_handle_token, 0, NULL, MEDIUM_PRIORITY ); token_channels++; } FC_init( ); Memb_init(); Net_set_membership( Reg_membership ); }