Skip to content

Commit 6b4955a

Browse files
authored
Fix message publish in transaction (apache#8980)
* Fix message publish in transaction * Resolve comments
1 parent 87e7c57 commit 6b4955a

4 files changed

Lines changed: 40 additions & 15 deletions

File tree

engine/components-api/src/main/java/com/cloud/configuration/ConfigurationManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.Map;
2121
import java.util.Set;
2222

23+
import com.cloud.dc.VlanVO;
2324
import org.apache.cloudstack.framework.config.ConfigKey;
2425
import org.apache.cloudstack.framework.config.impl.ConfigurationSubGroupVO;
2526

@@ -189,7 +190,7 @@ DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2,
189190
* @param caller TODO
190191
* @return success/failure
191192
*/
192-
boolean deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller);
193+
VlanVO deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller);
193194

194195
void checkZoneAccess(Account caller, DataCenter zone);
195196

engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,8 @@
255255
import com.cloud.vm.dao.VMInstanceDao;
256256
import com.googlecode.ipv6.IPv6Address;
257257

258+
import static com.cloud.configuration.ConfigurationManager.MESSAGE_DELETE_VLAN_IP_RANGE_EVENT;
259+
258260
/**
259261
* NetworkManagerImpl implements NetworkManager.
260262
*/
@@ -3298,16 +3300,16 @@ public boolean destroyNetwork(final long networkId, final ReservationContext con
32983300

32993301
final NetworkVO networkFinal = network;
33003302
try {
3301-
Transaction.execute(new TransactionCallbackNoReturn() {
3303+
final List<VlanVO> deletedVlanRangeToPublish = Transaction.execute(new TransactionCallback<List<VlanVO>>() {
33023304
@Override
3303-
public void doInTransactionWithoutResult(final TransactionStatus status) {
3305+
public List<VlanVO> doInTransaction(TransactionStatus status) {
33043306
final NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, networkFinal.getGuruName());
33053307

33063308
if (!guru.trash(networkFinal, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId()))) {
33073309
throw new CloudRuntimeException("Failed to trash network.");
33083310
}
3309-
3310-
if (!deleteVlansInNetwork(networkFinal, context.getCaller().getId(), callerAccount)) {
3311+
Pair<Boolean, List<VlanVO>> deletedVlans = deleteVlansInNetwork(networkFinal, context.getCaller().getId(), callerAccount);
3312+
if (!deletedVlans.first()) {
33113313
s_logger.warn("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges");
33123314
throw new CloudRuntimeException("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges");
33133315
} else {
@@ -3341,8 +3343,10 @@ public void doInTransactionWithoutResult(final TransactionStatus status) {
33413343
_resourceLimitMgr.decrementResourceCount(networkFinal.getAccountId(), ResourceType.network, networkFinal.getDisplayNetwork());
33423344
}
33433345
}
3346+
return deletedVlans.second();
33443347
}
33453348
});
3349+
publishDeletedVlanRanges(deletedVlanRangeToPublish);
33463350
if (_networksDao.findById(network.getId()) == null) {
33473351
// remove its related ACL permission
33483352
final Pair<Class<?>, Long> networkMsg = new Pair<Class<?>, Long>(Network.class, networkFinal.getId());
@@ -3360,22 +3364,34 @@ public void doInTransactionWithoutResult(final TransactionStatus status) {
33603364
return success;
33613365
}
33623366

3367+
private void publishDeletedVlanRanges(List<VlanVO> deletedVlanRangeToPublish) {
3368+
if (CollectionUtils.isNotEmpty(deletedVlanRangeToPublish)) {
3369+
for (VlanVO vlan : deletedVlanRangeToPublish) {
3370+
_messageBus.publish(_name, MESSAGE_DELETE_VLAN_IP_RANGE_EVENT, PublishScope.LOCAL, vlan);
3371+
}
3372+
}
3373+
}
3374+
33633375
@Override
33643376
public boolean resourceCountNeedsUpdate(final NetworkOffering ntwkOff, final ACLType aclType) {
33653377
//Update resource count only for Isolated account specific non-system networks
33663378
final boolean updateResourceCount = ntwkOff.getGuestType() == GuestType.Isolated && !ntwkOff.isSystemOnly() && aclType == ACLType.Account;
33673379
return updateResourceCount;
33683380
}
33693381

3370-
protected boolean deleteVlansInNetwork(final NetworkVO network, final long userId, final Account callerAccount) {
3382+
protected Pair<Boolean, List<VlanVO>> deleteVlansInNetwork(final NetworkVO network, final long userId, final Account callerAccount) {
33713383
final long networkId = network.getId();
33723384
//cleanup Public vlans
33733385
final List<VlanVO> publicVlans = _vlanDao.listVlansByNetworkId(networkId);
3386+
List<VlanVO> deletedPublicVlanRange = new ArrayList<>();
33743387
boolean result = true;
33753388
for (final VlanVO vlan : publicVlans) {
3376-
if (!_configMgr.deleteVlanAndPublicIpRange(userId, vlan.getId(), callerAccount)) {
3389+
VlanVO vlanRange = _configMgr.deleteVlanAndPublicIpRange(userId, vlan.getId(), callerAccount);
3390+
if (vlanRange == null) {
33773391
s_logger.warn("Failed to delete vlan " + vlan.getId() + ");");
33783392
result = false;
3393+
} else {
3394+
deletedPublicVlanRange.add(vlanRange);
33793395
}
33803396
}
33813397

@@ -3395,7 +3411,7 @@ protected boolean deleteVlansInNetwork(final NetworkVO network, final long userI
33953411
_dcDao.releaseVnet(BroadcastDomainType.getValue(network.getBroadcastUri()), network.getDataCenterId(),
33963412
network.getPhysicalNetworkId(), network.getAccountId(), network.getReservationId());
33973413
}
3398-
return result;
3414+
return new Pair<>(result, deletedPublicVlanRange);
33993415
}
34003416

34013417
public class NetworkGarbageCollector extends ManagedContextRunnable {

server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5348,7 +5348,7 @@ private void checkGatewayOverlap(String startIp, String endIp, String gateway) {
53485348

53495349
@Override
53505350
@DB
5351-
public boolean deleteVlanAndPublicIpRange(final long userId, final long vlanDbId, final Account caller) {
5351+
public VlanVO deleteVlanAndPublicIpRange(final long userId, final long vlanDbId, final Account caller) {
53525352
VlanVO vlanRange = _vlanDao.findById(vlanDbId);
53535353
if (vlanRange == null) {
53545354
throw new InvalidParameterValueException("Please specify a valid IP range id.");
@@ -5454,9 +5454,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) {
54545454
}
54555455
});
54565456

5457-
messageBus.publish(_name, MESSAGE_DELETE_VLAN_IP_RANGE_EVENT, PublishScope.LOCAL, vlanRange);
5458-
5459-
return true;
5457+
return vlanRange;
54605458
}
54615459

54625460
@Override
@@ -5962,7 +5960,16 @@ public boolean deleteVlanIpRange(final DeleteVlanIpRangeCmd cmd) {
59625960
throw new InvalidParameterValueException("Please specify a valid IP range id.");
59635961
}
59645962

5965-
return deleteVlanAndPublicIpRange(CallContext.current().getCallingUserId(), vlanDbId, CallContext.current().getCallingAccount());
5963+
return deleteAndPublishVlanAndPublicIpRange(CallContext.current().getCallingUserId(), vlanDbId, CallContext.current().getCallingAccount());
5964+
}
5965+
5966+
private boolean deleteAndPublishVlanAndPublicIpRange(final long userId, final long vlanDbId, final Account caller) {
5967+
VlanVO deletedVlan = deleteVlanAndPublicIpRange(userId, vlanDbId, caller);
5968+
if (deletedVlan != null) {
5969+
messageBus.publish(_name, MESSAGE_DELETE_VLAN_IP_RANGE_EVENT, PublishScope.LOCAL, deletedVlan);
5970+
return true;
5971+
}
5972+
return false;
59665973
}
59675974

59685975
@Override

server/src/test/java/com/cloud/vpc/MockConfigurationManagerImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.cloud.dc.HostPodVO;
2727
import com.cloud.dc.Pod;
2828
import com.cloud.dc.Vlan;
29+
import com.cloud.dc.VlanVO;
2930
import com.cloud.domain.Domain;
3031
import com.cloud.exception.ConcurrentOperationException;
3132
import com.cloud.exception.InsufficientCapacityException;
@@ -515,9 +516,9 @@ public HostPodVO createPod(long userId, String podName, DataCenter zone, String
515516
* @see com.cloud.configuration.ConfigurationManager#deleteVlanAndPublicIpRange(long, long, com.cloud.user.Account)
516517
*/
517518
@Override
518-
public boolean deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller) {
519+
public VlanVO deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller) {
519520
// TODO Auto-generated method stub
520-
return false;
521+
return null;
521522
}
522523

523524
/* (non-Javadoc)

0 commit comments

Comments
 (0)