//Initialize timers static int init_pro_fd_events() { // Send buffer for sending alive pings to_oracle = udp_sendbuf_new(PAXOS_PINGS_NET); if(to_oracle == NULL) { printf("Error creating proposer->oracle network sender\n"); return PROPOSER_ERROR; } // Message receive event (from oracle) from_oracle = udp_receiver_new(PAXOS_ORACLE_NET); if (from_oracle == NULL) { printf("Error creating oracle->proposer network receiver\n"); return PROPOSER_ERROR; } event_set(&oracle_msg_event, from_oracle->sock, EV_READ|EV_PERSIST, pro_handle_oracle_msg, NULL); event_add(&oracle_msg_event, NULL); //Set timer for sending alive pings evtimer_set(&fe_ping_event, pro_ping_failure_detector, NULL); evutil_timerclear(&fe_ping_interval); fe_ping_interval.tv_sec = (FAILURE_DETECTOR_PING_INTERVAL / 1000000); fe_ping_interval.tv_usec = (FAILURE_DETECTOR_PING_INTERVAL % 1000000); //Send the first alive ping pro_ping_failure_detector(0, 0, NULL); return 0; }
//Initialize sockets and related events static int init_pro_network() { // Send buffer for talking to acceptors to_acceptors = udp_sendbuf_new(PAXOS_ACCEPTORS_NET); if(to_acceptors == NULL) { printf("Error creating proposer->acceptors network sender\n"); return PROPOSER_ERROR; } // Message receive event for_proposer = udp_receiver_new(PAXOS_PROPOSERS_NET); if (for_proposer == NULL) { printf("Error creating proposer network receiver\n"); return PROPOSER_ERROR; } event_set(&proposer_msg_event, for_proposer->sock, EV_READ|EV_PERSIST, pro_handle_newmsg, NULL); event_add(&proposer_msg_event, NULL); return 0; }
int main (int argc, char const *argv[]) { argc = argc; argv = argv; //Init oracle sender and receiver to_proposers = udp_sendbuf_new(PAXOS_ORACLE_NET); if(to_proposers == NULL) { printf("Error creating oracle->proposers network sender\n"); return -1; } for_oracle = udp_receiver_blocking_new(PAXOS_PINGS_NET); if (for_oracle == NULL) { printf("Error creating proposers->oracle network receiver\n"); return -1; } init_oracle_state(); oracle_lock(); // Starts 3 threads sharing a global lock //Thread 1: periodically send current leader pthread_create(&announce_thread, NULL, broadcast_current_leader, NULL); //Thread 2: Receive alive_ping from proposers pthread_create(&get_pings_thread, NULL, get_proposer_pings, NULL); //Thread 3: Ask the user to force a particular leader pthread_create(&user_input_thread, NULL, get_user_input, NULL); oracle_unlock(); while(1) { sleep(10); } return 0; }