This is an automated email from the ASF dual-hosted git repository.

dahn pushed a commit to branch 4.19
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.19 by this push:
     new e16a9715111 Fix resource count discrepancy while associating IP 
address to a network or vpc (#9563)
e16a9715111 is described below

commit e16a971511137e47bdaa990ba80a647dcf23e56d
Author: Vishesh <[email protected]>
AuthorDate: Thu Sep 19 14:36:00 2024 +0530

    Fix resource count discrepancy while associating IP address to a network or 
vpc (#9563)
---
 .../com/cloud/network/IpAddressManagerImpl.java    | 22 +++++++++++++++-------
 .../java/com/cloud/network/vpc/VpcManagerImpl.java | 19 ++++++++++++++-----
 2 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java 
b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
index c8ac0c1016b..261dc529434 100644
--- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
@@ -35,6 +35,7 @@ import javax.inject.Inject;
 
 import com.cloud.network.dao.PublicIpQuarantineDao;
 import com.cloud.network.vo.PublicIpQuarantineVO;
+import com.cloud.resourcelimit.CheckedReservation;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.acl.SecurityChecker.AccessType;
 import org.apache.cloudstack.annotation.AnnotationService;
@@ -53,6 +54,7 @@ import org.apache.cloudstack.region.PortableIp;
 import org.apache.cloudstack.region.PortableIpDao;
 import org.apache.cloudstack.region.PortableIpVO;
 import org.apache.cloudstack.region.Region;
+import org.apache.cloudstack.reservation.dao.ReservationDao;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.log4j.Logger;
 
@@ -261,6 +263,8 @@ public class IpAddressManagerImpl extends ManagerBase 
implements IpAddressManage
     @Inject
     ResourceLimitService _resourceLimitMgr;
 
+    @Inject
+    ReservationDao reservationDao;
     @Inject
     NetworkOfferingServiceMapDao _ntwkOfferingSrvcDao;
     @Inject
@@ -1556,14 +1560,15 @@ public class IpAddressManagerImpl extends ManagerBase 
implements IpAddressManage
 
         s_logger.debug("Associating ip " + ipToAssoc + " to network " + 
network);
 
-        IPAddressVO ip = _ipAddressDao.findById(ipId);
-        //update ip address with networkId
-        ip.setAssociatedWithNetworkId(networkId);
-        ip.setSourceNat(isSourceNat);
-        _ipAddressDao.update(ipId, ip);
-
         boolean success = false;
-        try {
+        IPAddressVO ip = null;
+        try (CheckedReservation publicIpReservation = new 
CheckedReservation(owner, ResourceType.public_ip, 1l, reservationDao, 
_resourceLimitMgr)) {
+            ip = _ipAddressDao.findById(ipId);
+            //update ip address with networkId
+            ip.setAssociatedWithNetworkId(networkId);
+            ip.setSourceNat(isSourceNat);
+            _ipAddressDao.update(ipId, ip);
+
             success = applyIpAssociations(network, false);
             if (success) {
                 s_logger.debug("Successfully associated ip address " + 
ip.getAddress().addr() + " to network " + network);
@@ -1571,6 +1576,9 @@ public class IpAddressManagerImpl extends ManagerBase 
implements IpAddressManage
                 s_logger.warn("Failed to associate ip address " + 
ip.getAddress().addr() + " to network " + network);
             }
             return _ipAddressDao.findById(ipId);
+        } catch (Exception e) {
+            s_logger.error(String.format("Failed to associate ip address %s to 
network %s", ipToAssoc, network), e);
+            throw new CloudRuntimeException(String.format("Failed to associate 
ip address %s to network %s", ipToAssoc, network), e);
         } finally {
             if (!success && releaseOnFailure) {
                 if (ip != null) {
diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java 
b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
index c9391a32167..ce3f083135e 100644
--- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
@@ -42,6 +42,7 @@ import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
+import com.cloud.resourcelimit.CheckedReservation;
 import org.apache.cloudstack.acl.ControlledEntity.ACLType;
 import org.apache.cloudstack.alert.AlertService;
 import org.apache.cloudstack.annotation.AnnotationService;
@@ -63,6 +64,7 @@ import 
org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationSe
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 import org.apache.cloudstack.query.QueryService;
+import org.apache.cloudstack.reservation.dao.ReservationDao;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.log4j.Logger;
@@ -237,6 +239,8 @@ public class VpcManagerImpl extends ManagerBase implements 
VpcManager, VpcProvis
     @Inject
     ResourceLimitService _resourceLimitMgr;
     @Inject
+    ReservationDao reservationDao;
+    @Inject
     VpcServiceMapDao _vpcSrvcDao;
     @Inject
     DataCenterDao _dcDao;
@@ -2927,9 +2931,10 @@ public class VpcManagerImpl extends ManagerBase 
implements VpcManager, VpcProvis
         s_logger.debug("Associating ip " + ipToAssoc + " to vpc " + vpc);
 
         final boolean isSourceNatFinal = 
isSrcNatIpRequired(vpc.getVpcOfferingId()) && 
getExistingSourceNatInVpc(vpc.getAccountId(), vpcId) == null;
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(final TransactionStatus 
status) {
+        try (CheckedReservation publicIpReservation = new 
CheckedReservation(owner, ResourceType.public_ip, 1l, reservationDao, 
_resourceLimitMgr)) {
+            Transaction.execute(new TransactionCallbackNoReturn() {
+                @Override
+                public void doInTransactionWithoutResult(final 
TransactionStatus status) {
                 final IPAddressVO ip = _ipAddressDao.findById(ipId);
                 // update ip address with networkId
                 ip.setVpcId(vpcId);
@@ -2939,8 +2944,12 @@ public class VpcManagerImpl extends ManagerBase 
implements VpcManager, VpcProvis
 
                 // mark ip as allocated
                 _ipAddrMgr.markPublicIpAsAllocated(ip);
-            }
-        });
+                }
+            });
+        } catch (Exception e) {
+            s_logger.error("Failed to associate ip " + ipToAssoc + " to vpc " 
+ vpc, e);
+            throw new CloudRuntimeException("Failed to associate ip " + 
ipToAssoc + " to vpc " + vpc, e);
+        }
 
         s_logger.debug("Successfully assigned ip " + ipToAssoc + " to vpc " + 
vpc);
         CallContext.current().putContextParameter(IpAddress.class, 
ipToAssoc.getUuid());

Reply via email to