diff --git a/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java b/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java index eb60f3eadf1..ecfb6f65701 100644 --- a/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java +++ b/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java @@ -100,6 +100,8 @@ public interface HighAvailabilityManager extends Manager { void cancelScheduledMigrations(HostVO host); + boolean hasPendingHaWork(long vmId); + /** * @return */ diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 0ca0d309fea..e344001a598 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -4100,7 +4100,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac List pendingWorkJobs = _workJobDao.listPendingWorkJobs( VirtualMachine.Type.Instance, vmId); - if (pendingWorkJobs.size() == 0) { + if (pendingWorkJobs.size() == 0 || _haMgr.hasPendingHaWork(vmId)) { // there is no pending operation job VMInstanceVO vm = _vmDao.findById(vmId); if (vm != null) { @@ -4125,7 +4125,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.warn("VM " + vmId + " no longer exists when processing VM state report"); } } else { - s_logger.info("There is pending job working on the VM. vm id: " + vmId + ", postpone power-change report by resetting power-change counters"); + s_logger.info("There is pending job or HA tasks working on the VM. vm id: " + vmId + ", postpone power-change report by resetting power-change counters"); // reset VM power state tracking so that we won't lost signal when VM has // been translated to diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java index 8bd569a96a7..29f1e7b7879 100755 --- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java +++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java @@ -962,6 +962,9 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai if (oldState == State.Running && event == VirtualMachine.Event.FollowAgentPowerOffReport && newState == State.Stopped) { final VMInstanceVO vm = _instanceDao.findById(vo.getId()); if (vm.isHaEnabled()) { + if (vm.getState() == State.Stopped) + s_logger.warn("Sanity check failed. postStateTransitionEvent reports transited to Stopped but VM " + vm + " is still at state " + vm.getState()); + s_logger.info("Detected out-of-band stop of a HA enabled VM " + vm.getInstanceName() + ", will schedule restart"); _executor.submit(new ManagedContextRunnable() { @Override @@ -977,4 +980,10 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai } return true; } + + @Override + public boolean hasPendingHaWork(long vmId) { + List haWorks = _haDao.listRunningHaWorkForVm(vmId); + return haWorks.size() > 0; + } }