Repository: cloudstack Updated Branches: refs/heads/master e559b15b6 -> 331e257ca
CLOUDSTACK-8103: Vmsync marks VM as stopped even after failing to stop it in HV During vmsync if StopCommand (issued as part of PowerOff/PowerMissing report) fails to stop VM (since VM is running on HV), don't transition VM state to "Stopped" in CS db. Also added a check to throw ConcurrentOperationException if vm state is not "Running" after start operation. Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/331e257c Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/331e257c Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/331e257c Branch: refs/heads/master Commit: 331e257ca0ecb76e48f56422797e547d16d6944b Parents: e559b15 Author: Koushik Das <kous...@apache.org> Authored: Mon Dec 22 10:52:13 2014 +0530 Committer: Koushik Das <kous...@apache.org> Committed: Mon Dec 22 10:52:13 2014 +0530 ---------------------------------------------------------------------- .../src/com/cloud/vm/VirtualMachineManagerImpl.java | 5 ++++- server/src/com/cloud/vm/UserVmManagerImpl.java | 7 +++++++ 2 files changed, 11 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/331e257c/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java ---------------------------------------------------------------------- diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 6d513d5..caf374e 100644 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -3696,7 +3696,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac VirtualMachineGuru vmGuru = getVmGuru(vm); VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); - sendStop(vmGuru, profile, true, true); + if (!sendStop(vmGuru, profile, true, true)) { + // In case StopCommand fails, don't proceed further + return; + } try { stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOffReport, null); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/331e257c/server/src/com/cloud/vm/UserVmManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 674a4c1..03c9a23 100644 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -3221,6 +3221,13 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir try { vmParamPair = startVirtualMachine(vmId, hostId, additonalParams, deploymentPlannerToUse); vm = vmParamPair.first(); + + // At this point VM should be in "Running" state + UserVmVO tmpVm = _vmDao.findById(vm.getId()); + if (!tmpVm.getState().equals(State.Running)) { + // Some other thread changed state of VM, possibly vmsync + throw new ConcurrentOperationException("VM " + tmpVm + " unexpectedly went to " + tmpVm.getState() + " state"); + } } finally { updateVmStateForFailedVmCreation(vm.getId(), hostId); }