From cc35f9ddb0ca938a22c79aa02c42552d6656881c Mon Sep 17 00:00:00 2001 From: nvazquez Date: Thu, 15 Mar 2018 20:56:36 -0300 Subject: [PATCH] CLOUDSTACK-10326: Prevent hosts fall into Maintenance when there are running VMs on it --- engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java | 5 +++++ .../schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java | 9 +++++++++ server/src/com/cloud/resource/ResourceManagerImpl.java | 3 ++- 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java index 69efea42df9..addc46c1af8 100755 --- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java +++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java @@ -150,4 +150,9 @@ public interface VMInstanceDao extends GenericDao, StateDao< VMInstanceVO findVMByHostNameInZone(String hostName, long zoneId); boolean isPowerStateUpToDate(long instanceId); + + /** + * List running VMs which host and lastHost id are the same + */ + List listRunningVmsByHostAndLastHostSameId(long hostId); } diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java index 6e97d1275a6..cb7592403fc 100755 --- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -304,6 +304,15 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem return listBy(sc); } + @Override + public List listRunningVmsByHostAndLastHostSameId(long hostId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("host", hostId); + sc.setParameters("lastHost", hostId); + sc.setParameters("state", State.Running); + return listBy(sc); + } + @Override public List listByZoneId(long zoneId) { SearchCriteria sc = AllFieldsSearch.create(); diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index 2966d41d8bf..3797a0d2303 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -1296,7 +1296,8 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, if (host.getType() != Host.Type.Storage) { final List vos = _vmDao.listByHostId(hostId); final List vosMigrating = _vmDao.listVmsMigratingFromHost(hostId); - if (vos.isEmpty() && vosMigrating.isEmpty()) { + final List failedMigratedVms = _vmDao.listRunningVmsByHostAndLastHostSameId(hostId); + if (vos.isEmpty() && vosMigrating.isEmpty() && failedMigratedVms.isEmpty()) { resourceStateTransitTo(host, ResourceState.Event.InternalEnterMaintenance, _nodeId); hostInMaintenance = true; ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), CallContext.current().getCallingAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_MAINTENANCE_PREPARE, "completed maintenance for host " + hostId, 0);