From 08a8330633c5c3f87535239de99b9f1393a18df3 Mon Sep 17 00:00:00 2001 From: nvazquez Date: Sun, 18 Mar 2018 15:49:43 -0300 Subject: [PATCH] CLOUDSTACK-10326: Fix for infinite loop on PrepareForMaintenance --- .../src/com/cloud/vm/dao/VMInstanceDao.java | 5 +---- .../src/com/cloud/vm/dao/VMInstanceDaoImpl.java | 12 +++++++++--- .../com/cloud/resource/ResourceManagerImpl.java | 16 +++++++++++----- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java index addc46c1af8..6fda4a15c32 100755 --- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java +++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java @@ -151,8 +151,5 @@ public interface VMInstanceDao extends GenericDao, StateDao< boolean isPowerStateUpToDate(long instanceId); - /** - * List running VMs which host and lastHost id are the same - */ - List listRunningVmsByHostAndLastHostSameId(long hostId); + List listNonMigratingVmsByHostEqualsLastHost(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 cb7592403fc..1565f53233b 100755 --- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -93,6 +93,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem protected GenericSearchBuilder DistinctHostNameSearch; protected SearchBuilder HostAndStateSearch; protected SearchBuilder StartingWithNoHostSearch; + protected SearchBuilder NotMigratingSearch; @Inject ResourceTagDao _tagsDao; @@ -280,6 +281,11 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem DistinctHostNameSearch.join("nicSearch", nicSearch, DistinctHostNameSearch.entity().getId(), nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); DistinctHostNameSearch.done(); + NotMigratingSearch = createSearchBuilder(); + NotMigratingSearch.and("host", NotMigratingSearch.entity().getHostId(), Op.EQ); + NotMigratingSearch.and("lastHost", NotMigratingSearch.entity().getLastHostId(), Op.EQ); + NotMigratingSearch.and("state", NotMigratingSearch.entity().getState(), Op.NEQ); + NotMigratingSearch.done(); } @Override @@ -305,11 +311,11 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem } @Override - public List listRunningVmsByHostAndLastHostSameId(long hostId) { - SearchCriteria sc = AllFieldsSearch.create(); + public List listNonMigratingVmsByHostEqualsLastHost(long hostId) { + SearchCriteria sc = NotMigratingSearch.create(); sc.setParameters("host", hostId); sc.setParameters("lastHost", hostId); - sc.setParameters("state", State.Running); + sc.setParameters("state", State.Migrating); return listBy(sc); } diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index 3797a0d2303..25bfc4c9c67 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -1296,11 +1296,17 @@ 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); - 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); + final List failedMigratedVms = _vmDao.listNonMigratingVmsByHostEqualsLastHost(hostId); + if (vos.isEmpty() && vosMigrating.isEmpty()) { + if (!failedMigratedVms.isEmpty()) { + s_logger.debug("Unable to migrate " + failedMigratedVms.size() + " VM(s) from host " + host.getUuid()); + resourceStateTransitTo(host, ResourceState.Event.UnableToMigrate, _nodeId); + } else { + s_logger.debug("Host " + host.getUuid() + " entering in Maintenance"); + 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); + } } } } catch (final NoTransitionException e) {