Logo AND Algorithmique Numérique Distribuée

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