Fix message publish in transaction (#8980)

* Fix message publish in transaction

* Resolve comments
This commit is contained in:
Vishesh 2024-05-07 13:27:31 +05:30 committed by GitHub
parent 87e7c57d08
commit 6b4955affe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 40 additions and 15 deletions

View File

@ -20,6 +20,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import com.cloud.dc.VlanVO;
import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.impl.ConfigurationSubGroupVO; import org.apache.cloudstack.framework.config.impl.ConfigurationSubGroupVO;
@ -189,7 +190,7 @@ public interface ConfigurationManager {
* @param caller TODO * @param caller TODO
* @return success/failure * @return success/failure
*/ */
boolean deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller); VlanVO deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller);
void checkZoneAccess(Account caller, DataCenter zone); void checkZoneAccess(Account caller, DataCenter zone);

View File

@ -255,6 +255,8 @@ import com.cloud.vm.dao.UserVmDao;
import com.cloud.vm.dao.VMInstanceDao; import com.cloud.vm.dao.VMInstanceDao;
import com.googlecode.ipv6.IPv6Address; import com.googlecode.ipv6.IPv6Address;
import static com.cloud.configuration.ConfigurationManager.MESSAGE_DELETE_VLAN_IP_RANGE_EVENT;
/** /**
* NetworkManagerImpl implements NetworkManager. * NetworkManagerImpl implements NetworkManager.
*/ */
@ -3298,16 +3300,16 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
final NetworkVO networkFinal = network; final NetworkVO networkFinal = network;
try { try {
Transaction.execute(new TransactionCallbackNoReturn() { final List<VlanVO> deletedVlanRangeToPublish = Transaction.execute(new TransactionCallback<List<VlanVO>>() {
@Override @Override
public void doInTransactionWithoutResult(final TransactionStatus status) { public List<VlanVO> doInTransaction(TransactionStatus status) {
final NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, networkFinal.getGuruName()); final NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, networkFinal.getGuruName());
if (!guru.trash(networkFinal, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId()))) { if (!guru.trash(networkFinal, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId()))) {
throw new CloudRuntimeException("Failed to trash network."); throw new CloudRuntimeException("Failed to trash network.");
} }
Pair<Boolean, List<VlanVO>> deletedVlans = deleteVlansInNetwork(networkFinal, context.getCaller().getId(), callerAccount);
if (!deleteVlansInNetwork(networkFinal, context.getCaller().getId(), callerAccount)) { if (!deletedVlans.first()) {
s_logger.warn("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges"); s_logger.warn("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges");
throw new CloudRuntimeException("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges"); throw new CloudRuntimeException("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges");
} else { } else {
@ -3341,8 +3343,10 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
_resourceLimitMgr.decrementResourceCount(networkFinal.getAccountId(), ResourceType.network, networkFinal.getDisplayNetwork()); _resourceLimitMgr.decrementResourceCount(networkFinal.getAccountId(), ResourceType.network, networkFinal.getDisplayNetwork());
} }
} }
return deletedVlans.second();
} }
}); });
publishDeletedVlanRanges(deletedVlanRangeToPublish);
if (_networksDao.findById(network.getId()) == null) { if (_networksDao.findById(network.getId()) == null) {
// remove its related ACL permission // remove its related ACL permission
final Pair<Class<?>, Long> networkMsg = new Pair<Class<?>, Long>(Network.class, networkFinal.getId()); final Pair<Class<?>, Long> networkMsg = new Pair<Class<?>, Long>(Network.class, networkFinal.getId());
@ -3360,6 +3364,14 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
return success; return success;
} }
private void publishDeletedVlanRanges(List<VlanVO> deletedVlanRangeToPublish) {
if (CollectionUtils.isNotEmpty(deletedVlanRangeToPublish)) {
for (VlanVO vlan : deletedVlanRangeToPublish) {
_messageBus.publish(_name, MESSAGE_DELETE_VLAN_IP_RANGE_EVENT, PublishScope.LOCAL, vlan);
}
}
}
@Override @Override
public boolean resourceCountNeedsUpdate(final NetworkOffering ntwkOff, final ACLType aclType) { public boolean resourceCountNeedsUpdate(final NetworkOffering ntwkOff, final ACLType aclType) {
//Update resource count only for Isolated account specific non-system networks //Update resource count only for Isolated account specific non-system networks
@ -3367,15 +3379,19 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
return updateResourceCount; return updateResourceCount;
} }
protected boolean deleteVlansInNetwork(final NetworkVO network, final long userId, final Account callerAccount) { protected Pair<Boolean, List<VlanVO>> deleteVlansInNetwork(final NetworkVO network, final long userId, final Account callerAccount) {
final long networkId = network.getId(); final long networkId = network.getId();
//cleanup Public vlans //cleanup Public vlans
final List<VlanVO> publicVlans = _vlanDao.listVlansByNetworkId(networkId); final List<VlanVO> publicVlans = _vlanDao.listVlansByNetworkId(networkId);
List<VlanVO> deletedPublicVlanRange = new ArrayList<>();
boolean result = true; boolean result = true;
for (final VlanVO vlan : publicVlans) { for (final VlanVO vlan : publicVlans) {
if (!_configMgr.deleteVlanAndPublicIpRange(userId, vlan.getId(), callerAccount)) { VlanVO vlanRange = _configMgr.deleteVlanAndPublicIpRange(userId, vlan.getId(), callerAccount);
if (vlanRange == null) {
s_logger.warn("Failed to delete vlan " + vlan.getId() + ");"); s_logger.warn("Failed to delete vlan " + vlan.getId() + ");");
result = false; result = false;
} else {
deletedPublicVlanRange.add(vlanRange);
} }
} }
@ -3395,7 +3411,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
_dcDao.releaseVnet(BroadcastDomainType.getValue(network.getBroadcastUri()), network.getDataCenterId(), _dcDao.releaseVnet(BroadcastDomainType.getValue(network.getBroadcastUri()), network.getDataCenterId(),
network.getPhysicalNetworkId(), network.getAccountId(), network.getReservationId()); network.getPhysicalNetworkId(), network.getAccountId(), network.getReservationId());
} }
return result; return new Pair<>(result, deletedPublicVlanRange);
} }
public class NetworkGarbageCollector extends ManagedContextRunnable { public class NetworkGarbageCollector extends ManagedContextRunnable {

View File

@ -5348,7 +5348,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@Override @Override
@DB @DB
public boolean deleteVlanAndPublicIpRange(final long userId, final long vlanDbId, final Account caller) { public VlanVO deleteVlanAndPublicIpRange(final long userId, final long vlanDbId, final Account caller) {
VlanVO vlanRange = _vlanDao.findById(vlanDbId); VlanVO vlanRange = _vlanDao.findById(vlanDbId);
if (vlanRange == null) { if (vlanRange == null) {
throw new InvalidParameterValueException("Please specify a valid IP range id."); throw new InvalidParameterValueException("Please specify a valid IP range id.");
@ -5454,9 +5454,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
} }
}); });
messageBus.publish(_name, MESSAGE_DELETE_VLAN_IP_RANGE_EVENT, PublishScope.LOCAL, vlanRange); return vlanRange;
return true;
} }
@Override @Override
@ -5962,7 +5960,16 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
throw new InvalidParameterValueException("Please specify a valid IP range id."); throw new InvalidParameterValueException("Please specify a valid IP range id.");
} }
return deleteVlanAndPublicIpRange(CallContext.current().getCallingUserId(), vlanDbId, CallContext.current().getCallingAccount()); return deleteAndPublishVlanAndPublicIpRange(CallContext.current().getCallingUserId(), vlanDbId, CallContext.current().getCallingAccount());
}
private boolean deleteAndPublishVlanAndPublicIpRange(final long userId, final long vlanDbId, final Account caller) {
VlanVO deletedVlan = deleteVlanAndPublicIpRange(userId, vlanDbId, caller);
if (deletedVlan != null) {
messageBus.publish(_name, MESSAGE_DELETE_VLAN_IP_RANGE_EVENT, PublishScope.LOCAL, deletedVlan);
return true;
}
return false;
} }
@Override @Override

View File

@ -26,6 +26,7 @@ import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO; import com.cloud.dc.HostPodVO;
import com.cloud.dc.Pod; import com.cloud.dc.Pod;
import com.cloud.dc.Vlan; import com.cloud.dc.Vlan;
import com.cloud.dc.VlanVO;
import com.cloud.domain.Domain; import com.cloud.domain.Domain;
import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientCapacityException;
@ -515,9 +516,9 @@ public class MockConfigurationManagerImpl extends ManagerBase implements Configu
* @see com.cloud.configuration.ConfigurationManager#deleteVlanAndPublicIpRange(long, long, com.cloud.user.Account) * @see com.cloud.configuration.ConfigurationManager#deleteVlanAndPublicIpRange(long, long, com.cloud.user.Account)
*/ */
@Override @Override
public boolean deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller) { public VlanVO deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller) {
// TODO Auto-generated method stub // TODO Auto-generated method stub
return false; return null;
} }
/* (non-Javadoc) /* (non-Javadoc)