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

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

commit 255a45c4a62accd01feee47695d3a0ec54ccc573
Merge: 45bac89b831 4a1d80ddc8e
Author: Pearl Dsilva <[email protected]>
AuthorDate: Tue Apr 22 03:31:13 2025 -0400

    Merge branch '4.19' of https://github.com/apache/cloudstack into 4.20

 .../com/cloud/network/IpAddressManagerImpl.java    | 94 +++++++++++++---------
 .../java/com/cloud/network/vpc/VpcManagerImpl.java | 28 +++----
 2 files changed, 66 insertions(+), 56 deletions(-)

diff --cc server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
index 1fa416b643b,63c55966d5b..1c8bf7ae03f
--- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
@@@ -1042,32 -1048,44 +1042,44 @@@ public class IpAddressManagerImpl exten
                  @Override
                  public void doInTransactionWithoutResult(TransactionStatus 
status) {
                      Account owner = 
_accountMgr.getAccount(addr.getAllocatedToAccountId());
-                     if (_ipAddressDao.lockRow(addr.getId(), true) != null) {
-                         final IPAddressVO userIp = 
_ipAddressDao.findById(addr.getId());
-                         if (userIp.getState() == IpAddress.State.Allocating 
|| addr.getState() == IpAddress.State.Free || addr.getState() == 
IpAddress.State.Reserved) {
-                             boolean shouldUpdateIpResourceCount = 
checkIfIpResourceCountShouldBeUpdated(addr);
-                             addr.setState(IpAddress.State.Allocated);
-                             if (_ipAddressDao.update(addr.getId(), addr)) {
-                                 // Save usage event
-                                 if (owner.getAccountId() != 
Account.ACCOUNT_ID_SYSTEM) {
-                                     VlanVO vlan = 
_vlanDao.findById(addr.getVlanId());
-                                     String guestType = 
vlan.getVlanType().toString();
-                                     if (!isIpDedicated(addr)) {
-                                         final boolean usageHidden = 
isUsageHidden(addr);
-                                         
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, 
owner.getId(), addr.getDataCenterId(), addr.getId(),
-                                                 addr.getAddress().toString(), 
addr.isSourceNat(), guestType, addr.getSystem(), usageHidden,
-                                                 addr.getClass().getName(), 
addr.getUuid());
-                                     }
-                                     if (shouldUpdateIpResourceCount) {
-                                         
_resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip);
-                                     }
-                                 }
-                             } else {
-                                 logger.error("Failed to mark public IP as 
allocated: {}", addr);
+                     final IPAddressVO userIp = 
_ipAddressDao.lockRow(addr.getId(), true);
+                     if (userIp == null) {
 -                        s_logger.error(String.format("Failed to acquire row 
lock to mark public IP as allocated with ID [%s] and address [%s]", 
addr.getId(), addr.getAddress()));
++                        logger.error(String.format("Failed to acquire row 
lock to mark public IP as allocated with ID [%s] and address [%s]", 
addr.getId(), addr.getAddress()));
+                         return;
+                     }
+ 
+                     List<IpAddress.State> expectedIpAddressStates = 
List.of(IpAddress.State.Allocating, IpAddress.State.Free, 
IpAddress.State.Reserved);
+                     if (!expectedIpAddressStates.contains(userIp.getState())) 
{
 -                        s_logger.debug(String.format("Not marking public IP 
with ID [%s] and address [%s] as allocated, since it is in the [%s] state.", 
addr.getId(), addr.getAddress(), userIp.getState()));
++                        logger.debug(String.format("Not marking public IP 
with ID [%s] and address [%s] as allocated, since it is in the [%s] state.", 
addr.getId(), addr.getAddress(), userIp.getState()));
+                         return;
+                     }
+ 
+                     boolean shouldUpdateIpResourceCount = 
checkIfIpResourceCountShouldBeUpdated(addr);
+                     addr.setState(IpAddress.State.Allocated);
+                     boolean updatedIpAddress = 
_ipAddressDao.update(addr.getId(), addr);
+                     if (!updatedIpAddress) {
 -                        s_logger.error(String.format("Failed to mark public 
IP as allocated with ID [%s] and address [%s]", addr.getId(), 
addr.getAddress()));
++                        logger.error(String.format("Failed to mark public IP 
as allocated with ID [%s] and address [%s]", addr.getId(), addr.getAddress()));
+                         return;
+                     }
+ 
+                     if (owner.getAccountId() != Account.ACCOUNT_ID_SYSTEM) {
+                         if (shouldUpdateIpResourceCount) {
+                             try (CheckedReservation publicIpReservation = new 
CheckedReservation(owner, ResourceType.public_ip, 1L, reservationDao, 
_resourceLimitMgr)) {
+                                 
_resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip);
+                             } catch (Exception e) {
+                                 _ipAddressDao.unassignIpAddress(addr.getId());
+                                 throw new CloudRuntimeException(e);
                              }
                          }
-                     } else {
-                         logger.error("Failed to acquire row lock to mark 
public IP as allocated: {}", addr);
+ 
+                         VlanVO vlan = _vlanDao.findById(addr.getVlanId());
+                         String guestType = vlan.getVlanType().toString();
+                         if (!isIpDedicated(addr)) {
+                             final boolean usageHidden = isUsageHidden(addr);
+                             
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, 
owner.getId(), addr.getDataCenterId(), addr.getId(),
+                                     addr.getAddress().toString(), 
addr.isSourceNat(), guestType, addr.getSystem(), usageHidden,
+                                     addr.getClass().getName(), 
addr.getUuid());
+                         }
                      }
                  }
              });
@@@ -1552,28 -1569,30 +1564,32 @@@
          }
  
          boolean isSourceNat = isSourceNatAvailableForNetwork(owner, 
ipToAssoc, network);
 -        s_logger.debug(String.format("Associating IP [%s] to network [%s].", 
ipToAssoc, network));
 +
-         logger.debug("Associating ip " + ipToAssoc + " to network " + 
network);
++        logger.debug(String.format("Associating IP [%s] to network [%s].", 
ipToAssoc, network));
 +
          boolean success = false;
          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);
+         try {
+             Pair<IPAddressVO, Boolean> updatedIpAddress = 
Transaction.execute((TransactionCallbackWithException<Pair<IPAddressVO, 
Boolean>, Exception>) status -> {
+                 IPAddressVO ipAddress = _ipAddressDao.findById(ipId);
+                 ipAddress.setAssociatedWithNetworkId(networkId);
+                 ipAddress.setSourceNat(isSourceNat);
+                 _ipAddressDao.update(ipId, ipAddress);
+                 return new Pair<>(_ipAddressDao.findById(ipId), 
applyIpAssociations(network, false));
+             });
+ 
+             ip = updatedIpAddress.first();
+             success = updatedIpAddress.second();
              if (success) {
-                 logger.debug("Successfully associated ip address " + 
ip.getAddress().addr() + " to network " + network);
 -                s_logger.debug(String.format("Successfully associated IP 
address [%s] to network [%s]", ip.getAddress().addr(), network));
++                logger.debug(String.format("Successfully associated IP 
address [%s] to network [%s]", ip.getAddress().addr(), network));
              } else {
-                 logger.warn("Failed to associate ip address " + 
ip.getAddress().addr() + " to network " + network);
 -                s_logger.warn(String.format("Failed to associate IP address 
[%s] to network [%s]", ip.getAddress().addr(), network));
++                logger.warn(String.format("Failed to associate IP address 
[%s] to network [%s]", ip.getAddress().addr(), network));
              }
-             return _ipAddressDao.findById(ipId);
+             return ip;
          } catch (Exception e) {
-             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);
+             String errorMessage = String.format("Failed to associate IP 
address [%s] to network [%s]", ipToAssoc, network);
 -            s_logger.error(errorMessage, e);
++            logger.error(errorMessage, e);
+             throw new CloudRuntimeException(errorMessage, e);
          } finally {
              if (!success && releaseOnFailure) {
                  if (ip != null) {
diff --cc server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
index d542ffc1346,4882659f1ce..7fcdf5ce56e
--- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java
@@@ -42,16 -42,6 +42,15 @@@ import javax.annotation.PostConstruct
  import javax.inject.Inject;
  import javax.naming.ConfigurationException;
  
 +import com.cloud.configuration.ConfigurationManager;
 +import com.cloud.configuration.ConfigurationManagerImpl;
 +import com.cloud.bgp.BGPService;
 +import com.cloud.dc.ASNumberVO;
 +import com.cloud.dc.dao.ASNumberDao;
 +import com.cloud.dc.Vlan;
 +import com.cloud.network.dao.NsxProviderDao;
 +import com.cloud.network.element.NsxProviderVO;
- import com.cloud.resourcelimit.CheckedReservation;
 +import com.google.common.collect.Sets;
  import org.apache.cloudstack.acl.ControlledEntity.ACLType;
  import org.apache.cloudstack.alert.AlertService;
  import org.apache.cloudstack.annotation.AnnotationService;
@@@ -3191,32 -2927,27 +3190,27 @@@ public class VpcManagerImpl extends Man
          // check permissions
          _accountMgr.checkAccess(caller, null, false, owner, vpc);
  
-         logger.debug("Associating ip " + ipToAssoc + " to vpc " + vpc);
 -        s_logger.debug(String.format("Associating IP [%s] to VPC [%s]", 
ipToAssoc, vpc));
++        logger.debug(String.format("Associating IP [%s] to VPC [%s]", 
ipToAssoc, vpc));
  
 -        final boolean isSourceNatFinal = 
isSrcNatIpRequired(vpc.getVpcOfferingId()) && 
getExistingSourceNatInVpc(vpc.getAccountId(), vpcId) == null;
 +        final boolean isSourceNatFinal = 
isSrcNatIpRequired(vpc.getVpcOfferingId()) && 
getExistingSourceNatInVpc(vpc.getAccountId(), vpcId, false) == null;
-         try (CheckedReservation publicIpReservation = new 
CheckedReservation(owner, ResourceType.public_ip, 1l, reservationDao, 
_resourceLimitMgr)) {
-             Transaction.execute(new TransactionCallbackNoReturn() {
-                 @Override
-                 public void doInTransactionWithoutResult(final 
TransactionStatus status) {
+         try {
+             IPAddressVO updatedIpAddress = 
Transaction.execute((TransactionCallbackWithException<IPAddressVO, 
CloudRuntimeException>) status -> {
                  final IPAddressVO ip = _ipAddressDao.findById(ipId);
-                 // update ip address with networkId
                  ip.setVpcId(vpcId);
                  ip.setSourceNat(isSourceNatFinal);
- 
                  _ipAddressDao.update(ipId, ip);
- 
-                 // mark ip as allocated
                  _ipAddrMgr.markPublicIpAsAllocated(ip);
-                 }
+                 return _ipAddressDao.findById(ipId);
              });
+ 
 -            s_logger.debug(String.format("Successfully assigned IP [%s] to 
VPC [%s]", ipToAssoc, vpc));
++            logger.debug(String.format("Successfully assigned IP [%s] to VPC 
[%s]", ipToAssoc, vpc));
+             CallContext.current().putContextParameter(IpAddress.class, 
ipToAssoc.getUuid());
+             return updatedIpAddress;
          } catch (Exception e) {
-             logger.error("Failed to associate ip " + ipToAssoc + " to vpc " + 
vpc, e);
-             throw new CloudRuntimeException("Failed to associate ip " + 
ipToAssoc + " to vpc " + vpc, e);
+             String errorMessage = String.format("Failed to associate IP 
address [%s] to VPC [%s]", ipToAssoc, vpc);
 -            s_logger.error(errorMessage, e);
++            logger.error(errorMessage, e);
+             throw new CloudRuntimeException(errorMessage, e);
          }
- 
-         logger.debug("Successfully assigned ip " + ipToAssoc + " to vpc " + 
vpc);
-         CallContext.current().putContextParameter(IpAddress.class, 
ipToAssoc.getUuid());
-         return _ipAddressDao.findById(ipId);
      }
  
      @Override

Reply via email to