mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	[TK-3113] fixed CloudRuntimeException: NO EVENT PUBLISH CAN BE WRAPPED WITHIN DB TRANSACTION!
This commit is contained in:
		
							parent
							
								
									a51690be4b
								
							
						
					
					
						commit
						014b47f6e6
					
				| @ -183,6 +183,8 @@ | |||||||
|         <property name="vpcElements" value="#{vpcProvidersRegistry.registered}"></property> |         <property name="vpcElements" value="#{vpcProvidersRegistry.registered}"></property> | ||||||
|     </bean> |     </bean> | ||||||
|      |      | ||||||
|  |     <bean id="vpcTxCallable" class="com.cloud.network.vpc.VpcPrivateGatewayTransactionCallable" /> | ||||||
|  |      | ||||||
|     <bean id="vpcVirtualNetworkApplianceManagerImpl" |     <bean id="vpcVirtualNetworkApplianceManagerImpl" | ||||||
|         class="com.cloud.network.router.VpcVirtualNetworkApplianceManagerImpl" /> |         class="com.cloud.network.router.VpcVirtualNetworkApplianceManagerImpl" /> | ||||||
|      |      | ||||||
|  | |||||||
| @ -28,7 +28,10 @@ import java.util.List; | |||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.Map.Entry; | import java.util.Map.Entry; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
|  | import java.util.concurrent.ExecutionException; | ||||||
|  | import java.util.concurrent.ExecutorService; | ||||||
| import java.util.concurrent.Executors; | import java.util.concurrent.Executors; | ||||||
|  | import java.util.concurrent.Future; | ||||||
| import java.util.concurrent.ScheduledExecutorService; | import java.util.concurrent.ScheduledExecutorService; | ||||||
| import java.util.concurrent.TimeUnit; | import java.util.concurrent.TimeUnit; | ||||||
| 
 | 
 | ||||||
| @ -213,6 +216,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis | |||||||
|     @Inject |     @Inject | ||||||
|     ConfigDepot _configDepot; |     ConfigDepot _configDepot; | ||||||
| 
 | 
 | ||||||
|  |     @Inject | ||||||
|  |     private VpcPrivateGatewayTransactionCallable vpcTxCallable; | ||||||
|  | 
 | ||||||
|     private final ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("VpcChecker")); |     private final ScheduledExecutorService _executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("VpcChecker")); | ||||||
|     private List<VpcProvider> vpcElements = null; |     private List<VpcProvider> vpcElements = null; | ||||||
|     private final List<Service> nonSupportedServices = Arrays.asList(Service.SecurityGroup, Service.Firewall); |     private final List<Service> nonSupportedServices = Arrays.asList(Service.SecurityGroup, Service.Firewall); | ||||||
| @ -1779,37 +1785,26 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis | |||||||
|         //check if there are ips allocted in the network |         //check if there are ips allocted in the network | ||||||
|         final long networkId = gateway.getNetworkId(); |         final long networkId = gateway.getNetworkId(); | ||||||
| 
 | 
 | ||||||
|         boolean deleteNetwork = true; |         vpcTxCallable.setGateway(gateway); | ||||||
|         final List<PrivateIpVO> privateIps = _privateIpDao.listByNetworkId(networkId); |  | ||||||
|         if (privateIps.size() > 1 || !privateIps.get(0).getIpAddress().equalsIgnoreCase(gateway.getIp4Address())) { |  | ||||||
|             s_logger.debug("Not removing network id=" + gateway.getNetworkId() + " as it has private ip addresses for other gateways"); |  | ||||||
|             deleteNetwork = false; |  | ||||||
|         } |  | ||||||
| 
 | 
 | ||||||
|         //TODO: Clean this up, its bad.  There is a DB transaction wrapping calls to NetworkElements (destroyNetwork will |         final ExecutorService txExecutor = Executors.newSingleThreadExecutor(); | ||||||
|         // call network elements). |         final Future<Boolean> futureResult = txExecutor.submit(vpcTxCallable); | ||||||
|         final boolean deleteNetworkFinal = deleteNetwork; |  | ||||||
|         Transaction.execute(new TransactionCallbackNoReturn() { |  | ||||||
|             @Override |  | ||||||
|             public void doInTransactionWithoutResult(final TransactionStatus status) { |  | ||||||
|                 final PrivateIpVO ip = _privateIpDao.findByIpAndVpcId(gateway.getVpcId(), gateway.getIp4Address()); |  | ||||||
|                 if (ip != null) { |  | ||||||
|                     _privateIpDao.remove(ip.getId()); |  | ||||||
|                     s_logger.debug("Deleted private ip " + ip); |  | ||||||
|                 } |  | ||||||
| 
 | 
 | ||||||
|                 if (deleteNetworkFinal) { |         boolean deleteNetworkFinal; | ||||||
|                     final User callerUser = _accountMgr.getActiveUser(CallContext.current().getCallingUserId()); |         try { | ||||||
|                     final Account owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM); |             deleteNetworkFinal = futureResult.get(); | ||||||
|                     final ReservationContext context = new ReservationContextImpl(null, null, callerUser, owner); |             if (deleteNetworkFinal) { | ||||||
|                     _ntwkMgr.destroyNetwork(networkId, context, false); |                 final User callerUser = _accountMgr.getActiveUser(CallContext.current().getCallingUserId()); | ||||||
|                     s_logger.debug("Deleted private network id=" + networkId); |                 final Account owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM); | ||||||
|                 } |                 final ReservationContext context = new ReservationContextImpl(null, null, callerUser, owner); | ||||||
| 
 |                 _ntwkMgr.destroyNetwork(networkId, context, false); | ||||||
|                 _vpcGatewayDao.remove(gateway.getId()); |                 s_logger.debug("Deleted private network id=" + networkId); | ||||||
|                 s_logger.debug("Deleted private gateway " + gateway); |  | ||||||
|             } |             } | ||||||
|         }); |         } catch (final InterruptedException e) { | ||||||
|  |             s_logger.error("deletePrivateGatewayFromTheDB failed to delete network id " + networkId + "due to => ", e); | ||||||
|  |         } catch (final ExecutionException e) { | ||||||
|  |             s_logger.error("deletePrivateGatewayFromTheDB failed to delete network id " + networkId + "due to => ", e); | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -0,0 +1,77 @@ | |||||||
|  | // Licensed to the Apache Software Foundation (ASF) under one | ||||||
|  | // or more contributor license agreements.  See the NOTICE file | ||||||
|  | // distributed with this work for additional information | ||||||
|  | // regarding copyright ownership.  The ASF licenses this file | ||||||
|  | // to you under the Apache License, Version 2.0 (the | ||||||
|  | // "License"); you may not use this file except in compliance | ||||||
|  | // with the License.  You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //   http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, | ||||||
|  | // software distributed under the License is distributed on an | ||||||
|  | // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||||||
|  | // KIND, either express or implied.  See the License for the | ||||||
|  | // specific language governing permissions and limitations | ||||||
|  | // under the License. | ||||||
|  | package com.cloud.network.vpc; | ||||||
|  | 
 | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.concurrent.Callable; | ||||||
|  | 
 | ||||||
|  | import javax.inject.Inject; | ||||||
|  | 
 | ||||||
|  | import org.apache.log4j.Logger; | ||||||
|  | import org.springframework.stereotype.Component; | ||||||
|  | 
 | ||||||
|  | import com.cloud.network.vpc.dao.PrivateIpDao; | ||||||
|  | import com.cloud.network.vpc.dao.VpcGatewayDao; | ||||||
|  | import com.cloud.utils.db.Transaction; | ||||||
|  | import com.cloud.utils.db.TransactionCallbackNoReturn; | ||||||
|  | import com.cloud.utils.db.TransactionStatus; | ||||||
|  | 
 | ||||||
|  | @Component | ||||||
|  | public class VpcPrivateGatewayTransactionCallable implements Callable<Boolean> { | ||||||
|  | 
 | ||||||
|  |     private static final Logger s_logger = Logger.getLogger(VpcPrivateGatewayTransactionCallable.class); | ||||||
|  | 
 | ||||||
|  |     @Inject | ||||||
|  |     private VpcGatewayDao _vpcGatewayDao; | ||||||
|  |     @Inject | ||||||
|  |     private PrivateIpDao _privateIpDao; | ||||||
|  | 
 | ||||||
|  |     private PrivateGateway gateway; | ||||||
|  |     private boolean deleteNetwork = true; | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public Boolean call() throws Exception { | ||||||
|  |         final long networkId = gateway.getNetworkId(); | ||||||
|  | 
 | ||||||
|  |         Transaction.execute(new TransactionCallbackNoReturn() { | ||||||
|  |             @Override | ||||||
|  |             public void doInTransactionWithoutResult(final TransactionStatus status) { | ||||||
|  | 
 | ||||||
|  |                 final List<PrivateIpVO> privateIps = _privateIpDao.listByNetworkId(networkId); | ||||||
|  |                 if (privateIps.size() > 1 || !privateIps.get(0).getIpAddress().equalsIgnoreCase(gateway.getIp4Address())) { | ||||||
|  |                     s_logger.debug("Not removing network id=" + gateway.getNetworkId() + " as it has private ip addresses for other gateways"); | ||||||
|  |                     deleteNetwork = false; | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 final PrivateIpVO ip = _privateIpDao.findByIpAndVpcId(gateway.getVpcId(), gateway.getIp4Address()); | ||||||
|  |                 if (ip != null) { | ||||||
|  |                     _privateIpDao.remove(ip.getId()); | ||||||
|  |                     s_logger.debug("Deleted private ip " + ip); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 _vpcGatewayDao.remove(gateway.getId()); | ||||||
|  |                 s_logger.debug("Deleted private gateway " + gateway); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         return deleteNetwork; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setGateway(final PrivateGateway gateway) { | ||||||
|  |         this.gateway = gateway; | ||||||
|  |     } | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user