Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
all DHT examples are now called dht-<protocol>
[simgrid.git] / examples / msg / cloud / migrate_vm.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_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   xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
56   msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
57   msg_host_t pm1 = xbt_dynar_get_as(hosts_dynar, 1, msg_host_t);
58   msg_host_t pm2 = xbt_dynar_get_as(hosts_dynar, 2, msg_host_t);
59   msg_vm_t vm0, vm1;
60   s_vm_params_t params;
61   memset(&params, 0, sizeof(params));
62
63   vm0 = MSG_vm_create_core(pm0, "VM0");
64   params.ramsize = 1L * 1000 * 1000 * 1000; // 1Gbytes
65   MSG_host_set_params(vm0, &params);
66   MSG_vm_start(vm0);
67
68   XBT_INFO("Test: Migrate a VM with %llu Mbytes RAM", params.ramsize / 1000 / 1000);
69   vm_migrate(vm0, pm1);
70
71   MSG_vm_destroy(vm0);
72
73   vm0 = MSG_vm_create_core(pm0, "VM0");
74   params.ramsize = 1L * 1000 * 1000 * 100; // 100Mbytes
75   MSG_host_set_params(vm0, &params);
76   MSG_vm_start(vm0);
77
78   XBT_INFO("Test: Migrate a VM with %llu Mbytes RAM", params.ramsize / 1000 / 1000);
79   vm_migrate(vm0, pm1);
80
81   MSG_vm_destroy(vm0);
82
83   vm0 = MSG_vm_create_core(pm0, "VM0");
84   vm1 = MSG_vm_create_core(pm0, "VM1");
85
86   params.ramsize = 1L * 1000 * 1000 * 1000; // 1Gbytes
87   MSG_host_set_params(vm0, &params);
88   MSG_host_set_params(vm1, &params);
89   MSG_vm_start(vm0);
90   MSG_vm_start(vm1);
91
92   XBT_INFO("Test: Migrate two VMs at once from PM0 to PM1");
93   vm_migrate_async(vm0, pm1);
94   vm_migrate_async(vm1, pm1);
95   MSG_process_sleep(10000);
96
97   MSG_vm_destroy(vm0);
98   MSG_vm_destroy(vm1);
99
100   vm0 = MSG_vm_create_core(pm0, "VM0");
101   vm1 = MSG_vm_create_core(pm0, "VM1");
102
103   params.ramsize = 1L * 1000 * 1000 * 1000; // 1Gbytes
104   MSG_host_set_params(vm0, &params);
105   MSG_host_set_params(vm1, &params);
106   MSG_vm_start(vm0);
107   MSG_vm_start(vm1);
108
109   XBT_INFO("Test: Migrate two VMs at once to different PMs");
110   vm_migrate_async(vm0, pm1);
111   vm_migrate_async(vm1, pm2);
112   MSG_process_sleep(10000);
113
114   MSG_vm_destroy(vm0);
115   MSG_vm_destroy(vm1);
116
117   return 0;
118 }
119
120 static void launch_master(msg_host_t host)
121 {
122   const char *pr_name = "master_";
123   char **argv = xbt_new(char *, 2);
124   argv[0] = xbt_strdup(pr_name);
125   argv[1] = NULL;
126
127   MSG_process_create_with_arguments(pr_name, master_main, NULL, host, 1, argv);
128 }
129
130 int main(int argc, char *argv[])
131 {
132   /* Get the arguments */
133   MSG_init(&argc, argv);
134
135   /* load the platform file */
136   MSG_create_environment(argv[1]);
137
138   xbt_dynar_t hosts_dynar = MSG_hosts_as_dynar();
139   msg_host_t pm0 = xbt_dynar_get_as(hosts_dynar, 0, msg_host_t);
140   launch_master(pm0);
141
142   int res = MSG_main();
143   XBT_INFO("Bye (simulation time %g)", MSG_get_clock());
144
145   return !(res == MSG_OK);
146 }