Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
s4u::Link: avoid set_sharing_policy==WIFI
authorBruno Donassolo <bruno.donassolo@inria.fr>
Tue, 6 Jul 2021 09:50:15 +0000 (11:50 +0200)
committerBruno Donassolo <bruno.donassolo@inria.fr>
Thu, 15 Jul 2021 09:31:49 +0000 (11:31 +0200)
Implements sharing policy for split-duplex links.
Replicate config for each up/down link

src/s4u/s4u_Link.cpp
src/surf/SplitDuplexLinkImpl.cpp
src/surf/SplitDuplexLinkImpl_test.cpp
src/surf/sg_platf.cpp

index c4c179c..9c6d41a 100644 (file)
@@ -104,9 +104,9 @@ Link* Link::set_bandwidth(double value)
 
 Link* Link::set_sharing_policy(Link::SharingPolicy policy, const NonLinearResourceCb& cb)
 {
-  if (policy == SharingPolicy::SPLITDUPLEX)
-    throw std::invalid_argument(std::string("Impossible to set split-duplex for the link: ") + get_name() +
-                                std::string(". Use NetZone::create_split_duplex_link."));
+  if (policy == SharingPolicy::SPLITDUPLEX || policy == SharingPolicy::WIFI)
+    throw std::invalid_argument(std::string("Impossible to set wifi or split-duplex for the link: ") + get_name() +
+                                std::string(". Use appropriate create function in NetZone."));
 
   kernel::actor::simcall([this, policy, &cb] { pimpl_->set_sharing_policy(policy, cb); });
   return this;
index 6e3608f..99ddebe 100644 (file)
@@ -27,7 +27,10 @@ bool SplitDuplexLinkImpl::is_used() const
 
 void SplitDuplexLinkImpl::set_sharing_policy(s4u::Link::SharingPolicy policy, const s4u::NonLinearResourceCb& cb)
 {
-  xbt_die("Impossible to change sharing policy of split-duplex links");
+  xbt_assert(policy != s4u::Link::SharingPolicy::SPLITDUPLEX && policy != s4u::Link::SharingPolicy::WIFI,
+             "Invalid sharing policy for split-duplex links");
+  link_up_->set_sharing_policy(policy, cb);
+  link_down_->set_sharing_policy(policy, cb);
 }
 
 void SplitDuplexLinkImpl::set_bandwidth(double value)
index 98f86d2..5bf5ef8 100644 (file)
@@ -35,8 +35,8 @@ TEST_CASE("SplitDuplexLink: create", "")
 TEST_CASE("SplitDuplexLink: sets", "")
 {
   simgrid::s4u::Engine e("test");
-  auto* zone      = simgrid::s4u::create_star_zone("test");
-  auto* link      = zone->create_split_duplex_link("link", 100e6);
+  auto* zone            = simgrid::s4u::create_star_zone("test");
+  auto* link            = zone->create_split_duplex_link("link", 100e6);
   auto const* link_up   = link->get_link_up();
   auto const* link_down = link->get_link_down();
 
@@ -72,4 +72,26 @@ TEST_CASE("SplitDuplexLink: sets", "")
     REQUIRE(link_up->get_impl()->get_constraint()->get_concurrency_limit() == 3);
     REQUIRE(link_down->get_impl()->get_constraint()->get_concurrency_limit() == 3);
   }
+
+  SECTION("sharing_policy: invalid")
+  {
+    REQUIRE_THROWS_AS(link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::WIFI), std::invalid_argument);
+    REQUIRE_THROWS_AS(link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::SPLITDUPLEX), std::invalid_argument);
+  }
+
+  SECTION("sharing_policy: fatpipe/shared")
+  {
+    for (const auto& policy : {simgrid::s4u::Link::SharingPolicy::FATPIPE, simgrid::s4u::Link::SharingPolicy::SHARED}) {
+      link->set_sharing_policy(policy);
+      REQUIRE(link_up->get_sharing_policy() == policy);
+      REQUIRE(link_down->get_sharing_policy() == policy);
+    }
+  }
+
+  SECTION("sharing_policy: nonlinear")
+  {
+    link->set_sharing_policy(simgrid::s4u::Link::SharingPolicy::NONLINEAR, [](double c, int n) -> double { return c; });
+    REQUIRE(link_up->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::NONLINEAR);
+    REQUIRE(link_down->get_sharing_policy() == simgrid::s4u::Link::SharingPolicy::NONLINEAR);
+  }
 }
index 4667df6..d4e7434 100644 (file)
@@ -130,7 +130,8 @@ void sg_platf_new_link(const simgrid::kernel::routing::LinkCreationArgs* args)
   if (args->policy == simgrid::s4u::Link::SharingPolicy::SPLITDUPLEX) {
     link = current_routing->create_split_duplex_link(args->id, args->bandwidths);
   } else {
-    link = current_routing->create_link(args->id, args->bandwidths)->set_sharing_policy(args->policy);
+    link = current_routing->create_link(args->id, args->bandwidths);
+    link->get_impl()->set_sharing_policy(args->policy, {});
   }
   sg_platf_set_link_properties(link, args);
   link->seal();