Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Refactorize the sthread interception of functions
[simgrid.git] / examples / python / comm-failure / comm-failure.py
index b251f781a181df36e8af7a6d649ad454f2d94ec2..02cd7013777ce23d6d14fac2e027e69982b74f70 100644 (file)
@@ -1,11 +1,11 @@
-# Copyright (c) 2010-2022. The SimGrid Team. All rights reserved.
+# Copyright (c) 2010-2023. 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.
 
 import sys
 
-from simgrid import Engine, Actor, Comm, NetZone, Link, LinkInRoute, Mailbox, this_actor, NetworkFailureException
+from simgrid import Engine, Actor, ActivitySet, Comm, NetZone, Link, LinkInRoute, Mailbox, this_actor, NetworkFailureException
 
 
 def sender(mailbox1_name: str, mailbox2_name: str) -> None:
@@ -18,27 +18,26 @@ def sender(mailbox1_name: str, mailbox2_name: str) -> None:
     this_actor.info(f"Initiating asynchronous send to {mailbox2.name}")
     comm2: Comm = mailbox2.put_async(666, 2)
 
-    this_actor.info(f"Calling wait_any..")
-    pending_comms = [comm1, comm2]
+    this_actor.info("Calling wait_any..")
+    pending_comms = ActivitySet([comm1, comm2])
     try:
-        index = Comm.wait_any([comm1, comm2])
-        this_actor.info(f"Wait any returned index {index} (comm to {pending_comms[index].mailbox.name})")
+        comm = pending_comms.wait_any()
+        this_actor.info(f"Wait any returned a comm to {comm.mailbox.name})")
     except NetworkFailureException:
-        this_actor.info(f"Sender has experienced a network failure exception, so it knows that something went wrong")
-        this_actor.info(f"Now it needs to figure out which of the two comms failed by looking at their state")
+        this_actor.info("Sender has experienced a network failure exception, so it knows that something went wrong")
+        this_actor.info("Now it needs to figure out which of the two comms failed by looking at their state:")
 
-    this_actor.info(f"Comm to {comm1.mailbox.name} has state: {comm1.state_str}")
-    this_actor.info(f"Comm to {comm2.mailbox.name} has state: {comm2.state_str}")
+    this_actor.info(f"  Comm to {comm1.mailbox.name} has state: {comm1.state_str}")
+    this_actor.info(f"  Comm to {comm2.mailbox.name} has state: {comm2.state_str}")
 
     try:
         comm1.wait()
-    except NetworkFailureException:
-        this_actor.info(f"Waiting on a FAILED comm raises an exception")
+    except NetworkFailureException as err:
+        this_actor.info(f"Waiting on a FAILED comm raises an exception: '{err}'")
 
     this_actor.info("Wait for remaining comm, just to be nice")
-    pending_comms.pop(0)
     try:
-        Comm.wait_any(pending_comms)
+        pending_comms.wait_all()
     except Exception as e:
         this_actor.warning(str(e))
 
@@ -55,12 +54,9 @@ def receiver(mailbox_name: str) -> None:
 
 def link_killer(link_name: str) -> None:
     link_to_kill = Link.by_name(link_name)
-    this_actor.info("sleeping 10 seconds...")
     this_actor.sleep_for(10.0)
-    this_actor.info(f"turning off link {link_to_kill.name}")
+    this_actor.info(f"Turning off link '{link_to_kill.name}'")
     link_to_kill.turn_off()
-    this_actor.info("link killed. exiting")
-
 
 def main():
     e = Engine(sys.argv)
@@ -69,11 +65,11 @@ def main():
     host2 = zone.create_host("Host2", "1f")
     host3 = zone.create_host("Host3", "1f")
 
-    link_to_2 = LinkInRoute(zone.create_link("link_to_2", "1bps").seal())
-    link_to_3 = LinkInRoute(zone.create_link("link_to_3", "1bps").seal())
+    link_to_2 = zone.create_link("link_to_2", "1bps").seal()
+    link_to_3 = zone.create_link("link_to_3", "1bps").seal()
 
-    zone.add_route(host1.netpoint, host2.netpoint, None, None, [link_to_2], False)
-    zone.add_route(host1.netpoint, host3.netpoint, None, None, [link_to_3], False)
+    zone.add_route(host1, host2, [link_to_2])
+    zone.add_route(host1, host3, [link_to_3])
     zone.seal()
 
     Actor.create("Sender", host1, sender, "mailbox2", "mailbox3")