From 539243ac2a92567f69a30b86140af1bfa06fcef5 Mon Sep 17 00:00:00 2001 From: Tino Vazquez Date: Mon, 4 Nov 2013 17:58:07 +0100 Subject: [PATCH] Avoid sending prolog and epilog actions to already deleted (or non existent) hosts --- src/tm/TransferManager.cc | 58 +++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/src/tm/TransferManager.cc b/src/tm/TransferManager.cc index c769ad045b..0552b89295 100644 --- a/src/tm/TransferManager.cc +++ b/src/tm/TransferManager.cc @@ -149,9 +149,11 @@ void TransferManager::trigger(Actions action, int _vid) void TransferManager::do_action(const string &action, void * arg) { int vid; + int hid; VirtualMachine * vm; Host * host; - bool host_is_hybrid; + bool host_is_hybrid = false; + bool host_is_deleted = false; Nebula& nd = Nebula::instance(); if (arg == 0) @@ -170,11 +172,20 @@ void TransferManager::do_action(const string &action, void * arg) return; } - host = hpool->get(vm->get_hid(),true); - host_is_hybrid=host->isHybrid(); - + hid = vm->get_hid(); vm->unlock(); - host->unlock(); + + host = hpool->get(hid,true); + + if ( host == 0) + { + host_is_deleted=true; + } + else + { + host_is_hybrid=host->isHybrid(); + host->unlock(); + } if (action == "PROLOG") { @@ -182,6 +193,10 @@ void TransferManager::do_action(const string &action, void * arg) { (nd.get_lcm())->trigger(LifeCycleManager::PROLOG_SUCCESS,vid); } + else if (host_is_deleted) + { + (nd.get_lcm())->trigger(LifeCycleManager::PROLOG_FAILURE,vid); + } else { prolog_action(vid); @@ -193,6 +208,10 @@ void TransferManager::do_action(const string &action, void * arg) { (nd.get_lcm())->trigger(LifeCycleManager::PROLOG_SUCCESS,vid); } + else if (host_is_deleted) + { + (nd.get_lcm())->trigger(LifeCycleManager::PROLOG_FAILURE,vid); + } else { prolog_migr_action(vid); @@ -204,6 +223,10 @@ void TransferManager::do_action(const string &action, void * arg) { (nd.get_lcm())->trigger(LifeCycleManager::PROLOG_SUCCESS,vid); } + else if (host_is_deleted) + { + (nd.get_lcm())->trigger(LifeCycleManager::PROLOG_FAILURE,vid); + } else { prolog_resume_action(vid); @@ -215,6 +238,10 @@ void TransferManager::do_action(const string &action, void * arg) { (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_SUCCESS,vid); } + else if (host_is_deleted) + { + (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_FAILURE,vid); + } else { epilog_action(vid); @@ -226,6 +253,10 @@ void TransferManager::do_action(const string &action, void * arg) { (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_SUCCESS,vid); } + else if (host_is_deleted) + { + (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_FAILURE,vid); + } else { epilog_stop_action(vid); @@ -237,6 +268,10 @@ void TransferManager::do_action(const string &action, void * arg) { (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_SUCCESS,vid); } + else if (host_is_deleted) + { + (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_FAILURE,vid); + } else { epilog_delete_action(vid); @@ -248,6 +283,10 @@ void TransferManager::do_action(const string &action, void * arg) { (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_SUCCESS,vid); } + else if (host_is_deleted) + { + (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_FAILURE,vid); + } else { epilog_delete_stop_action(vid); @@ -259,10 +298,13 @@ void TransferManager::do_action(const string &action, void * arg) { (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_SUCCESS,vid); } + else if (host_is_deleted) + { + (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_FAILURE,vid); + } else { epilog_delete_previous_action(vid); - } } else if (action == "EPILOG_DELETE_BOTH") @@ -271,6 +313,10 @@ void TransferManager::do_action(const string &action, void * arg) { (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_SUCCESS,vid); } + else if (host_is_deleted) + { + (nd.get_lcm())->trigger(LifeCycleManager::EPILOG_FAILURE,vid); + } else { epilog_delete_both_action(vid);