From 116990be2493ac74a99c86d2be2ae62cbc8bd5b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn?= Date: Mon, 11 Aug 2014 18:40:04 +0200 Subject: [PATCH] Feature #1639: Allow a VM to be migrated from the unknown state (cherry picked from commit 9ace10e010e74f61b139c96d60b5482cb68cae1e) (cherry picked from commit 78ea7034a3280a3411efdc64b00dcccb357cdc3e) --- src/dm/DispatchManagerActions.cc | 6 ++- src/lcm/LifeCycleActions.cc | 54 ++++++++++++++++++++++++++ src/rm/RequestManagerVirtualMachine.cc | 3 +- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/dm/DispatchManagerActions.cc b/src/dm/DispatchManagerActions.cc index 7f3c83f10c..e95202ac0b 100644 --- a/src/dm/DispatchManagerActions.cc +++ b/src/dm/DispatchManagerActions.cc @@ -91,7 +91,8 @@ int DispatchManager::migrate( NebulaLog::log("DiM",Log::DEBUG,oss); if (vm->get_state() == VirtualMachine::ACTIVE && - vm->get_lcm_state() == VirtualMachine::RUNNING ) + (vm->get_lcm_state() == VirtualMachine::RUNNING || + vm->get_lcm_state() == VirtualMachine::UNKNOWN ) ) { Nebula& nd = Nebula::instance(); LifeCycleManager * lcm = nd.get_lcm(); @@ -776,7 +777,8 @@ int DispatchManager::resched(int vid, bool do_resched) NebulaLog::log("DiM",Log::DEBUG,oss); if (vm->get_state() == VirtualMachine::ACTIVE && - vm->get_lcm_state() == VirtualMachine::RUNNING ) + (vm->get_lcm_state() == VirtualMachine::RUNNING || + vm->get_lcm_state() == VirtualMachine::UNKNOWN)) { vm->set_resched(do_resched); vmpool->update(vm); diff --git a/src/lcm/LifeCycleActions.cc b/src/lcm/LifeCycleActions.cc index cb47402b06..e839746c26 100644 --- a/src/lcm/LifeCycleActions.cc +++ b/src/lcm/LifeCycleActions.cc @@ -267,6 +267,60 @@ void LifeCycleManager::migrate_action(int vid) vmm->trigger(VirtualMachineManager::SAVE,vid); } + else if (vm->get_state() == VirtualMachine::ACTIVE && + vm->get_lcm_state() == VirtualMachine::UNKNOWN) + { + //---------------------------------------------------- + // Bypass SAVE_MIGRATE to PROLOG_MIGRATE STATE + //---------------------------------------------------- + + Nebula& nd = Nebula::instance(); + TransferManager * tm = nd.get_tm(); + int cpu,mem,disk; + time_t the_time = time(0); + + vm->set_resched(false); + + vm->set_state(VirtualMachine::PROLOG); + + vm->delete_snapshots(); + + map empty; + vm->update_info(0, 0, -1, -1, empty); + + vmpool->update(vm); + + + vm->set_stime(the_time); + + vm->set_previous_action(History::MIGRATE_ACTION); + + vm->set_previous_etime(the_time); + + vm->set_previous_vm_info(); + + vm->set_previous_running_etime(the_time); + + vm->set_previous_reason(History::USER); + + vmpool->update_previous_history(vm); + + vm->set_prolog_stime(the_time); + + vmpool->update_history(vm); + + vm->get_requirements(cpu,mem,disk); + + hpool->add_capacity(vm->get_hid(), vm->get_oid(), cpu, mem, disk); + + hpool->del_capacity(vm->get_previous_hid(), vm->get_oid(), cpu, mem, disk); + + vm->log("LCM", Log::INFO, "New VM state is PROLOG"); + + //---------------------------------------------------- + + tm->trigger(TransferManager::PROLOG_MIGR,vid); + } else { vm->log("LCM", Log::ERROR, "migrate_action, VM in a wrong state."); diff --git a/src/rm/RequestManagerVirtualMachine.cc b/src/rm/RequestManagerVirtualMachine.cc index 809e3d2744..5b05a2bcee 100644 --- a/src/rm/RequestManagerVirtualMachine.cc +++ b/src/rm/RequestManagerVirtualMachine.cc @@ -882,7 +882,8 @@ void VirtualMachineMigrate::request_execute(xmlrpc_c::paramList const& paramList } if((vm->get_state() != VirtualMachine::ACTIVE) || - (vm->get_lcm_state() != VirtualMachine::RUNNING) || + (vm->get_lcm_state() != VirtualMachine::RUNNING && + vm->get_lcm_state() != VirtualMachine::UNKNOWN) || (vm->hasPreviousHistory() && vm->get_previous_reason() == History::NONE)) { failure_response(ACTION,