diff --git a/server/src/main/java/com/cloud/server/ManagementServerImpl.java b/server/src/main/java/com/cloud/server/ManagementServerImpl.java index 1b1debb756d..ca38545145d 100644 --- a/server/src/main/java/com/cloud/server/ManagementServerImpl.java +++ b/server/src/main/java/com/cloud/server/ManagementServerImpl.java @@ -1164,8 +1164,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe final Object resourceState = cmd.getResourceState(); final Object haHosts = cmd.getHaHost(); - final Pair, Integer> result = searchForServers(cmd.getStartIndex(), cmd.getPageSizeVal(), name, type, state, zoneId, pod, cluster, id, keyword, resourceState, haHosts, null, - null); + final Pair, Integer> result = searchForServers(cmd.getStartIndex(), cmd.getPageSizeVal(), name, type, state, zoneId, pod, + cluster, id, keyword, resourceState, haHosts, null, null); return new Pair, Integer>(result.first(), result.second()); } @@ -1267,19 +1267,20 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe final Type hostType = srcHost.getType(); Pair, Integer> allHostsPair = null; List allHosts = null; + List hostsForMigrationWithStorage = null; final Map requiresStorageMotion = new HashMap(); DataCenterDeployment plan = null; if (canMigrateWithStorage) { - allHostsPair = searchForServers(startIndex, pageSize, null, hostType, null, srcHost.getDataCenterId(), null, null, null, keyword, null, null, srcHost.getHypervisorType(), - srcHost.getHypervisorVersion()); + allHostsPair = searchForServers(startIndex, pageSize, null, hostType, null, srcHost.getDataCenterId(), null, null, null, keyword, + null, null, srcHost.getHypervisorType(), srcHost.getHypervisorVersion(), srcHost.getId()); allHosts = allHostsPair.first(); - allHosts.remove(srcHost); + hostsForMigrationWithStorage = new ArrayList<>(allHosts); for (final VolumeVO volume : volumes) { StoragePool storagePool = _poolDao.findById(volume.getPoolId()); Long volClusterId = storagePool.getClusterId(); - for (Iterator iterator = allHosts.iterator(); iterator.hasNext();) { + for (Iterator iterator = hostsForMigrationWithStorage.iterator(); iterator.hasNext();) { final Host host = iterator.next(); if (volClusterId != null) { @@ -1318,10 +1319,9 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe if (s_logger.isDebugEnabled()) { s_logger.debug("Searching for all hosts in cluster " + cluster + " for migrating VM " + vm); } - allHostsPair = searchForServers(startIndex, pageSize, null, hostType, null, null, null, cluster, null, keyword, null, null, null, null); - // Filter out the current host. + allHostsPair = searchForServers(startIndex, pageSize, null, hostType, null, null, null, cluster, null, keyword, null, null, null, + null, srcHost.getId()); allHosts = allHostsPair.first(); - allHosts.remove(srcHost); plan = new DataCenterDeployment(srcHost.getDataCenterId(), srcHost.getPodId(), srcHost.getClusterId(), null, null, null); } @@ -1350,7 +1350,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe for (final HostAllocator allocator : hostAllocators) { if (canMigrateWithStorage) { - suitableHosts = allocator.allocateTo(vmProfile, plan, Host.Type.Routing, excludes, allHosts, HostAllocator.RETURN_UPTO_ALL, false); + suitableHosts = allocator.allocateTo(vmProfile, plan, Host.Type.Routing, excludes, hostsForMigrationWithStorage, HostAllocator.RETURN_UPTO_ALL, false); } else { suitableHosts = allocator.allocateTo(vmProfile, plan, Host.Type.Routing, excludes, HostAllocator.RETURN_UPTO_ALL, false); } @@ -1542,12 +1542,14 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe return suitablePools; } - private Pair, Integer> searchForServers(final Long startIndex, final Long pageSize, final Object name, final Object type, final Object state, final Object zone, final Object pod, - final Object cluster, final Object id, final Object keyword, final Object resourceState, final Object haHosts, final Object hypervisorType, final Object hypervisorVersion) { + private Pair, Integer> searchForServers(final Long startIndex, final Long pageSize, final Object name, final Object type, + final Object state, final Object zone, final Object pod, final Object cluster, final Object id, final Object keyword, + final Object resourceState, final Object haHosts, final Object hypervisorType, final Object hypervisorVersion, final Object... excludes) { final Filter searchFilter = new Filter(HostVO.class, "id", Boolean.TRUE, startIndex, pageSize); final SearchBuilder sb = _hostDao.createSearchBuilder(); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); + sb.and("idsNotIn", sb.entity().getId(), SearchCriteria.Op.NOTIN); sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); sb.and("type", sb.entity().getType(), SearchCriteria.Op.LIKE); sb.and("status", sb.entity().getStatus(), SearchCriteria.Op.EQ); @@ -1588,6 +1590,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe sc.setParameters("id", id); } + if (excludes != null && excludes.length > 0) { + sc.setParameters("idsNotIn", excludes); + } + if (name != null) { sc.setParameters("name", "%" + name + "%"); }