mirror of https://github.com/apache/cloudstack.git
CLOUDSTACK-10326: Fix for infinite loop on PrepareForMaintenance
This commit is contained in:
parent
cc35f9ddb0
commit
08a8330633
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue