CLOUDSTACK-10326: Fix for infinite loop on PrepareForMaintenance

This commit is contained in:
nvazquez 2018-03-18 15:49:43 -03:00
parent cc35f9ddb0
commit 08a8330633
3 changed files with 21 additions and 12 deletions

View File

@ -151,8 +151,5 @@ public interface VMInstanceDao extends GenericDao<VMInstanceVO, Long>, StateDao<
boolean isPowerStateUpToDate(long instanceId);
/**
* List running VMs which host and lastHost id are the same
*/
List<VMInstanceVO> listRunningVmsByHostAndLastHostSameId(long hostId);
List<VMInstanceVO> listNonMigratingVmsByHostEqualsLastHost(long hostId);
}

View File

@ -93,6 +93,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
protected GenericSearchBuilder<VMInstanceVO, String> DistinctHostNameSearch;
protected SearchBuilder<VMInstanceVO> HostAndStateSearch;
protected SearchBuilder<VMInstanceVO> StartingWithNoHostSearch;
protected SearchBuilder<VMInstanceVO> NotMigratingSearch;
@Inject
ResourceTagDao _tagsDao;
@ -280,6 +281,11 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> 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<VMInstanceVO, Long> implem
}
@Override
public List<VMInstanceVO> listRunningVmsByHostAndLastHostSameId(long hostId) {
SearchCriteria<VMInstanceVO> sc = AllFieldsSearch.create();
public List<VMInstanceVO> listNonMigratingVmsByHostEqualsLastHost(long hostId) {
SearchCriteria<VMInstanceVO> sc = NotMigratingSearch.create();
sc.setParameters("host", hostId);
sc.setParameters("lastHost", hostId);
sc.setParameters("state", State.Running);
sc.setParameters("state", State.Migrating);
return listBy(sc);
}

View File

@ -1296,11 +1296,17 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
if (host.getType() != Host.Type.Storage) {
final List<VMInstanceVO> vos = _vmDao.listByHostId(hostId);
final List<VMInstanceVO> vosMigrating = _vmDao.listVmsMigratingFromHost(hostId);
final List<VMInstanceVO> 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<VMInstanceVO> 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) {