diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 7259ed762b3..c4a98354eab 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -2321,6 +2321,12 @@ public abstract class CitrixResourceBase implements ServerResource { s_logger.warn("Can not fake PV driver for " + vmName); } } + if( ! isPVInstalled(conn, vm) ) { + String msg = "Migration failed due to PV drivers is not installed for " + vmName; + s_logger.warn(msg); + return new MigrateAnswer(cmd, false, msg, null); + } + Set vbds = vm.getVBDs(conn); for( VBD vbd : vbds) { VBD.Record vbdRec = vbd.getRecord(conn); @@ -2329,16 +2335,8 @@ public abstract class CitrixResourceBase implements ServerResource { break; } } - - try { - vm.setAffinity(conn, dsthost); - vm.poolMigrate(conn, dsthost, new HashMap()); - } catch (Types.VmMissingPvDrivers e1) { - // if PV driver is missing, just shutdown the VM - s_logger.warn("VM " + vmName + " is stopped when trying to migrate it because PV driver is missing, Please install PV driver for this VM"); - vm.hardShutdown(conn); - vm.destroy(conn); - } + vm.poolMigrate(conn, dsthost, new HashMap()); + vm.setAffinity(conn, dsthost); state = State.Stopping; } return new MigrateAnswer(cmd, true, "migration succeeded", null); diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index be8a8f2f201..22038703cd0 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -1156,9 +1156,9 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene } excludes.addHost(dest.getHost().getId()); - + VMInstanceVO vmInstance = null; try { - vm = migrate(vm, srcHostId, dest); + vmInstance = migrate(vm, srcHostId, dest); } catch (ResourceUnavailableException e) { s_logger.debug("Unable to migrate to unavailable " + dest); } catch (ConcurrentOperationException e) { @@ -1166,9 +1166,20 @@ public class VirtualMachineManagerImpl implements VirtualMachineManager, Listene } catch (ManagementServerException e) { s_logger.debug("Unable to migrate VM: " + e.getMessage()); } - if (vm != null) { + if (vmInstance != null) { return true; } + try { + boolean result = advanceStop(vm, true, _accountMgr.getSystemUser(), _accountMgr.getSystemAccount()); + return result; + } catch (ResourceUnavailableException e) { + s_logger.debug("Unable to stop VM due to " + e.getMessage()); + } catch (ConcurrentOperationException e) { + s_logger.debug("Unable to stop VM due to " + e.getMessage()); + } catch (OperationTimedoutException e) { + s_logger.debug("Unable to stop VM due to " + e.getMessage()); + } + return false; } }