From f85b43df272b75c6cf714bde3c3c6f04aaca1b22 Mon Sep 17 00:00:00 2001 From: Takahiro Hirofuchi Date: Mon, 11 Mar 2013 12:23:16 +0100 Subject: [PATCH] Add the first basic model of a migration --- src/msg/msg_vm.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/src/msg/msg_vm.c b/src/msg/msg_vm.c index 7363b6747b..9cce6b7523 100644 --- a/src/msg/msg_vm.c +++ b/src/msg/msg_vm.c @@ -253,6 +253,113 @@ void MSG_vm_shutdown(msg_vm_t vm) } +static int migration_rx_fun(int argc, char *argv[]) +{ + const char *pr_name = MSG_process_get_name(MSG_process_self()); + const char *host_name = MSG_host_get_name(MSG_host_self()); + int need_exit = 0; + + xbt_assert(argc == 3); + const char *mbox = argv[1]; + const char *mbox_ctl = argv[2]; + + for (;;) { + msg_task_t task = NULL; + MSG_task_recv(&task, mbox); + + if (strcmp(task->name, "finalize") == 0) + need_exit = 1; + + MSG_task_destroy(task); + + if (need_exit) + break; + } + + + { + msg_task_t task = MSG_task_create("fin", 0, 0, NULL); + msg_error_t ret = MSG_task_send(task, mbox_ctl); + xbt_assert(ret == MSG_OK); + } + + XBT_INFO("%s@%s done", pr_name, host_name); + + return 0; +} + +static int migration_tx_fun(int argc, char *argv[]) +{ + const char *pr_name = MSG_process_get_name(MSG_process_self()); + const char *host_name = MSG_host_get_name(MSG_host_self()); + + xbt_assert(argc == 3); + const char *mbox = argv[1]; + long ramsize = atol(argv[2]); + + char *task_name = bprintf("task-%s", mbox); + msg_task_t task = MSG_task_create(task_name, 0, ramsize, NULL); + msg_error_t ret = MSG_task_send(task, mbox); + xbt_assert(ret == MSG_OK); + + xbt_free(task_name); + + { + msg_task_t task = MSG_task_create("finalize", 0, 0, NULL); + msg_error_t ret = MSG_task_send(task, mbox); + xbt_assert(ret == MSG_OK); + } + + XBT_INFO("%s@%s done", pr_name, host_name); + + return 0; +} + +static void create_dummy_task(msg_vm_t vm, msg_host_t old_pm, msg_host_t new_pm, long ramsize) +{ + if (ramsize == 0) + XBT_WARN("migrate a VM, but ramsize is zero"); + + char *suffix = bprintf("mig-%s(%s-%s)", vm->key, old_pm->key, new_pm->key); + char *mbox = bprintf("MBOX:%s", suffix); + char *mbox_ctl = bprintf("MBOX:%s:CTL", suffix); + + { + const char *pr_name = "mig_tx"; + int nargvs = 4; + char **argv = xbt_new(char *, nargvs); + argv[0] = xbt_strdup(pr_name); + argv[1] = xbt_strdup(mbox); + argv[2] = bprintf("%ld", ramsize); + argv[3] = NULL; + + msg_process_t pr = MSG_process_create_with_arguments(pr_name, migration_tx_fun, NULL, old_pm, nargvs - 1, argv); + } + + { + const char *pr_name = "mig_rx"; + int nargvs = 4; + char **argv = xbt_new(char *, nargvs); + argv[0] = xbt_strdup(pr_name); + argv[1] = xbt_strdup(mbox); + argv[2] = xbt_strdup(mbox_ctl); + argv[3] = NULL; + + msg_process_t pr = MSG_process_create_with_arguments(pr_name, migration_rx_fun, NULL, new_pm, nargvs - 1, argv); + } + + { + msg_task_t task = NULL; + msg_error_t ret = MSG_task_recv(&task, mbox_ctl); + xbt_assert(ret == MSG_OK); + } + + xbt_free(suffix); + xbt_free(mbox); + xbt_free(mbox_ctl); +} + + /** @brief Migrate the VM to the given host. * @ingroup msg_VMs * @@ -285,6 +392,12 @@ void MSG_vm_migrate(msg_vm_t vm, msg_host_t new_pm) msg_host_t old_pm = simcall_vm_get_pm(vm); + s_ws_params_t params; + simcall_host_get_params(vm, ¶ms); + long ramsize = params.ramsize; + + create_dummy_task(vm, old_pm, new_pm, ramsize); + simcall_vm_migrate(vm, new_pm); XBT_DEBUG("VM(%s) moved from PM(%s) to PM(%s)", vm->key, old_pm->key, new_pm->key); -- 2.30.2