Updated Branches: refs/heads/vmsync 0f26d5a05 -> d52e0c2eb
Add out-of-band sync for powner on events Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/d52e0c2e Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/d52e0c2e Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/d52e0c2e Branch: refs/heads/vmsync Commit: d52e0c2ebdd7bf81ee91f43c6c8e285f04cdcf9e Parents: 0f26d5a Author: Kelven Yang <[email protected]> Authored: Thu Jun 13 10:05:59 2013 -0700 Committer: Kelven Yang <[email protected]> Committed: Thu Jun 13 10:05:59 2013 -0700 ---------------------------------------------------------------------- api/src/com/cloud/vm/VirtualMachine.java | 10 ++++ .../com/cloud/vm/VirtualMachineManagerImpl.java | 60 ++++++++++++++++++-- 2 files changed, 65 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d52e0c2e/api/src/com/cloud/vm/VirtualMachine.java ---------------------------------------------------------------------- diff --git a/api/src/com/cloud/vm/VirtualMachine.java b/api/src/com/cloud/vm/VirtualMachine.java index 58ecdc1..3ac9aed 100755 --- a/api/src/com/cloud/vm/VirtualMachine.java +++ b/api/src/com/cloud/vm/VirtualMachine.java @@ -104,6 +104,12 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, I s_fsm.addTransition(State.Expunging, VirtualMachine.Event.ExpungeOperation, State.Expunging); s_fsm.addTransition(State.Error, VirtualMachine.Event.DestroyRequested, State.Expunging); s_fsm.addTransition(State.Error, VirtualMachine.Event.ExpungeOperation, State.Expunging); + + s_fsm.addTransition(State.Stopping, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running); + s_fsm.addTransition(State.Stopped, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running); + s_fsm.addTransition(State.Running, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running); + + s_fsm.addTransition(State.Migrating, VirtualMachine.Event.FollowAgentPowerOnReport, State.Running); } public static boolean isVmStarted(State oldState, Event e, State newState) { @@ -166,6 +172,10 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, I OperationFailedToError, OperationRetry, AgentReportMigrated, + + // added for new VMSync logic + FollowAgentPowerOnReport, + FollowAgentPowerOffReport, }; public enum Type { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/d52e0c2e/server/src/com/cloud/vm/VirtualMachineManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index af29307..e50027d 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -2646,6 +2646,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac */ } + + // take the chance to scan stalled VM + scanStalledVMInTransitionState(agentId); processed = true; } } @@ -3411,6 +3414,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } + // + // PowerState report handling for out-of-band changes and handling of left-over transitional VM states + // + @MessageHandler(topic=TopicConstants.VM_POWER_STATE) private void HandlePownerStateReport(Object target, String subject, String senderAddress, Object args) { assert(args != null); @@ -3447,33 +3454,60 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } private void HandlePowerOnReportWithNoPendingJobsOnVM(VMInstanceVO vm) { - - // TODO : + // // 1) handle left-over transitional VM states // 2) handle out of band VM live migration // 3) handle out of sync stationary states, marking VM from Stopped to Running with // alert messages - + // switch(vm.getState()) { - case Starting: + case Starting : + try { + stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOnReport, vm.getPowerHostId()); + } catch(NoTransitionException e) { + s_logger.warn("Unexpected VM state transition exception, race-condition?", e); + } + // TODO we need to alert admin or user about this risky state transition break; case Running : + try { + if(vm.getHostId() != null && vm.getHostId().longValue() != vm.getPowerHostId().longValue()) + s_logger.info("Detected out of band VM migration from host " + vm.getHostId() + " to host " + vm.getPowerHostId()); + stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOnReport, vm.getPowerHostId()); + } catch(NoTransitionException e) { + s_logger.warn("Unexpected VM state transition exception, race-condition?", e); + } break; case Stopping : case Stopped : + try { + stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOnReport, vm.getPowerHostId()); + } catch(NoTransitionException e) { + s_logger.warn("Unexpected VM state transition exception, race-condition?", e); + } + // TODO we need to alert admin or user about this risky state transition break; case Destroyed : case Expunging : + s_logger.info("Receive power on report when VM is in destroyed or expunging state. vm: " + + vm.getId() + ", state: " + vm.getState()); break; case Migrating : + try { + stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOnReport, vm.getPowerHostId()); + } catch(NoTransitionException e) { + s_logger.warn("Unexpected VM state transition exception, race-condition?", e); + } break; case Error : default : + s_logger.info("Receive power on report when VM is in error or unexpected state. vm: " + + vm.getId() + ", state: " + vm.getState()); break; } } @@ -3485,13 +3519,15 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac // 2) handle out of sync stationary states, schedule force-stop to release resources // switch(vm.getState()) { - case Starting: + case Starting : break; case Running : break; case Stopping : + break; + case Stopped : break; @@ -3507,4 +3543,18 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac break; } } + + private void scanStalledVMInTransitionState(long hostId) { + // + // TODO check VM that is stuck in Starting, Stopping, Migrating states, we won't check + // VMs in expunging state (this need to be handled specially) + // + // checking condition + // 1) no pending VmWork job + // 2) no power state update for some time + // 3) on hostId host + + + + } }
