-/* Copyright (c) 2010, 2012-2017. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2010-2019. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
/* First step: Send a "FIND_NODE" request to the node we know */
sendFindNode(known_id, id_);
- simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::to_string(id_));
+ simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(id_));
do {
if (receive_comm == nullptr)
receive_comm = mailbox->get_async(&received_msg);
} while (not got_answer);
/* Second step: Send a FIND_NODE to a a random node in buckets */
- unsigned int bucket_id = table->findBucket(known_id)->getId();
- for (i = 0; ((bucket_id > i) || (bucket_id + i) <= identifier_size) && i < JOIN_BUCKETS_QUERIES; i++) {
+ unsigned int bucket_id = table.findBucket(known_id)->getId();
+ xbt_assert(bucket_id <= IDENTIFIER_SIZE);
+ 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(id_, bucket_id - i);
findNode(id_in_bucket, false);
}
- if (bucket_id + i <= identifier_size) {
+ if (bucket_id + i <= IDENTIFIER_SIZE) {
unsigned int id_in_bucket = get_id_in_prefix(id_, bucket_id + i);
findNode(id_in_bucket, false);
}
void Node::sendFindNode(unsigned int id, unsigned int destination)
{
/* Gets the mailbox to send to */
- simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::to_string(id));
+ simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(id));
/* Build the task */
- Message* msg = new Message(id_, destination, simgrid::s4u::Mailbox::byName(std::to_string(id_)),
- simgrid::s4u::Host::current()->getCname());
+ Message* msg = new Message(id_, destination, simgrid::s4u::Mailbox::by_name(std::to_string(id_)),
+ simgrid::s4u::Host::current()->get_cname());
/* Send the task */
mailbox->put_init(msg, 1)->detach(kademlia::destroy);
}
/**
- * Sends to the best "kademlia_alpha" nodes in the "node_list" array a "FIND_NODE" request, to ask them for their best
+ * Sends to the best "KADEMLIA_ALPHA" nodes in the "node_list" array a "FIND_NODE" request, to ask them for their best
* nodes
*/
unsigned int Node::sendFindNodeToBest(Answer* node_list)
unsigned int j = 0;
unsigned int destination = node_list->getDestinationId();
for (auto node_to_query : node_list->nodes) {
- /* We need to have at most "kademlia_alpha" requests each time, according to the protocol */
+ /* 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 */
if (node_to_query.first != id_) { /* No need to query ourselves */
sendFindNode(node_to_query.first, destination);
j++;
}
i++;
- if (j == kademlia_alpha)
+ if (j == KADEMLIA_ALPHA)
break;
}
return i;
void Node::routingTableUpdate(unsigned int id)
{
// retrieval of the bucket in which the should be
- Bucket* bucket = table->findBucket(id);
+ Bucket* bucket = table.findBucket(id);
// check if the id is already in the bucket.
auto id_pos = std::find(bucket->nodes.begin(), bucket->nodes.end(), id);
{
Answer* answer = new Answer(destination_id);
/* We find the corresponding bucket for the id */
- Bucket* bucket = table->findBucket(destination_id);
+ const Bucket* bucket = table.findBucket(destination_id);
int bucket_id = bucket->getId();
- xbt_assert((bucket_id <= identifier_size), "Bucket found has a wrong identifier");
+ xbt_assert((bucket_id <= IDENTIFIER_SIZE), "Bucket found has a wrong identifier");
/* So, we copy the contents of the bucket unsigned into our answer */
answer->addBucket(bucket);
- /* However, if we don't have enough elements in our bucket, we NEED to include at least "bucket_size" elements
- * (if, of course, we know at least "bucket_size" elements. So we're going to look unsigned into the other buckets.
+ /* However, if we don't have enough elements in our bucket, we NEED to include at least "BUCKET_SIZE" elements
+ * (if, of course, we know at least "BUCKET_SIZE" elements. So we're going to look unsigned into the other buckets.
*/
- for (int i = 1; answer->getSize() < BUCKET_SIZE && ((bucket_id - i > 0) || (bucket_id + i < identifier_size)); i++) {
+ for (int i = 1; answer->getSize() < BUCKET_SIZE && ((bucket_id - i > 0) || (bucket_id + i < IDENTIFIER_SIZE)); i++) {
/* We check the previous buckets */
if (bucket_id - i >= 0) {
- Bucket* bucket_p = table->buckets[bucket_id - i];
+ const Bucket* bucket_p = &table.buckets[bucket_id - i];
answer->addBucket(bucket_p);
}
/* We check the next buckets */
- if (bucket_id + i <= identifier_size) {
- Bucket* bucket_n = table->buckets[bucket_id + i];
+ if (bucket_id + i <= IDENTIFIER_SIZE) {
+ const Bucket* bucket_n = &table.buckets[bucket_id + i];
answer->addBucket(bucket_n);
}
}
- /* We trim the array to have only bucket_size or less elements */
+ /* We trim the array to have only BUCKET_SIZE or less elements */
std::sort(answer->nodes.begin(), answer->nodes.end(), sortbydistance);
answer->trim();
unsigned int answers;
bool destination_found = false;
unsigned int nodes_added = 0;
- double global_timeout = simgrid::s4u::Engine::getClock() + find_node_global_timeout;
+ double global_timeout = simgrid::s4u::Engine::get_clock() + FIND_NODE_GLOBAL_TIMEOUT;
unsigned int steps = 0;
/* First we build a list of who we already know */
answers = 0;
queries = sendFindNodeToBest(node_list);
nodes_added = 0;
- double timeout = simgrid::s4u::Engine::getClock() + find_node_timeout;
+ double timeout = simgrid::s4u::Engine::get_clock() + FIND_NODE_TIMEOUT;
steps++;
- double time_beginreceive = simgrid::s4u::Engine::getClock();
+ double time_beginreceive = simgrid::s4u::Engine::get_clock();
- simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::to_string(id_));
+ simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(id_));
do {
if (receive_comm == nullptr)
receive_comm = mailbox->get_async(&received_msg);
answers++;
nodes_added = node_list->merge(msg->answer_);
- XBT_DEBUG("Received an answer from %s (%s) with %lu nodes on it", msg->answer_to_->getCname(),
- msg->issuer_host_name_, msg->answer_->nodes.size());
+ XBT_DEBUG("Received an answer from %s (%s) with %zu nodes on it", msg->answer_to_->get_cname(),
+ msg->issuer_host_name_.c_str(), msg->answer_->nodes.size());
} else {
if (msg->answer_) {
routingTableUpdate(msg->sender_id_);
handleFindNode(msg);
}
// Update the timeout if we didn't have our answer
- timeout += simgrid::s4u::Engine::getClock() - time_beginreceive;
- time_beginreceive = simgrid::s4u::Engine::getClock();
+ timeout += simgrid::s4u::Engine::get_clock() - time_beginreceive;
+ time_beginreceive = simgrid::s4u::Engine::get_clock();
}
delete msg->answer_;
delete msg;
} else {
simgrid::s4u::this_actor::sleep_for(1);
}
- } while (simgrid::s4u::Engine::getClock() < timeout && answers < queries);
+ } while (simgrid::s4u::Engine::get_clock() < timeout && answers < queries);
destination_found = node_list->destinationFound();
} while (not destination_found && (nodes_added > 0 || answers == 0) &&
- simgrid::s4u::Engine::getClock() < global_timeout && steps < MAX_STEPS);
+ simgrid::s4u::Engine::get_clock() < global_timeout && steps < MAX_STEPS);
if (destination_found) {
if (count_in_stats)
void Node::handleFindNode(Message* msg)
{
routingTableUpdate(msg->sender_id_);
- XBT_VERB("Received a FIND_NODE from %s (%s), he's trying to find %08x", msg->answer_to_->getCname(),
- msg->issuer_host_name_, msg->destination_id_);
+ XBT_VERB("Received a FIND_NODE from %s (%s), he's trying to find %08x", msg->answer_to_->get_cname(),
+ msg->issuer_host_name_.c_str(), msg->destination_id_);
// Building the answer to the request
Message* answer =
new Message(id_, msg->destination_id_, findClosest(msg->destination_id_),
- simgrid::s4u::Mailbox::byName(std::to_string(id_)), simgrid::s4u::Host::current()->getCname());
+ simgrid::s4u::Mailbox::by_name(std::to_string(id_)), simgrid::s4u::Host::current()->get_cname());
// Sending the answer
msg->answer_to_->put_init(answer, 1)->detach(kademlia::destroy);
}