Skip to content

Commit 08a8330

Browse files
committed
CLOUDSTACK-10326: Fix for infinite loop on PrepareForMaintenance
1 parent cc35f9d commit 08a8330

File tree

3 files changed

+21
-12
lines changed

3 files changed

+21
-12
lines changed

engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,5 @@ public interface VMInstanceDao extends GenericDao<VMInstanceVO, Long>, StateDao<
151151

152152
boolean isPowerStateUpToDate(long instanceId);
153153

154-
/**
155-
* List running VMs which host and lastHost id are the same
156-
*/
157-
List<VMInstanceVO> listRunningVmsByHostAndLastHostSameId(long hostId);
154+
List<VMInstanceVO> listNonMigratingVmsByHostEqualsLastHost(long hostId);
158155
}

engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
9393
protected GenericSearchBuilder<VMInstanceVO, String> DistinctHostNameSearch;
9494
protected SearchBuilder<VMInstanceVO> HostAndStateSearch;
9595
protected SearchBuilder<VMInstanceVO> StartingWithNoHostSearch;
96+
protected SearchBuilder<VMInstanceVO> NotMigratingSearch;
9697

9798
@Inject
9899
ResourceTagDao _tagsDao;
@@ -280,6 +281,11 @@ protected void init() {
280281
DistinctHostNameSearch.join("nicSearch", nicSearch, DistinctHostNameSearch.entity().getId(), nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER);
281282
DistinctHostNameSearch.done();
282283

284+
NotMigratingSearch = createSearchBuilder();
285+
NotMigratingSearch.and("host", NotMigratingSearch.entity().getHostId(), Op.EQ);
286+
NotMigratingSearch.and("lastHost", NotMigratingSearch.entity().getLastHostId(), Op.EQ);
287+
NotMigratingSearch.and("state", NotMigratingSearch.entity().getState(), Op.NEQ);
288+
NotMigratingSearch.done();
283289
}
284290

285291
@Override
@@ -305,11 +311,11 @@ public List<VMInstanceVO> listByHostId(long hostid) {
305311
}
306312

307313
@Override
308-
public List<VMInstanceVO> listRunningVmsByHostAndLastHostSameId(long hostId) {
309-
SearchCriteria<VMInstanceVO> sc = AllFieldsSearch.create();
314+
public List<VMInstanceVO> listNonMigratingVmsByHostEqualsLastHost(long hostId) {
315+
SearchCriteria<VMInstanceVO> sc = NotMigratingSearch.create();
310316
sc.setParameters("host", hostId);
311317
sc.setParameters("lastHost", hostId);
312-
sc.setParameters("state", State.Running);
318+
sc.setParameters("state", State.Migrating);
313319
return listBy(sc);
314320
}
315321

server/src/com/cloud/resource/ResourceManagerImpl.java

+11-5
Original file line numberDiff line numberDiff line change
@@ -1296,11 +1296,17 @@ public boolean checkAndMaintain(final long hostId) {
12961296
if (host.getType() != Host.Type.Storage) {
12971297
final List<VMInstanceVO> vos = _vmDao.listByHostId(hostId);
12981298
final List<VMInstanceVO> vosMigrating = _vmDao.listVmsMigratingFromHost(hostId);
1299-
final List<VMInstanceVO> failedMigratedVms = _vmDao.listRunningVmsByHostAndLastHostSameId(hostId);
1300-
if (vos.isEmpty() && vosMigrating.isEmpty() && failedMigratedVms.isEmpty()) {
1301-
resourceStateTransitTo(host, ResourceState.Event.InternalEnterMaintenance, _nodeId);
1302-
hostInMaintenance = true;
1303-
ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), CallContext.current().getCallingAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_MAINTENANCE_PREPARE, "completed maintenance for host " + hostId, 0);
1299+
final List<VMInstanceVO> failedMigratedVms = _vmDao.listNonMigratingVmsByHostEqualsLastHost(hostId);
1300+
if (vos.isEmpty() && vosMigrating.isEmpty()) {
1301+
if (!failedMigratedVms.isEmpty()) {
1302+
s_logger.debug("Unable to migrate " + failedMigratedVms.size() + " VM(s) from host " + host.getUuid());
1303+
resourceStateTransitTo(host, ResourceState.Event.UnableToMigrate, _nodeId);
1304+
} else {
1305+
s_logger.debug("Host " + host.getUuid() + " entering in Maintenance");
1306+
resourceStateTransitTo(host, ResourceState.Event.InternalEnterMaintenance, _nodeId);
1307+
hostInMaintenance = true;
1308+
ActionEventUtils.onCompletedActionEvent(CallContext.current().getCallingUserId(), CallContext.current().getCallingAccountId(), EventVO.LEVEL_INFO, EventTypes.EVENT_MAINTENANCE_PREPARE, "completed maintenance for host " + hostId, 0);
1309+
}
13041310
}
13051311
}
13061312
} catch (final NoTransitionException e) {

0 commit comments

Comments
 (0)