This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch 4.18
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.18 by this push:
new cb2b6aca45c server: check if there are active nics before network GC
(#8204)
cb2b6aca45c is described below
commit cb2b6aca45c81de19a5d9f1bf31a2f022d7f8c31
Author: Wei Zhou <[email protected]>
AuthorDate: Wed Nov 29 18:55:26 2023 +0100
server: check if there are active nics before network GC (#8204)
---
.../src/main/java/com/cloud/vm/dao/NicDao.java | 4 ++-
.../src/main/java/com/cloud/vm/dao/NicDaoImpl.java | 35 +++++++++++++++-------
.../java/com/cloud/network/NetworkModelImpl.java | 9 +++---
3 files changed, 32 insertions(+), 16 deletions(-)
diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java
b/engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java
index c52c690d8b5..13eb04ba6b8 100644
--- a/engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java
+++ b/engine/schema/src/main/java/com/cloud/vm/dao/NicDao.java
@@ -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);
diff --git a/engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java
b/engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java
index c8efc074a10..fdc36b4f918 100644
--- a/engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java
+++ b/engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java
@@ -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
@@ -91,14 +91,16 @@ public class NicDaoImpl extends GenericDaoBase<NicVO, Long>
implements NicDao {
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);
@@ -338,10 +340,21 @@ public class NicDaoImpl extends GenericDaoBase<NicVO,
Long> implements NicDao {
}
@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);
}
diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java
b/server/src/main/java/com/cloud/network/NetworkModelImpl.java
index beb416cab57..696e93d999f 100644
--- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java
@@ -2559,10 +2559,11 @@ public class NetworkModelImpl extends ManagerBase
implements NetworkModel, Confi
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;
}