X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/15af6f9bf88ff4bfdd0b8e87039e666ee092fbfe..0a140c4a29363442ebc51be3acddc903c249d17c:/examples/msg/dht-kademlia/dht-kademlia.c diff --git a/examples/msg/dht-kademlia/dht-kademlia.c b/examples/msg/dht-kademlia/dht-kademlia.c index f6885b9581..439ad0f7dc 100644 --- a/examples/msg/dht-kademlia/dht-kademlia.c +++ b/examples/msg/dht-kademlia/dht-kademlia.c @@ -20,15 +20,14 @@ static void main_loop(node_t node, double deadline) { double next_lookup_time = MSG_get_clock() + random_lookup_interval; XBT_VERB("Main loop start"); - while (MSG_get_clock() < deadline) { + if (node->receive_comm == NULL) { node->task_received = NULL; node->receive_comm = MSG_task_irecv(&node->task_received, node->mailbox); } - if (node->receive_comm) { - if (MSG_comm_test(node->receive_comm) == 0) { + if (!MSG_comm_test(node->receive_comm)) { /* We search for a pseudo random node */ if (MSG_get_clock() >= next_lookup_time) { random_lookup(node); @@ -43,12 +42,12 @@ static void main_loop(node_t node, double deadline) MSG_comm_destroy(node->receive_comm); node->receive_comm = NULL; - if (status == MSG_OK && node->task_received != NULL) { + if (status == MSG_OK) { xbt_assert((node->task_received != NULL), "We received an incorrect task"); handle_task(node, node->task_received); } else { - xbt_die("A problem occurred. Comm ended in status '%d' and there was '%d' received task", - status, node->task_received == NULL ? 0 : 1); + xbt_assert((MSG_comm_get_task(node->receive_comm) == NULL), "Comm failed but received a task."); + XBT_DEBUG("Nevermind, the communication has failed."); } } } else { @@ -58,7 +57,7 @@ static void main_loop(node_t node, double deadline) } //Cleanup the receiving communication. if (node->receive_comm != NULL) { - if (MSG_comm_test(node->receive_comm) != 0 && MSG_comm_get_status(node->receive_comm) == MSG_OK) { + if (MSG_comm_test(node->receive_comm) && MSG_comm_get_status(node->receive_comm) == MSG_OK) { task_free(MSG_comm_get_task(node->receive_comm)); } MSG_comm_destroy(node->receive_comm); @@ -137,7 +136,8 @@ unsigned int join(node_t node, unsigned int id_known) answer_got = 1; //retrieve the node list and ping them. task_data_t data = MSG_task_get_data(node->task_received); - if (data && data->type == TASK_FIND_NODE_ANSWER) { + xbt_assert((data != NULL), "Null data received"); + if (data->type == TASK_FIND_NODE_ANSWER) { node_contact_t contact; node_list = data->answer; xbt_dynar_foreach(node_list->nodes, i, contact) { @@ -159,8 +159,8 @@ unsigned int join(node_t node, unsigned int id_known) } while (answer_got == 0 && trial < max_join_trials); /* Second step: Send a FIND_NODE to a a random node in buckets */ unsigned int bucket_id = routing_table_find_bucket(node->table, id_known)->id; - for (i = 0; ((bucket_id - i) > 0 || (bucket_id + i) <= identifier_size) && i < JOIN_BUCKETS_QUERIES; i++) { - if (bucket_id - i > 0) { + for (i = 0; ((bucket_id > i) || (bucket_id + i) <= identifier_size) && i < JOIN_BUCKETS_QUERIES; i++) { + if (bucket_id > i) { unsigned int id_in_bucket = get_id_in_prefix(node->id, bucket_id - i); find_node(node, id_in_bucket, 0); } @@ -220,9 +220,10 @@ unsigned int find_node(node_t node, unsigned int id_to_find, unsigned int count_ xbt_assert((node->task_received != NULL), "Invalid task received"); //Figure out if we received an answer or something else task_data_t data = MSG_task_get_data(node->task_received); + xbt_assert((data != NULL), "No data in the task"); //Check if what we have received is what we are looking for. - if (data && data->type == TASK_FIND_NODE_ANSWER && data->answer->destination_id == id_to_find) { + if (data->type == TASK_FIND_NODE_ANSWER && data->answer->destination_id == id_to_find) { //Handle the answer node_routing_table_update(node, data->sender_id); node_contact_t contact; @@ -279,7 +280,6 @@ unsigned int ping(node_t node, unsigned int id_to_ping) char mailbox[MAILBOX_NAME_SIZE]; snprintf(mailbox,MAILBOX_NAME_SIZE, "%d", id_to_ping); - unsigned int destination_found = 0; double timeout = MSG_get_clock() + ping_timeout; msg_task_t ping_task = task_new_ping(node->id, node->mailbox, MSG_host_get_name(MSG_host_self())); @@ -298,30 +298,29 @@ unsigned int ping(node_t node, unsigned int id_to_ping) task_received = NULL; msg_error_t status = MSG_task_receive_with_timeout(&task_received, node->mailbox, ping_timeout); - if (status == MSG_OK && task_received) { + if (status == MSG_OK) { + xbt_assert((task_received != NULL), "Invalid task received"); //Checking if it's what we are waiting for or not. task_data_t data = MSG_task_get_data(task_received); - if (data && data->type == TASK_PING_ANSWER && id_to_ping == data->sender_id) { + xbt_assert((data != NULL), "didn't receive any data..."); + if (data->type == TASK_PING_ANSWER && id_to_ping == data->sender_id) { XBT_VERB("Ping to %s succeeded", mailbox); node_routing_table_update(node, data->sender_id); - destination_found = 1; task_free(task_received); + return 1; // Destination found, ping succeeded! } else { //If it's not our answer, we answer the query anyway. handle_task(node, task_received); } } - } while (destination_found == 0 && MSG_get_clock() < timeout); + } while (MSG_get_clock() < timeout); if (MSG_get_clock() >= timeout) { XBT_DEBUG("Ping to %s has timeout.", mailbox); return 0; } - if (destination_found == -1) { - XBT_DEBUG("It seems that %s is offline...", mailbox); - return 0; - } - return 1; + XBT_DEBUG("It seems that %s is offline...", mailbox); + return -1; } /** @brief Does a pseudo-random lookup for someone in the system @@ -361,11 +360,10 @@ unsigned int send_find_node_to_best(node_t node, answer_t node_list) unsigned int i = 0; unsigned int j = 0; unsigned int destination = node_list->destination_id; - node_contact_t node_to_query; while (j < kademlia_alpha && i < node_list->size) { /* We need to have at most "kademlia_alpha" requests each time, according to the protocol */ /* Gets the node we want to send the query to */ - node_to_query = xbt_dynar_get_as(node_list->nodes, i, node_contact_t); + node_contact_t node_to_query = xbt_dynar_get_as(node_list->nodes, i, node_contact_t); if (node_to_query->id != node->id) { /* No need to query ourselves */ send_find_node(node, node_to_query->id, destination); j++; @@ -379,24 +377,23 @@ unsigned int send_find_node_to_best(node_t node, answer_t node_list) void handle_task(node_t node, msg_task_t task) { task_data_t data = MSG_task_get_data(task); - if (data) { - //Adding/updating the guy to our routing table - node_routing_table_update(node, data->sender_id); - switch (data->type) { - case TASK_FIND_NODE: - handle_find_node(node, data); - break; - case TASK_FIND_NODE_ANSWER: - XBT_DEBUG("Received a wrong answer for a FIND_NODE"); - break; - case TASK_PING: - handle_ping(node, data); - break; - default: - break; - } - task_free(task); + xbt_assert((data != NULL), "Received NULL data"); + //Adding/updating the guy to our routing table + node_routing_table_update(node, data->sender_id); + switch (data->type) { + case TASK_FIND_NODE: + handle_find_node(node, data); + break; + case TASK_FIND_NODE_ANSWER: + XBT_DEBUG("Received a wrong answer for a FIND_NODE"); + break; + case TASK_PING: + handle_ping(node, data); + break; + default: + break; } + task_free(task); } /** @brief Handles the answer to an incoming "find_node" task */