From beabf596ba0d26dcd23edb555a2b20e63d32d70b Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Mon, 5 Aug 2013 14:12:25 -0700 Subject: [PATCH] CLOUDSTACK-4080: don't GC the network when it has vms in Starting state even when the nics are not allocated for them yet (can happen when vm is being created) --- .../schema/src/com/cloud/vm/dao/NicDao.java | 2 + .../src/com/cloud/vm/dao/NicDaoImpl.java | 52 +++++++++++++++---- .../com/cloud/network/NetworkModelImpl.java | 7 +++ 3 files changed, 50 insertions(+), 11 deletions(-) diff --git a/engine/schema/src/com/cloud/vm/dao/NicDao.java b/engine/schema/src/com/cloud/vm/dao/NicDao.java index 37249dd909e..79bd4d2b3d6 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicDao.java +++ b/engine/schema/src/com/cloud/vm/dao/NicDao.java @@ -71,4 +71,6 @@ public interface NicDao extends GenericDao { NicVO findByInstanceIdAndIpAddressAndVmtype(long instanceId, String ipaddress, VirtualMachine.Type type); List listByNetworkIdTypeAndGatewayAndBroadcastUri(long networkId, VirtualMachine.Type vmType, String gateway, URI broadcastUri); + + int countNicsForStartingVms(long networkId); } diff --git a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java index d6433a45ffb..8e9f7fab047 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java @@ -16,8 +16,18 @@ // under the License. package com.cloud.vm.dao; +import java.net.URI; +import java.util.List; + +import javax.annotation.PostConstruct; +import javax.ejb.Local; +import javax.inject.Inject; + +import org.springframework.stereotype.Component; + import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericSearchBuilder; +import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Func; @@ -25,25 +35,27 @@ import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.vm.Nic; import com.cloud.vm.Nic.State; import com.cloud.vm.NicVO; +import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachine; -import org.springframework.stereotype.Component; - -import javax.ejb.Local; -import java.net.URI; -import java.util.List; @Component @Local(value=NicDao.class) public class NicDaoImpl extends GenericDaoBase implements NicDao { - private final SearchBuilder AllFieldsSearch; - private final GenericSearchBuilder IpSearch; - private final SearchBuilder NonReleasedSearch; - final GenericSearchBuilder CountBy; + private SearchBuilder AllFieldsSearch; + private GenericSearchBuilder IpSearch; + private SearchBuilder NonReleasedSearch; + private GenericSearchBuilder CountBy; + private GenericSearchBuilder CountByForStartingVms; + @Inject + VMInstanceDao _vmDao; - public NicDaoImpl() { - super(); + public NicDaoImpl() { + } + + @PostConstruct + protected void init() { AllFieldsSearch = createSearchBuilder(); AllFieldsSearch.and("instance", AllFieldsSearch.entity().getInstanceId(), Op.EQ); AllFieldsSearch.and("network", AllFieldsSearch.entity().getNetworkId(), Op.EQ); @@ -73,6 +85,15 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { CountBy.and("vmId", CountBy.entity().getInstanceId(), Op.EQ); CountBy.and("removed", CountBy.entity().getRemoved(), Op.NULL); CountBy.done(); + + CountByForStartingVms = createSearchBuilder(Integer.class); + CountByForStartingVms.select(null, Func.COUNT, CountByForStartingVms.entity().getId()); + CountByForStartingVms.and("networkId", CountByForStartingVms.entity().getNetworkId(), Op.EQ); + CountByForStartingVms.and("removed", CountByForStartingVms.entity().getRemoved(), Op.NULL); + SearchBuilder join1 = _vmDao.createSearchBuilder(); + join1.and("state", join1.entity().getState(), Op.EQ); + CountByForStartingVms.join("vm", join1, CountByForStartingVms.entity().getInstanceId(), join1.entity().getId(), JoinBuilder.JoinType.INNER); + CountByForStartingVms.done(); } @Override @@ -256,4 +277,13 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { return listBy(sc); } + @Override + public int countNicsForStartingVms(long networkId) { + SearchCriteria sc = CountByForStartingVms.create(); + sc.setParameters("networkId", networkId); + sc.setJoinParameters("vm", "state", VirtualMachine.State.Starting); + List results = customSearch(sc, null); + return results.get(0); + } + } diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java index 849884d5d2b..7665f15b508 100755 --- a/server/src/com/cloud/network/NetworkModelImpl.java +++ b/server/src/com/cloud/network/NetworkModelImpl.java @@ -2169,6 +2169,13 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel { networkIsConfiguredForExternalNetworking(network.getDataCenterId(), networkId)) { return false; } + + //if the network has vms in Starting state (nics for those might not be allocated yet as Starting state also used when vm is being Created) + //don't GC + if (_nicDao.countNicsForStartingVms(networkId) > 0) { + s_logger.debug("Network id=" + networkId + " is not ready for GC as it has vms that are Starting at the moment"); + return false; + } return true; }