Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
isolate VM migration parameters from others
[simgrid.git] / examples / msg / cloud-migration / cloud-migration.c
1 /* Copyright (c) 2007-2015. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #include "simgrid/msg.h"
8
9 XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Messages specific for this msg example");
10
11 static void vm_migrate(msg_vm_t vm, msg_host_t dst_pm)
12 {
13   msg_host_t src_pm = MSG_vm_get_pm(vm);
14   double mig_sta = MSG_get_clock();
15   MSG_vm_migrate(vm, dst_pm);
16   double mig_end = MSG_get_clock();
17
18   XBT_INFO("%s migrated: %s->%s in %g s", MSG_vm_get_name(vm),
19       MSG_host_get_name(src_pm), MSG_host_get_name(dst_pm),
20       mig_end - mig_sta);
21 }
22
23 static int migration_worker_main(int argc, char *argv[])
24 {
25   xbt_assert(argc == 3);
26   char *vm_name = argv[1];
27   char *dst_pm_name = argv[2];
28
29   msg_vm_t vm       = (msg_vm_t)MSG_host_by_name(vm_name);
30   msg_host_t dst_pm = MSG_host_by_name(dst_pm_name);
31
32   vm_migrate(vm, dst_pm);
33
34   return 0;
35 }
36
37 static void vm_migrate_async(msg_vm_t vm, msg_host_t dst_pm)
38 {
39   const char *vm_name = MSG_vm_get_name(vm);
40   const char *dst_pm_name = MSG_host_get_name(dst_pm);
41   msg_host_t host = MSG_host_self();
42
43   const char *pr_name = "mig_wrk";
44   char **argv = xbt_new(char *, 4);
45   argv[0] = xbt_strdup(pr_name);
46   argv[1] = xbt_strdup(vm_name);
47   argv[2] = xbt_strdup(dst_pm_name);
48   argv[3] = NULL;
49
50   MSG_process_create_with_arguments(pr_name, migration_worker_main, NULL, host, 3, argv);
51 }
52
53 static int master_main(int argc, char *argv[])
54 {
55   msg_host_t pm0 = MSG_host_by_name("Fafard");
56   msg_host_t pm1 = MSG_host_by_name("Tremblay");
57   msg_host_t pm2 = MSG_host_by_name("Bourassa");
58
59   msg_vm_t vm0 = MSG_vm_create_core(pm0, "VM0");
60   MSG_vm_set_ramsize(vm0, 1e9); // 1Gbytes
61   MSG_vm_start(vm0);
62
63   XBT_INFO("Test: Migrate a VM with %zu Mbytes RAM", MSG_vm_get_ramsize(vm0) / 1000 / 1000);
64   vm_migrate(vm0, pm1);
65
66   MSG_vm_destroy(vm0);
67
68   vm0 = MSG_vm_create_core(pm0, "VM0");
69   MSG_vm_set_ramsize(vm0, 1e8); // 100Mbytes
70   MSG_vm_start(vm0);
71
72   XBT_INFO("Test: Migrate a VM with %zu Mbytes RAM", MSG_vm_get_ramsize(vm0) / 1000 / 1000);
73   vm_migrate(vm0, pm1);
74
75   MSG_vm_destroy(vm0);
76
77   vm0 = MSG_vm_create_core(pm0, "VM0");
78   msg_vm_t vm1 = MSG_vm_create_core(pm0, "VM1");
79
80   MSG_vm_set_ramsize(vm0, 1e9); // 1Gbytes
81   MSG_vm_set_ramsize(vm1, 1e9); // 1Gbytes
82   MSG_vm_start(vm0);
83   MSG_vm_start(vm1);
84
85   XBT_INFO("Test: Migrate two VMs at once from PM0 to PM1");
86   vm_migrate_async(vm0, pm1);
87   vm_migrate_async(vm1, pm1);
88   MSG_process_sleep(10000);
89
90   MSG_vm_destroy(vm0);
91   MSG_vm_destroy(vm1);
92
93   vm0 = MSG_vm_create_core(pm0, "VM0");
94   vm1 = MSG_vm_create_core(pm0, "VM1");
95
96   MSG_vm_set_ramsize(vm0, 1e9); // 1Gbytes
97   MSG_vm_set_ramsize(vm1, 1e9); // 1Gbytes
98   MSG_vm_start(vm0);
99   MSG_vm_start(vm1);
100
101   XBT_INFO("Test: Migrate two VMs at once to different PMs");
102   vm_migrate_async(vm0, pm1);
103   vm_migrate_async(vm1, pm2);
104   MSG_process_sleep(10000);
105
106   MSG_vm_destroy(vm0);
107   MSG_vm_destroy(vm1);
108
109   return 0;
110 }
111
112 static void launch_master(msg_host_t host)
113 {
114   const char *pr_name = "master_";
115   char **argv = xbt_new(char *, 2);
116   argv[0] = xbt_strdup(pr_name);
117   argv[1] = NULL;
118
119   MSG_process_create_with_arguments(pr_name, master_main, NULL, host, 1, argv);
120 }
121
122 int main(int argc, char *argv[])
123 {
124   /* Get the arguments */
125   MSG_init(&argc, argv);
126
127   /* load the platform file */
128   MSG_create_environment(argv[1]);
129
130   msg_host_t pm0 =  MSG_host_by_name("Fafard");
131   launch_master(pm0);
132
133   int res = MSG_main();
134   XBT_INFO("Bye (simulation time %g)", MSG_get_clock());
135
136   return !(res == MSG_OK);
137 }