Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Corrected jitter, now oscillates between [-lat*jitter,+lat*jitter), mean is granted...
[simgrid.git] / src / surf / gtnets / gtnets_simulator.cc
index d6bfc9d..2acaf14 100644 (file)
@@ -8,6 +8,15 @@
 #include "gtnets_topology.h"
 #include <map>
 #include <vector>
+#ifdef DEBUG0
+       #undef DEBUG0
+#endif
+#include "xbt/log.h"
+#include "xbt/asserts.h"
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets_simulator, surf_network_gtnets,
+                                "Logging specific to the SURF network GTNetS simulator");
+
 
 using namespace std;
 
@@ -15,6 +24,7 @@ static vector<void*> meta_flows;
 static int* meta_nflow;
 static int meta_flg = 0;
 
+
 void static tcp_sent_callback(void* action, double completion_time);
 
 // Constructor.
@@ -25,6 +35,7 @@ GTSim::GTSim(){
   nflow_ = 0;
   sim_ = new Simulator();
   topo_ = new GTNETS_Topology();
+  uniform_jitter_ = NULL;
 
   sim_->verbose=false;
   // Set default values.
@@ -78,21 +89,25 @@ GTSim::~GTSim(){
 }
 
 int GTSim::add_router(int id){
-  if (topo_->add_router(id) < 0){
-    fprintf(stderr, "can't add router %d. already exists.\n", id);
-    return -1;
-  }
+  xbt_assert1(!(topo_->add_router(id) < 0), "can't add router %d. already exists", id);
 }
 
 //bandwidth: in bytes.
 //latency: in seconds.
 int GTSim::add_link(int id, double bandwidth, double latency){
   double bw = bandwidth * 8; //Bandwidth in bits (used in GTNETS).
-  if (topo_->add_link(id) < 0){
-    fprintf(stderr, "can't add link %d. already exists.\n", id);
-    return -1;
-  }
+  xbt_assert1(!(topo_->add_link(id) < 0),"Can't add link %d. already exists", id);
+  DEBUG3("Creating a new P2P, linkid %d, bandwidth %gl, latency %gl", id, bandwidth, latency);
   gtnets_links_[id] = new Linkp2p(bw, latency);
+  if(jitter_ > 0){
+       DEBUG1("Using jitter %f", jitter_);
+       double min = -1*jitter_*latency;
+       double max = jitter_*latency;
+       if(uniform_jitter_ == NULL){
+               uniform_jitter_ = new Uniform(min,max);
+       }
+       gtnets_links_[id]->Jitter((const Random &) *uniform_jitter_);
+  }
   return 0;
 }
 
@@ -109,17 +124,14 @@ bool GTSim::link_include(int id){
 }
 
 int GTSim::add_onehop_route(int src, int dst, int link){
-  if (topo_->add_onehop_route(src, dst, link) < 0){
-    fprintf(stderr, "Cannot add a route, src: %d, dst: %d, link: %d\n",
-           src, dst, link);
-    return -1;
-  }
+  xbt_assert3(!(topo_->add_onehop_route(src, dst, link) < 0), "Cannot add a route, src: %d, dst: %d, link: %d", src, dst, link);
   return 0;
 }
 
 // Generate the gtnets nodes according to topo_.
 void GTSim::add_nodes(){
   static unsigned int address = IPAddr("192.168.0.1");
+  IPAddr helper = IPAddr();
   vector<GTNETS_Node*> nodes = topo_->nodes();
   vector<GTNETS_Node*>::iterator it;
   int id;
@@ -127,7 +139,8 @@ void GTSim::add_nodes(){
     id = (*it)->id();
     gtnets_nodes_[id] = new Node();
     gtnets_nodes_[id]->SetIPAddr(address++);
-    //    printf("In GTSim, add_node: %d\n", id);
+    DEBUG2("In GTSim, add_node: %d, with IPAddr %s", id, helper.ToDotted(address-1));
+
   }
 }
 
@@ -146,6 +159,7 @@ void GTSim::node_connect(){
 
       gtnets_nodes_[srcid]->
        AddDuplexLink(gtnets_nodes_[dstid], *(gtnets_links_[linkid]));
+    DEBUG3("Setting DuplexLink, src %d, dst %d, linkid %d", srcid, dstid, linkid);
     }
   }
 }
@@ -156,6 +170,10 @@ void GTSim::create_gtnets_topology(){
   node_connect();
 }
 
+void GTSim::print_topology(){
+  topo_->print_topology();
+}
+
 // Add a route that includes more than one hop. All one hop
 // routes must have been added. When this function is called
 // for the first time, all gtnets nodes are generated.
@@ -170,14 +188,8 @@ int GTSim::add_route(int src, int dst, int* links, int nlink){
   int src_node = topo_->nodeid_from_hostid(src);
   int dst_node = topo_->nodeid_from_hostid(dst);
 
-  if (gtnets_nodes_.find(src_node) == gtnets_nodes_.end()){
-    fprintf(stderr, "node %d not found\n", src_node);
-    return -1;
-  }
-  if (gtnets_nodes_.find(dst_node) == gtnets_nodes_.end()){
-    fprintf(stderr, "node %d not found\n", dst_node);
-    return -1;
-  }
+  xbt_assert1(!(gtnets_nodes_.find(src_node) == gtnets_nodes_.end()), "Node %d not found", src_node);
+  xbt_assert1(!(gtnets_nodes_.find(dst_node) == gtnets_nodes_.end()), "Node %d not found", dst_node);
 
   Node* tmpsrc = gtnets_nodes_[src_node];
   Node* tmpdst = gtnets_nodes_[dst_node];
@@ -186,19 +198,10 @@ int GTSim::add_route(int src, int dst, int* links, int nlink){
   
   cur_node = src_node;
   for (int i = 0; i < nlink; i++){
-    if (gtnets_nodes_.find(cur_node) == gtnets_nodes_.end()){
-      fprintf(stderr, "node %d not found\n", cur_node);
-      return -1;
-    }
+       xbt_assert1(!(gtnets_nodes_.find(cur_node) == gtnets_nodes_.end()), "Node %d not found", cur_node);
     next_node = topo_->peer_node_id(links[i], cur_node);
-    if (next_node < 0){
-      fprintf(stderr, "peer node not found\n");
-      return -1;
-    }
-    if (gtnets_nodes_.find(next_node) == gtnets_nodes_.end()){
-      fprintf(stderr, "node %d not found\n", next_node);
-      return -1;
-    }
+    xbt_assert0(!(next_node < 0), "Peer node not found");
+    xbt_assert1(!(gtnets_nodes_.find(next_node) == gtnets_nodes_.end()), "Node %d not found", next_node);
     
     //add route
     Node* tmpcur = gtnets_nodes_[cur_node];
@@ -217,11 +220,7 @@ int GTSim::add_route(int src, int dst, int* links, int nlink){
     cur_node = next_node;
   }
 
-  if (cur_node != dst_node){
-    fprintf(stderr, "Route inconsistency, last: %d, dst: %d\n",
-           cur_node, dst_node);
-    return -1;
-  }
+  xbt_assert2(!(cur_node != dst_node), "Route inconsistency, last: %d, dst: %d",cur_node, dst_node);
 
   return 0;
 }
@@ -237,36 +236,21 @@ int GTSim::create_flow(int src, int dst, long datasize, void* metadata){
   }
 
   int src_node = topo_->nodeid_from_hostid(src);
-  if (src_node < 0){
-    fprintf(stderr, "src %d not found\n");
-    return -1;
-  }
+  xbt_assert1(!(src_node < 0), "Src %d not found", src_node);
+
   int dst_node = topo_->nodeid_from_hostid(dst);
-  if (dst_node < 0){
-    fprintf(stderr, "dst %d not found\n");
-    return -1;
-  }
+  xbt_assert1(!(dst_node < 0), "Dst %d not found", dst_node);
 
-  gtnets_servers_[nflow_] = (TCPServer*)gtnets_nodes_[dst_node]->
+  gtnets_servers_[nflow_] = (TCPServer*) gtnets_nodes_[dst_node]->
        AddApplication(TCPServer(TCPReno()));
-  //added by arnaud in order to avoid TCPServer duplicates.
-  //It is not needed since we create a new TCPServer for
-  //each flow. Also we need to control this variable
-  //to proper set the value of remaining communication amount.
-  //See functions:
-  gtnets_servers_[nflow_]->copyOnConnect=false;
-  gtnets_servers_[nflow_]->BindAndListen(80);
+  gtnets_servers_[nflow_]->BindAndListen(1000+nflow_);
 
   gtnets_clients_[nflow_] = (TCPSend*)gtnets_nodes_[src_node]->
     AddApplication(TCPSend(metadata, gtnets_nodes_[dst_node]->GetIPAddr(), 
-                          80, Constant(datasize), TCPReno()));
-  gtnets_clients_[nflow_]->copyOnConnect=false;
+                          1000+nflow_, Constant(datasize), TCPReno()));
   gtnets_clients_[nflow_]->SetSendCallBack(tcp_sent_callback);
   gtnets_clients_[nflow_]->Start(0);
 
-  //added by pedro in order to get statistics
-  //map an action from a gtnets flow id
-  //metadata is the action and flow is the id to gtnets
   gtnets_action_to_flow_[metadata] = nflow_;
   nflow_++;
 
@@ -301,8 +285,8 @@ Time_t GTSim::get_time_to_next_flow_completion(){
 }
 
 double GTSim::gtnets_get_flow_rx(void *metadata){
-  int flow = gtnets_action_to_flow_[metadata];
-  return ((TCPServer *)gtnets_servers_[flow])->totRx;//action_remain[flow]
+  int flow_id = gtnets_action_to_flow_[metadata];
+  return gtnets_servers_[flow_id]->GetTotRx()
 }
 
 int GTSim::run_until_next_flow_completion(void ***metadata, int *number_of_flows){
@@ -323,6 +307,9 @@ int GTSim::run(double delta){
   return 0;
 }
 
+void GTSim::set_jitter(double d){
+  jitter_ = d;
+}
 
 void static tcp_sent_callback(void* action, double completion_time){
   // Schedule the flow complete event.
@@ -336,3 +323,4 @@ void static tcp_sent_callback(void* action, double completion_time){
   }
 }
 
+