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;
         }
 

Reply via email to