You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2013/10/16 18:50:22 UTC
[11/20] New Transaction API
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java b/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java
index 00dd25c..cd3532e 100644
--- a/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalDeviceUsageManagerImpl.java
@@ -81,8 +81,9 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.exception.ExecutionException;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.NicVO;
import com.cloud.vm.dao.DomainRouterDao;
@@ -288,12 +289,19 @@ public class ExternalDeviceUsageManagerImpl extends ManagerBase implements Exter
newCurrentBytesReceived += bytesSentAndReceived[1];
}
- UserStatisticsVO userStats;
- final Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
- userStats = _userStatsDao.lock(accountId, zone.getId(), networkId, publicIp, externalLoadBalancer.getId(), externalLoadBalancer.getType().toString());
+ commitStats(networkId, externalLoadBalancer, accountId, publicIp, zone, statsEntryIdentifier,
+ newCurrentBytesSent, newCurrentBytesReceived);
+ }
+ }
+ private void commitStats(final long networkId, final HostVO externalLoadBalancer, final long accountId, final String publicIp,
+ final DataCenterVO zone, final String statsEntryIdentifier, final long newCurrentBytesSent, final long newCurrentBytesReceived) {
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ UserStatisticsVO userStats;
+ userStats = _userStatsDao.lock(accountId, zone.getId(), networkId, publicIp, externalLoadBalancer.getId(), externalLoadBalancer.getType().toString());
+
if (userStats != null) {
long oldNetBytesSent = userStats.getNetBytesSent();
long oldNetBytesReceived = userStats.getNetBytesReceived();
@@ -301,19 +309,19 @@ public class ExternalDeviceUsageManagerImpl extends ManagerBase implements Exter
long oldCurrentBytesReceived = userStats.getCurrentBytesReceived();
String warning = "Received an external network stats byte count that was less than the stored value. Zone ID: " + userStats.getDataCenterId()
+ ", account ID: " + userStats.getAccountId() + ".";
-
+
userStats.setCurrentBytesSent(newCurrentBytesSent);
if (oldCurrentBytesSent > newCurrentBytesSent) {
s_logger.warn(warning + "Stored bytes sent: " + oldCurrentBytesSent + ", new bytes sent: " + newCurrentBytesSent + ".");
userStats.setNetBytesSent(oldNetBytesSent + oldCurrentBytesSent);
}
-
+
userStats.setCurrentBytesReceived(newCurrentBytesReceived);
if (oldCurrentBytesReceived > newCurrentBytesReceived) {
s_logger.warn(warning + "Stored bytes received: " + oldCurrentBytesReceived + ", new bytes received: " + newCurrentBytesReceived + ".");
userStats.setNetBytesReceived(oldNetBytesReceived + oldCurrentBytesReceived);
}
-
+
if (_userStatsDao.update(userStats.getId(), userStats)) {
s_logger.debug("Successfully updated stats for " + statsEntryIdentifier);
} else {
@@ -322,13 +330,8 @@ public class ExternalDeviceUsageManagerImpl extends ManagerBase implements Exter
} else {
s_logger.warn("Unable to find user stats entry for " + statsEntryIdentifier);
}
-
- txn.commit();
- } catch (final Exception e) {
- txn.rollback();
- throw new CloudRuntimeException("Problem getting stats after reboot/stop ", e);
}
- }
+ });
}
protected class ExternalDeviceNetworkUsageTask extends ManagedContextRunnable {
@@ -601,78 +604,78 @@ public class ExternalDeviceUsageManagerImpl extends ManagerBase implements Exter
* Stats entries are created for source NAT IP addresses, static NAT rules, port forwarding rules, and load
* balancing rules
*/
- private boolean manageStatsEntries(boolean create, long accountId, long zoneId, Network network,
- HostVO externalFirewall, ExternalNetworkResourceUsageAnswer firewallAnswer,
- HostVO externalLoadBalancer, ExternalNetworkResourceUsageAnswer lbAnswer) {
- String accountErrorMsg = "Failed to update external network stats entry. Details: account ID = " + accountId;
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ private boolean manageStatsEntries(final boolean create, final long accountId, final long zoneId, final Network network,
+ final HostVO externalFirewall, final ExternalNetworkResourceUsageAnswer firewallAnswer,
+ final HostVO externalLoadBalancer, final ExternalNetworkResourceUsageAnswer lbAnswer) {
+ final String accountErrorMsg = "Failed to update external network stats entry. Details: account ID = " + accountId;
try {
- txn.start();
- String networkErrorMsg = accountErrorMsg + ", network ID = " + network.getId();
-
- boolean sharedSourceNat = false;
- Map<Network.Capability, String> sourceNatCapabilities = _networkModel.getNetworkServiceCapabilities(network.getId(), Network.Service.SourceNat);
- if (sourceNatCapabilities != null) {
- String supportedSourceNatTypes = sourceNatCapabilities.get(Network.Capability.SupportedSourceNatTypes).toLowerCase();
- if (supportedSourceNatTypes.contains("zone")) {
- sharedSourceNat = true;
- }
- }
-
- if (externalFirewall != null && firewallAnswer != null) {
- if (!sharedSourceNat) {
- // Manage the entry for this network's source NAT IP address
- List<IPAddressVO> sourceNatIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), true);
- if (sourceNatIps.size() == 1) {
- String publicIp = sourceNatIps.get(0).getAddress().addr();
- if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
- throw new ExecutionException(networkErrorMsg + ", source NAT IP = " + publicIp);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ String networkErrorMsg = accountErrorMsg + ", network ID = " + network.getId();
+
+ boolean sharedSourceNat = false;
+ Map<Network.Capability, String> sourceNatCapabilities = _networkModel.getNetworkServiceCapabilities(network.getId(), Network.Service.SourceNat);
+ if (sourceNatCapabilities != null) {
+ String supportedSourceNatTypes = sourceNatCapabilities.get(Network.Capability.SupportedSourceNatTypes).toLowerCase();
+ if (supportedSourceNatTypes.contains("zone")) {
+ sharedSourceNat = true;
}
}
-
- // Manage one entry for each static NAT rule in this network
- List<IPAddressVO> staticNatIps = _ipAddressDao.listStaticNatPublicIps(network.getId());
- for (IPAddressVO staticNatIp : staticNatIps) {
- String publicIp = staticNatIp.getAddress().addr();
- if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
- throw new ExecutionException(networkErrorMsg + ", static NAT rule public IP = " + publicIp);
+
+ if (externalFirewall != null && firewallAnswer != null) {
+ if (!sharedSourceNat) {
+ // Manage the entry for this network's source NAT IP address
+ List<IPAddressVO> sourceNatIps = _ipAddressDao.listByAssociatedNetwork(network.getId(), true);
+ if (sourceNatIps.size() == 1) {
+ String publicIp = sourceNatIps.get(0).getAddress().addr();
+ if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
+ throw new CloudRuntimeException(networkErrorMsg + ", source NAT IP = " + publicIp);
+ }
+ }
+
+ // Manage one entry for each static NAT rule in this network
+ List<IPAddressVO> staticNatIps = _ipAddressDao.listStaticNatPublicIps(network.getId());
+ for (IPAddressVO staticNatIp : staticNatIps) {
+ String publicIp = staticNatIp.getAddress().addr();
+ if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
+ throw new CloudRuntimeException(networkErrorMsg + ", static NAT rule public IP = " + publicIp);
+ }
+ }
+
+ // Manage one entry for each port forwarding rule in this network
+ List<PortForwardingRuleVO> portForwardingRules = _portForwardingRulesDao.listByNetwork(network.getId());
+ for (PortForwardingRuleVO portForwardingRule : portForwardingRules) {
+ String publicIp = _networkModel.getIp(portForwardingRule.getSourceIpAddressId()).getAddress().addr();
+ if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
+ throw new CloudRuntimeException(networkErrorMsg + ", port forwarding rule public IP = " + publicIp);
+ }
+ }
+ } else {
+ // Manage the account-wide entry for the external firewall
+ if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), null, externalFirewall.getId(), firewallAnswer, false)) {
+ throw new CloudRuntimeException(networkErrorMsg);
+ }
}
}
-
- // Manage one entry for each port forwarding rule in this network
- List<PortForwardingRuleVO> portForwardingRules = _portForwardingRulesDao.listByNetwork(network.getId());
- for (PortForwardingRuleVO portForwardingRule : portForwardingRules) {
- String publicIp = _networkModel.getIp(portForwardingRule.getSourceIpAddressId()).getAddress().addr();
- if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalFirewall.getId(), firewallAnswer, false)) {
- throw new ExecutionException(networkErrorMsg + ", port forwarding rule public IP = " + publicIp);
+
+ // If an external load balancer is added, manage one entry for each load balancing rule in this network
+ if (externalLoadBalancer != null && lbAnswer != null) {
+ boolean inline = _networkModel.isNetworkInlineMode(network);
+ List<LoadBalancerVO> loadBalancers = _loadBalancerDao.listByNetworkIdAndScheme(network.getId(), Scheme.Public);
+ for (LoadBalancerVO loadBalancer : loadBalancers) {
+ String publicIp = _networkModel.getIp(loadBalancer.getSourceIpAddressId()).getAddress().addr();
+ if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalLoadBalancer.getId(), lbAnswer, inline)) {
+ throw new CloudRuntimeException(networkErrorMsg + ", load balancing rule public IP = " + publicIp);
+ }
}
}
- } else {
- // Manage the account-wide entry for the external firewall
- if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), null, externalFirewall.getId(), firewallAnswer, false)) {
- throw new ExecutionException(networkErrorMsg);
- }
- }
- }
-
- // If an external load balancer is added, manage one entry for each load balancing rule in this network
- if (externalLoadBalancer != null && lbAnswer != null) {
- boolean inline = _networkModel.isNetworkInlineMode(network);
- List<LoadBalancerVO> loadBalancers = _loadBalancerDao.listByNetworkIdAndScheme(network.getId(), Scheme.Public);
- for (LoadBalancerVO loadBalancer : loadBalancers) {
- String publicIp = _networkModel.getIp(loadBalancer.getSourceIpAddressId()).getAddress().addr();
- if (!createOrUpdateStatsEntry(create, accountId, zoneId, network.getId(), publicIp, externalLoadBalancer.getId(), lbAnswer, inline)) {
- throw new ExecutionException(networkErrorMsg + ", load balancing rule public IP = " + publicIp);
- }
}
- }
- return txn.commit();
+ });
+ return true;
} catch (Exception e) {
s_logger.warn("Exception: ", e);
- txn.rollback();
return false;
- } finally {
- txn.close();
}
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
index 629bef5..32744ef 100644
--- a/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalFirewallDeviceManagerImpl.java
@@ -26,7 +26,6 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.response.ExternalFirewallResponse;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -108,6 +107,8 @@ import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
import com.cloud.utils.net.UrlUtil;
@@ -159,7 +160,7 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
@Override
@DB
- public ExternalFirewallDeviceVO addExternalFirewall(long physicalNetworkId, String url, String username, String password, String deviceName, ServerResource resource) {
+ public ExternalFirewallDeviceVO addExternalFirewall(long physicalNetworkId, String url, String username, String password, final String deviceName, ServerResource resource) {
String guid;
PhysicalNetworkVO pNetwork = null;
NetworkDevice ntwkDevice = NetworkDevice.getNetworkDevice(deviceName);
@@ -176,7 +177,7 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
}
zoneId = pNetwork.getDataCenterId();
- PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(), ntwkDevice.getNetworkServiceProvder());
+ final PhysicalNetworkServiceProviderVO ntwkSvcProvider = _physicalNetworkServiceProviderDao.findByServiceProvider(pNetwork.getId(), ntwkDevice.getNetworkServiceProvder());
if (ntwkSvcProvider == null ) {
throw new CloudRuntimeException("Network Service Provider: " + ntwkDevice.getNetworkServiceProvder() +
" is not enabled in the physical network: " + physicalNetworkId + "to add this device" );
@@ -204,7 +205,7 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
hostDetails.put("username", username);
hostDetails.put("password", password);
hostDetails.put("deviceName", deviceName);
- Map<String, String> configParams = new HashMap<String, String>();
+ final Map<String, String> configParams = new HashMap<String, String>();
UrlUtil.parseQueryParameters(uri.getQuery(), false, configParams);
hostDetails.putAll(configParams);
@@ -215,27 +216,29 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
throw new CloudRuntimeException(e.getMessage());
}
- Host externalFirewall = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalFirewall, hostDetails);
+ final Host externalFirewall = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalFirewall, hostDetails);
if (externalFirewall != null) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- boolean dedicatedUse = (configParams.get(ApiConstants.FIREWALL_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.FIREWALL_DEVICE_DEDICATED)) : false;
- long capacity = NumbersUtil.parseLong(configParams.get(ApiConstants.FIREWALL_DEVICE_CAPACITY), 0);
- if (capacity == 0) {
- capacity = _defaultFwCapacity;
- }
+ final PhysicalNetworkVO pNetworkFinal = pNetwork;
+ return Transaction.execute(new TransactionCallback<ExternalFirewallDeviceVO>() {
+ @Override
+ public ExternalFirewallDeviceVO doInTransaction(TransactionStatus status) {
+ boolean dedicatedUse = (configParams.get(ApiConstants.FIREWALL_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams.get(ApiConstants.FIREWALL_DEVICE_DEDICATED)) : false;
+ long capacity = NumbersUtil.parseLong(configParams.get(ApiConstants.FIREWALL_DEVICE_CAPACITY), 0);
+ if (capacity == 0) {
+ capacity = _defaultFwCapacity;
+ }
- ExternalFirewallDeviceVO fwDevice = new ExternalFirewallDeviceVO(externalFirewall.getId(), pNetwork.getId(), ntwkSvcProvider.getProviderName(),
- deviceName, capacity, dedicatedUse);
+ ExternalFirewallDeviceVO fwDevice = new ExternalFirewallDeviceVO(externalFirewall.getId(), pNetworkFinal.getId(), ntwkSvcProvider.getProviderName(),
+ deviceName, capacity, dedicatedUse);
- _externalFirewallDeviceDao.persist(fwDevice);
+ _externalFirewallDeviceDao.persist(fwDevice);
- DetailVO hostDetail = new DetailVO(externalFirewall.getId(), ApiConstants.FIREWALL_DEVICE_ID, String.valueOf(fwDevice.getId()));
- _hostDetailDao.persist(hostDetail);
+ DetailVO hostDetail = new DetailVO(externalFirewall.getId(), ApiConstants.FIREWALL_DEVICE_ID, String.valueOf(fwDevice.getId()));
+ _hostDetailDao.persist(hostDetail);
- txn.commit();
- return fwDevice;
+ return fwDevice;
+ }
+ });
} else {
return null;
}
@@ -343,7 +346,6 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
@DB
protected boolean freeFirewallForNetwork(Network network) {
- Transaction txn = Transaction.currentTxn();
GlobalLock deviceMapLock = GlobalLock.getInternLock("NetworkFirewallDeviceMap");
try {
if (deviceMapLock.lock(120)) {
@@ -353,7 +355,6 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
_networkExternalFirewallDao.remove(fwDeviceForNetwork.getId());
}
} catch (Exception exception) {
- txn.rollback();
s_logger.error("Failed to release firewall device for the network" + network.getId() + " due to " + exception.getMessage());
return false;
} finally {
@@ -363,7 +364,6 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
} finally {
deviceMapLock.releaseRef();
}
- txn.commit();
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
index dd48930..59df3e8 100644
--- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
@@ -27,7 +27,6 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.response.ExternalLoadBalancerResponse;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -118,6 +117,9 @@ import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
import com.cloud.utils.net.UrlUtil;
@@ -196,11 +198,11 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
@Override
@DB
public ExternalLoadBalancerDeviceVO addExternalLoadBalancer(long physicalNetworkId, String url,
- String username, String password, String deviceName, ServerResource resource, boolean gslbProvider,
- String gslbSitePublicIp, String gslbSitePrivateIp) {
+ String username, String password, final String deviceName, ServerResource resource, final boolean gslbProvider,
+ final String gslbSitePublicIp, final String gslbSitePrivateIp) {
PhysicalNetworkVO pNetwork = null;
- NetworkDevice ntwkDevice = NetworkDevice.getNetworkDevice(deviceName);
+ final NetworkDevice ntwkDevice = NetworkDevice.getNetworkDevice(deviceName);
long zoneId;
if ((ntwkDevice == null) || (url == null) || (username == null) || (resource == null) || (password == null)) {
@@ -258,39 +260,41 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
UrlUtil.parseQueryParameters(uri.getQuery(), false, configParams);
hostDetails.putAll(configParams);
- Transaction txn = Transaction.currentTxn();
try {
resource.configure(hostName, hostDetails);
- Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails);
+ final Host host = _resourceMgr.addHost(zoneId, resource, Host.Type.ExternalLoadBalancer, hostDetails);
if (host != null) {
- boolean dedicatedUse = (configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams
+ final boolean dedicatedUse = (configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED) != null) ? Boolean.parseBoolean(configParams
.get(ApiConstants.LOAD_BALANCER_DEVICE_DEDICATED)) : false;
long capacity = NumbersUtil.parseLong(configParams.get(ApiConstants.LOAD_BALANCER_DEVICE_CAPACITY), 0);
if (capacity == 0) {
capacity = _defaultLbCapacity;
}
- ExternalLoadBalancerDeviceVO lbDeviceVO;
- txn.start();
- lbDeviceVO = new ExternalLoadBalancerDeviceVO(host.getId(), pNetwork.getId(), ntwkDevice.getNetworkServiceProvder(),
- deviceName, capacity, dedicatedUse, gslbProvider);
- if (gslbProvider) {
- lbDeviceVO.setGslbSitePublicIP(gslbSitePublicIp);
- lbDeviceVO.setGslbSitePrivateIP(gslbSitePrivateIp);
- }
- _externalLoadBalancerDeviceDao.persist(lbDeviceVO);
- DetailVO hostDetail = new DetailVO(host.getId(), ApiConstants.LOAD_BALANCER_DEVICE_ID, String.valueOf(lbDeviceVO.getId()));
- _hostDetailDao.persist(hostDetail);
+ final long capacityFinal = capacity;
+ final PhysicalNetworkVO pNetworkFinal = pNetwork;
+ return Transaction.execute(new TransactionCallback<ExternalLoadBalancerDeviceVO>() {
+ @Override
+ public ExternalLoadBalancerDeviceVO doInTransaction(TransactionStatus status) {
+ ExternalLoadBalancerDeviceVO lbDeviceVO = new ExternalLoadBalancerDeviceVO(host.getId(), pNetworkFinal.getId(), ntwkDevice.getNetworkServiceProvder(),
+ deviceName, capacityFinal, dedicatedUse, gslbProvider);
+ if (gslbProvider) {
+ lbDeviceVO.setGslbSitePublicIP(gslbSitePublicIp);
+ lbDeviceVO.setGslbSitePrivateIP(gslbSitePrivateIp);
+ }
+ _externalLoadBalancerDeviceDao.persist(lbDeviceVO);
+ DetailVO hostDetail = new DetailVO(host.getId(), ApiConstants.LOAD_BALANCER_DEVICE_ID, String.valueOf(lbDeviceVO.getId()));
+ _hostDetailDao.persist(hostDetail);
- txn.commit();
- return lbDeviceVO;
+ return lbDeviceVO;
+ }
+ });
} else {
throw new CloudRuntimeException("Failed to add load balancer device due to internal error.");
}
} catch (ConfigurationException e) {
- txn.rollback();
throw new CloudRuntimeException(e.getMessage());
}
}
@@ -402,7 +406,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
}
@DB
- protected ExternalLoadBalancerDeviceVO allocateLoadBalancerForNetwork(Network guestConfig) throws InsufficientCapacityException {
+ protected ExternalLoadBalancerDeviceVO allocateLoadBalancerForNetwork(final Network guestConfig) throws InsufficientCapacityException {
boolean retry = true;
boolean tryLbProvisioning = false;
ExternalLoadBalancerDeviceVO lbDevice = null;
@@ -412,34 +416,33 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
while (retry) {
GlobalLock deviceMapLock = GlobalLock.getInternLock("LoadBalancerAllocLock");
- Transaction txn = Transaction.currentTxn();
try {
if (deviceMapLock.lock(120)) {
try {
- boolean dedicatedLB = offering.getDedicatedLB(); // does network offering supports a dedicated
-// load balancer?
- long lbDeviceId;
+ final boolean dedicatedLB = offering.getDedicatedLB(); // does network offering supports a dedicated load balancer?
- txn.start();
try {
- // FIXME: should the device allocation be done during network implement phase or do a
- // lazy allocation when first rule for the network is configured??
-
- // find a load balancer device for this network as per the network offering
- lbDevice = findSuitableLoadBalancerForNetwork(guestConfig, dedicatedLB);
- lbDeviceId = lbDevice.getId();
-
- // persist the load balancer device id that will be used for this network. Once a network
- // is implemented on a LB device then later on all rules will be programmed on to same
-// device
- NetworkExternalLoadBalancerVO networkLB = new NetworkExternalLoadBalancerVO(guestConfig.getId(), lbDeviceId);
- _networkExternalLBDao.persist(networkLB);
-
- // mark device to be either dedicated or shared use
- lbDevice.setAllocationState(dedicatedLB ? LBDeviceAllocationState.Dedicated : LBDeviceAllocationState.Shared);
- _externalLoadBalancerDeviceDao.update(lbDeviceId, lbDevice);
-
- txn.commit();
+ lbDevice = Transaction.executeWithException(new TransactionCallbackWithException<ExternalLoadBalancerDeviceVO>() {
+ @Override
+ public ExternalLoadBalancerDeviceVO doInTransaction(TransactionStatus status) throws Exception {
+ // FIXME: should the device allocation be done during network implement phase or do a
+ // lazy allocation when first rule for the network is configured??
+
+ // find a load balancer device for this network as per the network offering
+ ExternalLoadBalancerDeviceVO lbDevice = findSuitableLoadBalancerForNetwork(guestConfig, dedicatedLB);
+ long lbDeviceId = lbDevice.getId();
+
+ // persist the load balancer device id that will be used for this network. Once a network
+ // is implemented on a LB device then later on all rules will be programmed on to same device
+ NetworkExternalLoadBalancerVO networkLB = new NetworkExternalLoadBalancerVO(guestConfig.getId(), lbDeviceId);
+ _networkExternalLBDao.persist(networkLB);
+
+ // mark device to be either dedicated or shared use
+ lbDevice.setAllocationState(dedicatedLB ? LBDeviceAllocationState.Dedicated : LBDeviceAllocationState.Shared);
+ _externalLoadBalancerDeviceDao.update(lbDeviceId, lbDevice);
+ return lbDevice;
+ }
+ }, InsufficientCapacityException.class);
// allocated load balancer for the network, so skip retry
tryLbProvisioning = false;
@@ -448,28 +451,22 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
// if already attempted to provision load balancer then throw out of capacity exception,
if (tryLbProvisioning) {
retry = false;
- // TODO: throwing warning instead of error for now as its possible another provider can
-// service this network
+ // TODO: throwing warning instead of error for now as its possible another provider can service this network
s_logger.warn("There are no load balancer device with the capacity for implementing this network");
throw exception;
} else {
- tryLbProvisioning = true; // if possible provision a LB appliance in to the physical
-// network
+ tryLbProvisioning = true; // if possible provision a LB appliance in to the physical network
}
}
} finally {
deviceMapLock.unlock();
- if (lbDevice == null) {
- txn.rollback();
- }
}
}
} finally {
deviceMapLock.releaseRef();
}
- // there are no LB devices or there is no free capacity on the devices in the physical network so provision
-// a new LB appliance
+ // there are no LB devices or there is no free capacity on the devices in the physical network so provision a new LB appliance
if (tryLbProvisioning) {
// check if LB appliance can be dynamically provisioned
List<ExternalLoadBalancerDeviceVO> providerLbDevices = _externalLoadBalancerDeviceDao.listByProviderAndDeviceAllocationState(physicalNetworkId, provider,
@@ -477,8 +474,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
if ((providerLbDevices != null) && (!providerLbDevices.isEmpty())) {
for (ExternalLoadBalancerDeviceVO lbProviderDevice : providerLbDevices) {
if (lbProviderDevice.getState() == LBDeviceState.Enabled) {
- // acquire a private IP from the data center which will be used as management IP of
-// provisioned LB appliance,
+ // acquire a private IP from the data center which will be used as management IP of provisioned LB appliance,
DataCenterIpAddressVO dcPrivateIp = _dcDao.allocatePrivateIpAddress(guestConfig.getDataCenterId(), lbProviderDevice.getUuid());
if (dcPrivateIp == null) {
throw new InsufficientNetworkCapacityException("failed to acquire a priavate IP in the zone " + guestConfig.getDataCenterId() +
@@ -509,13 +505,11 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
String publicIf = createLbAnswer.getPublicInterface();
String privateIf = createLbAnswer.getPrivateInterface();
- // we have provisioned load balancer so add the appliance as cloudstack provisioned external
-// load balancer
+ // we have provisioned load balancer so add the appliance as cloudstack provisioned external load balancer
String dedicatedLb = offering.getDedicatedLB() ? "true" : "false";
String capacity = Long.toString(lbProviderDevice.getCapacity());
- // acquire a public IP to associate with lb appliance (used as subnet IP to make the
-// appliance part of private network)
+ // acquire a public IP to associate with lb appliance (used as subnet IP to make the appliance part of private network)
PublicIp publicIp = _ipAddrMgr.assignPublicIpAddress(guestConfig.getDataCenterId(),
null,
_accountMgr.getSystemAccount(),
@@ -542,8 +536,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
}
if (lbAppliance != null) {
- // mark the load balancer as cloudstack managed and set parent host id on which lb
-// appliance is provisioned
+ // mark the load balancer as cloudstack managed and set parent host id on which lb appliance is provisioned
ExternalLoadBalancerDeviceVO managedLb = _externalLoadBalancerDeviceDao.findById(lbAppliance.getId());
managedLb.setIsManagedDevice(true);
managedLb.setParentHostId(lbProviderDevice.getHostId());
@@ -557,8 +550,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
if (answer == null || !answer.getResult()) {
s_logger.warn("Failed to destroy load balancer appliance created");
} else {
- // release the public & private IP back to dc pool, as the load balancer
-// appliance is now destroyed
+ // release the public & private IP back to dc pool, as the load balancer appliance is now destroyed
_dcDao.releasePrivateIpAddress(lbIP, guestConfig.getDataCenterId(), null);
_ipAddrMgr.disassociatePublicIpAddress(publicIp.getId(), _accountMgr.getSystemUser().getId(), _accountMgr.getSystemAccount());
}
@@ -656,34 +648,40 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
}
@DB
- protected boolean freeLoadBalancerForNetwork(Network guestConfig) {
- Transaction txn = Transaction.currentTxn();
+ protected boolean freeLoadBalancerForNetwork(final Network guestConfig) {
GlobalLock deviceMapLock = GlobalLock.getInternLock("LoadBalancerAllocLock");
try {
if (deviceMapLock.lock(120)) {
- txn.start();
- // since network is shutdown remove the network mapping to the load balancer device
- NetworkExternalLoadBalancerVO networkLBDevice = _networkExternalLBDao.findByNetworkId(guestConfig.getId());
- long lbDeviceId = networkLBDevice.getExternalLBDeviceId();
- _networkExternalLBDao.remove(networkLBDevice.getId());
-
- List<NetworkExternalLoadBalancerVO> ntwksMapped = _networkExternalLBDao.listByLoadBalancerDeviceId(networkLBDevice.getExternalLBDeviceId());
- ExternalLoadBalancerDeviceVO lbDevice = _externalLoadBalancerDeviceDao.findById(lbDeviceId);
- boolean lbInUse = !(ntwksMapped == null || ntwksMapped.isEmpty());
- boolean lbCloudManaged = lbDevice.getIsManagedDevice();
-
- if (!lbInUse && !lbCloudManaged) {
- // this is the last network mapped to the load balancer device so set device allocation state to be
-// free
- lbDevice.setAllocationState(LBDeviceAllocationState.Free);
- _externalLoadBalancerDeviceDao.update(lbDevice.getId(), lbDevice);
- }
+ ExternalLoadBalancerDeviceVO lbDevice = Transaction.execute(new TransactionCallback<ExternalLoadBalancerDeviceVO>() {
+ @Override
+ public ExternalLoadBalancerDeviceVO doInTransaction(TransactionStatus status) {
+ // since network is shutdown remove the network mapping to the load balancer device
+ NetworkExternalLoadBalancerVO networkLBDevice = _networkExternalLBDao.findByNetworkId(guestConfig.getId());
+ long lbDeviceId = networkLBDevice.getExternalLBDeviceId();
+ _networkExternalLBDao.remove(networkLBDevice.getId());
+
+ List<NetworkExternalLoadBalancerVO> ntwksMapped = _networkExternalLBDao.listByLoadBalancerDeviceId(networkLBDevice.getExternalLBDeviceId());
+ ExternalLoadBalancerDeviceVO lbDevice = _externalLoadBalancerDeviceDao.findById(lbDeviceId);
+ boolean lbInUse = !(ntwksMapped == null || ntwksMapped.isEmpty());
+ boolean lbCloudManaged = lbDevice.getIsManagedDevice();
+
+ if (!lbInUse && !lbCloudManaged) {
+ // this is the last network mapped to the load balancer device so set device allocation state to be free
+ lbDevice.setAllocationState(LBDeviceAllocationState.Free);
+ _externalLoadBalancerDeviceDao.update(lbDevice.getId(), lbDevice);
+ }
- // commit the changes before sending agent command to destroy cloudstack managed LB
- txn.commit();
+ // commit the changes before sending agent command to destroy cloudstack managed LB
+ if (!lbInUse && lbCloudManaged) {
+ return lbDevice;
+ } else {
+ return null;
+ }
+ }
+ });
- if (!lbInUse && lbCloudManaged) {
+ if (lbDevice != null) {
// send DestroyLoadBalancerApplianceCommand to the host where load balancer appliance is provisioned
Host lbHost = _hostDao.findById(lbDevice.getHostId());
String lbIP = lbHost.getPrivateIpAddress();
@@ -723,7 +721,6 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
return false;
}
} catch (Exception exception) {
- txn.rollback();
s_logger.error("Failed to release load balancer device for the network" + guestConfig.getId() + " due to " + exception.getMessage());
} finally {
deviceMapLock.releaseRef();