From 8ef070ee96c5e23b24fbc3bf8c787fae449bfeec Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Thu, 9 Nov 2023 09:43:09 +0100 Subject: [PATCH 1/3] server: check if there are active nics before network GC --- .../main/java/com/cloud/vm/dao/NicDao.java | 2 +- .../java/com/cloud/vm/dao/NicDaoImpl.java | 22 +++++++++---------- .../com/cloud/network/NetworkModelImpl.java | 2 +- 3 files changed, 13 insertions(+), 13 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 c52c690d8b54..2a2642206e0b 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,7 @@ public interface NicDao extends GenericDao { List listByNetworkIdTypeAndGatewayAndBroadcastUri(long networkId, VirtualMachine.Type vmType, String gateway, URI broadcastUri); - int countNicsForStartingVms(long networkId); + int countNicsForNonStoppedVms(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 c8efc074a106..992be3fe77b8 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 implements NicDao { private GenericSearchBuilder IpSearch; private SearchBuilder NonReleasedSearch; private GenericSearchBuilder deviceIdSearch; - private GenericSearchBuilder CountByForStartingVms; + private GenericSearchBuilder CountByForNonStoppedVms; private SearchBuilder PeerRouterSearch; @Inject @@ -91,14 +91,14 @@ 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("networkId", CountByForNonStoppedVms.entity().getNetworkId(), Op.EQ); + CountByForNonStoppedVms.and("removed", CountByForNonStoppedVms.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(); + 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 +338,10 @@ public List listPlaceholderNicsByNetworkIdAndVmType(long networkId, Virtu } @Override - public int countNicsForStartingVms(long networkId) { - SearchCriteria sc = CountByForStartingVms.create(); + public int countNicsForNonStoppedVms(long networkId) { + SearchCriteria sc = CountByForNonStoppedVms.create(); sc.setParameters("networkId", networkId); - sc.setJoinParameters("vm", "state", VirtualMachine.State.Starting); + sc.setJoinParameters("vm", "state", new Object[] {VirtualMachine.State.Starting, VirtualMachine.State.Running, VirtualMachine.State.Stopping, VirtualMachine.State.Migrating}); List 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 beb416cab574..7a404ff2898b 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -2561,7 +2561,7 @@ public boolean isNetworkReadyForGc(long networkId) { //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) { + if (_nicDao.countNicsForNonStoppedVms(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; } From 9b1551d7598e38b82d2173cc59e820edf2693406 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 10 Nov 2023 15:19:47 +0100 Subject: [PATCH 2/3] PR8204: update --- .../src/main/java/com/cloud/vm/dao/NicDao.java | 2 ++ .../src/main/java/com/cloud/vm/dao/NicDaoImpl.java | 13 +++++++++++++ .../java/com/cloud/network/NetworkModelImpl.java | 9 +++++---- 3 files changed, 20 insertions(+), 4 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 2a2642206e0b..13eb04ba6b85 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 @@ -81,6 +81,8 @@ public interface NicDao extends GenericDao { int countNicsForNonStoppedVms(long networkId); + int countNicsForNonStoppedRunningVrs(long networkId); + NicVO getControlNicForVM(long vmId); Long getPeerRouterId(String publicMacAddress, long routerId); 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 992be3fe77b8..5c5949a002fc 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 @@ -93,6 +93,8 @@ protected void init() { CountByForNonStoppedVms = createSearchBuilder(Integer.class); CountByForNonStoppedVms.select(null, Func.COUNT, CountByForNonStoppedVms.entity().getId()); + CountByForNonStoppedVms.and("vmType", AllFieldsSearch.entity().getVmType(), Op.EQ); + CountByForNonStoppedVms.and("vmTypeNEQ", AllFieldsSearch.entity().getVmType(), Op.NEQ); CountByForNonStoppedVms.and("networkId", CountByForNonStoppedVms.entity().getNetworkId(), Op.EQ); CountByForNonStoppedVms.and("removed", CountByForNonStoppedVms.entity().getRemoved(), Op.NULL); SearchBuilder join1 = _vmDao.createSearchBuilder(); @@ -341,11 +343,22 @@ public List listPlaceholderNicsByNetworkIdAndVmType(long networkId, Virtu public int countNicsForNonStoppedVms(long networkId) { SearchCriteria sc = CountByForNonStoppedVms.create(); sc.setParameters("networkId", networkId); + 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 results = customSearch(sc, null); return results.get(0); } + @Override + public int countNicsForNonStoppedRunningVrs(long networkId) { + SearchCriteria 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 results = customSearch(sc, null); + return results.get(0); + } + @Override public Long getPeerRouterId(String publicMacAddress, final long routerId) { final SearchCriteria sc = PeerRouterSearch.create(); diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index 7a404ff2898b..696e93d999ff 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 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.countNicsForNonStoppedVms(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; } From f2992f3701974c150acd4d6371a0759945a1d870 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 10 Nov 2023 16:24:38 +0100 Subject: [PATCH 3/3] PR8204: fix unit tests --- engine/schema/src/main/java/com/cloud/vm/dao/NicDaoImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 5c5949a002fc..fdc36b4f918f 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 @@ -93,8 +93,8 @@ protected void init() { CountByForNonStoppedVms = createSearchBuilder(Integer.class); CountByForNonStoppedVms.select(null, Func.COUNT, CountByForNonStoppedVms.entity().getId()); - CountByForNonStoppedVms.and("vmType", AllFieldsSearch.entity().getVmType(), Op.EQ); - CountByForNonStoppedVms.and("vmTypeNEQ", AllFieldsSearch.entity().getVmType(), Op.NEQ); + 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 join1 = _vmDao.createSearchBuilder();