static void *handle_ping(void *arg) //master handle ping from server { Pthread_detach(pthread_self()); char *buf = (char *)arg; pair <int, int> srv_name; depacketize(buf, srv_name); //printf("%s\n",seperator); printf("Ping received: 127.0.0.1:%d\n",srv_name.second); ms.update_time_sheet(srv_name); //ms.display_time_sheet(); if (!ms.Server_exists(srv_name)) //if the server doesn't exist, it means that new server joined, start chain extension { printf("New server joined:127.0.0.1:%d, chain extension start\n",srv_name.second); Server *s = new Server(srv_name); ms.Addserver(s); ms.client_notify(srv_name, true); ms.server_notify(srv_name, true); } }
static void *probing(void *arg) //master probe the time_sheet in every 5 seconds { Pthread_detach(pthread_self()); while (1) { sleep(5); printf("start probing\n"); time_t cur_time = time(NULL); for(map<pair<int, int>, time_t >::iterator it = ms.Gettimesheet().begin(); it != ms.Gettimesheet().end(); ++it) { if (cur_time - (it->second) > 5) //if certain server's last ping from now is more than 5 seconds, it means the server fails, start notify client and server the failure { printf("%s\n",seperator); printf("Server 127.0.0.1:%d FAILS\n",it->first.second); ms.client_notify(it->first, false); ms.server_notify(it->first, false); it = ms.Gettimesheet().erase(it); if (it == ms.Gettimesheet().end()) break; } } } }