1 /* Copyright (c) 2010-2020. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
6 #include "simgrid/Exception.hpp"
7 #include "simgrid/s4u.hpp"
9 XBT_LOG_NEW_DEFAULT_CATEGORY(s4u_test, "Messages specific for this s4u example");
13 XBT_ATTRIB_NORETURN static void actor_daemon()
15 const simgrid::s4u::Host* host = simgrid::s4u::Host::current();
16 XBT_INFO(" Start daemon on %s (%f)", host->get_cname(), host->get_speed());
18 XBT_INFO(" Execute daemon");
19 simgrid::s4u::this_actor::execute(host->get_speed());
22 xbt_die(" daemon done. See you!");
27 XBT_INFO(" Start TX");
28 std::string* payload = new std::string("COMM");
29 simgrid::s4u::Mailbox::by_name("comm")->put_init(payload, 100000000)->detach();
30 // We should wait a bit (if not the process will end before the communication, hence an exception on the other side).
32 simgrid::s4u::this_actor::sleep_for(30);
33 } catch (const simgrid::HostFailureException&) {
34 XBT_INFO("The host has died ... as expected.");
43 const std::string* payload = nullptr;
44 XBT_INFO(" Start RX");
46 payload = static_cast<std::string*>(simgrid::s4u::Mailbox::by_name("comm")->get());
47 XBT_INFO(" Receive message: %s", payload->c_str());
48 } catch (const simgrid::HostFailureException&) {
49 XBT_INFO(" Receive message: HOST_FAILURE");
50 } catch (const simgrid::NetworkFailureException&) {
51 XBT_INFO(" Receive message: TRANSFER_FAILURE");
58 static void test_launcher(int test_number)
60 simgrid::s4u::Host* jupiter = simgrid::s4u::Host::by_name("Jupiter");
61 simgrid::s4u::ActorPtr daemon;
62 simgrid::s4u::VirtualMachine* vm0 = nullptr;
64 switch (test_number) {
66 // Create a process running a simple task on a host and turn the host off during the execution of the actor.
68 XBT_INFO(" Create an actor on Jupiter");
69 simgrid::s4u::Actor::create("actor_daemon", jupiter, actor_daemon);
70 simgrid::s4u::this_actor::sleep_for(3);
71 XBT_INFO(" Turn off Jupiter");
73 simgrid::s4u::this_actor::sleep_for(10);
74 XBT_INFO("Test 1 seems ok, cool !(#Actors: %zu, it should be 1; #tasks: %d)",
75 simgrid::s4u::Engine::get_instance()->get_actor_count(), tasks_done);
78 // Create an actorthat on a host that is turned off (this is not allowed)
80 XBT_INFO(" Turn off Jupiter");
81 // adsein: Jupiter is already off, hence nothing should happen
82 // adsein: This can be one additional test, to check that you cannot shutdown twice a host
85 simgrid::s4u::Actor::create("actor_daemon", jupiter, actor_daemon);
86 simgrid::s4u::this_actor::sleep_for(10);
87 XBT_INFO(" Test 2 does crash as it should. This message will not be displayed.");
88 } catch (const simgrid::HostFailureException&) {
89 xbt_die("Could not launch a new actor on failed host %s.", jupiter->get_cname());
93 // Create an actor running successive sleeps on a host and turn the host off during the execution of the actor.
94 xbt_die("Test 3 is superseded by activity-lifecycle");
97 XBT_INFO("Test 4 (turn off src during a communication) : Create an actor/task to make a communication between "
98 "Jupiter and Tremblay and turn off Jupiter during the communication");
100 simgrid::s4u::this_actor::sleep_for(10);
101 simgrid::s4u::Actor::create("commRX", simgrid::s4u::Host::by_name("Tremblay"), commRX);
102 simgrid::s4u::Actor::create("commTX", jupiter, commTX);
103 XBT_INFO(" number of actors: %zu", simgrid::s4u::Engine::get_instance()->get_actor_count());
104 simgrid::s4u::this_actor::sleep_for(10);
105 XBT_INFO(" Turn Jupiter off");
107 XBT_INFO("Test 4 is ok. (number of actors : %zu, it should be 1 or 2 if RX has not been satisfied)."
108 " An exception is raised when we turn off a node that has an actor sleeping",
109 simgrid::s4u::Engine::get_instance()->get_actor_count());
112 XBT_INFO("Test 5 (turn off dest during a communication : Create an actor/task to make a communication between "
113 "Tremblay and Jupiter and turn off Jupiter during the communication");
115 simgrid::s4u::this_actor::sleep_for(10);
116 simgrid::s4u::Actor::create("commRX", jupiter, commRX);
117 simgrid::s4u::Actor::create("commTX", simgrid::s4u::Host::by_name("Tremblay"), commTX);
118 XBT_INFO(" number of actors: %zu", simgrid::s4u::Engine::get_instance()->get_actor_count());
119 simgrid::s4u::this_actor::sleep_for(10);
120 XBT_INFO(" Turn Jupiter off");
122 XBT_INFO("Test 5 seems ok (number of actors: %zu, it should be 2)",
123 simgrid::s4u::Engine::get_instance()->get_actor_count());
126 XBT_INFO("Test 6: Turn on Jupiter, assign a VM on Jupiter, launch an actor inside the VM, and turn off the node");
129 vm0 = new simgrid::s4u::VirtualMachine("vm0", jupiter, 1);
132 daemon = simgrid::s4u::Actor::create("actor_daemon", vm0, actor_daemon);
133 simgrid::s4u::Actor::create("actor_daemonJUPI", jupiter, actor_daemon);
139 simgrid::s4u::this_actor::sleep_for(10);
141 XBT_INFO(" Turn Jupiter off");
143 XBT_INFO(" Shutdown vm0");
145 XBT_INFO(" Destroy vm0");
147 XBT_INFO("Test 6 is also weird: when the node Jupiter is turned off once again, the VM and its daemon are not "
148 "killed. However, the issue regarding the shutdown of hosted VMs can be seen a feature not a bug ;)");
151 xbt_die("Unknown test case.");
154 XBT_INFO(" Test done. See you!");
157 int main(int argc, char* argv[])
159 simgrid::s4u::Engine e(&argc, argv);
160 xbt_assert(argc == 3, "Usage: %s platform_file test_number\n\tExample: %s msg_platform.xml 1\n", argv[0], argv[0]);
162 e.load_platform(argv[1]);
164 simgrid::s4u::Actor::create("test_launcher", simgrid::s4u::Host::by_name("Tremblay"), test_launcher,
169 XBT_INFO("Simulation time %g", e.get_clock());