Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Try to ensure test reproducibility.
[simgrid.git] / examples / s4u / dht-chord / s4u-dht-chord-node.cpp
index 4a73c0f..8d9640f 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-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. */
@@ -17,10 +17,10 @@ XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(s4u_chord);
  * 24 belongs to [21, 29]
  * 24 does not belong to [29, 21]
  *
- * \param id id to check
- * \param start lower bound
- * \param end upper bound
- * \return a non-zero value if id in in [start, end]
+ * @param id id to check
+ * @param start lower bound
+ * @param end upper bound
+ * @return a non-zero value if id in in [start, end]
  */
 static int is_in_interval(int id, int start, int end)
 {
@@ -52,18 +52,13 @@ Node::Node(std::vector<std::string> args)
 
   // initialize my node
   id_                = std::stoi(args[1]);
-  stream             = simgrid::s4u::this_actor::getHost()->extension<HostChord>()->getStream();
-  mailbox_           = simgrid::s4u::Mailbox::byName(std::to_string(id_));
+  mailbox_           = simgrid::s4u::Mailbox::by_name(std::to_string(id_));
   next_finger_to_fix = 0;
-  fingers_           = new int[nb_bits];
-
-  for (int i = 0; i < nb_bits; i++) {
-    fingers_[i] = id_;
-  }
+  fingers_.resize(nb_bits, id_);
 
   if (args.size() == 3) { // first ring
     deadline_   = std::stod(args[2]);
-    start_time_ = simgrid::s4u::Engine::getClock();
+    start_time_ = simgrid::s4u::Engine::get_clock();
     XBT_DEBUG("Create a new Chord ring...");
   } else {
     known_id_   = std::stoi(args[2]);
@@ -74,14 +69,10 @@ Node::Node(std::vector<std::string> args)
   }
 }
 
-Node::~Node()
-{
-  delete[] fingers_;
-}
 /* Makes the current node join the ring, knowing the id of a node already in the ring
  *
- * \param known_id id of a node already in the ring
- * \return true if the join operation succeeded
+ * @param known_id id of a node already in the ring
+ * @return true if the join operation succeeded
  *  */
 
 void Node::join(int known_id)
@@ -117,12 +108,10 @@ void Node::notifyAndQuit()
 
   XBT_DEBUG("Sending a 'PREDECESSOR_LEAVING' to my successor %d", fingers_[0]);
   try {
-    simgrid::s4u::Mailbox::byName(std::to_string(fingers_[0]))->put(pred_msg, 10, timeout);
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Timeout expired when sending a 'PREDECESSOR_LEAVING' to my successor %d", fingers_[0]);
-      delete pred_msg;
-    }
+    simgrid::s4u::Mailbox::by_name(std::to_string(fingers_[0]))->put(pred_msg, 10, timeout);
+  } catch (const simgrid::TimeoutException&) {
+    XBT_DEBUG("Timeout expired when sending a 'PREDECESSOR_LEAVING' to my successor %d", fingers_[0]);
+    delete pred_msg;
   }
 
   if (pred_id_ != -1 && pred_id_ != id_) {
@@ -133,12 +122,10 @@ void Node::notifyAndQuit()
     XBT_DEBUG("Sending a 'SUCCESSOR_LEAVING' to my predecessor %d", pred_id_);
 
     try {
-      simgrid::s4u::Mailbox::byName(std::to_string(pred_id_))->put(succ_msg, 10, timeout);
-    } catch (xbt_ex& e) {
-      if (e.category == timeout_error) {
-        XBT_DEBUG("Timeout expired when sending a 'SUCCESSOR_LEAVING' to my predecessor %d", pred_id_);
-        delete succ_msg;
-      }
+      simgrid::s4u::Mailbox::by_name(std::to_string(pred_id_))->put(succ_msg, 10, timeout);
+    } catch (const simgrid::TimeoutException&) {
+      XBT_DEBUG("Timeout expired when sending a 'SUCCESSOR_LEAVING' to my predecessor %d", pred_id_);
+      delete succ_msg;
     }
   }
 }
@@ -147,7 +134,9 @@ void Node::notifyAndQuit()
 void Node::randomLookup()
 {
   int res          = id_;
-  int random_index = RngStream_RandInt(stream, 0, nb_bits - 1);
+  // std::uniform_int_distribution<int> dist(0, nb_bits - 1);
+  // int random_index = dist(generator);
+  int random_index = generator() % nb_bits; // ensure reproducibility across platforms
   int random_id    = fingers_[random_index];
   XBT_DEBUG("Making a lookup request for id %d", random_id);
   if (random_id != id_)
@@ -157,9 +146,9 @@ void Node::randomLookup()
 
 /* Sets a finger of the current node.
  *
- * \param node the current node
- * \param finger_index index of the finger to set (0 to nb_bits - 1)
- * \param id the id to set for this finger
+ * @param node the current node
+ * @param finger_index index of the finger to set (0 to nb_bits - 1)
+ * @param id the id to set for this finger
  */
 void Node::setFinger(int finger_index, int id)
 {
@@ -170,7 +159,7 @@ void Node::setFinger(int finger_index, int id)
 }
 
 /* Sets the predecessor of the current node.
- * \param id the id to predecessor, or -1 to unset the predecessor
+ * @param id the id to predecessor, or -1 to unset the predecessor
  */
 void Node::setPredecessor(int predecessor_id)
 {
@@ -184,7 +173,7 @@ void Node::setPredecessor(int predecessor_id)
 void Node::fixFingers()
 {
   XBT_DEBUG("Fixing fingers");
-  int id = findSuccessor(id_ + powers2[next_finger_to_fix]);
+  int id = findSuccessor(id_ + (1U << next_finger_to_fix));
   if (id != -1) {
     if (id != fingers_[next_finger_to_fix]) {
       setFinger(next_finger_to_fix, id);
@@ -201,7 +190,7 @@ void Node::printFingerTable()
     XBT_VERB("My finger table:");
     XBT_VERB("Start | Succ");
     for (int i = 0; i < nb_bits; i++) {
-      XBT_VERB(" %3d  | %3d", (id_ + powers2[i]) % nb_keys, fingers_[i]);
+      XBT_VERB(" %3u  | %3d", (id_ + (1U << i)) % nb_keys, fingers_[i]);
     }
 
     XBT_VERB("Predecessor: %d", pred_id_);
@@ -216,8 +205,8 @@ void Node::checkPredecessor()
   if (pred_id_ == -1)
     return;
 
-  simgrid::s4u::MailboxPtr mailbox        = simgrid::s4u::Mailbox::byName(std::to_string(pred_id_));
-  simgrid::s4u::MailboxPtr return_mailbox = simgrid::s4u::Mailbox::byName(std::to_string(id_) + "_is_alive");
+  simgrid::s4u::Mailbox* mailbox        = simgrid::s4u::Mailbox::by_name(std::to_string(pred_id_));
+  simgrid::s4u::Mailbox* return_mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(id_) + "_is_alive");
 
   ChordMessage* message = new ChordMessage(PREDECESSOR_ALIVE);
   message->request_id   = pred_id_;
@@ -226,41 +215,38 @@ void Node::checkPredecessor()
   XBT_DEBUG("Sending a 'Predecessor Alive' request to my predecessor %d", pred_id_);
   try {
     mailbox->put(message, 10, timeout);
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to send the 'Predecessor Alive' request to %d", pred_id_);
-      delete message;
-      return;
-    }
+  } catch (const simgrid::TimeoutException&) {
+    XBT_DEBUG("Failed to send the 'Predecessor Alive' request to %d", pred_id_);
+    delete message;
+    return;
   }
+
   // receive the answer
   XBT_DEBUG("Sent 'Predecessor Alive' request to %d, waiting for the answer on my mailbox '%s'", pred_id_,
-            message->answer_to->getCname());
+            message->answer_to->get_cname());
   simgrid::s4u::CommPtr comm = return_mailbox->get_async(&data);
 
   try {
-    comm->wait(timeout);
+    comm->wait_for(timeout);
     XBT_DEBUG("Received the answer to my 'Predecessor Alive': my predecessor %d is alive", pred_id_);
     delete static_cast<ChordMessage*>(data);
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to receive the answer to my 'Predecessor Alive' request");
-      pred_id_ = -1;
-    }
+  } catch (const simgrid::TimeoutException&) {
+    XBT_DEBUG("Failed to receive the answer to my 'Predecessor Alive' request");
+    pred_id_ = -1;
   }
 }
 
 /* Asks its predecessor to a remote node
  *
- * \param ask_to the node to ask to
- * \return the id of its predecessor node, or -1 if the request failed (or if the node does not know its predecessor)
+ * @param ask_to the node to ask to
+ * @return the id of its predecessor node, or -1 if the request failed (or if the node does not know its predecessor)
  */
 int Node::remoteGetPredecessor(int ask_to)
 {
   int predecessor_id                      = -1;
   void* data                              = nullptr;
-  simgrid::s4u::MailboxPtr mailbox        = simgrid::s4u::Mailbox::byName(std::to_string(ask_to));
-  simgrid::s4u::MailboxPtr return_mailbox = simgrid::s4u::Mailbox::byName(std::to_string(id_) + "_pred");
+  simgrid::s4u::Mailbox* mailbox          = simgrid::s4u::Mailbox::by_name(std::to_string(ask_to));
+  simgrid::s4u::Mailbox* return_mailbox   = simgrid::s4u::Mailbox::by_name(std::to_string(id_) + "_pred");
 
   ChordMessage* message = new ChordMessage(GET_PREDECESSOR);
   message->request_id   = id_;
@@ -270,31 +256,27 @@ int Node::remoteGetPredecessor(int ask_to)
   XBT_DEBUG("Sending a 'Get Predecessor' request to %d", ask_to);
   try {
     mailbox->put(message, 10, timeout);
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to send the 'Get Predecessor' request to %d", ask_to);
-      delete message;
-      return predecessor_id;
-    }
+  } catch (const simgrid::TimeoutException&) {
+    XBT_DEBUG("Failed to send the 'Get Predecessor' request to %d", ask_to);
+    delete message;
+    return predecessor_id;
   }
 
   // receive the answer
   XBT_DEBUG("Sent 'Get Predecessor' request to %d, waiting for the answer on my mailbox '%s'", ask_to,
-            message->answer_to->getCname());
+            message->answer_to->get_cname());
   simgrid::s4u::CommPtr comm = return_mailbox->get_async(&data);
 
   try {
-    comm->wait(timeout);
+    comm->wait_for(timeout);
     ChordMessage* answer = static_cast<ChordMessage*>(data);
     XBT_DEBUG("Received the answer to my 'Get Predecessor' request: the predecessor of node %d is %d", ask_to,
               answer->answer_id);
     predecessor_id = answer->answer_id;
     delete answer;
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to receive the answer to my 'Get Predecessor' request");
-      delete static_cast<ChordMessage*>(data);
-    }
+  } catch (const simgrid::TimeoutException&) {
+    XBT_DEBUG("Failed to receive the answer to my 'Get Predecessor' request");
+    delete static_cast<ChordMessage*>(data);
   }
 
   return predecessor_id;
@@ -302,8 +284,8 @@ int Node::remoteGetPredecessor(int ask_to)
 
 /* Returns the closest preceding finger of an id with respect to the finger table of the current node.
  *
- * \param id the id to find
- * \return the closest preceding finger of that id
+ * @param id the id to find
+ * @return the closest preceding finger of that id
  */
 int Node::closestPrecedingFinger(int id)
 {
@@ -317,8 +299,8 @@ int Node::closestPrecedingFinger(int id)
 
 /* Makes the current node find the successor node of an id.
  *
- * \param id the id to find
- * \return the id of the successor node, or -1 if the request failed
+ * @param id the id to find
+ * @return the id of the successor node, or -1 if the request failed
  */
 int Node::findSuccessor(int id)
 {
@@ -335,8 +317,8 @@ int Node::remoteFindSuccessor(int ask_to, int id)
 {
   int successor                           = -1;
   void* data                              = nullptr;
-  simgrid::s4u::MailboxPtr mailbox        = simgrid::s4u::Mailbox::byName(std::to_string(ask_to));
-  simgrid::s4u::MailboxPtr return_mailbox = simgrid::s4u::Mailbox::byName(std::to_string(id_) + "_succ");
+  simgrid::s4u::Mailbox* mailbox          = simgrid::s4u::Mailbox::by_name(std::to_string(ask_to));
+  simgrid::s4u::Mailbox* return_mailbox   = simgrid::s4u::Mailbox::by_name(std::to_string(id_) + "_succ");
 
   ChordMessage* message = new ChordMessage(FIND_SUCCESSOR);
   message->request_id   = id_;
@@ -346,30 +328,27 @@ int Node::remoteFindSuccessor(int ask_to, int id)
   XBT_DEBUG("Sending a 'Find Successor' request to %d for id %d", ask_to, id);
   try {
     mailbox->put(message, 10, timeout);
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to send the 'Find Successor' request to %d for id %d", ask_to, id_);
-      delete message;
-      return successor;
-    }
+  } catch (const simgrid::TimeoutException&) {
+    XBT_DEBUG("Failed to send the 'Find Successor' request to %d for id %d", ask_to, id_);
+    delete message;
+    return successor;
   }
   // receive the answer
   XBT_DEBUG("Sent a 'Find Successor' request to %d for key %d, waiting for the answer", ask_to, id);
   simgrid::s4u::CommPtr comm = return_mailbox->get_async(&data);
 
   try {
-    comm->wait(timeout);
+    comm->wait_for(timeout);
     ChordMessage* answer = static_cast<ChordMessage*>(data);
     XBT_DEBUG("Received the answer to my 'Find Successor' request for id %d: the successor of key %d is %d",
               answer->request_id, id_, answer->answer_id);
     successor = answer->answer_id;
     delete answer;
-  } catch (xbt_ex& e) {
-    if (e.category == timeout_error) {
-      XBT_DEBUG("Failed to receive the answer to my 'Find Successor' request");
-      delete static_cast<ChordMessage*>(data);
-    }
+  } catch (const simgrid::TimeoutException&) {
+    XBT_DEBUG("Failed to receive the answer to my 'Find Successor' request");
+    delete static_cast<ChordMessage*>(data);
   }
+
   return successor;
 }
 
@@ -393,7 +372,7 @@ void Node::remoteNotify(int notify_id, int predecessor_candidate_id)
 
   // send a "Notify" request to notify_id
   XBT_DEBUG("Sending a 'Notify' request to %d", notify_id);
-  simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::to_string(notify_id));
+  simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(notify_id));
   mailbox->put_init(message, 10)->detach(ChordMessage::destroy);
 }
 
@@ -419,7 +398,7 @@ void Node::stabilize()
 
 /* This function is called when a node receives a message.
  *
- * \param message the message to handle (don't touch it afterward: it will be destroyed, reused or forwarded)
+ * @param message the message to handle (don't touch it afterward: it will be destroyed, reused or forwarded)
  */
 void Node::handleMessage(ChordMessage* message)
 {
@@ -432,7 +411,7 @@ void Node::handleMessage(ChordMessage* message)
       message->type = FIND_SUCCESSOR_ANSWER;
       message->answer_id = fingers_[0];
       XBT_DEBUG("Sending back a 'Find Successor Answer' to %s (mailbox %s): the successor of %d is %d",
-                message->issuer_host_name.c_str(), message->answer_to->getCname(), message->request_id,
+                message->issuer_host_name.c_str(), message->answer_to->get_cname(), message->request_id,
                 message->answer_id);
       message->answer_to->put_init(message, 10)->detach(ChordMessage::destroy);
     } else {
@@ -440,7 +419,7 @@ void Node::handleMessage(ChordMessage* message)
       int closest = closestPrecedingFinger(message->request_id);
       XBT_DEBUG("Forwarding the 'Find Successor' request for id %d to my closest preceding finger %d",
           message->request_id, closest);
-      simgrid::s4u::MailboxPtr mailbox = simgrid::s4u::Mailbox::byName(std::to_string(closest));
+      simgrid::s4u::Mailbox* mailbox = simgrid::s4u::Mailbox::by_name(std::to_string(closest));
       mailbox->put_init(message, 10)->detach(ChordMessage::destroy);
     }
     break;
@@ -450,7 +429,7 @@ void Node::handleMessage(ChordMessage* message)
     message->type = GET_PREDECESSOR_ANSWER;
     message->answer_id = pred_id_;
     XBT_DEBUG("Sending back a 'Get Predecessor Answer' to %s via mailbox '%s': my predecessor is %d",
-              message->issuer_host_name.c_str(), message->answer_to->getCname(), message->answer_id);
+              message->issuer_host_name.c_str(), message->answer_to->get_cname(), message->answer_id);
     message->answer_to->put_init(message, 10)->detach(ChordMessage::destroy);
     break;
 
@@ -488,7 +467,7 @@ void Node::handleMessage(ChordMessage* message)
     XBT_DEBUG("Receiving a 'Predecessor Alive' request from %s", message->issuer_host_name.c_str());
     message->type = PREDECESSOR_ALIVE_ANSWER;
     XBT_DEBUG("Sending back a 'Predecessor Alive Answer' to %s (mailbox %s)", message->issuer_host_name.c_str(),
-              message->answer_to->getCname());
+              message->answer_to->get_cname());
     message->answer_to->put_init(message, 10)->detach(ChordMessage::destroy);
     break;