From ba151c7e5f7daefddf662c6c0a6362c9b5eb40f6 Mon Sep 17 00:00:00 2001 From: Samuel Lepetit Date: Thu, 14 Jun 2012 17:43:58 +0200 Subject: [PATCH] Bugfix in Java Cloud API. Bugfix in the associated example. Add a tesh file for the example. --- CMakeLists.txt | 4 +- examples/async/Slave.java | 1 - examples/cloud/Cloud.java | 4 +- examples/cloud/Master.java | 14 ++-- examples/cloud/Slave.java | 8 +- examples/cloud/cloud.tesh | 160 +++++++++++++++++++++++++++++++++++++ src/jmsg_vm.c | 6 ++ src/jmsg_vm.h | 7 ++ 8 files changed, 188 insertions(+), 16 deletions(-) create mode 100644 examples/cloud/cloud.tesh diff --git a/CMakeLists.txt b/CMakeLists.txt index 9806f484e0..bf8b5b362a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -261,6 +261,7 @@ set(TESH_FILES ${CMAKE_HOME_DIRECTORY}/examples/migration/migration.tesh ${CMAKE_HOME_DIRECTORY}/examples/masterslave/masterslave.tesh ${CMAKE_HOME_DIRECTORY}/examples/chord/chord.tesh + ${CMAKE_HOME_DIRECTORY}/examples/cloud/cloud.tesh ${CMAKE_HOME_DIRECTORY}/examples/suspend/suspend.tesh ${CMAKE_HOME_DIRECTORY}/examples/master_slave_kill/kill.tesh ${CMAKE_HOME_DIRECTORY}/examples/mutualExclusion/mutualexclusion.tesh @@ -445,6 +446,7 @@ ADD_TEST(bittorrent ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE ADD_TEST(bypass ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/examples/master_slave_bypass/bypass.tesh) ADD_TEST(commTime ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/examples/commTime/commtime.tesh) ADD_TEST(chord ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/examples/chord/chord.tesh) +ADD_TEST(cloud ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/examples/cloud/cloud.tesh) ADD_TEST(kill ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/examples/master_slave_kill/kill.tesh) ADD_TEST(masterslave ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/examples/masterslave/masterslave.tesh) ADD_TEST(migration ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/examples/migration/migration.tesh) @@ -454,7 +456,7 @@ ADD_TEST(priority ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE ADD_TEST(startKillTime ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/examples/startKillTime/startKillTime.tesh) ADD_TEST(suspend ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/examples/suspend/suspend.tesh) #Don't forget to put new test in this list!!! -set(test_list async bittorrent bypass chord commTime kill masterslave migration mutualExclusion pingPong priority startKillTime suspend) +set(test_list async bittorrent bypass chord cloud commTime kill masterslave migration mutualExclusion pingPong priority startKillTime suspend) if(HAVE_TRACING) ADD_TEST(tracing ${TESH_BIN_PATH} ${TESH_OPTION} --setenv srcdir=${CMAKE_HOME_DIRECTORY} ${CMAKE_HOME_DIRECTORY}/examples/tracing/tracingPingPong.tesh) set(test_list ${test_list} tracing) diff --git a/examples/async/Slave.java b/examples/async/Slave.java index d58910fd03..ca0696564c 100644 --- a/examples/async/Slave.java +++ b/examples/async/Slave.java @@ -27,7 +27,6 @@ public class Slave extends Process { } int num = Integer.valueOf(args[0]).intValue(); - Comm comm = null; boolean slaveFinished = false; while(!slaveFinished) { diff --git a/examples/cloud/Cloud.java b/examples/cloud/Cloud.java index 69dd79b113..6cdd6acb43 100644 --- a/examples/cloud/Cloud.java +++ b/examples/cloud/Cloud.java @@ -14,8 +14,8 @@ import org.simgrid.msg.MsgException; * Example showing the use of the new experimental Cloud API. */ public class Cloud { - public static final double task_comp_size = 10000000; - public static final double task_comm_size = 10000000; + public static final double task_comp_size = 10; + public static final double task_comm_size = 10; public static void main(String[] args) throws MsgException { Msg.init(args); diff --git a/examples/cloud/Master.java b/examples/cloud/Master.java index 791a956105..2a46bc5266 100644 --- a/examples/cloud/Master.java +++ b/examples/cloud/Master.java @@ -55,10 +55,10 @@ public class Master extends Process { Msg.info("Sleep long enough for everyone to be done with previous batch of work"); waitFor(1000 - Msg.getClock()); - Msg.info("Add one more process per VM, and dispatch a batch of work to everyone"); + Msg.info("Add one more process per VM."); for (int i = 0; i < vms.size(); i++) { VM vm = vms.get(i); - Slave slave = new Slave(hosts[i],i + slavesCount); + Slave slave = new Slave(hosts[i],i + vms.size()); slave.start(); vm.bind(slave); } @@ -73,25 +73,23 @@ public class Master extends Process { VM vm = vms.get(i); vm.suspend(); vm.migrate(hosts[2]); + vm.resume(); } workBatch(slavesCount * 2); - Msg.info("Let's shut down the simulation. 10 first processes will be shut down cleanly while the second half will forcefully get killed"); - - for (int i = 0; i < 10; i++) { - FinalizeTask task = new FinalizeTask(0,0); - task.send("slave_" + i); - } + Msg.info("Let's shut down the simulation and kill everyone."); for (int i = 0; i < vms.size(); i++) { vms.get(i).shutdown(); } + Msg.info("Master done."); } public void workBatch(int slavesCount) throws MsgException { for (int i = 0; i < slavesCount; i++) { Task task = new Task("Task_" + i, Cloud.task_comp_size, Cloud.task_comm_size); + Msg.info("Sending to " + i); task.send("slave_" + i); } } diff --git a/examples/cloud/Slave.java b/examples/cloud/Slave.java index ca5ecaf085..8f7cde3384 100644 --- a/examples/cloud/Slave.java +++ b/examples/cloud/Slave.java @@ -11,7 +11,6 @@ import org.simgrid.msg.Msg; import org.simgrid.msg.MsgException; import org.simgrid.msg.Process; import org.simgrid.msg.Task; -import org.simgrid.msg.TaskCancelledException; public class Slave extends Process { private int number; @@ -20,7 +19,8 @@ public class Slave extends Process { this.number = number; } public void main(String[] args) throws MsgException { - while(true) { + while(true) { + Msg.info("Receiving on " + "slave_" + number); Task task = Task.receive("slave_"+number); if (task instanceof FinalizeTask) { @@ -29,10 +29,10 @@ public class Slave extends Process { Msg.info("Received \"" + task.getName() + "\". Processing it."); try { task.execute(); - } catch (TaskCancelledException e) { + } catch (MsgException e) { } - // Msg.info("\"" + task.getName() + "\" done "); + Msg.info("\"" + task.getName() + "\" done "); } Msg.info("Received Finalize. I'm done. See you!"); diff --git a/examples/cloud/cloud.tesh b/examples/cloud/cloud.tesh new file mode 100644 index 0000000000..7fcf70e060 --- /dev/null +++ b/examples/cloud/cloud.tesh @@ -0,0 +1,160 @@ +#! ./tesh + +! output sort + +$ java -cp .:${srcdir:=.}/examples:${srcdir:=.}/simgrid.jar cloud/Cloud ${srcdir:=.}/examples/platform.xml "--log=root.fmt:[%10.6r]%e(%i:%P@%h)%e%m%n" +> [ 0.000000] (0:@) Ready to run MSG_MAIN +> [ 0.000000] (10:Slave 8@Jean_Yves) Receiving on slave_8 +> [ 0.000000] (11:Slave 9@Fafard) Receiving on slave_9 +> [ 0.000000] (1:Master@Jacquelin) Launched 10 VMs +> [ 0.000000] (1:Master@Jacquelin) Send a first batch of work to everyone +> [ 0.000000] (1:Master@Jacquelin) Sending to 0 +> [ 0.000000] (2:Slave 0@Jacquelin) Receiving on slave_0 +> [ 0.000000] (3:Slave 1@Intel) Receiving on slave_1 +> [ 0.000000] (4:Slave 2@Provost) Receiving on slave_2 +> [ 0.000000] (5:Slave 3@Fernand) Receiving on slave_3 +> [ 0.000000] (6:Slave 4@Bescherelle) Receiving on slave_4 +> [ 0.000000] (7:Slave 5@Ethernet) Receiving on slave_5 +> [ 0.000000] (8:Slave 6@Kuenning) Receiving on slave_6 +> [ 0.000000] (9:Slave 7@Dodge) Receiving on slave_7 +> [ 0.000195] (1:Master@Jacquelin) Sending to 1 +> [ 0.000195] (2:Slave 0@Jacquelin) Received "Task_0". Processing it. +> [ 0.000195] (2:Slave 0@Jacquelin) "Task_0" done +> [ 0.000195] (2:Slave 0@Jacquelin) Receiving on slave_0 +> [ 0.918964] (1:Master@Jacquelin) Sending to 2 +> [ 0.918964] (3:Slave 1@Intel) Received "Task_1". Processing it. +> [ 0.918964] (3:Slave 1@Intel) "Task_1" done +> [ 0.918964] (3:Slave 1@Intel) Receiving on slave_1 +> [ 2.798763] (1:Master@Jacquelin) Sending to 3 +> [ 2.798763] (4:Slave 2@Provost) Received "Task_2". Processing it. +> [ 2.798763] (4:Slave 2@Provost) "Task_2" done +> [ 2.798763] (4:Slave 2@Provost) Receiving on slave_2 +> [ 4.624559] (1:Master@Jacquelin) Sending to 4 +> [ 4.624559] (5:Slave 3@Fernand) Received "Task_3". Processing it. +> [ 4.624559] (5:Slave 3@Fernand) "Task_3" done +> [ 4.624559] (5:Slave 3@Fernand) Receiving on slave_3 +> [ 5.487412] (1:Master@Jacquelin) Sending to 5 +> [ 5.487412] (6:Slave 4@Bescherelle) Received "Task_4". Processing it. +> [ 5.487412] (6:Slave 4@Bescherelle) "Task_4" done +> [ 5.487412] (6:Slave 4@Bescherelle) Receiving on slave_4 +> [ 6.547690] (1:Master@Jacquelin) Sending to 6 +> [ 6.547690] (7:Slave 5@Ethernet) Received "Task_5". Processing it. +> [ 6.547690] (7:Slave 5@Ethernet) "Task_5" done +> [ 6.547690] (7:Slave 5@Ethernet) Receiving on slave_5 +> [ 7.405064] (1:Master@Jacquelin) Sending to 7 +> [ 7.405064] (8:Slave 6@Kuenning) Received "Task_6". Processing it. +> [ 7.405064] (8:Slave 6@Kuenning) "Task_6" done +> [ 7.405064] (8:Slave 6@Kuenning) Receiving on slave_6 +> [ 8.805320] (1:Master@Jacquelin) Sending to 8 +> [ 8.805320] (9:Slave 7@Dodge) Received "Task_7". Processing it. +> [ 8.805320] (9:Slave 7@Dodge) "Task_7" done +> [ 8.805320] (9:Slave 7@Dodge) Receiving on slave_7 +> [ 9.730479] (10:Slave 8@Jean_Yves) Received "Task_8". Processing it. +> [ 9.730479] (10:Slave 8@Jean_Yves) "Task_8" done +> [ 9.730479] (10:Slave 8@Jean_Yves) Receiving on slave_8 +> [ 9.730479] (1:Master@Jacquelin) Sending to 9 +> [ 11.715289] (11:Slave 9@Fafard) Received "Task_9". Processing it. +> [ 11.715289] (1:Master@Jacquelin) Now suspend all VMs, just for fun +> [ 11.715289] (1:Master@Jacquelin) Wait a while +> [ 13.715289] (11:Slave 9@Fafard) "Task_9" done +> [ 13.715289] (11:Slave 9@Fafard) Receiving on slave_9 +> [ 13.715289] (1:Master@Jacquelin) Enough. Let's resume everybody. +> [ 13.715289] (1:Master@Jacquelin) Sleep long enough for everyone to be done with previous batch of work +> [1000.000000] (12:Slave 10@Jacquelin) Receiving on slave_10 +> [1000.000000] (13:Slave 11@Intel) Receiving on slave_11 +> [1000.000000] (14:Slave 12@Provost) Receiving on slave_12 +> [1000.000000] (15:Slave 13@Fernand) Receiving on slave_13 +> [1000.000000] (16:Slave 14@Bescherelle) Receiving on slave_14 +> [1000.000000] (17:Slave 15@Ethernet) Receiving on slave_15 +> [1000.000000] (18:Slave 16@Kuenning) Receiving on slave_16 +> [1000.000000] (19:Slave 17@Dodge) Receiving on slave_17 +> [1000.000000] (1:Master@Jacquelin) Add one more process per VM. +> [1000.000000] (1:Master@Jacquelin) Migrate everyone to the second host. +> [1000.000000] (1:Master@Jacquelin) Suspend everyone, move them to the third host, and resume them. +> [1000.000000] (1:Master@Jacquelin) Sending to 0 +> [1000.000000] (20:Slave 18@Jean_Yves) Receiving on slave_18 +> [1000.000000] (21:Slave 19@Fafard) Receiving on slave_19 +> [1000.000195] (1:Master@Jacquelin) Sending to 1 +> [1000.000195] (2:Slave 0@Provost) Received "Task_0". Processing it. +> [1000.000195] (2:Slave 0@Provost) "Task_0" done +> [1000.000195] (2:Slave 0@Provost) Receiving on slave_0 +> [1000.918964] (1:Master@Jacquelin) Sending to 2 +> [1000.918964] (3:Slave 1@Provost) Received "Task_1". Processing it. +> [1000.918964] (3:Slave 1@Provost) "Task_1" done +> [1000.918964] (3:Slave 1@Provost) Receiving on slave_1 +> [1002.798763] (1:Master@Jacquelin) Sending to 3 +> [1002.798763] (4:Slave 2@Provost) Received "Task_2". Processing it. +> [1002.798763] (4:Slave 2@Provost) "Task_2" done +> [1002.798763] (4:Slave 2@Provost) Receiving on slave_2 +> [1004.624559] (1:Master@Jacquelin) Sending to 4 +> [1004.624559] (5:Slave 3@Provost) Received "Task_3". Processing it. +> [1004.624559] (5:Slave 3@Provost) "Task_3" done +> [1004.624559] (5:Slave 3@Provost) Receiving on slave_3 +> [1005.487412] (1:Master@Jacquelin) Sending to 5 +> [1005.487412] (6:Slave 4@Provost) Received "Task_4". Processing it. +> [1005.487412] (6:Slave 4@Provost) "Task_4" done +> [1005.487412] (6:Slave 4@Provost) Receiving on slave_4 +> [1006.547690] (1:Master@Jacquelin) Sending to 6 +> [1006.547690] (7:Slave 5@Provost) Received "Task_5". Processing it. +> [1006.547690] (7:Slave 5@Provost) "Task_5" done +> [1006.547690] (7:Slave 5@Provost) Receiving on slave_5 +> [1007.405064] (1:Master@Jacquelin) Sending to 7 +> [1007.405064] (8:Slave 6@Provost) Received "Task_6". Processing it. +> [1007.405064] (8:Slave 6@Provost) "Task_6" done +> [1007.405064] (8:Slave 6@Provost) Receiving on slave_6 +> [1008.805320] (1:Master@Jacquelin) Sending to 8 +> [1008.805320] (9:Slave 7@Provost) Received "Task_7". Processing it. +> [1008.805320] (9:Slave 7@Provost) "Task_7" done +> [1008.805320] (9:Slave 7@Provost) Receiving on slave_7 +> [1009.730479] (10:Slave 8@Provost) Received "Task_8". Processing it. +> [1009.730479] (10:Slave 8@Provost) "Task_8" done +> [1009.730479] (10:Slave 8@Provost) Receiving on slave_8 +> [1009.730479] (1:Master@Jacquelin) Sending to 9 +> [1011.715289] (11:Slave 9@Provost) Received "Task_9". Processing it. +> [1011.715289] (11:Slave 9@Provost) "Task_9" done +> [1011.715289] (11:Slave 9@Provost) Receiving on slave_9 +> [1011.715289] (1:Master@Jacquelin) Sending to 10 +> [1011.715484] (12:Slave 10@Provost) Received "Task_10". Processing it. +> [1011.715484] (12:Slave 10@Provost) "Task_10" done +> [1011.715484] (12:Slave 10@Provost) Receiving on slave_10 +> [1011.715484] (1:Master@Jacquelin) Sending to 11 +> [1012.634253] (13:Slave 11@Provost) Received "Task_11". Processing it. +> [1012.634253] (13:Slave 11@Provost) "Task_11" done +> [1012.634253] (13:Slave 11@Provost) Receiving on slave_11 +> [1012.634253] (1:Master@Jacquelin) Sending to 12 +> [1014.514051] (14:Slave 12@Provost) Received "Task_12". Processing it. +> [1014.514051] (14:Slave 12@Provost) "Task_12" done +> [1014.514051] (14:Slave 12@Provost) Receiving on slave_12 +> [1014.514051] (1:Master@Jacquelin) Sending to 13 +> [1016.339847] (15:Slave 13@Provost) Received "Task_13". Processing it. +> [1016.339847] (15:Slave 13@Provost) "Task_13" done +> [1016.339847] (15:Slave 13@Provost) Receiving on slave_13 +> [1016.339847] (1:Master@Jacquelin) Sending to 14 +> [1017.202700] (16:Slave 14@Provost) Received "Task_14". Processing it. +> [1017.202700] (16:Slave 14@Provost) "Task_14" done +> [1017.202700] (16:Slave 14@Provost) Receiving on slave_14 +> [1017.202700] (1:Master@Jacquelin) Sending to 15 +> [1018.262978] (17:Slave 15@Provost) Received "Task_15". Processing it. +> [1018.262978] (17:Slave 15@Provost) "Task_15" done +> [1018.262978] (17:Slave 15@Provost) Receiving on slave_15 +> [1018.262978] (1:Master@Jacquelin) Sending to 16 +> [1019.120353] (18:Slave 16@Provost) Received "Task_16". Processing it. +> [1019.120353] (18:Slave 16@Provost) "Task_16" done +> [1019.120353] (18:Slave 16@Provost) Receiving on slave_16 +> [1019.120353] (1:Master@Jacquelin) Sending to 17 +> [1020.520609] (19:Slave 17@Provost) Received "Task_17". Processing it. +> [1020.520609] (19:Slave 17@Provost) "Task_17" done +> [1020.520609] (19:Slave 17@Provost) Receiving on slave_17 +> [1020.520609] (1:Master@Jacquelin) Sending to 18 +> [1021.445768] (1:Master@Jacquelin) Sending to 19 +> [1021.445768] (20:Slave 18@Provost) Received "Task_18". Processing it. +> [1021.445768] (20:Slave 18@Provost) "Task_18" done +> [1021.445768] (20:Slave 18@Provost) Receiving on slave_18 +> [1023.430577] (0:@) Done running MSG_MAIN +> [1023.430577] (0:@) MSG_main finished +> [1023.430577] (0:@) Clean java world +> [1023.430577] (0:@) Clean native world +> [1023.430577] (1:Master@Jacquelin) Let's shut down the simulation and kill everyone. +> [1023.430577] (1:Master@Jacquelin) Master done. +> [1023.430577] (21:Slave 19@Provost) Received "Task_19". Processing it. + diff --git a/src/jmsg_vm.c b/src/jmsg_vm.c index 1615e420ec..3f0945e8de 100644 --- a/src/jmsg_vm.c +++ b/src/jmsg_vm.c @@ -84,3 +84,9 @@ Java_org_simgrid_msg_VM_resume(JNIEnv *env, jobject jvm) { MSG_vm_resume(vm); } +JNIEXPORT void JNICALL +Java_org_simgrid_msg_VM_shutdown(JNIEnv *env, jobject jvm) { + msg_vm_t vm = jvm_get_native(env,jvm); + + MSG_vm_shutdown(vm); +} diff --git a/src/jmsg_vm.h b/src/jmsg_vm.h index fa5a965f40..0acedc5f64 100644 --- a/src/jmsg_vm.h +++ b/src/jmsg_vm.h @@ -87,4 +87,11 @@ Java_org_simgrid_msg_VM_suspend(JNIEnv *env, jobject jvm); */ JNIEXPORT void JNICALL Java_org_simgrid_msg_VM_resume(JNIEnv *env, jobject jvm); +/** + * Class org_simgrid_msg_VM + * Method shutdown + * Signature ()V + */ +JNIEXPORT void JNICALL +Java_org_simgrid_msg_VM_shutdown(JNIEnv *env, jobject jvm); #endif -- 2.20.1