From: velho Date: Sun, 4 Oct 2009 23:38:52 +0000 (+0000) Subject: Improved debugging and assert functions in GTNetS interface. X-Git-Tag: SVN~1025 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/9760fe02b2b4402c5937fc939d5c5fbddfc008d6 Improved debugging and assert functions in GTNetS interface. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6688 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/surf/gtnets/gtnets_interface.cc b/src/surf/gtnets/gtnets_interface.cc index 4207edbf0f..f62dbdb50d 100644 --- a/src/surf/gtnets/gtnets_interface.cc +++ b/src/surf/gtnets/gtnets_interface.cc @@ -4,17 +4,30 @@ /* 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. */ + #include "gtnets_simulator.h" #include "gtnets_interface.h" +#ifdef DEBUG0 + #undef DEBUG0 +#endif +#include "xbt/log.h" +#include "xbt/asserts.h" static GTSim* gtnets_sim = 0; + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets_interface, surf_network_gtnets, + "Logging specific to the SURF network GTNetS interface"); + + + // initialize the GTNetS interface and environment int gtnets_initialize(){ - if (gtnets_sim){ - fprintf(stderr, "gtnets already initialized.\n"); - return -1; - } + + DEBUG0("Using logging."); + + xbt_assert0(!gtnets_sim, "gtnets already initialized"); + gtnets_sim = new GTSim(); return 0; } @@ -54,30 +67,48 @@ int gtnets_create_flow(int src, int dst, long datasize, void* metadata){ // if no flows exist, return -1.0 double gtnets_get_time_to_next_flow_completion(){ ofstream file; + streambuf* sbuf; double value; - file.open ("/dev/null"); - streambuf* sbuf = cout.rdbuf(); - cout.rdbuf(file.rdbuf()); - value = gtnets_sim->get_time_to_next_flow_completion(); + if (!XBT_LOG_ISENABLED(surf_network_gtnets_interface, xbt_log_priority_debug)) { + file.open ("/dev/null"); + sbuf = cout.rdbuf(); + cout.rdbuf(file.rdbuf()); + DEBUG0("Enable GTNetS library quite mode"); + }else { + DEBUG0("Disable GTNetS library quite mode"); + } - cout.rdbuf(sbuf); + value = gtnets_sim->get_time_to_next_flow_completion(); + if (!XBT_LOG_ISENABLED(surf_network_gtnets_interface, xbt_log_priority_debug)) { + cout.rdbuf(sbuf); + file.close(); + } return value; } // run until a flow completes (returns that flow's metadata) int gtnets_run_until_next_flow_completion(void ***metadata, int *number_of_flows){ ofstream file; + streambuf* sbuf; double value; - file.open ("/dev/null"); - streambuf* sbuf = cout.rdbuf(); - cout.rdbuf(file.rdbuf()); - value = gtnets_sim->run_until_next_flow_completion(metadata, number_of_flows); + if (!XBT_LOG_ISENABLED(surf_network_gtnets_interface, xbt_log_priority_debug)) { + file.open ("/dev/null"); + sbuf = cout.rdbuf(); + cout.rdbuf(file.rdbuf()); + DEBUG0("Enable GTNetS library quite mode"); + }else { + DEBUG0("Disable GTNetS library quite mode"); + } - cout.rdbuf(sbuf); + value = gtnets_sim->run_until_next_flow_completion(metadata, number_of_flows); + if (!XBT_LOG_ISENABLED(surf_network_gtnets_interface, xbt_log_priority_debug)) { + cout.rdbuf(sbuf); + file.close(); + } return value; } diff --git a/src/surf/gtnets/gtnets_simulator.cc b/src/surf/gtnets/gtnets_simulator.cc index dafa66844e..505e4c59d3 100644 --- a/src/surf/gtnets/gtnets_simulator.cc +++ b/src/surf/gtnets/gtnets_simulator.cc @@ -8,6 +8,15 @@ #include "gtnets_topology.h" #include #include +#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; @@ -79,20 +88,15 @@ 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); return 0; } @@ -110,17 +114,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 nodes = topo_->nodes(); vector::iterator it; int id; @@ -128,7 +129,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)); + } } @@ -147,6 +149,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); } } } @@ -175,14 +178,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]; @@ -191,19 +188,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]; @@ -222,11 +210,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; } @@ -242,15 +226,10 @@ 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]-> AddApplication(TCPServer(TCPReno())); diff --git a/src/surf/gtnets/gtnets_topology.cc b/src/surf/gtnets/gtnets_topology.cc index 7978192c4e..05c1f65b69 100644 --- a/src/surf/gtnets/gtnets_topology.cc +++ b/src/surf/gtnets/gtnets_topology.cc @@ -9,6 +9,14 @@ //Temporary classes for generating GTNetS topology #include "gtnets_topology.h" +#ifdef DEBUG0 + #undef DEBUG0 +#endif +#include "xbt/log.h" +#include "xbt/asserts.h" + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_network_gtnets_topology, surf_network_gtnets, + "Logging specific to the SURF network GTNetS simulator"); // // GTNETS_Node @@ -29,10 +37,7 @@ GTNETS_Node::~GTNETS_Node(){ // hostid = network_card_id int GTNETS_Node::add_host(int hostid){ - if (is_router_){ - fprintf(stderr, "Cannot add a host to a router node.\n"); - return -1; - } + xbt_assert0(!(is_router_), "Cannot add a host to a router node"); hosts_.insert(hostid); return 0; } @@ -40,18 +45,8 @@ int GTNETS_Node::add_host(int hostid){ // Add a router. If this node already has a router/host, // return -1. int GTNETS_Node::add_router(int routerid){ - if (hosts_.size() > 1){ - fprintf(stderr, "Router node should have only one router.\n"); - return -1; - }else if (hosts_.size() == 1){ - if (hosts_.find(routerid) != hosts_.end()){ - //printf("the router already exists\n"); - return 0; - }else{ - fprintf(stderr, "Node %d is a different router.\n"); - return -1; - } - } + xbt_assert0(!(hosts_.size() > 1), "Router node should have only one router"); + xbt_assert1(((hosts_.size() == 1)&&(hosts_.find(routerid) != hosts_.end())), "Node %d is a different router", routerid); is_router_ = true; hosts_.insert(routerid); return 0; @@ -68,11 +63,9 @@ bool GTNETS_Node::include(int hostid){ void GTNETS_Node::print_hosts(){ set::iterator it; - printf("["); for (it = hosts_.begin(); it != hosts_.end(); it++){ - printf(" %d", *it); + DEBUG1(" host id %d", *it); } - printf("]"); } // @@ -99,19 +92,15 @@ GTNETS_Link::~GTNETS_Link(){ } void GTNETS_Link::print_link_status(){ - printf("== LINKID: %d\n", ID_); + DEBUG1(" link id: %d", ID_); if (src_node_){ - printf(" [SRC] ID: %d, router?: %d, hosts[]: ", - src_node_->id(), src_node_->is_router()); + DEBUG2(" [src] id: %d, is it router?: %d, host list: ",src_node_->id(), src_node_->is_router()); src_node_->print_hosts(); - printf("\n"); } if (dst_node_){ - printf(" [DST] ID: %d, router?: %d, hosts[]: ", - dst_node_->id(), dst_node_->is_router()); + DEBUG2(" [dst] id: %d, is it router?: %d, host list: ",dst_node_->id(), dst_node_->is_router()); dst_node_->print_hosts(); - printf("\n"); } } @@ -130,12 +119,10 @@ bool GTNETS_Link::route_exists(){ // return the peer node id int GTNETS_Link::peer_node(int cur_id){ + xbt_assert0(((cur_id == src_node_->id())||(cur_id == dst_node_->id())), "Node not found"); + if (cur_id == src_node_->id()) return dst_node_->id(); else if (cur_id == dst_node_->id()) return src_node_->id(); - else { - fprintf(stderr, "node not found\n"); - return -1; - } } int GTNETS_Link::add_src(GTNETS_Node* src){ @@ -179,30 +166,20 @@ int GTNETS_Topology::node_size(){ int GTNETS_Topology::add_link(int id){ map::iterator iter = links_.find(id); + xbt_assert1((iter == links_.end()), "Link %d already exists", id); if(iter == links_.end()) { GTNETS_Link* link= new GTNETS_Link(id); - //printf("link %d is added: %d\n", id, link->id()); - //links_.insert(make_pair(id, link)); links_[id] = link; - return 0; - }else{ - fprintf(stderr, "Link %d already exists.\n", id); - return -1; } + return 0; } int GTNETS_Topology::add_router(int id){ set::iterator iter = routers_.find(id); - - if(iter == routers_.end()) { - //printf("router %d is inserted\n", id); - routers_.insert(id); - return 0; - }else{ - fprintf(stderr, "Router %d already exists.\n", id); - return -1; - } + xbt_assert1((iter == routers_.end()), "Router %d already exists", id); + routers_.insert(id); + return 0; } bool GTNETS_Topology::is_router(int id){ @@ -213,21 +190,13 @@ bool GTNETS_Topology::is_router(int id){ //return the node id of the peer of cur_id by linkid. int GTNETS_Topology::peer_node_id(int linkid, int cur_id){ - //printf("linkid: %d, cur_id: %d\n", linkid, cur_id); GTNETS_Link* link = links_[linkid]; - if (!link) { - fprintf(stderr, "link %d not found\n", linkid); - return -1; - } - if ((cur_id < 0) || (cur_id > nodes_.size()-1)){ - fprintf(stderr, "node %d not found\n", cur_id); - return -1; - } + xbt_assert1((link), "Link %d not found", linkid); + xbt_assert1(!((cur_id < 0) || (cur_id > nodes_.size()-1)), "Node %d not found", cur_id); + int peer = link->peer_node(nodes_[cur_id]->id()); - if (peer < 0){ - fprintf(stderr, "peer not found\n"); - return -1; - } + xbt_assert0(!(peer < 0), "Peer not found"); + return peer; } @@ -236,20 +205,22 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){ map::iterator iter = links_.find(linkid); - if(iter == links_.end()) { - fprintf(stderr, "Link %d not found.\n", linkid); - return -1; - }else{ - link = iter->second; - } + xbt_assert1(!(iter == links_.end()), "Link %d not found", linkid); + link = iter->second; - // printf("add_onehop_route: src: %d, dst: %d, linkid: %d, %d\n", - // src, dst, linkid, link->id()); + DEBUG4("Add onehop route, src: %d, dst: %d, linkid: %d, %d",src, dst, linkid, link->id()); GTNETS_Node *src_node, *dst_node; src_node = link->src_node(); dst_node = link->dst_node(); + if (XBT_LOG_ISENABLED(surf_network_gtnets_topology, xbt_log_priority_debug)) { + link->print_link_status(); + src_node->print_hosts(); + dst_node->print_hosts(); + } + + xbt_assert0((src_node && dst_node), "Either src or dst is null"); // If not exists a route, add one. if (!link->route_exists()){ @@ -289,11 +260,6 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){ nodes_[d_node_id]->add_host(dst); link->add_dst(nodes_[d_node_id]); - - // other: has either src or dst (error) - }else if (!src_node || !dst_node){ - fprintf(stderr, "Either src or dst is null\n"); - return -1; } // case 1: link has two routers @@ -302,39 +268,27 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){ int tmpsrc2 = nodeid_from_hostid(src); int tmpdst1 = dst_node->id(); int tmpdst2 = nodeid_from_hostid(dst); - if (((tmpsrc1 == tmpsrc2) && (tmpdst1 == tmpdst2)) || - ((tmpsrc1 == tmpdst2) && (tmpdst1 == tmpsrc2))){ - //fprintf(stderr, "Route already exists\n"); - }else{ - fprintf(stderr, "Different one hop route defined\n"); - return -1; - } + xbt_assert0( (((tmpsrc1 == tmpsrc2) && (tmpdst1 == tmpdst2)) || + ((tmpsrc1 == tmpdst2) && (tmpdst1 == tmpsrc2))), "Different one hop route defined"); } + // case 2: link has one router and one host else if (src_node->is_router() && !dst_node->is_router()){ int newsrc, newdst; + xbt_assert0( ((is_router(src))||(is_router(dst))), "one of nodes should be a router"); + if (is_router(src)){ newsrc = src; newdst = dst; }else if (is_router(dst)){ newsrc = dst; newdst = src; - }else{ - fprintf(stderr, "one of nodes should be a router\n"); - return -1; } - if (src_node->id() != nodeid_from_hostid(newsrc)){ - fprintf(stderr, "The router should be identical\n"); - return -1; - } + xbt_assert0(!(src_node->id() != nodeid_from_hostid(newsrc)), "The router should be identical"); //now, to add dst to dst_node, dst should be a host. - - if (is_router(newdst)){ - fprintf(stderr, "dst %d is not an endpoint. cannot add it to dst_node\n"); - return -1; - } + xbt_assert1(!(is_router(newdst)), "Dst %d is not an endpoint. cannot add it to dst_node", newdst); if (!dst_node->include(newdst)){ dst_node->add_host(newdst); @@ -343,29 +297,19 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){ } else if (!src_node->is_router() && dst_node->is_router()){ int newsrc, newdst; + xbt_assert0(((is_router(src))||(is_router(dst))), "One of nodes should be a router"); + if (is_router(src)){ newsrc = dst; newdst = src; }else if (is_router(dst)){ newsrc = src; newdst = dst; - }else{ - fprintf(stderr, "one of nodes should be a router\n"); - return -1; - } - - - if (dst_node->id() != hosts_[newdst]){ - fprintf(stderr, "The router should be identical\n"); - return -1; } + xbt_assert0(!(dst_node->id() != hosts_[newdst]), "The router should be identical"); //now, to add dst to src_node, dst should be a host. - - if (is_router(newsrc)){ - fprintf(stderr, "dst %d is not an endpoint. cannot add it to src_node\n"); - return -1; - } + xbt_assert1(!(is_router(newsrc)), "Src %d is not an endpoint. cannot add it to src_node", newsrc); if (!src_node->include(newsrc)){ src_node->add_host(newsrc); @@ -375,40 +319,36 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){ // case 3: link has two hosts else if (!src_node->is_router() && !dst_node->is_router()){ - - if (is_router(src) || is_router(dst)){ - fprintf(stderr, "Cannot add a router to host-host link\n"); - return -1; - } + xbt_assert0(!(is_router(src) || is_router(dst)), "Cannot add a router to host-host link"); //if both are hosts, the order doesn't matter. if (src_node->include(src)){ if (dst_node->include(dst)){ - //nothing + //nothing }else{ - dst_node->add_host(dst); - hosts_[dst] = dst_node->id(); + dst_node->add_host(dst); + hosts_[dst] = dst_node->id(); } }else if (src_node->include(dst)){ if (dst_node->include(src)){ - //nothing + //nothing }else{ - dst_node->add_host(src); - hosts_[src] = dst_node->id(); + dst_node->add_host(src); + hosts_[src] = dst_node->id(); } }else if (dst_node->include(src)){ if (src_node->include(dst)){ - //nothing + //nothing }else{ - src_node->add_host(dst); - hosts_[dst] = src_node->id(); + src_node->add_host(dst); + hosts_[dst] = src_node->id(); } }else if (dst_node->include(dst)){ if (src_node->include(src)){ - //nothing + //nothing }else{ - src_node->add_host(src); - hosts_[src] = src_node->id(); + src_node->add_host(src); + hosts_[src] = src_node->id(); } }else{ src_node->add_host(src); @@ -419,8 +359,7 @@ int GTNETS_Topology::add_onehop_route(int src, int dst, int linkid){ } else{ - fprintf(stderr, "Shouldn't be here\n"); - return -1; + xbt_assert0(0, "Shouldn't be here"); } return 0; } @@ -433,13 +372,13 @@ int GTNETS_Topology::nodeid_from_hostid(int hostid){ } void GTNETS_Topology::print_topology(){ - printf("<<<<<================================>>>>>\n"); - printf("Dumping GTNETS topollogy information\n"); + DEBUG0("<<<<<================================>>>>>"); + DEBUG0("Dumping GTNETS topollogy information"); map::iterator it; for (it = links_.begin(); it != links_.end(); it++){ it->second->print_link_status(); } - printf(">>>>>================================<<<<<\n"); + DEBUG0(">>>>>================================<<<<<"); fflush(NULL); }