Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,9 @@ public interface NicDao extends GenericDao<NicVO, Long> {

List<NicVO> listByNetworkIdTypeAndGatewayAndBroadcastUri(long networkId, VirtualMachine.Type vmType, String gateway, URI broadcastUri);

int countNicsForStartingVms(long networkId);
int countNicsForNonStoppedVms(long networkId);

int countNicsForNonStoppedRunningVrs(long networkId);

NicVO getControlNicForVM(long vmId);

Expand Down
35 changes: 24 additions & 11 deletions engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long> implements NicDao {
private GenericSearchBuilder<NicVO, String> IpSearch;
private SearchBuilder<NicVO> NonReleasedSearch;
private GenericSearchBuilder<NicVO, Integer> deviceIdSearch;
private GenericSearchBuilder<NicVO, Integer> CountByForStartingVms;
private GenericSearchBuilder<NicVO, Integer> CountByForNonStoppedVms;
private SearchBuilder<NicVO> PeerRouterSearch;

@Inject
Expand Down Expand Up @@ -91,14 +91,16 @@ protected void init() {
deviceIdSearch.and("instance", deviceIdSearch.entity().getInstanceId(), Op.EQ);
deviceIdSearch.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);
CountByForNonStoppedVms = createSearchBuilder(Integer.class);
CountByForNonStoppedVms.select(null, Func.COUNT, CountByForNonStoppedVms.entity().getId());
CountByForNonStoppedVms.and("vmType", CountByForNonStoppedVms.entity().getVmType(), Op.EQ);
CountByForNonStoppedVms.and("vmTypeNEQ", CountByForNonStoppedVms.entity().getVmType(), Op.NEQ);
CountByForNonStoppedVms.and("networkId", CountByForNonStoppedVms.entity().getNetworkId(), Op.EQ);
CountByForNonStoppedVms.and("removed", CountByForNonStoppedVms.entity().getRemoved(), Op.NULL);
SearchBuilder<VMInstanceVO> 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();
join1.and("state", join1.entity().getState(), Op.IN);
CountByForNonStoppedVms.join("vm", join1, CountByForNonStoppedVms.entity().getInstanceId(), join1.entity().getId(), JoinBuilder.JoinType.INNER);
CountByForNonStoppedVms.done();

PeerRouterSearch = createSearchBuilder();
PeerRouterSearch.and("instanceId", PeerRouterSearch.entity().getInstanceId(), Op.NEQ);
Expand Down Expand Up @@ -338,10 +340,21 @@ public List<NicVO> listPlaceholderNicsByNetworkIdAndVmType(long networkId, Virtu
}

@Override
public int countNicsForStartingVms(long networkId) {
SearchCriteria<Integer> sc = CountByForStartingVms.create();
public int countNicsForNonStoppedVms(long networkId) {
SearchCriteria<Integer> sc = CountByForNonStoppedVms.create();
sc.setParameters("networkId", networkId);
sc.setJoinParameters("vm", "state", VirtualMachine.State.Starting);
sc.setParameters("vmType", VirtualMachine.Type.User);
sc.setJoinParameters("vm", "state", new Object[] {VirtualMachine.State.Starting, VirtualMachine.State.Running, VirtualMachine.State.Stopping, VirtualMachine.State.Migrating});
List<Integer> results = customSearch(sc, null);
return results.get(0);
}

@Override
public int countNicsForNonStoppedRunningVrs(long networkId) {
SearchCriteria<Integer> sc = CountByForNonStoppedVms.create();
sc.setParameters("networkId", networkId);
sc.setParameters("vmTypeNEQ", VirtualMachine.Type.User);
sc.setJoinParameters("vm", "state", new Object[] {VirtualMachine.State.Starting, VirtualMachine.State.Stopping, VirtualMachine.State.Migrating});
List<Integer> results = customSearch(sc, null);
return results.get(0);
}
Expand Down
9 changes: 5 additions & 4 deletions server/src/main/java/com/cloud/network/NetworkModelImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -2559,10 +2559,11 @@ public boolean isNetworkReadyForGc(long 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");
// if the network has user vms in Starting/Stopping/Migrating/Running state, or VRs in Starting/Stopping/Migrating state, don't GC
// The active nics count (nics_count in op_networks table) might be wrong due to some reasons, should check the state of vms as well.
// (nics for Starting VMs might not be allocated yet as Starting state also used when vm is being Created)
if (_nicDao.countNicsForNonStoppedVms(networkId) > 0 || _nicDao.countNicsForNonStoppedRunningVrs(networkId) > 0) {
s_logger.debug("Network id=" + networkId + " is not ready for GC as it has vms that are not Stopped at the moment");
return false;
}

Expand Down