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:12 UTC
[01/20] New Transaction API
Updated Branches:
refs/heads/txn-refactor [created] 7364d55cc
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/test/com/cloud/configuration/ConfigurationManagerTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/configuration/ConfigurationManagerTest.java b/server/test/com/cloud/configuration/ConfigurationManagerTest.java
index 908f0d0..2d2c03d 100755
--- a/server/test/com/cloud/configuration/ConfigurationManagerTest.java
+++ b/server/test/com/cloud/configuration/ConfigurationManagerTest.java
@@ -40,7 +40,6 @@ import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-
import org.apache.cloudstack.api.command.admin.vlan.DedicatePublicIpRangeCmd;
import org.apache.cloudstack.api.command.admin.vlan.ReleasePublicIpRangeCmd;
import org.apache.cloudstack.context.CallContext;
@@ -69,6 +68,7 @@ import com.cloud.user.ResourceLimitService;
import com.cloud.user.UserVO;
import com.cloud.user.dao.AccountDao;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.net.Ip;
public class ConfigurationManagerTest {
@@ -213,7 +213,7 @@ public class ConfigurationManagerTest {
}
void runDedicatePublicIpRangePostiveTest() throws Exception {
- Transaction txn = Transaction.open("runDedicatePublicIpRangePostiveTest");
+ TransactionLegacy txn = TransactionLegacy.open("runDedicatePublicIpRangePostiveTest");
when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
@@ -239,7 +239,7 @@ public class ConfigurationManagerTest {
}
void runDedicatePublicIpRangeInvalidRange() throws Exception {
- Transaction txn = Transaction.open("runDedicatePublicIpRangeInvalidRange");
+ TransactionLegacy txn = TransactionLegacy.open("runDedicatePublicIpRangeInvalidRange");
when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(null);
try {
@@ -252,7 +252,7 @@ public class ConfigurationManagerTest {
}
void runDedicatePublicIpRangeDedicatedRange() throws Exception {
- Transaction txn = Transaction.open("runDedicatePublicIpRangeDedicatedRange");
+ TransactionLegacy txn = TransactionLegacy.open("runDedicatePublicIpRangeDedicatedRange");
when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
@@ -281,7 +281,7 @@ public class ConfigurationManagerTest {
}
void runDedicatePublicIpRangeInvalidZone() throws Exception {
- Transaction txn = Transaction.open("runDedicatePublicIpRangeInvalidZone");
+ TransactionLegacy txn = TransactionLegacy.open("runDedicatePublicIpRangeInvalidZone");
when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
@@ -307,7 +307,7 @@ public class ConfigurationManagerTest {
}
void runDedicatePublicIpRangeIPAdressAllocated() throws Exception {
- Transaction txn = Transaction.open("runDedicatePublicIpRangeIPAdressAllocated");
+ TransactionLegacy txn = TransactionLegacy.open("runDedicatePublicIpRangeIPAdressAllocated");
when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
@@ -334,7 +334,7 @@ public class ConfigurationManagerTest {
}
void runReleasePublicIpRangePostiveTest1() throws Exception {
- Transaction txn = Transaction.open("runReleasePublicIpRangePostiveTest1");
+ TransactionLegacy txn = TransactionLegacy.open("runReleasePublicIpRangePostiveTest1");
when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
@@ -358,7 +358,7 @@ public class ConfigurationManagerTest {
}
void runReleasePublicIpRangePostiveTest2() throws Exception {
- Transaction txn = Transaction.open("runReleasePublicIpRangePostiveTest2");
+ TransactionLegacy txn = TransactionLegacy.open("runReleasePublicIpRangePostiveTest2");
when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
@@ -392,7 +392,7 @@ public class ConfigurationManagerTest {
}
void runReleasePublicIpRangeInvalidIpRange() throws Exception {
- Transaction txn = Transaction.open("runReleasePublicIpRangeInvalidIpRange");
+ TransactionLegacy txn = TransactionLegacy.open("runReleasePublicIpRangeInvalidIpRange");
when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(null);
try {
@@ -405,7 +405,7 @@ public class ConfigurationManagerTest {
}
void runReleaseNonDedicatedPublicIpRange() throws Exception {
- Transaction txn = Transaction.open("runReleaseNonDedicatedPublicIpRange");
+ TransactionLegacy txn = TransactionLegacy.open("runReleaseNonDedicatedPublicIpRange");
when(configurationMgr._vlanDao.findById(anyLong())).thenReturn(vlan);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/test/com/cloud/network/CreatePrivateNetworkTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/CreatePrivateNetworkTest.java b/server/test/com/cloud/network/CreatePrivateNetworkTest.java
index 0e57b02..9276309 100644
--- a/server/test/com/cloud/network/CreatePrivateNetworkTest.java
+++ b/server/test/com/cloud/network/CreatePrivateNetworkTest.java
@@ -36,7 +36,6 @@ import org.junit.Ignore;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -63,6 +62,7 @@ import com.cloud.user.AccountManager;
import com.cloud.user.AccountVO;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
//@Ignore("Requires database to be set up")
@@ -152,8 +152,8 @@ public class CreatePrivateNetworkTest {
@Test
@DB
public void createInvalidlyHostedPrivateNetwork() {
- Transaction __txn;
- __txn = Transaction.open("createInvalidlyHostedPrivateNetworkTest");
+ TransactionLegacy __txn;
+ __txn = TransactionLegacy.open("createInvalidlyHostedPrivateNetworkTest");
/* Network nw; */
try {
/* nw = */
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java b/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java
index d6ee630..ea7167b 100644
--- a/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java
+++ b/server/test/com/cloud/network/DedicateGuestVlanRangesTest.java
@@ -37,7 +37,6 @@ import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
-
import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
import org.apache.cloudstack.api.command.admin.network.ReleaseDedicatedGuestVlanRangeCmd;
@@ -56,6 +55,7 @@ import com.cloud.user.AccountVO;
import com.cloud.user.UserVO;
import com.cloud.user.dao.AccountDao;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
public class DedicateGuestVlanRangesTest {
@@ -177,7 +177,7 @@ public class DedicateGuestVlanRangesTest {
}
void runDedicateGuestVlanRangePostiveTest() throws Exception {
- Transaction txn = Transaction.open("runDedicateGuestVlanRangePostiveTest");
+ TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangePostiveTest");
Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
dedicateVlanField.setAccessible(true);
@@ -213,7 +213,7 @@ public class DedicateGuestVlanRangesTest {
}
void runDedicateGuestVlanRangeInvalidFormat() throws Exception {
- Transaction txn = Transaction.open("runDedicateGuestVlanRangeInvalidFormat");
+ TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangeInvalidFormat");
Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
dedicateVlanField.setAccessible(true);
@@ -234,7 +234,7 @@ public class DedicateGuestVlanRangesTest {
}
void runDedicateGuestVlanRangeInvalidRangeValue() throws Exception {
- Transaction txn = Transaction.open("runDedicateGuestVlanRangeInvalidRangeValue");
+ TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangeInvalidRangeValue");
Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
dedicateVlanField.setAccessible(true);
@@ -255,7 +255,7 @@ public class DedicateGuestVlanRangesTest {
}
void runDedicateGuestVlanRangeAllocatedVlans() throws Exception {
- Transaction txn = Transaction.open("runDedicateGuestVlanRangeAllocatedVlans");
+ TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangeAllocatedVlans");
Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
dedicateVlanField.setAccessible(true);
@@ -281,7 +281,7 @@ public class DedicateGuestVlanRangesTest {
}
void runDedicateGuestVlanRangeDedicatedRange() throws Exception {
- Transaction txn = Transaction.open("runDedicateGuestVlanRangeDedicatedRange");
+ TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangeDedicatedRange");
Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
dedicateVlanField.setAccessible(true);
@@ -310,7 +310,7 @@ public class DedicateGuestVlanRangesTest {
}
void runDedicateGuestVlanRangePartiallyDedicated() throws Exception {
- Transaction txn = Transaction.open("runDedicateGuestVlanRangePartiallyDedicated");
+ TransactionLegacy txn = TransactionLegacy.open("runDedicateGuestVlanRangePartiallyDedicated");
Field dedicateVlanField = _dedicateGuestVlanRangeClass.getDeclaredField("vlan");
dedicateVlanField.setAccessible(true);
@@ -339,7 +339,7 @@ public class DedicateGuestVlanRangesTest {
}
void runReleaseDedicatedGuestVlanRangePostiveTest() throws Exception {
- Transaction txn = Transaction.open("runReleaseDedicatedGuestVlanRangePostiveTest");
+ TransactionLegacy txn = TransactionLegacy.open("runReleaseDedicatedGuestVlanRangePostiveTest");
AccountGuestVlanMapVO accountGuestVlanMap = new AccountGuestVlanMapVO(1L, 1L);
when(networkService._accountGuestVlanMapDao.findById(anyLong())).thenReturn(accountGuestVlanMap);
@@ -357,7 +357,7 @@ public class DedicateGuestVlanRangesTest {
}
void runReleaseDedicatedGuestVlanRangeInvalidRange() throws Exception {
- Transaction txn = Transaction.open("runReleaseDedicatedGuestVlanRangeInvalidRange");
+ TransactionLegacy txn = TransactionLegacy.open("runReleaseDedicatedGuestVlanRangeInvalidRange");
when(networkService._accountGuestVlanMapDao.findById(anyLong())).thenReturn(null);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java b/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
index 1c0eff6..264f91c 100644
--- a/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
+++ b/server/test/com/cloud/network/UpdatePhysicalNetworkTest.java
@@ -24,7 +24,8 @@ import com.cloud.network.dao.PhysicalNetworkDao;
import com.cloud.network.dao.PhysicalNetworkVO;
import com.cloud.utils.Pair;
import com.cloud.utils.db.Transaction;
-import org.junit.Test;
+import com.cloud.utils.db.TransactionLegacy;
+
import org.junit.*;
import org.mockito.ArgumentCaptor;
import org.mockito.MockitoAnnotations.*;
@@ -58,7 +59,7 @@ public class UpdatePhysicalNetworkTest {
@Test
public void updatePhysicalNetworkTest(){
- Transaction txn = Transaction.open("updatePhysicalNetworkTest");
+ TransactionLegacy txn = TransactionLegacy.open("updatePhysicalNetworkTest");
NetworkServiceImpl networkService = setUp();
existingRange.add("524");
when(_physicalNetworkDao.findById(anyLong())).thenReturn(physicalNetworkVO);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
----------------------------------------------------------------------
diff --git a/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java b/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
index d0f0951..504ab9c 100644
--- a/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
+++ b/server/test/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImplTest.java
@@ -33,7 +33,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
-
import org.apache.cloudstack.api.command.user.region.ha.gslb.AssignToGlobalLoadBalancerRuleCmd;
import org.apache.cloudstack.api.command.user.region.ha.gslb.CreateGlobalLoadBalancerRuleCmd;
import org.apache.cloudstack.api.command.user.region.ha.gslb.DeleteGlobalLoadBalancerRuleCmd;
@@ -59,6 +58,7 @@ import com.cloud.user.AccountManager;
import com.cloud.user.AccountVO;
import com.cloud.user.UserVO;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.net.Ip;
public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
@@ -181,7 +181,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runCreateGlobalLoadBalancerRulePostiveTest() throws Exception {
- Transaction txn = Transaction.open("runCreateGlobalLoadBalancerRulePostiveTest");
+ TransactionLegacy txn = TransactionLegacy.open("runCreateGlobalLoadBalancerRulePostiveTest");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -246,7 +246,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runCreateGlobalLoadBalancerRuleInvalidAlgorithm() throws Exception {
- Transaction txn = Transaction.open("runCreateGlobalLoadBalancerRulePostiveTest");
+ TransactionLegacy txn = TransactionLegacy.open("runCreateGlobalLoadBalancerRulePostiveTest");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -311,7 +311,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runCreateGlobalLoadBalancerRuleInvalidStickyMethod() throws Exception {
- Transaction txn = Transaction.open("runCreateGlobalLoadBalancerRulePostiveTest");
+ TransactionLegacy txn = TransactionLegacy.open("runCreateGlobalLoadBalancerRulePostiveTest");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -376,7 +376,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runCreateGlobalLoadBalancerRuleInvalidServiceType() throws Exception {
- Transaction txn = Transaction.open("runCreateGlobalLoadBalancerRulePostiveTest");
+ TransactionLegacy txn = TransactionLegacy.open("runCreateGlobalLoadBalancerRulePostiveTest");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -441,7 +441,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runCreateGlobalLoadBalancerRuleInvalidDomainName() throws Exception {
- Transaction txn = Transaction.open("runCreateGlobalLoadBalancerRulePostiveTest");
+ TransactionLegacy txn = TransactionLegacy.open("runCreateGlobalLoadBalancerRulePostiveTest");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -507,7 +507,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runAssignToGlobalLoadBalancerRuleTest() throws Exception {
- Transaction txn = Transaction.open("runAssignToGlobalLoadBalancerRuleTest");
+ TransactionLegacy txn = TransactionLegacy.open("runAssignToGlobalLoadBalancerRuleTest");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -570,7 +570,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runAssignToGlobalLoadBalancerRuleTestSameZoneLb() throws Exception {
- Transaction txn = Transaction.open("runAssignToGlobalLoadBalancerRuleTestSameZoneLb");
+ TransactionLegacy txn = TransactionLegacy.open("runAssignToGlobalLoadBalancerRuleTestSameZoneLb");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -655,7 +655,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runAssignToGlobalLoadBalancerRuleTestRevokedState() throws Exception {
- Transaction txn = Transaction.open("runAssignToGlobalLoadBalancerRuleTestRevokedState");
+ TransactionLegacy txn = TransactionLegacy.open("runAssignToGlobalLoadBalancerRuleTestRevokedState");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -712,7 +712,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runRemoveFromGlobalLoadBalancerRuleTest() throws Exception {
- Transaction txn = Transaction.open("runRemoveFromGlobalLoadBalancerRuleTest");
+ TransactionLegacy txn = TransactionLegacy.open("runRemoveFromGlobalLoadBalancerRuleTest");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -785,7 +785,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runRemoveFromGlobalLoadBalancerRuleTestUnassignedLb() throws Exception {
- Transaction txn = Transaction.open("runRemoveFromGlobalLoadBalancerRuleTestUnassignedLb");
+ TransactionLegacy txn = TransactionLegacy.open("runRemoveFromGlobalLoadBalancerRuleTestUnassignedLb");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -846,7 +846,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runRemoveFromGlobalLoadBalancerRuleTestInvalidLb() throws Exception {
- Transaction txn = Transaction.open("runRemoveFromGlobalLoadBalancerRuleTestInvalidLb");
+ TransactionLegacy txn = TransactionLegacy.open("runRemoveFromGlobalLoadBalancerRuleTestInvalidLb");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -890,7 +890,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runDeleteGlobalLoadBalancerRuleTestWithNoLbRules() throws Exception {
- Transaction txn = Transaction.open("runDeleteGlobalLoadBalancerRuleTestWithNoLbRules");
+ TransactionLegacy txn = TransactionLegacy.open("runDeleteGlobalLoadBalancerRuleTestWithNoLbRules");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
@@ -936,7 +936,7 @@ public class GlobalLoadBalancingRulesServiceImplTest extends TestCase {
void runDeleteGlobalLoadBalancerRuleTestWithLbRules() throws Exception {
- Transaction txn = Transaction.open("runDeleteGlobalLoadBalancerRuleTestWithLbRules");
+ TransactionLegacy txn = TransactionLegacy.open("runDeleteGlobalLoadBalancerRuleTestWithLbRules");
GlobalLoadBalancingRulesServiceImpl gslbServiceImpl = new GlobalLoadBalancingRulesServiceImpl();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/usage/src/com/cloud/usage/UsageManagerImpl.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/UsageManagerImpl.java b/usage/src/com/cloud/usage/UsageManagerImpl.java
index 3ff53e0..1ee21c9 100644
--- a/usage/src/com/cloud/usage/UsageManagerImpl.java
+++ b/usage/src/com/cloud/usage/UsageManagerImpl.java
@@ -84,7 +84,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UsageManager.class})
@@ -248,7 +248,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
m_sanity = m_sanityExecutor.scheduleAtFixedRate(new SanityCheck(), 1, m_sanityCheckInterval, TimeUnit.DAYS);
}
- Transaction usageTxn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy usageTxn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
try {
if(m_heartbeatLock.lock(3)) { // 3 second timeout
try {
@@ -381,7 +381,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
s_logger.info("not parsing usage records since start time mills (" + startDateMillis + ") is on or after end time millis (" + endDateMillis + ")");
}
- Transaction jobUpdateTxn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy jobUpdateTxn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
try {
jobUpdateTxn.start();
// everything seemed to work...set endDate as the last success date
@@ -411,7 +411,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
Map<String, UsageNetworkVO> networkStats = null;
List<VmDiskStatisticsVO> vmDiskStats = null;
Map<String, UsageVmDiskVO> vmDiskUsages = null;
- Transaction userTxn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy userTxn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
Long limit = Long.valueOf(500);
Long offset = Long.valueOf(0);
@@ -552,7 +552,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
List<UsageEventVO> events = _usageEventDao.getRecentEvents(new Date(endDateMillis));
- Transaction usageTxn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy usageTxn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
try {
usageTxn.start();
@@ -779,7 +779,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
usageTxn.close();
// switch back to CLOUD_DB
- Transaction swap = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy swap = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
if(!success){
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_USAGE_SERVER_RESULT, 0, new Long(0), "Usage job failed. Job id: "+job.getId(), "Usage job failed. Job id: "+job.getId());
} else {
@@ -1664,7 +1664,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
private class Heartbeat extends ManagedContextRunnable {
@Override
protected void runInContext() {
- Transaction usageTxn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy usageTxn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
try {
if(!m_heartbeatLock.lock(3)) { // 3 second timeout
if(s_logger.isTraceEnabled())
@@ -1723,7 +1723,7 @@ public class UsageManagerImpl extends ManagerBase implements UsageManager, Runna
@DB
protected boolean updateJob(Long jobId, String hostname, Integer pid, Date heartbeat, int scheduled) {
boolean changeOwner = false;
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/usage/src/com/cloud/usage/UsageSanityChecker.java
----------------------------------------------------------------------
diff --git a/usage/src/com/cloud/usage/UsageSanityChecker.java b/usage/src/com/cloud/usage/UsageSanityChecker.java
index ed78a15..35fbe81 100644
--- a/usage/src/com/cloud/usage/UsageSanityChecker.java
+++ b/usage/src/com/cloud/usage/UsageSanityChecker.java
@@ -26,7 +26,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
public class UsageSanityChecker {
@@ -186,7 +186,7 @@ public class UsageSanityChecker {
// Error while reading last check id
}
- Connection conn = Transaction.getStandaloneConnection();
+ Connection conn = TransactionLegacy.getStandaloneConnection();
int maxId = 0;
PreparedStatement pstmt = conn.prepareStatement("select max(id) from cloud_usage.cloud_usage");
ResultSet rs = pstmt.executeQuery();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/utils/src/com/cloud/utils/exception/ExceptionUtil.java
----------------------------------------------------------------------
diff --git a/utils/src/com/cloud/utils/exception/ExceptionUtil.java b/utils/src/com/cloud/utils/exception/ExceptionUtil.java
index 977af92..322c23d 100644
--- a/utils/src/com/cloud/utils/exception/ExceptionUtil.java
+++ b/utils/src/com/cloud/utils/exception/ExceptionUtil.java
@@ -35,4 +35,16 @@ public class ExceptionUtil {
}
return writer.toString();
}
+
+ @SuppressWarnings("unchecked")
+ public static <T extends Throwable> void rethrow(Throwable t, Class<T> clz) throws T {
+ if ( clz.isAssignableFrom(t.getClass()) )
+ throw (T)t;
+ }
+
+ public static <T extends Throwable> void rethrowRuntime(Throwable t) {
+ rethrow(t, RuntimeException.class);
+ rethrow(t, Error.class);
+ }
+
}
[17/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
index 88a2b2b..301e54c 100755
--- a/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
+++ b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java
@@ -46,7 +46,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -186,7 +186,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
@Override
public List<Long> listClustersCrossingThreshold(short capacityType, Long zoneId, String configName, long compute_requested){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
StringBuilder sql = new StringBuilder(LIST_CLUSTERS_CROSSING_THRESHOLD);
@@ -241,7 +241,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
@Override
public List<SummedCapacity> findCapacityBy(Integer capacityType, Long zoneId, Long podId, Long clusterId, String resource_state){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<SummedCapacity> result = new ArrayList<SummedCapacity>();
@@ -291,7 +291,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
public List<SummedCapacity> listCapacitiesGroupedByLevelAndType(Integer capacityType, Long zoneId, Long podId, Long clusterId, int level, Long limit){
StringBuilder finalQuery = new StringBuilder();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<SummedCapacity> result = new ArrayList<SummedCapacity>();
@@ -378,7 +378,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
@Override
public List<SummedCapacity> findCapacityBy(Integer capacityType, Long zoneId, Long podId, Long clusterId){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<SummedCapacity> result = new ArrayList<SummedCapacity>();
@@ -425,7 +425,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
}
public void updateAllocated(Long hostId, long allocatedAmount, short capacityType, boolean add) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
txn.start();
@@ -458,7 +458,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
@Override
public List<Long> listClustersInZoneOrPodByHostCapacities(long id, int requiredCpu, long requiredRam, short capacityTypeForOrdering, boolean isZone){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
@@ -503,7 +503,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
@Override
public List<Long> listHostsWithEnoughCapacity(int requiredCpu, long requiredRam, Long clusterId, String hostType){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
@@ -594,7 +594,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
@Override
public List<SummedCapacity> findByClusterPodZone(Long zoneId, Long podId, Long clusterId){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<SummedCapacity> result = new ArrayList<SummedCapacity>();
@@ -706,7 +706,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
@Override
public Pair<List<Long>, Map<Long, Double>> orderClustersByAggregateCapacity(long id, short capacityTypeForOrdering, boolean isZone){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
Map<Long, Double> clusterCapacityMap = new HashMap<Long, Double>();
@@ -759,7 +759,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
@Override
public List<Long> listPodsByHostCapacities(long zoneId, int requiredCpu, long requiredRam, short capacityType) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
@@ -793,7 +793,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
@Override
public Pair<List<Long>, Map<Long, Double>> orderPodsByAggregateCapacity(long zoneId, short capacityTypeForOrdering) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
Map<Long, Double> podCapacityMap = new HashMap<Long, Double>();
@@ -835,7 +835,7 @@ public class CapacityDaoImpl extends GenericDaoBase<CapacityVO, Long> implements
@Override
public void updateCapacityState(Long dcId, Long podId, Long clusterId, Long hostId, String capacityState) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
StringBuilder sql = new StringBuilder(UPDATE_CAPACITY_STATE);
List<Long> resourceIdList = new ArrayList<Long>();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java b/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java
index 9070ff9..0d99d30 100644
--- a/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java
+++ b/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java
@@ -40,7 +40,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={ResourceCountDao.class})
@@ -158,7 +158,7 @@ public class ResourceCountDaoImpl extends GenericDaoBase<ResourceCountVO, Long>
@Override @DB
public void createResourceCounts(long ownerId, ResourceLimit.ResourceOwnerType ownerType){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
ResourceType[] resourceTypes = Resource.ResourceType.values();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java
index f7f0f11..72ac400 100755
--- a/engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/ClusterDetailsDaoImpl.java
@@ -30,7 +30,7 @@ import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Local(value=ClusterDetailsDao.class)
public class ClusterDetailsDaoImpl extends GenericDaoBase<ClusterDetailsVO, Long> implements ClusterDetailsDao, ScopedConfigStorage {
@@ -100,7 +100,7 @@ public class ClusterDetailsDaoImpl extends GenericDaoBase<ClusterDetailsVO, Long
@Override
public void persist(long clusterId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<ClusterDetailsVO> sc = ClusterSearch.create();
sc.setParameters("clusterId", clusterId);
@@ -119,7 +119,7 @@ public class ClusterDetailsDaoImpl extends GenericDaoBase<ClusterDetailsVO, Long
@Override
public void persist(long clusterId, String name, String value) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<ClusterDetailsVO> sc = DetailSearch.create();
sc.setParameters("clusterId", clusterId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java
index d115ce9..bd45ecd 100644
--- a/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/ClusterDaoImpl.java
@@ -40,7 +40,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -156,7 +156,7 @@ public class ClusterDaoImpl extends GenericDaoBase<ClusterVO, Long> implements C
@Override
public Map<Long, List<Long>> getPodClusterIdMap(List<Long> clusterIds){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
Map<Long, List<Long>> result = new HashMap<Long, List<Long>>();
@@ -243,7 +243,7 @@ public class ClusterDaoImpl extends GenericDaoBase<ClusterVO, Long> implements C
@Override
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
ClusterVO cluster = createForUpdate();
cluster.setName(null);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java
index c3d3f2a..a01af06 100644
--- a/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/ClusterVSMMapDaoImpl.java
@@ -26,7 +26,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value=ClusterVSMMapDao.class)
@@ -79,7 +79,7 @@ public class ClusterVSMMapDaoImpl extends GenericDaoBase<ClusterVSMMapVO, Long>
}
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
ClusterVSMMapVO cluster = createForUpdate();
//cluster.setClusterId(null);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
index 47b5522..e3b70a2 100755
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java
@@ -44,7 +44,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SequenceFetcher;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.net.NetUtils;
/**
@@ -343,7 +343,7 @@ public class DataCenterDaoImpl extends GenericDaoBase<DataCenterVO, Long> implem
@Override @DB
public boolean update(Long zoneId, DataCenterVO zone) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
boolean persisted = super.update(zoneId, zone);
if (!persisted) {
@@ -408,7 +408,7 @@ public class DataCenterDaoImpl extends GenericDaoBase<DataCenterVO, Long> implem
@Override
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
DataCenterVO zone = createForUpdate();
zone.setName(null);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java
index 0ec2bb5..c2ed551 100755
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
@@ -52,7 +52,7 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase<DataCenterIpAddre
sc.setParameters("pod", podId);
sc.setParameters("taken", (Date)null);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
DataCenterIpAddressVO vo = lockOneRandomRow(sc, true);
if (vo == null) {
@@ -73,7 +73,7 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase<DataCenterIpAddre
sc.setParameters("dc", dcId);
sc.setParameters("taken", (Date)null);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
DataCenterIpAddressVO vo = lockOneRandomRow(sc, true);
if (vo == null) {
@@ -108,7 +108,7 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase<DataCenterIpAddre
@DB
public void addIpRange(long dcId, long podId, String start, String end) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
String insertSql = "INSERT INTO `cloud`.`op_dc_ip_address_alloc` (ip_address, data_center_id, pod_id, mac_address) VALUES (?, ?, ?, (select mac_address from `cloud`.`data_center` where id=?))";
String updateSql = "UPDATE `cloud`.`data_center` set mac_address = mac_address+1 where id=?";
PreparedStatement stmt = null;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java
index 6baf04f..39d5753 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterLinkLocalIpAddressDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
@@ -54,7 +54,7 @@ public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase<DataCent
sc.setParameters("pod", podId);
sc.setParameters("taken", (Date)null);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
DataCenterLinkLocalIpAddressVO vo = lockOneRandomRow(sc, true);
@@ -84,7 +84,7 @@ public class DataCenterLinkLocalIpAddressDaoImpl extends GenericDaoBase<DataCent
long startIP = NetUtils.ip2Long(start);
long endIP = NetUtils.ip2Long(end);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
stmt = txn.prepareAutoCloseStatement(insertSql);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
index 28cd027..7f65b3a 100644
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java
@@ -21,6 +21,7 @@ import java.util.List;
import com.cloud.dc.DataCenterVnetVO;
import com.cloud.utils.db.GenericDao;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
public interface DataCenterVnetDao extends GenericDao<DataCenterVnetVO, Long> {
public List<DataCenterVnetVO> listAllocatedVnets(long physicalNetworkId);
@@ -33,7 +34,7 @@ public interface DataCenterVnetDao extends GenericDao<DataCenterVnetVO, Long> {
public void delete(long physicalNetworkId);
- public void deleteVnets(Transaction txn, long dcId, long physicalNetworkId, List<String> vnets);
+ public void deleteVnets(TransactionLegacy txn, long dcId, long physicalNetworkId, List<String> vnets);
public void lockRange(long dcId, long physicalNetworkId, Integer start, Integer end);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
index c052026..4e2aabf 100755
--- a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
/**
@@ -121,7 +121,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long
public void add(long dcId, long physicalNetworkId, List<String> vnets) {
String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, data_center_id, physical_network_id) VALUES ( ?, ?, ?)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertVnet);
@@ -139,7 +139,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long
}
//In the List<string> argument each string is a vlan. not a vlanRange.
- public void deleteVnets(Transaction txn, long dcId, long physicalNetworkId, List<String> vnets) {
+ public void deleteVnets(TransactionLegacy txn, long dcId, long physicalNetworkId, List<String> vnets) {
String deleteVnet = "DELETE FROM `cloud`.`op_dc_vnet_alloc` WHERE data_center_id=? AND physical_network_id=? AND taken IS NULL AND vnet=?";
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(deleteVnet);
@@ -171,7 +171,7 @@ public class DataCenterVnetDaoImpl extends GenericDaoBase<DataCenterVnetVO, Long
}
sc.setParameters("physicalNetworkId", physicalNetworkId);
Date now = new Date();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
DataCenterVnetVO vo = lockOneRandomRow(sc, true);
if (vo == null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java
index 88c326b..5f2b0b9 100644
--- a/engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/DcDetailsDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.dc.DcDetailVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Local(value=DcDetailsDao.class)
public class DcDetailsDaoImpl extends GenericDaoBase<DcDetailVO, Long> implements DcDetailsDao, ScopedConfigStorage {
@@ -106,7 +106,7 @@ public class DcDetailsDaoImpl extends GenericDaoBase<DcDetailVO, Long> implement
@Override
public void persist(long dcId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<DcDetailVO> sc = DcSearch.create();
sc.setParameters("dcId", dcId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java
index f77deda..384fa00 100644
--- a/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={HostPodDao.class})
@@ -85,7 +85,7 @@ public class HostPodDaoImpl extends GenericDaoBase<HostPodVO, Long> implements H
HashMap<Long, List<Object>> currentPodCidrSubnets = new HashMap<Long, List<Object>>();
String selectSql = "SELECT id, cidr_address, cidr_size FROM host_pod_ref WHERE data_center_id=" + zoneId +" and removed IS NULL";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
ResultSet rs = stmt.executeQuery();
@@ -111,7 +111,7 @@ public class HostPodDaoImpl extends GenericDaoBase<HostPodVO, Long> implements H
@Override
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
HostPodVO pod = createForUpdate();
pod.setName(null);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java
index 413f9ed..9e9a0e7 100755
--- a/engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/PodVlanDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.utils.db.GenericDao;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
/**
@@ -49,7 +49,7 @@ public class PodVlanDaoImpl extends GenericDaoBase<PodVlanVO, Long> implements P
public void add(long podId, int start, int end) {
String insertVnet = "INSERT INTO `cloud`.`op_pod_vlan_alloc` (vlan, pod_id) VALUES ( ?, ?)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertVnet);
@@ -68,7 +68,7 @@ public class PodVlanDaoImpl extends GenericDaoBase<PodVlanVO, Long> implements P
public void delete(long podId) {
String deleteVnet = "DELETE FROM `cloud`.`op_pod_vlan_alloc` WHERE pod_id = ?";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(deleteVnet);
stmt.setLong(1, podId);
@@ -82,7 +82,7 @@ public class PodVlanDaoImpl extends GenericDaoBase<PodVlanVO, Long> implements P
SearchCriteria<PodVlanVO> sc = FreeVlanSearch.create();
sc.setParameters("podId", podId);
Date now = new Date();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
PodVlanVO vo = lockOneRandomRow(sc, true);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java
index a7bb9c1..d6a3879 100755
--- a/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/StorageNetworkIpAddressDaoImpl.java
@@ -30,10 +30,10 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.GenericQueryBuilder;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={StorageNetworkIpAddressDao.class})
@@ -87,7 +87,7 @@ public class StorageNetworkIpAddressDaoImpl extends GenericDaoBase<StorageNetwor
public StorageNetworkIpAddressVO takeIpAddress(long rangeId) {
SearchCriteria<StorageNetworkIpAddressVO> sc = untakenIp.create();
sc.setParameters("rangeId", rangeId);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
StorageNetworkIpAddressVO ip = lockOneRandomRow(sc, true);
if (ip == null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java
index 6f5a01f..6ec819d 100755
--- a/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java
+++ b/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
import org.springframework.stereotype.Component;
@@ -301,7 +301,7 @@ public class VlanDaoImpl extends GenericDaoBase<VlanVO, Long> implements VlanDao
StringBuilder sql = new StringBuilder(FindZoneWideVlans);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql.toString());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java b/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java
index 3d0588e..1b73591 100644
--- a/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java
+++ b/engine/schema/src/com/cloud/domain/dao/DomainDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={DomainDao.class})
@@ -117,7 +117,7 @@ public class DomainDaoImpl extends GenericDaoBase<DomainVO, Long> implements Dom
return null;
}
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
@@ -168,7 +168,7 @@ public class DomainDaoImpl extends GenericDaoBase<DomainVO, Long> implements Dom
String sql1 = "SELECT * from domain where parent = " + id + " and removed is null";
boolean success = false;
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
DomainVO parentDomain = super.lockRow(domain.getParent(), true);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java b/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java
index e5615db..f3a11c6 100644
--- a/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java
+++ b/engine/schema/src/com/cloud/event/dao/EventDaoImpl.java
@@ -30,7 +30,7 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.SearchCriteria.Op;
@Component
@@ -104,7 +104,7 @@ public class EventDaoImpl extends GenericDaoBase<EventVO, Long> implements Event
@Override
public void archiveEvents(List<EventVO> events) {
if (events != null && !events.isEmpty()) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
for (EventVO event : events) {
event = lockRow(event.getId(), true);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java b/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
index 4f05bbe..4333903 100644
--- a/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
+++ b/engine/schema/src/com/cloud/event/dao/UsageEventDaoImpl.java
@@ -36,7 +36,7 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -90,7 +90,7 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
public synchronized List<UsageEventVO> getRecentEvents(Date endDate) {
long recentEventId = getMostRecentEventId();
long maxEventId = getMaxEventId(endDate);
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
String sql = COPY_EVENTS;
if (recentEventId == 0) {
if (s_logger.isDebugEnabled()) {
@@ -120,7 +120,7 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
@DB
private long getMostRecentEventId() {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
try {
List<UsageEventVO> latestEvents = getLatestEvent();
@@ -140,7 +140,7 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
}
private List<UsageEventVO> findRecentEvents(Date endDate) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
try {
return listLatestEvents(endDate);
} catch (Exception ex) {
@@ -152,7 +152,7 @@ public class UsageEventDaoImpl extends GenericDaoBase<UsageEventVO, Long> implem
}
private long getMaxEventId(Date endDate) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
String sql = MAX_EVENT;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
index caf7c01..c51e2c7 100755
--- a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
+++ b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
@@ -59,7 +59,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -490,7 +490,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
@Override
@DB
public List<HostVO> findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
if (s_logger.isDebugEnabled()) {
@@ -589,7 +589,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
@Override
@DB
public List<HostVO> findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<HostVO> sc = UnmanagedApplianceSearch.create();
@@ -728,7 +728,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
@DB
@Override
public List<HostVO> findLostHosts(long timeout) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<HostVO> result = new ArrayList<HostVO>();
ResultSet rs = null;
@@ -779,7 +779,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
public HostVO persist(HostVO host) {
final String InsertSequenceSql = "INSERT INTO op_host(id) VALUES(?)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
HostVO dbHost = super.persist(host);
@@ -805,7 +805,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
@Override
@DB
public boolean update(Long hostId, HostVO host) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
boolean persisted = super.update(hostId, host);
@@ -831,7 +831,7 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
ArrayList<RunningHostCountInfo> l = new ArrayList<RunningHostCountInfo>();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
;
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java
index 47cdeb3..7b7267c 100644
--- a/engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/host/dao/HostDetailsDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -96,7 +96,7 @@ public class HostDetailsDaoImpl extends GenericDaoBase<DetailVO, Long> implement
public void persist(long hostId, Map<String, String> details) {
final String InsertOrUpdateSql = "INSERT INTO `cloud`.`host_details` (host_id, name, value) VALUES (?,?,?) ON DUPLICATE KEY UPDATE value=?";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
for (Map.Entry<String, String> detail : details.entrySet()) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java
index 0e93275..b12fd7e 100644
--- a/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java
+++ b/engine/schema/src/com/cloud/host/dao/HostTagsDaoImpl.java
@@ -27,7 +27,7 @@ import com.cloud.host.HostTagVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value=HostTagsDao.class)
@@ -56,7 +56,7 @@ public class HostTagsDaoImpl extends GenericDaoBase<HostTagVO, Long> implements
@Override
public void persist(long hostId, List<String> hostTags) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<HostTagVO> sc = HostSearch.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java b/engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java
index f53f228..370f874 100644
--- a/engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java
+++ b/engine/schema/src/com/cloud/keystore/KeystoreDaoImpl.java
@@ -30,7 +30,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -74,7 +74,7 @@ public class KeystoreDaoImpl extends GenericDaoBase<KeystoreVO, Long> implements
@Override
@DB
public void save(String name, String certificate, String key, String domainSuffix) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java
index b007e19..26f399d 100644
--- a/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value=FirewallRulesCidrsDao.class)
@@ -58,7 +58,7 @@ public class FirewallRulesCidrsDaoImpl extends GenericDaoBase<FirewallRulesCidrs
@Override @DB
public void persist(long firewallRuleId, List<String> sourceCidrs) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
for (String tag : sourceCidrs) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
index cd7878f..6aa8910 100644
--- a/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java
@@ -39,7 +39,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = FirewallRulesDao.class)
@@ -220,7 +220,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase<FirewallRuleVO, Long> i
@Override
@DB
public FirewallRuleVO persist(FirewallRuleVO firewallRule) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
FirewallRuleVO dbfirewallRule = super.persist(firewallRule);
@@ -309,7 +309,7 @@ public class FirewallRulesDaoImpl extends GenericDaoBase<FirewallRuleVO, Long> i
@Override
@DB
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
FirewallRuleVO entry = findById(id);
if (entry != null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
index 9f5f403..46a34c5 100755
--- a/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/IPAddressDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.net.Ip;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@@ -285,7 +285,7 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
@Override
@DB
public int countIPs(long dcId, Long accountId, String vlanId, String vlanGateway, String vlanNetmask) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
int ipCount = 0;
try {
String sql = "SELECT count(*) FROM user_ip_address u INNER JOIN vlan v on (u.vlan_db_id = v.id AND v.data_center_id = ? AND v.vlan_id = ? AND v.vlan_gateway = ? AND v.vlan_netmask = ? AND u.account_id = ?)";
@@ -390,7 +390,7 @@ public class IPAddressDaoImpl extends GenericDaoBase<IPAddressVO, Long> implemen
@Override
@DB
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
IPAddressVO entry = findById(id);
if (entry != null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
index 72b357d..6599d6b 100644
--- a/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java
@@ -289,7 +289,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
@Override
@DB
public NetworkVO persist(NetworkVO network, boolean gc, Map<String, String> serviceProviderMap) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
// 1) create network
@@ -309,7 +309,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
@Override
@DB
public boolean update(Long networkId, NetworkVO network, Map<String, String> serviceProviderMap) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
super.update(networkId, network);
@@ -325,7 +325,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
@Override
@DB
public void persistNetworkServiceProviders(long networkId, Map<String, String> serviceProviderMap) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
for (String service : serviceProviderMap.keySet()) {
NetworkServiceMapVO serviceMap = new NetworkServiceMapVO(networkId, Service.getService(service), Provider.getProvider(serviceProviderMap.get(service)));
@@ -576,7 +576,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
@Override
@DB
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
NetworkVO entry = findById(id);
if (entry != null) {
@@ -599,7 +599,7 @@ public class NetworkDaoImpl extends GenericDaoBase<NetworkVO, Long> implements N
@Override
public boolean updateState(State currentState, Event event, State nextState, Network vo, Object data) {
// TODO: ensure this update is correct
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
NetworkVO networkVo = (NetworkVO) vo;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java b/engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java
index 2325c4a..64a846c 100644
--- a/engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/dao/PortProfileDaoImpl.java
@@ -29,7 +29,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -66,7 +66,7 @@ public class PortProfileDaoImpl extends GenericDaoBase<PortProfileVO, Long> impl
String condition = "(trunk_low_vlan_id BETWEEN " + lowVlanId + " AND " + highVlanId + ")" + " OR (trunk_high_vlan_id BETWEEN " + lowVlanId + " AND " + highVlanId + ")";
String selectSql = "SELECT * FROM `" + dbName + "`.`" + tableName + "` WHERE " + condition;
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
ResultSet rs = stmt.executeQuery();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java
index d82cc4a..ee8c160 100644
--- a/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupDaoImpl.java
@@ -32,7 +32,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={SecurityGroupDao.class})
@@ -109,7 +109,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase<SecurityGroupVO, Long>
@Override
@DB
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SecurityGroupVO entry = findById(id);
if (entry != null) {
@@ -123,7 +123,7 @@ public class SecurityGroupDaoImpl extends GenericDaoBase<SecurityGroupVO, Long>
@Override
@DB
public boolean expunge(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SecurityGroupVO entry = findById(id);
if (entry != null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java
index 3154ffe..98cc0d3 100644
--- a/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/security/dao/SecurityGroupWorkDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -100,7 +100,7 @@ public class SecurityGroupWorkDaoImpl extends GenericDaoBase<SecurityGroupWorkVO
@Override
@DB
public SecurityGroupWorkVO take(long serverId) {
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
final SearchCriteria<SecurityGroupWorkVO> sc = UntakenWorkSearch.create();
sc.setParameters("step", Step.Scheduled);
@@ -149,7 +149,7 @@ public class SecurityGroupWorkDaoImpl extends GenericDaoBase<SecurityGroupWorkVO
@Override
@DB
public void updateStep(Long vmId, Long logSequenceNumber, Step step) {
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<SecurityGroupWorkVO> sc = VmIdSeqNumSearch.create();
sc.setParameters("vmId", vmId);
@@ -180,7 +180,7 @@ public class SecurityGroupWorkDaoImpl extends GenericDaoBase<SecurityGroupWorkVO
@Override
@DB
public void updateStep(Long workId, Step step) {
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SecurityGroupWorkVO work = lockRow(workId, true);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java b/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
index 746b66f..f957439 100644
--- a/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/security/dao/VmRulesetLogDaoImpl.java
@@ -34,7 +34,7 @@ import com.cloud.network.security.VmRulesetLogVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={VmRulesetLogDao.class})
@@ -85,7 +85,7 @@ public class VmRulesetLogDaoImpl extends GenericDaoBase<VmRulesetLogVO, Long> im
return createOrUpdateUsingMultiInsert(workItems);
}
- private int executeWithRetryOnDeadlock(Transaction txn, String pstmt, List<Long> vmIds) throws SQLException {
+ private int executeWithRetryOnDeadlock(TransactionLegacy txn, String pstmt, List<Long> vmIds) throws SQLException {
int numUpdated = 0;
final int maxTries = 3;
@@ -120,7 +120,7 @@ public class VmRulesetLogDaoImpl extends GenericDaoBase<VmRulesetLogVO, Long> im
}
protected int createOrUpdateUsingMultiInsert(Set<Long> workItems) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
int size = workItems.size();
int count = 0;
@@ -156,7 +156,7 @@ public class VmRulesetLogDaoImpl extends GenericDaoBase<VmRulesetLogVO, Long> im
}
protected int createOrUpdateUsingBatch(Set<Long> workItems) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement stmtInsert = null;
int [] queryResult = null;
int count=0;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java
index 5ed7fb2..7511657 100644
--- a/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/vpc/dao/PrivateIpDaoImpl.java
@@ -32,7 +32,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = PrivateIpDao.class)
@@ -78,7 +78,7 @@ public class PrivateIpDaoImpl extends GenericDaoBase<PrivateIpVO, Long> implemen
sc.setParameters("ipAddress", requestedIp);
}
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
PrivateIpVO vo = lockOneRandomRow(sc, true);
if (vo == null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java
index e7e006e..f5a9ed5 100644
--- a/engine/schema/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/vpc/dao/StaticRouteDaoImpl.java
@@ -36,7 +36,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = StaticRouteDao.class)
@@ -106,7 +106,7 @@ public class StaticRouteDaoImpl extends GenericDaoBase<StaticRouteVO, Long> impl
@Override
@DB
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
StaticRouteVO entry = findById(id);
if (entry != null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java
index 289b896..c34b551 100644
--- a/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/vpc/dao/VpcDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = VpcDao.class)
@@ -107,7 +107,7 @@ public class VpcDaoImpl extends GenericDaoBase<VpcVO, Long> implements VpcDao{
@Override
@DB
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
VpcVO entry = findById(id);
if (entry != null) {
@@ -129,7 +129,7 @@ public class VpcDaoImpl extends GenericDaoBase<VpcVO, Long> implements VpcDao{
@Override
@DB
public VpcVO persist(VpcVO vpc, Map<String, List<String>> serviceProviderMap) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
VpcVO newVpc = super.persist(vpc);
persistVpcServiceProviders(vpc.getId(), serviceProviderMap);
@@ -140,7 +140,7 @@ public class VpcDaoImpl extends GenericDaoBase<VpcVO, Long> implements VpcDao{
@Override
@DB
public void persistVpcServiceProviders(long vpcId, Map<String, List<String>> serviceProviderMap) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
for (String service : serviceProviderMap.keySet()) {
for (String provider : serviceProviderMap.get(service)) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingDaoImpl.java
index b5a7e4d..3453da0 100644
--- a/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingDaoImpl.java
+++ b/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingDaoImpl.java
@@ -26,7 +26,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = VpcOfferingDao.class)
@@ -51,7 +51,7 @@ public class VpcOfferingDaoImpl extends GenericDaoBase<VpcOfferingVO, Long> impl
@Override
@DB
public boolean remove(Long vpcOffId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
VpcOfferingVO offering = findById(vpcOffId);
offering.setUniqueName(null);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
index 1c0a1d7..19290a6 100644
--- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
+++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = NetworkOfferingDao.class)
@@ -129,7 +129,7 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase<NetworkOfferingVO, Lo
@Override
@DB
public boolean remove(Long networkOfferingId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
NetworkOfferingVO offering = findById(networkOfferingId);
offering.setUniqueName(null);
@@ -174,7 +174,7 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase<NetworkOfferingVO, Lo
@Override
@DB
public NetworkOfferingVO persist(NetworkOfferingVO off, Map<Detail, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
//1) persist the offering
NetworkOfferingVO vo = super.persist(off);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/projects/dao/ProjectDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/projects/dao/ProjectDaoImpl.java b/engine/schema/src/com/cloud/projects/dao/ProjectDaoImpl.java
index ecf40da..fd6c802 100644
--- a/engine/schema/src/com/cloud/projects/dao/ProjectDaoImpl.java
+++ b/engine/schema/src/com/cloud/projects/dao/ProjectDaoImpl.java
@@ -36,7 +36,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = { ProjectDao.class })
@@ -75,7 +75,7 @@ public class ProjectDaoImpl extends GenericDaoBase<ProjectVO, Long> implements P
@DB
public boolean remove(Long projectId) {
boolean result = false;
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
ProjectVO projectToRemove = findById(projectId);
projectToRemove.setName(null);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
index 91d736a..70fd570 100644
--- a/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/service/dao/ServiceOfferingDetailsDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.service.ServiceOfferingDetailsVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value=ServiceOfferingDetailsDao.class)
@@ -82,7 +82,7 @@ public class ServiceOfferingDetailsDaoImpl extends GenericDaoBase<ServiceOfferin
@Override
public void persist(long serviceOfferingId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<ServiceOfferingDetailsVO> sc = ServiceOfferingSearch.create();
sc.setParameters("serviceOfferingId", serviceOfferingId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java
index 3e32f1a..60c87af 100644
--- a/engine/schema/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/LaunchPermissionDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -69,7 +69,7 @@ public class LaunchPermissionDaoImpl extends GenericDaoBase<LaunchPermissionVO,
@Override
public void removePermissions(long templateId, List<Long> accountIds) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
txn.start();
@@ -106,7 +106,7 @@ public class LaunchPermissionDaoImpl extends GenericDaoBase<LaunchPermissionVO,
@Override
public List<VMTemplateVO> listPermittedTemplates(long accountId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
List<VMTemplateVO> permittedTemplates = new ArrayList<VMTemplateVO>();
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java
index f5319ea..94b3871 100644
--- a/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java
@@ -47,7 +47,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.dao.VMInstanceDao;
@@ -204,7 +204,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
@Override
public Long getSecHostId(long volumeId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = GET_SECHOST_ID;
try {
@@ -221,7 +221,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
@Override
public long getLastSnapshot(long volumeId, DataStoreRole role) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = GET_LAST_SNAPSHOT;
try {
@@ -240,7 +240,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
@Override
public long updateSnapshotVersion(long volumeId, String from, String to) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = UPDATE_SNAPSHOT_VERSION;
try {
@@ -258,7 +258,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
@Override
public long updateSnapshotSecHost(long dcId, long secHostId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = UPDATE_SECHOST_ID;
try {
@@ -304,7 +304,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
@Override
@DB
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SnapshotVO entry = findById(id);
if (entry != null) {
@@ -324,7 +324,7 @@ public class SnapshotDaoImpl extends GenericDaoBase<SnapshotVO, Long> implements
@Override
public boolean updateState(State currentState, Event event, State nextState, SnapshotVO snapshot, Object data) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SnapshotVO snapshotVO = (SnapshotVO) snapshot;
snapshotVO.setState(nextState);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
index f60ea17..7859ca7 100644
--- a/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolDetailsDaoImpl.java
@@ -31,7 +31,7 @@ import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Local(value = StoragePoolDetailsDao.class)
public class StoragePoolDetailsDaoImpl extends GenericDaoBase<StoragePoolDetailVO, Long> implements StoragePoolDetailsDao, ScopedConfigStorage {
@@ -48,7 +48,7 @@ public class StoragePoolDetailsDaoImpl extends GenericDaoBase<StoragePoolDetailV
@Override
public void update(long poolId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
SearchCriteria<StoragePoolDetailVO> sc = PoolSearch.create();
sc.setParameters("pool", poolId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java
index 730216b..ba0c48d 100644
--- a/engine/schema/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolHostDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.Pair;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = { StoragePoolHostDao.class })
@@ -104,7 +104,7 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase<StoragePoolHostVO, Lo
@Override
public List<StoragePoolHostVO> listByHostStatus(long poolId, Status hostStatus) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<StoragePoolHostVO> result = new ArrayList<StoragePoolHostVO>();
ResultSet rs = null;
@@ -142,7 +142,7 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase<StoragePoolHostVO, Lo
public List<Pair<Long, Integer>> getDatacenterStoragePoolHostInfo(long dcId, boolean sharedOnly) {
ArrayList<Pair<Long, Integer>> l = new ArrayList<Pair<Long, Integer>>();
String sql = sharedOnly ? SHARED_STORAGE_POOL_HOST_INFO : STORAGE_POOL_HOST_INFO;
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
;
PreparedStatement pstmt = null;
try {
@@ -169,7 +169,7 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase<StoragePoolHostVO, Lo
public void deletePrimaryRecordsForHost(long hostId) {
SearchCriteria<StoragePoolHostVO> sc = HostSearch.create();
sc.setParameters("host_id", hostId);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
remove(sc);
txn.commit();
@@ -180,7 +180,7 @@ public class StoragePoolHostDaoImpl extends GenericDaoBase<StoragePoolHostVO, Lo
SearchCriteria<StoragePoolHostVO> sc = PoolHostSearch.create();
sc.setParameters("host_id", hostId);
sc.setParameters("pool_id", poolId);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
remove(sc);
txn.commit();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/StoragePoolWorkDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolWorkDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/StoragePoolWorkDaoImpl.java
index aa3e0df..df0b6f2 100644
--- a/engine/schema/src/com/cloud/storage/dao/StoragePoolWorkDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolWorkDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -125,7 +125,7 @@ public class StoragePoolWorkDaoImpl extends GenericDaoBase<StoragePoolWorkVO, Lo
StringBuilder sql = new StringBuilder(FindPoolIds);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql.toString());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
index a96524c..9af4ae8 100755
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java
@@ -57,7 +57,7 @@ import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -220,7 +220,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
List<Long> l = new ArrayList<Long>();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
@@ -421,7 +421,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
* permittedAccountsStr = permittedAccountsStr.substring(0,
* permittedAccountsStr.length() - 1); }
*
- * Transaction txn = Transaction.currentTxn(); txn.start();
+ * TransactionLegacy txn = TransactionLegacy.currentTxn(); txn.start();
*
* Set<Pair<Long, Long>> templateZonePairList = new HashSet<Pair<Long,
* Long>>(); PreparedStatement pstmt = null; ResultSet rs = null; String sql
@@ -505,7 +505,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
* permittedAccountsStr = permittedAccountsStr.substring(0,
* permittedAccountsStr.length()-1); }
*
- * Transaction txn = Transaction.currentTxn(); txn.start();
+ * TransactionLegacy txn = TransactionLegacy.currentTxn(); txn.start();
*
* // Use LinkedHashSet here to guarantee iteration order Set<Pair<Long,
* Long>> templateZonePairList = new LinkedHashSet<Pair<Long, Long>>();
@@ -720,7 +720,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
@Override
@DB
public long addTemplateToZone(VMTemplateVO tmplt, long zoneId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
VMTemplateVO tmplt2 = findById(tmplt.getId());
if (tmplt2 == null) {
@@ -855,7 +855,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
@Override
@DB
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
VMTemplateVO template = createForUpdate();
template.setRemoved(new Date());
@@ -890,7 +890,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase<VMTemplateVO, Long> implem
*
* final String permittedAccountsStr = join(",", permittedAccounts);
*
- * final Transaction txn = Transaction.currentTxn(); txn.start();
+ * final TransactionLegacy txn = TransactionLegacy.currentTxn(); txn.start();
*
* Set<Pair<Long, Long>> templateZonePairList = new HashSet<Pair<Long,
* Long>>(); PreparedStatement pstmt = null; ResultSet rs = null; try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
index 33b96c4..00aafba 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDetailsDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.storage.VMTemplateDetailVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = VMTemplateDetailsDao.class)
@@ -84,7 +84,7 @@ public class VMTemplateDetailsDaoImpl extends GenericDaoBase<VMTemplateDetailVO,
@Override
public void persist(long templateId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<VMTemplateDetailVO> sc = TemplateSearch.create();
sc.setParameters("templateId", templateId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java
index 85d8348..d6283b6 100755
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateHostDaoImpl.java
@@ -46,7 +46,7 @@ import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
@Component
@@ -163,7 +163,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
@Override
public void update(VMTemplateHostVO instance) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
Date now = new Date();
@@ -235,7 +235,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
@Override
public List<VMTemplateHostVO> listByTemplateStatus(long templateId, long datacenterId,
VMTemplateHostVO.Status downloadState) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<VMTemplateHostVO> result = new ArrayList<VMTemplateHostVO>();
try {
@@ -267,7 +267,7 @@ public class VMTemplateHostDaoImpl extends GenericDaoBase<VMTemplateHostVO, Long
@Override
public List<VMTemplateHostVO> listByTemplateStatus(long templateId, long datacenterId, long podId,
VMTemplateHostVO.Status downloadState) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<VMTemplateHostVO> result = new ArrayList<VMTemplateHostVO>();
ResultSet rs = null;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java
index ba8135b..b121297 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
@Component
@@ -150,7 +150,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase<VMTemplateStoragePoolV
@Override
public List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, long datacenterId,
VMTemplateStoragePoolVO.Status downloadState) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<VMTemplateStoragePoolVO> result = new ArrayList<VMTemplateStoragePoolVO>();
try {
@@ -173,7 +173,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase<VMTemplateStoragePoolV
@Override
public List<VMTemplateStoragePoolVO> listByTemplateStatus(long templateId, long datacenterId, long podId,
VMTemplateStoragePoolVO.Status downloadState) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<VMTemplateStoragePoolVO> result = new ArrayList<VMTemplateStoragePoolVO>();
ResultSet rs = null;
@@ -210,7 +210,7 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase<VMTemplateStoragePoolV
}
public List<VMTemplateStoragePoolVO> listByHostTemplate(long hostId, long templateId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<VMTemplateStoragePoolVO> result = new ArrayList<VMTemplateStoragePoolVO>();
ResultSet rs = null;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java
index c4a4dc7..a56959d 100644
--- a/engine/schema/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateZoneDaoImpl.java
@@ -27,7 +27,7 @@ import com.cloud.storage.VMTemplateZoneVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = { VMTemplateZoneDao.class })
@@ -89,7 +89,7 @@ public class VMTemplateZoneDaoImpl extends GenericDaoBase<VMTemplateZoneVO, Long
public void deletePrimaryRecordsForTemplate(long templateId) {
SearchCriteria<VMTemplateZoneVO> sc = TemplateSearch.create();
sc.setParameters("template_id", templateId);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
remove(sc);
txn.commit();
[05/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/projects/ProjectManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/projects/ProjectManagerImpl.java b/server/src/com/cloud/projects/ProjectManagerImpl.java
index a385739..193a49e 100755
--- a/server/src/com/cloud/projects/ProjectManagerImpl.java
+++ b/server/src/com/cloud/projects/ProjectManagerImpl.java
@@ -82,6 +82,10 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.sun.mail.smtp.SMTPMessage;
import com.sun.mail.smtp.SMTPSSLTransport;
@@ -175,7 +179,7 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
@Override
@ActionEvent(eventType = EventTypes.EVENT_PROJECT_CREATE, eventDescription = "creating project", create=true)
@DB
- public Project createProject(String name, String displayText, String accountName, Long domainId) throws ResourceAllocationException{
+ public Project createProject(final String name, final String displayText, String accountName, final Long domainId) throws ResourceAllocationException{
Account caller = CallContext.current().getCallingAccount();
Account owner = caller;
@@ -201,30 +205,32 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
//do resource limit check
_resourceLimitMgr.checkResourceLimit(owner, ResourceType.project);
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ final Account ownerFinal = owner;
+ return Transaction.execute(new TransactionCallback<Project>() {
+ @Override
+ public Project doInTransaction(TransactionStatus status) {
- //Create an account associated with the project
- StringBuilder acctNm = new StringBuilder("PrjAcct-");
- acctNm.append(name).append("-").append(owner.getDomainId());
-
- Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.ACCOUNT_TYPE_PROJECT, domainId, null, null, UUID.randomUUID().toString());
-
- Project project = _projectDao.persist(new ProjectVO(name, displayText, owner.getDomainId(), projectAccount.getId()));
-
- //assign owner to the project
- assignAccountToProject(project, owner.getId(), ProjectAccount.Role.Admin);
-
- if (project != null) {
- CallContext.current().setEventDetails("Project id=" + project.getId());
- }
-
- //Increment resource count
- _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.project);
-
- txn.commit();
+ //Create an account associated with the project
+ StringBuilder acctNm = new StringBuilder("PrjAcct-");
+ acctNm.append(name).append("-").append(ownerFinal.getDomainId());
+
+ Account projectAccount = _accountMgr.createAccount(acctNm.toString(), Account.ACCOUNT_TYPE_PROJECT, domainId, null, null, UUID.randomUUID().toString());
+
+ Project project = _projectDao.persist(new ProjectVO(name, displayText, ownerFinal.getDomainId(), projectAccount.getId()));
+
+ //assign owner to the project
+ assignAccountToProject(project, ownerFinal.getId(), ProjectAccount.Role.Admin);
+
+ if (project != null) {
+ CallContext.current().setEventDetails("Project id=" + project.getId());
+ }
+
+ //Increment resource count
+ _resourceLimitMgr.incrementResourceCount(ownerFinal.getId(), ResourceType.project);
- return project;
+ return project;
+ }
+ });
}
@@ -268,20 +274,24 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
@DB
@Override
- public boolean deleteProject(Account caller, long callerUserId, ProjectVO project) {
+ public boolean deleteProject(Account caller, long callerUserId, final ProjectVO project) {
//mark project as inactive first, so you can't add resources to it
- Transaction txn = Transaction.currentTxn();
- txn.start();
- s_logger.debug("Marking project id=" + project.getId() + " with state " + State.Disabled + " as a part of project delete...");
- project.setState(State.Disabled);
- boolean updateResult = _projectDao.update(project.getId(), project);
- //owner can be already removed at this point, so adding the conditional check
- Account projectOwner = getProjectOwner(project.getId());
- if (projectOwner != null) {
- _resourceLimitMgr.decrementResourceCount(projectOwner.getId(), ResourceType.project);
- }
+ boolean updateResult = Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ s_logger.debug("Marking project id=" + project.getId() + " with state " + State.Disabled + " as a part of project delete...");
+ project.setState(State.Disabled);
+ boolean updateResult = _projectDao.update(project.getId(), project);
+ //owner can be already removed at this point, so adding the conditional check
+ Account projectOwner = getProjectOwner(project.getId());
+ if (projectOwner != null) {
+ _resourceLimitMgr.decrementResourceCount(projectOwner.getId(), ResourceType.project);
+ }
+
+ return updateResult;
+ }
+ });
- txn.commit();
if (updateResult) {
//pass system caller when clenaup projects account
@@ -298,7 +308,7 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
}
@DB
- private boolean cleanupProject(Project project, AccountVO caller, Long callerUserId) {
+ private boolean cleanupProject(final Project project, AccountVO caller, Long callerUserId) {
boolean result=true;
//Delete project's account
AccountVO account = _accountDao.findById(project.getProjectAccountId());
@@ -308,20 +318,22 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
if (result) {
//Unassign all users from the project
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- s_logger.debug("Unassigning all accounts from project " + project + " as a part of project cleanup...");
- List<? extends ProjectAccount> projectAccounts = _projectAccountDao.listByProjectId(project.getId());
- for (ProjectAccount projectAccount : projectAccounts) {
- result = result && unassignAccountFromProject(projectAccount.getProjectId(), projectAccount.getAccountId());
- }
-
- s_logger.debug("Removing all invitations for the project " + project + " as a part of project cleanup...");
- _projectInvitationDao.cleanupInvitations(project.getId());
-
- txn.commit();
+ result = Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ boolean result = true;
+ s_logger.debug("Unassigning all accounts from project " + project + " as a part of project cleanup...");
+ List<? extends ProjectAccount> projectAccounts = _projectAccountDao.listByProjectId(project.getId());
+ for (ProjectAccount projectAccount : projectAccounts) {
+ result = result && unassignAccountFromProject(projectAccount.getProjectId(), projectAccount.getAccountId());
+ }
+
+ s_logger.debug("Removing all invitations for the project " + project + " as a part of project cleanup...");
+ _projectInvitationDao.cleanupInvitations(project.getId());
+
+ return result;
+ }
+ });
if (result) {
s_logger.debug("Accounts are unassign successfully from project " + project + " as a part of project cleanup...");
}
@@ -366,26 +378,28 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
}
@Override @DB
- public boolean deleteAccountFromProject(long projectId, long accountId) {
- boolean success = true;
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ public boolean deleteAccountFromProject(final long projectId, final long accountId) {
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ boolean success = true;
+
+ //remove account
+ ProjectAccountVO projectAccount = _projectAccountDao.findByProjectIdAccountId(projectId, accountId);
+ success = _projectAccountDao.remove(projectAccount.getId());
+
+ //remove all invitations for account
+ if (success) {
+ s_logger.debug("Removed account " + accountId + " from project " + projectId + " , cleaning up old invitations for account/project...");
+ ProjectInvitation invite = _projectInvitationDao.findByAccountIdProjectId(accountId, projectId);
+ if (invite != null) {
+ success = success && _projectInvitationDao.remove(invite.getId());
+ }
+ }
- //remove account
- ProjectAccountVO projectAccount = _projectAccountDao.findByProjectIdAccountId(projectId, accountId);
- success = _projectAccountDao.remove(projectAccount.getId());
-
- //remove all invitations for account
- if (success) {
- s_logger.debug("Removed account " + accountId + " from project " + projectId + " , cleaning up old invitations for account/project...");
- ProjectInvitation invite = _projectInvitationDao.findByAccountIdProjectId(accountId, projectId);
- if (invite != null) {
- success = success && _projectInvitationDao.remove(invite.getId());
+ return success;
}
- }
-
- txn.commit();
- return success;
+ });
}
@Override
@@ -442,11 +456,11 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
@Override @DB
@ActionEvent(eventType = EventTypes.EVENT_PROJECT_UPDATE, eventDescription = "updating project", async=true)
- public Project updateProject(long projectId, String displayText, String newOwnerName) throws ResourceAllocationException{
+ public Project updateProject(final long projectId, final String displayText, final String newOwnerName) throws ResourceAllocationException{
Account caller = CallContext.current().getCallingAccount();
//check that the project exists
- ProjectVO project = getProject(projectId);
+ final ProjectVO project = getProject(projectId);
if (project == null) {
throw new InvalidParameterValueException("Unable to find the project id=" + projectId);
@@ -455,47 +469,51 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
//verify permissions
_accountMgr.checkAccess(caller,AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
- Transaction txn = Transaction.currentTxn();
- txn.start();
- if (displayText != null) {
- project.setDisplayText(displayText);
- _projectDao.update(projectId, project);
- }
-
- if (newOwnerName != null) {
- //check that the new owner exists
- Account futureOwnerAccount = _accountMgr.getActiveAccountByName(newOwnerName, project.getDomainId());
- if (futureOwnerAccount == null) {
- throw new InvalidParameterValueException("Unable to find account name=" + newOwnerName + " in domain id=" + project.getDomainId());
- }
- Account currentOwnerAccount = getProjectOwner(projectId);
- if (currentOwnerAccount.getId() != futureOwnerAccount.getId()) {
- ProjectAccountVO futureOwner = _projectAccountDao.findByProjectIdAccountId(projectId, futureOwnerAccount.getAccountId());
- if (futureOwner == null) {
- throw new InvalidParameterValueException("Account " + newOwnerName + " doesn't belong to the project. Add it to the project first and then change the project's ownership");
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException {
+ if (displayText != null) {
+ project.setDisplayText(displayText);
+ _projectDao.update(projectId, project);
}
-
- //do resource limit check
- _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(futureOwnerAccount.getId()), ResourceType.project);
-
- //unset the role for the old owner
- ProjectAccountVO currentOwner = _projectAccountDao.findByProjectIdAccountId(projectId, currentOwnerAccount.getId());
- currentOwner.setAccountRole(Role.Regular);
- _projectAccountDao.update(currentOwner.getId(), currentOwner);
- _resourceLimitMgr.decrementResourceCount(currentOwnerAccount.getId(), ResourceType.project);
-
- //set new owner
- futureOwner.setAccountRole(Role.Admin);
- _projectAccountDao.update(futureOwner.getId(), futureOwner);
- _resourceLimitMgr.incrementResourceCount(futureOwnerAccount.getId(), ResourceType.project);
-
-
- } else {
- s_logger.trace("Future owner " + newOwnerName + "is already the owner of the project id=" + projectId);
+
+ if (newOwnerName != null) {
+ //check that the new owner exists
+ Account futureOwnerAccount = _accountMgr.getActiveAccountByName(newOwnerName, project.getDomainId());
+ if (futureOwnerAccount == null) {
+ throw new InvalidParameterValueException("Unable to find account name=" + newOwnerName + " in domain id=" + project.getDomainId());
+ }
+ Account currentOwnerAccount = getProjectOwner(projectId);
+ if (currentOwnerAccount.getId() != futureOwnerAccount.getId()) {
+ ProjectAccountVO futureOwner = _projectAccountDao.findByProjectIdAccountId(projectId, futureOwnerAccount.getAccountId());
+ if (futureOwner == null) {
+ throw new InvalidParameterValueException("Account " + newOwnerName + " doesn't belong to the project. Add it to the project first and then change the project's ownership");
+ }
+
+ //do resource limit check
+ _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(futureOwnerAccount.getId()), ResourceType.project);
+
+ //unset the role for the old owner
+ ProjectAccountVO currentOwner = _projectAccountDao.findByProjectIdAccountId(projectId, currentOwnerAccount.getId());
+ currentOwner.setAccountRole(Role.Regular);
+ _projectAccountDao.update(currentOwner.getId(), currentOwner);
+ _resourceLimitMgr.decrementResourceCount(currentOwnerAccount.getId(), ResourceType.project);
+
+ //set new owner
+ futureOwner.setAccountRole(Role.Admin);
+ _projectAccountDao.update(futureOwner.getId(), futureOwner);
+ _resourceLimitMgr.incrementResourceCount(futureOwnerAccount.getId(), ResourceType.project);
+
+
+ } else {
+ s_logger.trace("Future owner " + newOwnerName + "is already the owner of the project id=" + projectId);
+ }
+ }
+
+ return null;
}
- }
+ }, ResourceAllocationException.class);
- txn.commit();
return _projectDao.findById(projectId);
@@ -649,37 +667,40 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
}
@DB
- public boolean activeInviteExists(Project project, Long accountId, String email) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- //verify if the invitation was already generated
- ProjectInvitationVO invite = null;
- if (accountId != null) {
- invite = _projectInvitationDao.findByAccountIdProjectId(accountId, project.getId());
- } else if (email != null) {
- invite = _projectInvitationDao.findByEmailAndProjectId(email, project.getId());
- }
-
- if (invite != null) {
- if (invite.getState() == ProjectInvitation.State.Completed ||
- (invite.getState() == ProjectInvitation.State.Pending && _projectInvitationDao.isActive(invite.getId(), _invitationTimeOut))) {
- return true;
- } else {
- if (invite.getState() == ProjectInvitation.State.Pending) {
- expireInvitation(invite);
- }
- //remove the expired/declined invitation
+ public boolean activeInviteExists(final Project project, final Long accountId, final String email) {
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ //verify if the invitation was already generated
+ ProjectInvitationVO invite = null;
if (accountId != null) {
- s_logger.debug("Removing invitation in state " + invite.getState() + " for account id=" + accountId + " to project " + project);
+ invite = _projectInvitationDao.findByAccountIdProjectId(accountId, project.getId());
} else if (email != null) {
- s_logger.debug("Removing invitation in state " + invite.getState() + " for email " + email + " to project " + project);
+ invite = _projectInvitationDao.findByEmailAndProjectId(email, project.getId());
+ }
+
+ if (invite != null) {
+ if (invite.getState() == ProjectInvitation.State.Completed ||
+ (invite.getState() == ProjectInvitation.State.Pending && _projectInvitationDao.isActive(invite.getId(), _invitationTimeOut))) {
+ return true;
+ } else {
+ if (invite.getState() == ProjectInvitation.State.Pending) {
+ expireInvitation(invite);
+ }
+ //remove the expired/declined invitation
+ if (accountId != null) {
+ s_logger.debug("Removing invitation in state " + invite.getState() + " for account id=" + accountId + " to project " + project);
+ } else if (email != null) {
+ s_logger.debug("Removing invitation in state " + invite.getState() + " for email " + email + " to project " + project);
+ }
+
+ _projectInvitationDao.expunge(invite.getId());
+ }
}
- _projectInvitationDao.expunge(invite.getId());
+ return false;
}
- }
- txn.commit();
- return false;
+ });
}
public ProjectInvitation generateTokenBasedInvitation(Project project, String email, String token) {
@@ -710,7 +731,7 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
@Override @DB
@ActionEvent(eventType = EventTypes.EVENT_PROJECT_INVITATION_UPDATE, eventDescription = "updating project invitation", async=true)
- public boolean updateInvitation(long projectId, String accountName, String token, boolean accept) {
+ public boolean updateInvitation(final long projectId, String accountName, String token, final boolean accept) {
Account caller = CallContext.current().getCallingAccount();
Long accountId = null;
boolean result = true;
@@ -721,7 +742,7 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
}
//check that the project exists
- Project project = getProject(projectId);
+ final Project project = getProject(projectId);
if (project == null) {
throw new InvalidParameterValueException("Unable to find the project id=" + projectId);
@@ -755,29 +776,37 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
expireInvitation(invite);
throw new InvalidParameterValueException("Invitation is expired for account id=" + accountName + " to the project id=" + projectId);
} else {
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- ProjectInvitation.State newState = accept ? ProjectInvitation.State.Completed : ProjectInvitation.State.Declined;
-
- //update invitation
- s_logger.debug("Marking invitation " + invite + " with state " + newState);
- invite.setState(newState);
- result = _projectInvitationDao.update(invite.getId(), invite);
-
- if (result && accept) {
- //check if account already exists for the project (was added before invitation got accepted)
- ProjectAccount projectAccount = _projectAccountDao.findByProjectIdAccountId(projectId, accountId);
- if (projectAccount != null) {
- s_logger.debug("Account " + accountName + " already added to the project id=" + projectId);
- } else {
- assignAccountToProject(project, accountId, ProjectAccount.Role.Regular);
+
+ final ProjectInvitationVO inviteFinal = invite;
+ final Long accountIdFinal = accountId;
+ final String accountNameFinal = accountName;
+ result = Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ boolean result = true;
+
+ ProjectInvitation.State newState = accept ? ProjectInvitation.State.Completed : ProjectInvitation.State.Declined;
+
+ //update invitation
+ s_logger.debug("Marking invitation " + inviteFinal + " with state " + newState);
+ inviteFinal.setState(newState);
+ result = _projectInvitationDao.update(inviteFinal.getId(), inviteFinal);
+
+ if (result && accept) {
+ //check if account already exists for the project (was added before invitation got accepted)
+ ProjectAccount projectAccount = _projectAccountDao.findByProjectIdAccountId(projectId, accountIdFinal);
+ if (projectAccount != null) {
+ s_logger.debug("Account " + accountNameFinal + " already added to the project id=" + projectId);
+ } else {
+ assignAccountToProject(project, accountIdFinal, ProjectAccount.Role.Regular);
+ }
+ } else {
+ s_logger.warn("Failed to update project invitation " + inviteFinal + " with state " + newState);
+ }
+
+ return result;
}
- } else {
- s_logger.warn("Failed to update project invitation " + invite + " with state " + newState);
- }
-
- txn.commit();
+ });
}
} else {
throw new InvalidParameterValueException("Unable to find invitation for account name=" + accountName + " to the project id=" + projectId);
@@ -794,11 +823,11 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
@Override
@ActionEvent(eventType = EventTypes.EVENT_PROJECT_ACTIVATE, eventDescription = "activating project")
@DB
- public Project activateProject(long projectId) {
+ public Project activateProject(final long projectId) {
Account caller = CallContext.current().getCallingAccount();
//check that the project exists
- ProjectVO project = getProject(projectId);
+ final ProjectVO project = getProject(projectId);
if (project == null) {
InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find project with specified id");
@@ -821,15 +850,15 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
throw new InvalidParameterValueException("Can't activate the project in " + currentState + " state");
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- project.setState(Project.State.Active);
- _projectDao.update(projectId, project);
-
- _accountMgr.enableAccount(project.getProjectAccountId());
-
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ project.setState(Project.State.Active);
+ _projectDao.update(projectId, project);
+
+ _accountMgr.enableAccount(project.getProjectAccountId());
+ }
+ });
return _projectDao.findById(projectId);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/resource/ResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java
index 7a9343c..2a245f1 100755
--- a/server/src/com/cloud/resource/ResourceManagerImpl.java
+++ b/server/src/com/cloud/resource/ResourceManagerImpl.java
@@ -143,6 +143,9 @@ import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
@@ -783,10 +786,10 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
}
@DB
- protected boolean doDeleteHost(long hostId, boolean isForced, boolean isForceDeleteStorage) {
+ protected boolean doDeleteHost(final long hostId, boolean isForced, final boolean isForceDeleteStorage) {
User caller = _accountMgr.getActiveUser(CallContext.current().getCallingUserId());
// Verify that host exists
- HostVO host = _hostDao.findById(hostId);
+ final HostVO host = _hostDao.findById(hostId);
if (host == null) {
throw new InvalidParameterValueException("Host with id " + hostId + " doesn't exist");
}
@@ -799,7 +802,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
// Get storage pool host mappings here because they can be removed as a
// part of handleDisconnect later
// TODO: find out the bad boy, what's a buggy logic!
- List<StoragePoolHostVO> pools = _storagePoolHostDao.listByHostIdIncludingRemoved(hostId);
+ final List<StoragePoolHostVO> pools = _storagePoolHostDao.listByHostIdIncludingRemoved(hostId);
ResourceStateAdapter.DeleteHostAnswer answer = (ResourceStateAdapter.DeleteHostAnswer)dispatchToStateAdapters(ResourceStateAdapter.Event.DELETE_HOST, false, host,
new Boolean(isForced), new Boolean(isForceDeleteStorage));
@@ -817,74 +820,77 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
return true;
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- _dcDao.releasePrivateIpAddress(host.getPrivateIpAddress(), host.getDataCenterId(), null);
- _agentMgr.disconnectWithoutInvestigation(hostId, Status.Event.Remove);
-
- // delete host details
- _hostDetailsDao.deleteDetails(hostId);
-
- host.setGuid(null);
- Long clusterId = host.getClusterId();
- host.setClusterId(null);
- _hostDao.update(host.getId(), host);
-
- _hostDao.remove(hostId);
- if (clusterId != null) {
- List<HostVO> hosts = listAllHostsInCluster(clusterId);
- if (hosts.size() == 0) {
- ClusterVO cluster = _clusterDao.findById(clusterId);
- cluster.setGuid(null);
- _clusterDao.update(clusterId, cluster);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+
+ _dcDao.releasePrivateIpAddress(host.getPrivateIpAddress(), host.getDataCenterId(), null);
+ _agentMgr.disconnectWithoutInvestigation(hostId, Status.Event.Remove);
+
+ // delete host details
+ _hostDetailsDao.deleteDetails(hostId);
+
+ host.setGuid(null);
+ Long clusterId = host.getClusterId();
+ host.setClusterId(null);
+ _hostDao.update(host.getId(), host);
+
+ _hostDao.remove(hostId);
+ if (clusterId != null) {
+ List<HostVO> hosts = listAllHostsInCluster(clusterId);
+ if (hosts.size() == 0) {
+ ClusterVO cluster = _clusterDao.findById(clusterId);
+ cluster.setGuid(null);
+ _clusterDao.update(clusterId, cluster);
+ }
+ }
+
+ try {
+ resourceStateTransitTo(host, ResourceState.Event.DeleteHost, _nodeId);
+ } catch (NoTransitionException e) {
+ s_logger.debug("Cannot transmit host " + host.getId() + "to Enabled state", e);
+ }
+
+ // Delete the associated entries in host ref table
+ _storagePoolHostDao.deletePrimaryRecordsForHost(hostId);
+
+ // Make sure any VMs that were marked as being on this host are cleaned up
+ List<VMInstanceVO> vms = _vmDao.listByHostId(hostId);
+ for (VMInstanceVO vm : vms) {
+ // this is how VirtualMachineManagerImpl does it when it syncs VM states
+ vm.setState(State.Stopped);
+ vm.setHostId(null);
+ _vmDao.persist(vm);
+ }
+
+ // For pool ids you got, delete local storage host entries in pool table
+ // where
+ for (StoragePoolHostVO pool : pools) {
+ Long poolId = pool.getPoolId();
+ StoragePoolVO storagePool = _storagePoolDao.findById(poolId);
+ if (storagePool.isLocal() && isForceDeleteStorage) {
+ storagePool.setUuid(null);
+ storagePool.setClusterId(null);
+ _storagePoolDao.update(poolId, storagePool);
+ _storagePoolDao.remove(poolId);
+ s_logger.debug("Local storage id=" + poolId + " is removed as a part of host removal id=" + hostId);
+ }
+ }
+
+ // delete the op_host_capacity entry
+ Object[] capacityTypes = {Capacity.CAPACITY_TYPE_CPU, Capacity.CAPACITY_TYPE_MEMORY};
+ SearchCriteria<CapacityVO> hostCapacitySC = _capacityDao.createSearchCriteria();
+ hostCapacitySC.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, hostId);
+ hostCapacitySC.addAnd("capacityType", SearchCriteria.Op.IN, capacityTypes);
+ _capacityDao.remove(hostCapacitySC);
+ // remove from dedicated resources
+ DedicatedResourceVO dr = _dedicatedDao.findByHostId(hostId);
+ if (dr != null) {
+ _dedicatedDao.remove(dr.getId());
+ }
}
- }
-
- try {
- resourceStateTransitTo(host, ResourceState.Event.DeleteHost, _nodeId);
- } catch (NoTransitionException e) {
- s_logger.debug("Cannot transmit host " + host.getId() + "to Enabled state", e);
- }
-
- // Delete the associated entries in host ref table
- _storagePoolHostDao.deletePrimaryRecordsForHost(hostId);
+ });
- // Make sure any VMs that were marked as being on this host are cleaned up
- List<VMInstanceVO> vms = _vmDao.listByHostId(hostId);
- for (VMInstanceVO vm : vms) {
- // this is how VirtualMachineManagerImpl does it when it syncs VM states
- vm.setState(State.Stopped);
- vm.setHostId(null);
- _vmDao.persist(vm);
- }
-
- // For pool ids you got, delete local storage host entries in pool table
- // where
- for (StoragePoolHostVO pool : pools) {
- Long poolId = pool.getPoolId();
- StoragePoolVO storagePool = _storagePoolDao.findById(poolId);
- if (storagePool.isLocal() && isForceDeleteStorage) {
- storagePool.setUuid(null);
- storagePool.setClusterId(null);
- _storagePoolDao.update(poolId, storagePool);
- _storagePoolDao.remove(poolId);
- s_logger.debug("Local storage id=" + poolId + " is removed as a part of host removal id=" + hostId);
- }
- }
-
- // delete the op_host_capacity entry
- Object[] capacityTypes = {Capacity.CAPACITY_TYPE_CPU, Capacity.CAPACITY_TYPE_MEMORY};
- SearchCriteria<CapacityVO> hostCapacitySC = _capacityDao.createSearchCriteria();
- hostCapacitySC.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, hostId);
- hostCapacitySC.addAnd("capacityType", SearchCriteria.Op.IN, capacityTypes);
- _capacityDao.remove(hostCapacitySC);
- // remove from dedicated resources
- DedicatedResourceVO dr = _dedicatedDao.findByHostId(hostId);
- if (dr != null) {
- _dedicatedDao.remove(dr.getId());
- }
- txn.commit();
return true;
}
@@ -904,63 +910,61 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
@Override
@DB
- public boolean deleteCluster(DeleteClusterCmd cmd) {
- Transaction txn = Transaction.currentTxn();
+ public boolean deleteCluster(final DeleteClusterCmd cmd) {
try {
- txn.start();
- ClusterVO cluster = _clusterDao.lockRow(cmd.getId(), true);
- if (cluster == null) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Cluster: " + cmd.getId() + " does not even exist. Delete call is ignored.");
- }
- txn.rollback();
- throw new CloudRuntimeException("Cluster: " + cmd.getId() + " does not exist");
- }
-
- Hypervisor.HypervisorType hypervisorType = cluster.getHypervisorType();
-
- List<HostVO> hosts = listAllHostsInCluster(cmd.getId());
- if (hosts.size() > 0) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Cluster: " + cmd.getId() + " still has hosts, can't remove");
- }
- txn.rollback();
- throw new CloudRuntimeException("Cluster: " + cmd.getId() + " cannot be removed. Cluster still has hosts");
- }
-
- // don't allow to remove the cluster if it has non-removed storage
- // pools
- List<StoragePoolVO> storagePools = _storagePoolDao.listPoolsByCluster(cmd.getId());
- if (storagePools.size() > 0) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Cluster: " + cmd.getId() + " still has storage pools, can't remove");
- }
- txn.rollback();
- throw new CloudRuntimeException("Cluster: " + cmd.getId() + " cannot be removed. Cluster still has storage pools");
- }
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ ClusterVO cluster = _clusterDao.lockRow(cmd.getId(), true);
+ if (cluster == null) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Cluster: " + cmd.getId() + " does not even exist. Delete call is ignored.");
+ }
+ throw new CloudRuntimeException("Cluster: " + cmd.getId() + " does not exist");
+ }
+
+ Hypervisor.HypervisorType hypervisorType = cluster.getHypervisorType();
+
+ List<HostVO> hosts = listAllHostsInCluster(cmd.getId());
+ if (hosts.size() > 0) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Cluster: " + cmd.getId() + " still has hosts, can't remove");
+ }
+ throw new CloudRuntimeException("Cluster: " + cmd.getId() + " cannot be removed. Cluster still has hosts");
+ }
+
+ // don't allow to remove the cluster if it has non-removed storage
+ // pools
+ List<StoragePoolVO> storagePools = _storagePoolDao.listPoolsByCluster(cmd.getId());
+ if (storagePools.size() > 0) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Cluster: " + cmd.getId() + " still has storage pools, can't remove");
+ }
+ throw new CloudRuntimeException("Cluster: " + cmd.getId() + " cannot be removed. Cluster still has storage pools");
+ }
+
+ if (_clusterDao.remove(cmd.getId())) {
+ _capacityDao.removeBy(null, null, null, cluster.getId(), null);
+ // If this cluster is of type vmware, and if the nexus vswitch
+ // global parameter setting is turned
+ // on, remove the row in cluster_vsm_map for this cluster id.
+ if (hypervisorType == HypervisorType.VMware && Boolean.parseBoolean(_configDao.getValue(Config.VmwareUseNexusVSwitch.toString()))) {
+ _clusterVSMMapDao.removeByClusterId(cmd.getId());
+ }
+ // remove from dedicated resources
+ DedicatedResourceVO dr = _dedicatedDao.findByClusterId(cluster.getId());
+ if (dr != null) {
+ _dedicatedDao.remove(dr.getId());
+ }
+ }
- if (_clusterDao.remove(cmd.getId())) {
- _capacityDao.removeBy(null, null, null, cluster.getId(), null);
- // If this cluster is of type vmware, and if the nexus vswitch
- // global parameter setting is turned
- // on, remove the row in cluster_vsm_map for this cluster id.
- if (hypervisorType == HypervisorType.VMware && Boolean.parseBoolean(_configDao.getValue(Config.VmwareUseNexusVSwitch.toString()))) {
- _clusterVSMMapDao.removeByClusterId(cmd.getId());
- }
- // remove from dedicated resources
- DedicatedResourceVO dr = _dedicatedDao.findByClusterId(cluster.getId());
- if (dr != null) {
- _dedicatedDao.remove(dr.getId());
}
- }
-
- txn.commit();
+ });
return true;
} catch (CloudRuntimeException e) {
throw e;
} catch (Throwable t) {
s_logger.error("Unable to delete cluster: " + cmd.getId(), t);
- txn.rollback();
return false;
}
}
@@ -1034,26 +1038,15 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
}
if (doUpdate) {
- Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
- _clusterDao.update(cluster.getId(), cluster);
- txn.commit();
- } catch (Exception e) {
- s_logger.error("Unable to update cluster due to " + e.getMessage(), e);
- throw new CloudRuntimeException("Failed to update cluster. Please contact Cloud Support.");
- }
+ _clusterDao.update(cluster.getId(), cluster);
}
if (newManagedState != null && !newManagedState.equals(oldManagedState)) {
- Transaction txn = Transaction.currentTxn();
if (newManagedState.equals(Managed.ManagedState.Unmanaged)) {
boolean success = false;
try {
- txn.start();
cluster.setManagedState(Managed.ManagedState.PrepareUnmanaged);
_clusterDao.update(cluster.getId(), cluster);
- txn.commit();
List<HostVO> hosts = listAllUpAndEnabledHosts(Host.Type.Routing, cluster.getId(), cluster.getPodId(), cluster.getDataCenterId());
for (HostVO host : hosts) {
if (host.getType().equals(Host.Type.Routing) && !host.getStatus().equals(Status.Down) && !host.getStatus().equals(Status.Disconnected) &&
@@ -1092,16 +1085,12 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
throw new CloudRuntimeException("PrepareUnmanaged Failed due to some hosts are still in UP status after 5 Minutes, please try later ");
}
} finally {
- txn.start();
cluster.setManagedState(success ? Managed.ManagedState.Unmanaged : Managed.ManagedState.PrepareUnmanagedError);
_clusterDao.update(cluster.getId(), cluster);
- txn.commit();
}
} else if (newManagedState.equals(Managed.ManagedState.Managed)) {
- txn.start();
cluster.setManagedState(Managed.ManagedState.Managed);
_clusterDao.update(cluster.getId(), cluster);
- txn.commit();
}
}
@@ -2459,35 +2448,37 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager,
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_HOST_RESERVATION_RELEASE, eventDescription = "releasing host reservation", async = true)
- public boolean releaseHostReservation(Long hostId) {
- Transaction txn = Transaction.currentTxn();
+ public boolean releaseHostReservation(final Long hostId) {
try {
- txn.start();
- PlannerHostReservationVO reservationEntry = _plannerHostReserveDao.findByHostId(hostId);
- if (reservationEntry != null) {
- long id = reservationEntry.getId();
- PlannerHostReservationVO hostReservation = _plannerHostReserveDao.lockRow(id, true);
- if (hostReservation == null) {
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ PlannerHostReservationVO reservationEntry = _plannerHostReserveDao.findByHostId(hostId);
+ if (reservationEntry != null) {
+ long id = reservationEntry.getId();
+ PlannerHostReservationVO hostReservation = _plannerHostReserveDao.lockRow(id, true);
+ if (hostReservation == null) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Host reservation for host: " + hostId + " does not even exist. Release reservartion call is ignored.");
+ }
+ return false;
+ }
+ hostReservation.setResourceUsage(null);
+ _plannerHostReserveDao.persist(hostReservation);
+ return true;
+ }
+
if (s_logger.isDebugEnabled()) {
s_logger.debug("Host reservation for host: " + hostId + " does not even exist. Release reservartion call is ignored.");
}
- txn.rollback();
+
return false;
}
- hostReservation.setResourceUsage(null);
- _plannerHostReserveDao.persist(hostReservation);
- txn.commit();
- return true;
- }
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Host reservation for host: " + hostId + " does not even exist. Release reservartion call is ignored.");
- }
- return false;
+ });
} catch (CloudRuntimeException e) {
throw e;
} catch (Throwable t) {
s_logger.error("Unable to release host reservation for host: " + hostId, t);
- txn.rollback();
return false;
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
index 1f8713a..bfe32ec 100755
--- a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
+++ b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
@@ -90,6 +90,10 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
@@ -361,8 +365,8 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
@Override
@DB
- public void checkResourceLimit(Account account, ResourceType type, long... count) throws ResourceAllocationException {
- long numResources = ((count.length == 0) ? 1 : count[0]);
+ public void checkResourceLimit(final Account account, final ResourceType type, long... count) throws ResourceAllocationException {
+ final long numResources = ((count.length == 0) ? 1 : count[0]);
Project project = null;
// Don't place any limits on system or root admin accounts
@@ -374,53 +378,55 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
project = _projectDao.findByProjectAccountId(account.getId());
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
- try {
- // Lock all rows first so nobody else can read it
- Set<Long> rowIdsToLock = _resourceCountDao.listAllRowsToUpdate(account.getId(), ResourceOwnerType.Account, type);
- SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
- sc.setParameters("id", rowIdsToLock.toArray());
- _resourceCountDao.lockRows(sc, null, true);
-
- // Check account limits
- long accountLimit = findCorrectResourceLimitForAccount(account, type);
- long potentialCount = _resourceCountDao.getResourceCount(account.getId(), ResourceOwnerType.Account, type) + numResources;
- if (accountLimit != Resource.RESOURCE_UNLIMITED && potentialCount > accountLimit) {
- String message = "Maximum number of resources of type '" + type + "' for account name=" + account.getAccountName()
- + " in domain id=" + account.getDomainId() + " has been exceeded.";
- if (project != null) {
- message = "Maximum number of resources of type '" + type + "' for project name=" + project.getName()
+ final Project projectFinal = project;
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException {
+ // Lock all rows first so nobody else can read it
+ Set<Long> rowIdsToLock = _resourceCountDao.listAllRowsToUpdate(account.getId(), ResourceOwnerType.Account, type);
+ SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
+ sc.setParameters("id", rowIdsToLock.toArray());
+ _resourceCountDao.lockRows(sc, null, true);
+
+ // Check account limits
+ long accountLimit = findCorrectResourceLimitForAccount(account, type);
+ long potentialCount = _resourceCountDao.getResourceCount(account.getId(), ResourceOwnerType.Account, type) + numResources;
+ if (accountLimit != Resource.RESOURCE_UNLIMITED && potentialCount > accountLimit) {
+ String message = "Maximum number of resources of type '" + type + "' for account name=" + account.getAccountName()
+ " in domain id=" + account.getDomainId() + " has been exceeded.";
+ if (projectFinal != null) {
+ message = "Maximum number of resources of type '" + type + "' for project name=" + projectFinal.getName()
+ + " in domain id=" + account.getDomainId() + " has been exceeded.";
+ }
+ throw new ResourceAllocationException(message, type);
}
- throw new ResourceAllocationException(message, type);
- }
-
- // check all domains in the account's domain hierarchy
- Long domainId = null;
- if (project != null) {
- domainId = project.getDomainId();
- } else {
- domainId = account.getDomainId();
- }
-
- while (domainId != null) {
- DomainVO domain = _domainDao.findById(domainId);
- // no limit check if it is ROOT domain
- if (domainId != Domain.ROOT_DOMAIN) {
- ResourceLimitVO domainLimit = _resourceLimitDao.findByOwnerIdAndType(domainId, ResourceOwnerType.Domain, type);
- if (domainLimit != null && domainLimit.getMax().longValue() != Resource.RESOURCE_UNLIMITED) {
- long domainCount = _resourceCountDao.getResourceCount(domainId, ResourceOwnerType.Domain, type);
- if ((domainCount + numResources) > domainLimit.getMax().longValue()) {
- throw new ResourceAllocationException("Maximum number of resources of type '" + type + "' for domain id=" + domainId + " has been exceeded.", type);
+
+ // check all domains in the account's domain hierarchy
+ Long domainId = null;
+ if (projectFinal != null) {
+ domainId = projectFinal.getDomainId();
+ } else {
+ domainId = account.getDomainId();
+ }
+
+ while (domainId != null) {
+ DomainVO domain = _domainDao.findById(domainId);
+ // no limit check if it is ROOT domain
+ if (domainId != Domain.ROOT_DOMAIN) {
+ ResourceLimitVO domainLimit = _resourceLimitDao.findByOwnerIdAndType(domainId, ResourceOwnerType.Domain, type);
+ if (domainLimit != null && domainLimit.getMax().longValue() != Resource.RESOURCE_UNLIMITED) {
+ long domainCount = _resourceCountDao.getResourceCount(domainId, ResourceOwnerType.Domain, type);
+ if ((domainCount + numResources) > domainLimit.getMax().longValue()) {
+ throw new ResourceAllocationException("Maximum number of resources of type '" + type + "' for domain id=" + domainId + " has been exceeded.", type);
+ }
}
}
+ domainId = domain.getParent();
}
- domainId = domain.getParent();
+
+ return null;
}
- } finally {
- txn.commit();
- }
+ }, ResourceAllocationException.class);
}
@Override
@@ -716,143 +722,143 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
}
@DB
- protected boolean updateResourceCountForAccount(long accountId, ResourceType type, boolean increment, long delta) {
- boolean result = true;
+ protected boolean updateResourceCountForAccount(final long accountId, final ResourceType type, final boolean increment, final long delta) {
try {
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- Set<Long> rowsToLock = _resourceCountDao.listAllRowsToUpdate(accountId, ResourceOwnerType.Account, type);
-
- // Lock rows first
- SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
- sc.setParameters("id", rowsToLock.toArray());
- List<ResourceCountVO> rowsToUpdate = _resourceCountDao.lockRows(sc, null, true);
-
- for (ResourceCountVO rowToUpdate : rowsToUpdate) {
- if (!_resourceCountDao.updateById(rowToUpdate.getId(), increment, delta)) {
- s_logger.trace("Unable to update resource count for the row " + rowToUpdate);
- result = false;
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ boolean result = true;
+ Set<Long> rowsToLock = _resourceCountDao.listAllRowsToUpdate(accountId, ResourceOwnerType.Account, type);
+
+ // Lock rows first
+ SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
+ sc.setParameters("id", rowsToLock.toArray());
+ List<ResourceCountVO> rowsToUpdate = _resourceCountDao.lockRows(sc, null, true);
+
+ for (ResourceCountVO rowToUpdate : rowsToUpdate) {
+ if (!_resourceCountDao.updateById(rowToUpdate.getId(), increment, delta)) {
+ s_logger.trace("Unable to update resource count for the row " + rowToUpdate);
+ result = false;
+ }
+ }
+
+ return result;
}
- }
-
- txn.commit();
+ });
} catch (Exception ex) {
s_logger.error("Failed to update resource count for account id=" + accountId);
- result = false;
+ return false;
}
- return result;
}
@DB
- protected long recalculateDomainResourceCount(long domainId, ResourceType type) {
- long newCount = 0;
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- try {
- // Lock all rows first so nobody else can read it
- Set<Long> rowIdsToLock = _resourceCountDao.listAllRowsToUpdate(domainId, ResourceOwnerType.Domain, type);
- SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
- sc.setParameters("id", rowIdsToLock.toArray());
- _resourceCountDao.lockRows(sc, null, true);
-
- ResourceCountVO domainRC = _resourceCountDao.findByOwnerAndType(domainId, ResourceOwnerType.Domain, type);
- long oldCount = domainRC.getCount();
-
- List<DomainVO> domainChildren = _domainDao.findImmediateChildrenForParent(domainId);
- // for each child domain update the resource count
- if (type.supportsOwner(ResourceOwnerType.Domain)) {
-
- // calculate project count here
- if (type == ResourceType.project) {
- newCount = newCount + _projectDao.countProjectsForDomain(domainId);
+ protected long recalculateDomainResourceCount(final long domainId, final ResourceType type) {
+ return Transaction.execute(new TransactionCallback<Long>() {
+ @Override
+ public Long doInTransaction(TransactionStatus status) {
+ long newCount = 0;
+
+ // Lock all rows first so nobody else can read it
+ Set<Long> rowIdsToLock = _resourceCountDao.listAllRowsToUpdate(domainId, ResourceOwnerType.Domain, type);
+ SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
+ sc.setParameters("id", rowIdsToLock.toArray());
+ _resourceCountDao.lockRows(sc, null, true);
+
+ ResourceCountVO domainRC = _resourceCountDao.findByOwnerAndType(domainId, ResourceOwnerType.Domain, type);
+ long oldCount = domainRC.getCount();
+
+ List<DomainVO> domainChildren = _domainDao.findImmediateChildrenForParent(domainId);
+ // for each child domain update the resource count
+ if (type.supportsOwner(ResourceOwnerType.Domain)) {
+
+ // calculate project count here
+ if (type == ResourceType.project) {
+ newCount = newCount + _projectDao.countProjectsForDomain(domainId);
+ }
+
+ for (DomainVO domainChild : domainChildren) {
+ long domainCount = recalculateDomainResourceCount(domainChild.getId(), type);
+ newCount = newCount + domainCount; // add the child domain count to parent domain count
+ }
}
-
- for (DomainVO domainChild : domainChildren) {
- long domainCount = recalculateDomainResourceCount(domainChild.getId(), type);
- newCount = newCount + domainCount; // add the child domain count to parent domain count
+
+ if (type.supportsOwner(ResourceOwnerType.Account)) {
+ List<AccountVO> accounts = _accountDao.findActiveAccountsForDomain(domainId);
+ for (AccountVO account : accounts) {
+ long accountCount = recalculateAccountResourceCount(account.getId(), type);
+ newCount = newCount + accountCount; // add account's resource count to parent domain count
+ }
}
- }
-
- if (type.supportsOwner(ResourceOwnerType.Account)) {
- List<AccountVO> accounts = _accountDao.findActiveAccountsForDomain(domainId);
- for (AccountVO account : accounts) {
- long accountCount = recalculateAccountResourceCount(account.getId(), type);
- newCount = newCount + accountCount; // add account's resource count to parent domain count
+ _resourceCountDao.setResourceCount(domainId, ResourceOwnerType.Domain, type, newCount);
+
+ if (oldCount != newCount) {
+ s_logger.info("Discrepency in the resource count " + "(original count=" + oldCount + " correct count = " +
+ newCount + ") for type " + type + " for domain ID " + domainId + " is fixed during resource count recalculation.");
}
+
+ return newCount;
}
- _resourceCountDao.setResourceCount(domainId, ResourceOwnerType.Domain, type, newCount);
-
- if (oldCount != newCount) {
- s_logger.info("Discrepency in the resource count " + "(original count=" + oldCount + " correct count = " +
- newCount + ") for type " + type + " for domain ID " + domainId + " is fixed during resource count recalculation.");
- }
- } catch (Exception e) {
- throw new CloudRuntimeException("Failed to update resource count for domain with Id " + domainId);
- } finally {
- txn.commit();
- }
-
- return newCount;
+ });
}
@DB
- protected long recalculateAccountResourceCount(long accountId, ResourceType type) {
- Long newCount = null;
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- // this lock guards against the updates to user_vm, volume, snapshot, public _ip and template table
- // as any resource creation precedes with the resourceLimitExceeded check which needs this lock too
- SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
- sc.setParameters("accountId", accountId);
- _resourceCountDao.lockRows(sc, null, true);
-
- ResourceCountVO accountRC = _resourceCountDao.findByOwnerAndType(accountId, ResourceOwnerType.Account, type);
- long oldCount = 0;
- if (accountRC != null)
- oldCount = accountRC.getCount();
-
- if (type == Resource.ResourceType.user_vm) {
- newCount = _userVmDao.countAllocatedVMsForAccount(accountId);
- } else if (type == Resource.ResourceType.volume) {
- newCount = _volumeDao.countAllocatedVolumesForAccount(accountId);
- long virtualRouterCount = _vmDao.findIdsOfAllocatedVirtualRoutersForAccount(accountId).size();
- newCount = newCount - virtualRouterCount; // don't count the volumes of virtual router
- } else if (type == Resource.ResourceType.snapshot) {
- newCount = _snapshotDao.countSnapshotsForAccount(accountId);
- } else if (type == Resource.ResourceType.public_ip) {
- newCount = calculatePublicIpForAccount(accountId);
- } else if (type == Resource.ResourceType.template) {
- newCount = _vmTemplateDao.countTemplatesForAccount(accountId);
- } else if (type == Resource.ResourceType.project) {
- newCount = _projectAccountDao.countByAccountIdAndRole(accountId, Role.Admin);
- } else if (type == Resource.ResourceType.network) {
- newCount = _networkDao.countNetworksUserCanCreate(accountId);
- } else if (type == Resource.ResourceType.vpc) {
- newCount = _vpcDao.countByAccountId(accountId);
- } else if (type == Resource.ResourceType.cpu) {
- newCount = countCpusForAccount(accountId);
- } else if (type == Resource.ResourceType.memory) {
- newCount = calculateMemoryForAccount(accountId);
- } else if (type == Resource.ResourceType.primary_storage) {
- List<Long> virtualRouters = _vmDao.findIdsOfAllocatedVirtualRoutersForAccount(accountId);
- newCount = _volumeDao.primaryStorageUsedForAccount(accountId, virtualRouters);
- } else if (type == Resource.ResourceType.secondary_storage) {
- newCount = calculateSecondaryStorageForAccount(accountId);
- } else {
- throw new InvalidParameterValueException("Unsupported resource type " + type);
- }
- _resourceCountDao.setResourceCount(accountId, ResourceOwnerType.Account, type, (newCount == null) ? 0 : newCount.longValue());
-
- if (oldCount != newCount) {
- s_logger.info("Discrepency in the resource count " + "(original count=" + oldCount + " correct count = " +
- newCount + ") for type " + type + " for account ID " + accountId + " is fixed during resource count recalculation.");
- }
- txn.commit();
+ protected long recalculateAccountResourceCount(final long accountId, final ResourceType type) {
+ Long newCount = Transaction.execute(new TransactionCallback<Long>() {
+ @Override
+ public Long doInTransaction(TransactionStatus status) {
+ Long newCount = null;
+
+ // this lock guards against the updates to user_vm, volume, snapshot, public _ip and template table
+ // as any resource creation precedes with the resourceLimitExceeded check which needs this lock too
+ SearchCriteria<ResourceCountVO> sc = ResourceCountSearch.create();
+ sc.setParameters("accountId", accountId);
+ _resourceCountDao.lockRows(sc, null, true);
+
+ ResourceCountVO accountRC = _resourceCountDao.findByOwnerAndType(accountId, ResourceOwnerType.Account, type);
+ long oldCount = 0;
+ if (accountRC != null)
+ oldCount = accountRC.getCount();
+
+ if (type == Resource.ResourceType.user_vm) {
+ newCount = _userVmDao.countAllocatedVMsForAccount(accountId);
+ } else if (type == Resource.ResourceType.volume) {
+ newCount = _volumeDao.countAllocatedVolumesForAccount(accountId);
+ long virtualRouterCount = _vmDao.findIdsOfAllocatedVirtualRoutersForAccount(accountId).size();
+ newCount = newCount - virtualRouterCount; // don't count the volumes of virtual router
+ } else if (type == Resource.ResourceType.snapshot) {
+ newCount = _snapshotDao.countSnapshotsForAccount(accountId);
+ } else if (type == Resource.ResourceType.public_ip) {
+ newCount = calculatePublicIpForAccount(accountId);
+ } else if (type == Resource.ResourceType.template) {
+ newCount = _vmTemplateDao.countTemplatesForAccount(accountId);
+ } else if (type == Resource.ResourceType.project) {
+ newCount = _projectAccountDao.countByAccountIdAndRole(accountId, Role.Admin);
+ } else if (type == Resource.ResourceType.network) {
+ newCount = _networkDao.countNetworksUserCanCreate(accountId);
+ } else if (type == Resource.ResourceType.vpc) {
+ newCount = _vpcDao.countByAccountId(accountId);
+ } else if (type == Resource.ResourceType.cpu) {
+ newCount = countCpusForAccount(accountId);
+ } else if (type == Resource.ResourceType.memory) {
+ newCount = calculateMemoryForAccount(accountId);
+ } else if (type == Resource.ResourceType.primary_storage) {
+ List<Long> virtualRouters = _vmDao.findIdsOfAllocatedVirtualRoutersForAccount(accountId);
+ newCount = _volumeDao.primaryStorageUsedForAccount(accountId, virtualRouters);
+ } else if (type == Resource.ResourceType.secondary_storage) {
+ newCount = calculateSecondaryStorageForAccount(accountId);
+ } else {
+ throw new InvalidParameterValueException("Unsupported resource type " + type);
+ }
+ _resourceCountDao.setResourceCount(accountId, ResourceOwnerType.Account, type, (newCount == null) ? 0 : newCount.longValue());
+
+ if (oldCount != newCount) {
+ s_logger.info("Discrepency in the resource count " + "(original count=" + oldCount + " correct count = " +
+ newCount + ") for type " + type + " for account ID " + accountId + " is fixed during resource count recalculation.");
+ }
+
+ return newCount;
+ }
+ });
return (newCount == null) ? 0 : newCount.longValue();
}
[20/20] git commit: updated refs/heads/txn-refactor to 7364d55
Posted by da...@apache.org.
Removed unneeded method
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/7364d55c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/7364d55c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/7364d55c
Branch: refs/heads/txn-refactor
Commit: 7364d55ccdb97e0bcb9c04566f86a26aa6cbd678
Parents: f62e28c
Author: Darren Shepherd <da...@gmail.com>
Authored: Wed Oct 16 09:48:19 2013 -0700
Committer: Darren Shepherd <da...@gmail.com>
Committed: Wed Oct 16 09:48:19 2013 -0700
----------------------------------------------------------------------
framework/db/src/com/cloud/utils/db/Transaction.java | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7364d55c/framework/db/src/com/cloud/utils/db/Transaction.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/Transaction.java b/framework/db/src/com/cloud/utils/db/Transaction.java
index 0ca1cc7..4f8e5c7 100755
--- a/framework/db/src/com/cloud/utils/db/Transaction.java
+++ b/framework/db/src/com/cloud/utils/db/Transaction.java
@@ -57,9 +57,5 @@ public class Transaction {
throw e;
}
}
-
- public static Object startTransaction() {
- return null;
- }
-
+
}
[02/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/vm/UserVmManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 6e87916..5053a97 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -35,7 +35,6 @@ import javax.naming.ConfigurationException;
import org.apache.commons.codec.binary.Base64;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -239,8 +238,12 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.exception.ExecutionException;
import com.cloud.utils.fsm.NoTransitionException;
@@ -1375,11 +1378,11 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
public UserVm recoverVirtualMachine(RecoverVMCmd cmd)
throws ResourceAllocationException, CloudRuntimeException {
- Long vmId = cmd.getId();
+ final Long vmId = cmd.getId();
Account caller = CallContext.current().getCallingAccount();
// Verify input parameters
- UserVmVO vm = _vmDao.findById(vmId.longValue());
+ final UserVmVO vm = _vmDao.findById(vmId.longValue());
if (vm == null) {
throw new InvalidParameterValueException(
@@ -1409,68 +1412,72 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
s_logger.debug("Recovering vm " + vmId);
}
- Transaction txn = Transaction.currentTxn();
- AccountVO account = null;
- txn.start();
-
- account = _accountDao.lockRow(vm.getAccountId(), true);
-
- // if the account is deleted, throw error
- if (account.getRemoved() != null) {
- throw new CloudRuntimeException(
- "Unable to recover VM as the account is deleted");
- }
-
- // Get serviceOffering for Virtual Machine
- ServiceOfferingVO serviceOffering = _serviceOfferingDao.findById(vm.getServiceOfferingId());
-
- // First check that the maximum number of UserVMs, CPU and Memory limit for the given
- // accountId will not be exceeded
- resourceLimitCheck(account, new Long(serviceOffering.getCpu()), new Long(serviceOffering.getRamSize()));
-
- _haMgr.cancelDestroy(vm, vm.getHostId());
-
- try {
- if (!_itMgr.stateTransitTo(vm,
- VirtualMachine.Event.RecoveryRequested, null)) {
- s_logger.debug("Unable to recover the vm because it is not in the correct state: "
- + vmId);
- throw new InvalidParameterValueException(
- "Unable to recover the vm because it is not in the correct state: "
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException {
+
+ Account account = _accountDao.lockRow(vm.getAccountId(), true);
+
+ // if the account is deleted, throw error
+ if (account.getRemoved() != null) {
+ throw new CloudRuntimeException(
+ "Unable to recover VM as the account is deleted");
+ }
+
+ // Get serviceOffering for Virtual Machine
+ ServiceOfferingVO serviceOffering = _serviceOfferingDao.findById(vm.getServiceOfferingId());
+
+ // First check that the maximum number of UserVMs, CPU and Memory limit for the given
+ // accountId will not be exceeded
+ resourceLimitCheck(account, new Long(serviceOffering.getCpu()), new Long(serviceOffering.getRamSize()));
+
+ _haMgr.cancelDestroy(vm, vm.getHostId());
+
+ try {
+ if (!_itMgr.stateTransitTo(vm,
+ VirtualMachine.Event.RecoveryRequested, null)) {
+ s_logger.debug("Unable to recover the vm because it is not in the correct state: "
+ vmId);
- }
- } catch (NoTransitionException e) {
- throw new InvalidParameterValueException(
- "Unable to recover the vm because it is not in the correct state: "
- + vmId);
- }
-
- // Recover the VM's disks
- List<VolumeVO> volumes = _volsDao.findByInstance(vmId);
- for (VolumeVO volume : volumes) {
- if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
- // Create an event
- Long templateId = volume.getTemplateId();
- Long diskOfferingId = volume.getDiskOfferingId();
- Long offeringId = null;
- if (diskOfferingId != null) {
- DiskOfferingVO offering = _diskOfferingDao
- .findById(diskOfferingId);
- if (offering != null
- && (offering.getType() == DiskOfferingVO.Type.Disk)) {
- offeringId = offering.getId();
+ throw new InvalidParameterValueException(
+ "Unable to recover the vm because it is not in the correct state: "
+ + vmId);
+ }
+ } catch (NoTransitionException e) {
+ throw new InvalidParameterValueException(
+ "Unable to recover the vm because it is not in the correct state: "
+ + vmId);
+ }
+
+ // Recover the VM's disks
+ List<VolumeVO> volumes = _volsDao.findByInstance(vmId);
+ for (VolumeVO volume : volumes) {
+ if (volume.getVolumeType().equals(Volume.Type.ROOT)) {
+ // Create an event
+ Long templateId = volume.getTemplateId();
+ Long diskOfferingId = volume.getDiskOfferingId();
+ Long offeringId = null;
+ if (diskOfferingId != null) {
+ DiskOfferingVO offering = _diskOfferingDao
+ .findById(diskOfferingId);
+ if (offering != null
+ && (offering.getType() == DiskOfferingVO.Type.Disk)) {
+ offeringId = offering.getId();
+ }
+ }
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(),
+ volume.getDataCenterId(), volume.getId(), volume.getName(), offeringId, templateId,
+ volume.getSize(), Volume.class.getName(), volume.getUuid());
}
}
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(),
- volume.getDataCenterId(), volume.getId(), volume.getName(), offeringId, templateId,
- volume.getSize(), Volume.class.getName(), volume.getUuid());
+
+ //Update Resource Count for the given account
+ resourceCountIncrement(account.getId(), new Long(serviceOffering.getCpu()),
+ new Long(serviceOffering.getRamSize()));
+
+ return null;
}
- }
+ }, ResourceAllocationException.class);
- //Update Resource Count for the given account
- resourceCountIncrement(account.getId(), new Long(serviceOffering.getCpu()),
- new Long(serviceOffering.getRamSize()));
- txn.commit();
return _vmDao.findById(vmId);
}
@@ -1965,8 +1972,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
@DB
protected InstanceGroupVO createVmGroup(String groupName, long accountId) {
Account account = null;
- final Transaction txn = Transaction.currentTxn();
- txn.start();
try {
account = _accountDao.acquireInLockTable(accountId); // to ensure
// duplicate
@@ -1989,7 +1994,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
if (account != null) {
_accountDao.releaseFromLockTable(accountId);
}
- txn.commit();
}
}
@@ -2032,7 +2036,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
@Override
@DB
- public boolean addInstanceToGroup(long userVmId, String groupName) {
+ public boolean addInstanceToGroup(final long userVmId, String groupName) {
UserVmVO vm = _vmDao.findById(userVmId);
InstanceGroupVO group = _vmGroupDao.findByAccountAndName(
@@ -2043,43 +2047,47 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
}
if (group != null) {
- final Transaction txn = Transaction.currentTxn();
- txn.start();
UserVm userVm = _vmDao.acquireInLockTable(userVmId);
if (userVm == null) {
s_logger.warn("Failed to acquire lock on user vm id="
+ userVmId);
}
try {
- // don't let the group be deleted when we are assigning vm to
- // it.
- InstanceGroupVO ngrpLock = _vmGroupDao.lockRow(group.getId(),
- false);
- if (ngrpLock == null) {
- s_logger.warn("Failed to acquire lock on vm group id="
- + group.getId() + " name=" + group.getName());
- txn.rollback();
- return false;
- }
+ final InstanceGroupVO groupFinal = group;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ // don't let the group be deleted when we are assigning vm to
+ // it.
+ InstanceGroupVO ngrpLock = _vmGroupDao.lockRow(groupFinal.getId(),
+ false);
+ if (ngrpLock == null) {
+ s_logger.warn("Failed to acquire lock on vm group id="
+ + groupFinal.getId() + " name=" + groupFinal.getName());
+ throw new CloudRuntimeException("Failed to acquire lock on vm group id="
+ + groupFinal.getId() + " name=" + groupFinal.getName());
+ }
+
+ // Currently don't allow to assign a vm to more than one group
+ if (_groupVMMapDao.listByInstanceId(userVmId) != null) {
+ // Delete all mappings from group_vm_map table
+ List<InstanceGroupVMMapVO> groupVmMaps = _groupVMMapDao
+ .listByInstanceId(userVmId);
+ for (InstanceGroupVMMapVO groupMap : groupVmMaps) {
+ SearchCriteria<InstanceGroupVMMapVO> sc = _groupVMMapDao
+ .createSearchCriteria();
+ sc.addAnd("instanceId", SearchCriteria.Op.EQ,
+ groupMap.getInstanceId());
+ _groupVMMapDao.expunge(sc);
+ }
+ }
+ InstanceGroupVMMapVO groupVmMapVO = new InstanceGroupVMMapVO(
+ groupFinal.getId(), userVmId);
+ _groupVMMapDao.persist(groupVmMapVO);
- // Currently don't allow to assign a vm to more than one group
- if (_groupVMMapDao.listByInstanceId(userVmId) != null) {
- // Delete all mappings from group_vm_map table
- List<InstanceGroupVMMapVO> groupVmMaps = _groupVMMapDao
- .listByInstanceId(userVmId);
- for (InstanceGroupVMMapVO groupMap : groupVmMaps) {
- SearchCriteria<InstanceGroupVMMapVO> sc = _groupVMMapDao
- .createSearchCriteria();
- sc.addAnd("instanceId", SearchCriteria.Op.EQ,
- groupMap.getInstanceId());
- _groupVMMapDao.expunge(sc);
}
- }
- InstanceGroupVMMapVO groupVmMapVO = new InstanceGroupVMMapVO(
- group.getId(), userVmId);
- _groupVMMapDao.persist(groupVmMapVO);
+ });
- txn.commit();
return true;
} finally {
if (userVm != null) {
@@ -2744,98 +2752,9 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
hypervisorType = template.getHypervisorType();
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
- UserVmVO vm = new UserVmVO(id, instanceName, displayName,
- template.getId(), hypervisorType, template.getGuestOSId(),
- offering.getOfferHA(), offering.getLimitCpuUse(),
- owner.getDomainId(), owner.getId(), offering.getId(), userData,
- hostName, diskOfferingId);
- vm.setUuid(uuidName);
- vm.setDynamicallyScalable(template.isDynamicallyScalable());
- if (sshPublicKey != null) {
- vm.setDetail("SSH.PublicKey", sshPublicKey);
- }
-
- if (keyboard != null && !keyboard.isEmpty())
- vm.setDetail(VmDetailConstants.KEYBOARD, keyboard);
-
- if (isIso) {
- vm.setIsoId(template.getId());
- }
-
- if(isDisplayVmEnabled != null){
- if(!_accountMgr.isRootAdmin(caller.getType())){
- throw new PermissionDeniedException( "Cannot update parameter displayvm, only admin permitted ");
- }
- vm.setDisplayVm(isDisplayVmEnabled);
- }else {
- vm.setDisplayVm(true);
- }
-
- // If hypervisor is vSphere, check for clone type setting.
- if (hypervisorType.equals(HypervisorType.VMware)) {
- // retrieve clone flag.
- UserVmCloneType cloneType = UserVmCloneType.linked;
- String value = _configDao.getValue(Config.VmwareCreateFullClone.key());
- if (value != null) {
- if (Boolean.parseBoolean(value) == true)
- cloneType = UserVmCloneType.full;
- }
- UserVmCloneSettingVO vmCloneSettingVO = new UserVmCloneSettingVO(id, cloneType.toString());
- _vmCloneSettingDao.persist(vmCloneSettingVO);
- }
-
- long guestOSId = template.getGuestOSId();
- GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
- long guestOSCategoryId = guestOS.getCategoryId();
- GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId);
-
-
- // If hypervisor is vSphere and OS is OS X, set special settings.
- if (hypervisorType.equals(HypervisorType.VMware)) {
- if (guestOS.getDisplayName().toLowerCase().contains("apple mac os")){
- vm.setDetail("smc.present", "TRUE");
- vm.setDetail(VmDetailConstants.ROOK_DISK_CONTROLLER, "scsi");
- vm.setDetail("firmware", "efi");
- s_logger.info("guestOS is OSX : overwrite root disk controller to scsi, use smc and efi");
- }
- }
-
- _vmDao.persist(vm);
- _vmDao.saveDetails(vm);
-
- s_logger.debug("Allocating in the DB for vm");
- DataCenterDeployment plan = new DataCenterDeployment(zone.getId());
-
- List<String> computeTags = new ArrayList<String>();
- computeTags.add(offering.getHostTag());
-
- List<String> rootDiskTags = new ArrayList<String>();
- rootDiskTags.add(offering.getTags());
-
- if(isIso){
- VirtualMachineEntity vmEntity = _orchSrvc.createVirtualMachineFromScratch(vm.getUuid(), Long.toString(owner.getAccountId()), vm.getIsoId().toString(), hostName, displayName, hypervisor.name(), guestOSCategory.getName(), offering.getCpu(), offering.getSpeed(), offering.getRamSize(), diskSize, computeTags, rootDiskTags, networkNicMap, plan);
- }else {
- VirtualMachineEntity vmEntity = _orchSrvc.createVirtualMachine(vm.getUuid(), Long.toString(owner.getAccountId()), Long.toString(template.getId()), hostName, displayName, hypervisor.name(), offering.getCpu(), offering.getSpeed(), offering.getRamSize(), diskSize, computeTags, rootDiskTags, networkNicMap, plan);
- }
-
-
-
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Successfully allocated DB entry for " + vm);
- }
- CallContext.current().setEventDetails("Vm Id: " + vm.getId());
-
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, accountId, zone.getId(), vm.getId(),
- vm.getHostName(), offering.getId(), template.getId(), hypervisorType.toString(),
- VirtualMachine.class.getName(), vm.getUuid());
-
- //Update Resource Count for the given account
- resourceCountIncrement(accountId, new Long(offering.getCpu()),
- new Long(offering.getRamSize()));
-
- txn.commit();
+ UserVmVO vm = commitUserVm(zone, template, hostName, displayName, owner, diskOfferingId, diskSize, userData,
+ hypervisor, caller, isDisplayVmEnabled, keyboard, accountId, offering, isIso, sshPublicKey,
+ networkNicMap, id, instanceName, uuidName, hypervisorType);
// Assign instance to the group
try {
@@ -2860,6 +2779,108 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
return vm;
}
+ private UserVmVO commitUserVm(final DataCenter zone, final VirtualMachineTemplate template, final String hostName,
+ final String displayName, final Account owner, final Long diskOfferingId, final Long diskSize, final String userData,
+ final HypervisorType hypervisor, final Account caller, final Boolean isDisplayVmEnabled, final String keyboard, final long accountId,
+ final ServiceOfferingVO offering, final boolean isIso, final String sshPublicKey,
+ final LinkedHashMap<String, NicProfile> networkNicMap, final long id, final String instanceName, final String uuidName,
+ final HypervisorType hypervisorType) throws InsufficientCapacityException {
+ return Transaction.executeWithException(new TransactionCallbackWithException<UserVmVO>() {
+ @Override
+ public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
+ UserVmVO vm = new UserVmVO(id, instanceName, displayName,
+ template.getId(), hypervisorType, template.getGuestOSId(),
+ offering.getOfferHA(), offering.getLimitCpuUse(),
+ owner.getDomainId(), owner.getId(), offering.getId(), userData,
+ hostName, diskOfferingId);
+ vm.setUuid(uuidName);
+ vm.setDynamicallyScalable(template.isDynamicallyScalable());
+ if (sshPublicKey != null) {
+ vm.setDetail("SSH.PublicKey", sshPublicKey);
+ }
+
+ if (keyboard != null && !keyboard.isEmpty())
+ vm.setDetail(VmDetailConstants.KEYBOARD, keyboard);
+
+ if (isIso) {
+ vm.setIsoId(template.getId());
+ }
+
+ if(isDisplayVmEnabled != null){
+ if(!_accountMgr.isRootAdmin(caller.getType())){
+ throw new PermissionDeniedException( "Cannot update parameter displayvm, only admin permitted ");
+ }
+ vm.setDisplayVm(isDisplayVmEnabled);
+ }else {
+ vm.setDisplayVm(true);
+ }
+
+ // If hypervisor is vSphere, check for clone type setting.
+ if (hypervisorType.equals(HypervisorType.VMware)) {
+ // retrieve clone flag.
+ UserVmCloneType cloneType = UserVmCloneType.linked;
+ String value = _configDao.getValue(Config.VmwareCreateFullClone.key());
+ if (value != null) {
+ if (Boolean.parseBoolean(value) == true)
+ cloneType = UserVmCloneType.full;
+ }
+ UserVmCloneSettingVO vmCloneSettingVO = new UserVmCloneSettingVO(id, cloneType.toString());
+ _vmCloneSettingDao.persist(vmCloneSettingVO);
+ }
+
+ long guestOSId = template.getGuestOSId();
+ GuestOSVO guestOS = _guestOSDao.findById(guestOSId);
+ long guestOSCategoryId = guestOS.getCategoryId();
+ GuestOSCategoryVO guestOSCategory = _guestOSCategoryDao.findById(guestOSCategoryId);
+
+
+ // If hypervisor is vSphere and OS is OS X, set special settings.
+ if (hypervisorType.equals(HypervisorType.VMware)) {
+ if (guestOS.getDisplayName().toLowerCase().contains("apple mac os")){
+ vm.setDetail("smc.present", "TRUE");
+ vm.setDetail(VmDetailConstants.ROOK_DISK_CONTROLLER, "scsi");
+ vm.setDetail("firmware", "efi");
+ s_logger.info("guestOS is OSX : overwrite root disk controller to scsi, use smc and efi");
+ }
+ }
+
+ _vmDao.persist(vm);
+ _vmDao.saveDetails(vm);
+
+ s_logger.debug("Allocating in the DB for vm");
+ DataCenterDeployment plan = new DataCenterDeployment(zone.getId());
+
+ List<String> computeTags = new ArrayList<String>();
+ computeTags.add(offering.getHostTag());
+
+ List<String> rootDiskTags = new ArrayList<String>();
+ rootDiskTags.add(offering.getTags());
+
+ if(isIso){
+ VirtualMachineEntity vmEntity = _orchSrvc.createVirtualMachineFromScratch(vm.getUuid(), Long.toString(owner.getAccountId()), vm.getIsoId().toString(), hostName, displayName, hypervisor.name(), guestOSCategory.getName(), offering.getCpu(), offering.getSpeed(), offering.getRamSize(), diskSize, computeTags, rootDiskTags, networkNicMap, plan);
+ }else {
+ VirtualMachineEntity vmEntity = _orchSrvc.createVirtualMachine(vm.getUuid(), Long.toString(owner.getAccountId()), Long.toString(template.getId()), hostName, displayName, hypervisor.name(), offering.getCpu(), offering.getSpeed(), offering.getRamSize(), diskSize, computeTags, rootDiskTags, networkNicMap, plan);
+ }
+
+
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Successfully allocated DB entry for " + vm);
+ }
+ CallContext.current().setEventDetails("Vm Id: " + vm.getId());
+
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, accountId, zone.getId(), vm.getId(),
+ vm.getHostName(), offering.getId(), template.getId(), hypervisorType.toString(),
+ VirtualMachine.class.getName(), vm.getUuid());
+
+ //Update Resource Count for the given account
+ resourceCountIncrement(accountId, new Long(offering.getCpu()),
+ new Long(offering.getRamSize()));
+ return vm;
+ }
+ }, InsufficientCapacityException.class);
+ }
+
private void validateUserData(String userData, HTTPMethod httpmethod) {
byte[] decodedUserData = null;
if (userData != null) {
@@ -3417,7 +3438,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
}
@Override
- public void collectVmDiskStatistics (UserVmVO userVm) {
+ public void collectVmDiskStatistics (final UserVmVO userVm) {
// support KVM only util 2013.06.25
if (!userVm.getHypervisorType().equals(HypervisorType.KVM))
return;
@@ -3425,7 +3446,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
long hostId = userVm.getHostId();
List<String> vmNames = new ArrayList<String>();
vmNames.add(userVm.getInstanceName());
- HostVO host = _hostDao.findById(hostId);
+ final HostVO host = _hostDao.findById(hostId);
GetVmDiskStatsAnswer diskStatsAnswer = null;
try {
@@ -3439,98 +3460,98 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
s_logger.warn("Error while collecting disk stats vm: " + userVm.getHostName() + " from host: " + host.getName() + "; details: " + diskStatsAnswer.getDetails());
return;
}
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
try {
- txn.start();
- HashMap<String, List<VmDiskStatsEntry>> vmDiskStatsByName = diskStatsAnswer.getVmDiskStatsMap();
- if (vmDiskStatsByName == null)
- return;
- List<VmDiskStatsEntry> vmDiskStats = vmDiskStatsByName.get(userVm.getInstanceName());
- if (vmDiskStats == null)
- return;
-
- for (VmDiskStatsEntry vmDiskStat:vmDiskStats) {
- SearchCriteria<VolumeVO> sc_volume = _volsDao.createSearchCriteria();
- sc_volume.addAnd("path", SearchCriteria.Op.EQ, vmDiskStat.getPath());
- VolumeVO volume = _volsDao.search(sc_volume, null).get(0);
- VmDiskStatisticsVO previousVmDiskStats = _vmDiskStatsDao.findBy(userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), volume.getId());
- VmDiskStatisticsVO vmDiskStat_lock = _vmDiskStatsDao.lock(userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), volume.getId());
-
- if ((vmDiskStat.getIORead() == 0) && (vmDiskStat.getIOWrite() == 0) && (vmDiskStat.getBytesRead() == 0) && (vmDiskStat.getBytesWrite() == 0)) {
- s_logger.debug("Read/Write of IO and Bytes are both 0. Not updating vm_disk_statistics");
- continue;
- }
-
- if (vmDiskStat_lock == null) {
- s_logger.warn("unable to find vm disk stats from host for account: " + userVm.getAccountId() + " with vmId: " + userVm.getId()+ " and volumeId:" + volume.getId());
- continue;
- }
-
- if (previousVmDiskStats != null
- && ((previousVmDiskStats.getCurrentIORead() != vmDiskStat_lock.getCurrentIORead())
- || ((previousVmDiskStats.getCurrentIOWrite() != vmDiskStat_lock.getCurrentIOWrite())
- || (previousVmDiskStats.getCurrentBytesRead() != vmDiskStat_lock.getCurrentBytesRead())
- || (previousVmDiskStats.getCurrentBytesWrite() != vmDiskStat_lock.getCurrentBytesWrite())))) {
- s_logger.debug("vm disk stats changed from the time GetVmDiskStatsCommand was sent. " +
- "Ignoring current answer. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
- " IO Read: " + vmDiskStat.getIORead() + " IO Write: " + vmDiskStat.getIOWrite() +
- " Bytes Read: " + vmDiskStat.getBytesRead() + " Bytes Write: " + vmDiskStat.getBytesWrite());
- continue;
- }
-
- if (vmDiskStat_lock.getCurrentIORead() > vmDiskStat.getIORead()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Read # of IO that's less than the last one. " +
- "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
- " Reported: " + vmDiskStat.getIORead() + " Stored: " + vmDiskStat_lock.getCurrentIORead());
- }
- vmDiskStat_lock.setNetIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
- }
- vmDiskStat_lock.setCurrentIORead(vmDiskStat.getIORead());
- if (vmDiskStat_lock.getCurrentIOWrite() > vmDiskStat.getIOWrite()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Write # of IO that's less than the last one. " +
- "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
- " Reported: " + vmDiskStat.getIOWrite() + " Stored: " + vmDiskStat_lock.getCurrentIOWrite());
- }
- vmDiskStat_lock.setNetIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
- }
- vmDiskStat_lock.setCurrentIOWrite(vmDiskStat.getIOWrite());
- if (vmDiskStat_lock.getCurrentBytesRead() > vmDiskStat.getBytesRead()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Read # of Bytes that's less than the last one. " +
- "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
- " Reported: " + vmDiskStat.getBytesRead() + " Stored: " + vmDiskStat_lock.getCurrentBytesRead());
- }
- vmDiskStat_lock.setNetBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
- }
- vmDiskStat_lock.setCurrentBytesRead(vmDiskStat.getBytesRead());
- if (vmDiskStat_lock.getCurrentBytesWrite() > vmDiskStat.getBytesWrite()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Write # of Bytes that's less than the last one. " +
- "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
- " Reported: " + vmDiskStat.getBytesWrite() + " Stored: " + vmDiskStat_lock.getCurrentBytesWrite());
- }
- vmDiskStat_lock.setNetBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
- }
- vmDiskStat_lock.setCurrentBytesWrite(vmDiskStat.getBytesWrite());
-
- if (! _dailyOrHourly) {
- //update agg bytes
- vmDiskStat_lock.setAggIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
- vmDiskStat_lock.setAggIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
- vmDiskStat_lock.setAggBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
- vmDiskStat_lock.setAggBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
- }
-
- _vmDiskStatsDao.update(vmDiskStat_lock.getId(), vmDiskStat_lock);
- }
- txn.commit();
+ final GetVmDiskStatsAnswer diskStatsAnswerFinal = diskStatsAnswer;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ HashMap<String, List<VmDiskStatsEntry>> vmDiskStatsByName = diskStatsAnswerFinal.getVmDiskStatsMap();
+ if (vmDiskStatsByName == null)
+ return;
+ List<VmDiskStatsEntry> vmDiskStats = vmDiskStatsByName.get(userVm.getInstanceName());
+ if (vmDiskStats == null)
+ return;
+
+ for (VmDiskStatsEntry vmDiskStat:vmDiskStats) {
+ SearchCriteria<VolumeVO> sc_volume = _volsDao.createSearchCriteria();
+ sc_volume.addAnd("path", SearchCriteria.Op.EQ, vmDiskStat.getPath());
+ VolumeVO volume = _volsDao.search(sc_volume, null).get(0);
+ VmDiskStatisticsVO previousVmDiskStats = _vmDiskStatsDao.findBy(userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), volume.getId());
+ VmDiskStatisticsVO vmDiskStat_lock = _vmDiskStatsDao.lock(userVm.getAccountId(), userVm.getDataCenterId(), userVm.getId(), volume.getId());
+
+ if ((vmDiskStat.getIORead() == 0) && (vmDiskStat.getIOWrite() == 0) && (vmDiskStat.getBytesRead() == 0) && (vmDiskStat.getBytesWrite() == 0)) {
+ s_logger.debug("Read/Write of IO and Bytes are both 0. Not updating vm_disk_statistics");
+ continue;
+ }
+
+ if (vmDiskStat_lock == null) {
+ s_logger.warn("unable to find vm disk stats from host for account: " + userVm.getAccountId() + " with vmId: " + userVm.getId()+ " and volumeId:" + volume.getId());
+ continue;
+ }
+
+ if (previousVmDiskStats != null
+ && ((previousVmDiskStats.getCurrentIORead() != vmDiskStat_lock.getCurrentIORead())
+ || ((previousVmDiskStats.getCurrentIOWrite() != vmDiskStat_lock.getCurrentIOWrite())
+ || (previousVmDiskStats.getCurrentBytesRead() != vmDiskStat_lock.getCurrentBytesRead())
+ || (previousVmDiskStats.getCurrentBytesWrite() != vmDiskStat_lock.getCurrentBytesWrite())))) {
+ s_logger.debug("vm disk stats changed from the time GetVmDiskStatsCommand was sent. " +
+ "Ignoring current answer. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " IO Read: " + vmDiskStat.getIORead() + " IO Write: " + vmDiskStat.getIOWrite() +
+ " Bytes Read: " + vmDiskStat.getBytesRead() + " Bytes Write: " + vmDiskStat.getBytesWrite());
+ continue;
+ }
+
+ if (vmDiskStat_lock.getCurrentIORead() > vmDiskStat.getIORead()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Read # of IO that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getIORead() + " Stored: " + vmDiskStat_lock.getCurrentIORead());
+ }
+ vmDiskStat_lock.setNetIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
+ }
+ vmDiskStat_lock.setCurrentIORead(vmDiskStat.getIORead());
+ if (vmDiskStat_lock.getCurrentIOWrite() > vmDiskStat.getIOWrite()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Write # of IO that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getIOWrite() + " Stored: " + vmDiskStat_lock.getCurrentIOWrite());
+ }
+ vmDiskStat_lock.setNetIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
+ }
+ vmDiskStat_lock.setCurrentIOWrite(vmDiskStat.getIOWrite());
+ if (vmDiskStat_lock.getCurrentBytesRead() > vmDiskStat.getBytesRead()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Read # of Bytes that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getBytesRead() + " Stored: " + vmDiskStat_lock.getCurrentBytesRead());
+ }
+ vmDiskStat_lock.setNetBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
+ }
+ vmDiskStat_lock.setCurrentBytesRead(vmDiskStat.getBytesRead());
+ if (vmDiskStat_lock.getCurrentBytesWrite() > vmDiskStat.getBytesWrite()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Write # of Bytes that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getBytesWrite() + " Stored: " + vmDiskStat_lock.getCurrentBytesWrite());
+ }
+ vmDiskStat_lock.setNetBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
+ }
+ vmDiskStat_lock.setCurrentBytesWrite(vmDiskStat.getBytesWrite());
+
+ if (! _dailyOrHourly) {
+ //update agg bytes
+ vmDiskStat_lock.setAggIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
+ vmDiskStat_lock.setAggIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
+ vmDiskStat_lock.setAggBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
+ vmDiskStat_lock.setAggBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
+ }
+
+ _vmDiskStatsDao.update(vmDiskStat_lock.getId(), vmDiskStat_lock);
+ }
+ }
+ });
} catch (Exception e) {
- txn.rollback();
s_logger.warn("Unable to update vm disk statistics for vm: " + userVm.getId() + " from host: " + hostId, e);
- } finally {
- txn.close();
}
}
}
@@ -4271,7 +4292,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
@DB
@Override
@ActionEvent(eventType = EventTypes.EVENT_VM_MOVE, eventDescription = "move VM to another user", async = false)
- public UserVm moveVMToUser(AssignVMCmd cmd)
+ public UserVm moveVMToUser(final AssignVMCmd cmd)
throws ResourceAllocationException, ConcurrentOperationException,
ResourceUnavailableException, InsufficientCapacityException {
// VERIFICATIONS and VALIDATIONS
@@ -4291,7 +4312,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
}
// get and check the valid VM
- UserVmVO vm = _vmDao.findById(cmd.getVmId());
+ final UserVmVO vm = _vmDao.findById(cmd.getVmId());
if (vm == null) {
throw new InvalidParameterValueException(
"There is no vm by that id " + cmd.getVmId());
@@ -4306,7 +4327,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
throw ex;
}
- Account oldAccount = _accountService.getActiveAccountById(vm
+ final Account oldAccount = _accountService.getActiveAccountById(vm
.getAccountId());
if (oldAccount == null) {
throw new InvalidParameterValueException("Invalid account for VM "
@@ -4319,7 +4340,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
ex.addProxyObject(vm.getUuid(), "vmId");
throw ex;
}
- Account newAccount = _accountService.getActiveAccountByName(
+ final Account newAccount = _accountService.getActiveAccountByName(
cmd.getAccountName(), cmd.getDomainId());
if (newAccount == null
|| newAccount.getType() == Account.ACCOUNT_TYPE_PROJECT) {
@@ -4376,8 +4397,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
DataCenterVO zone = _dcDao.findById(vm.getDataCenterId());
// Get serviceOffering and Volumes for Virtual Machine
- ServiceOfferingVO offering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId());
- List<VolumeVO> volumes = _volsDao.findByInstance(cmd.getVmId());
+ final ServiceOfferingVO offering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getServiceOfferingId());
+ final List<VolumeVO> volumes = _volsDao.findByInstance(cmd.getVmId());
//Remove vm from instance group
removeInstanceFromInstanceGroup(cmd.getVmId());
@@ -4407,55 +4428,57 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
DomainVO domain = _domainDao.findById(cmd.getDomainId());
_accountMgr.checkAccess(newAccount, domain);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- //generate destroy vm event for usage
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_DESTROY, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
- vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString(),
- VirtualMachine.class.getName(), vm.getUuid());
-
- // update resource counts for old account
- resourceCountDecrement(oldAccount.getAccountId(), new Long(offering.getCpu()),
- new Long(offering.getRamSize()));
-
- // OWNERSHIP STEP 1: update the vm owner
- vm.setAccountId(newAccount.getAccountId());
- vm.setDomainId(cmd.getDomainId());
- _vmDao.persist(vm);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ //generate destroy vm event for usage
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_DESTROY, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
+ vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString(),
+ VirtualMachine.class.getName(), vm.getUuid());
+
+ // update resource counts for old account
+ resourceCountDecrement(oldAccount.getAccountId(), new Long(offering.getCpu()),
+ new Long(offering.getRamSize()));
+
+ // OWNERSHIP STEP 1: update the vm owner
+ vm.setAccountId(newAccount.getAccountId());
+ vm.setDomainId(cmd.getDomainId());
+ _vmDao.persist(vm);
+
+ // OS 2: update volume
+ for (VolumeVO volume : volumes) {
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_DELETE, volume.getAccountId(),
+ volume.getDataCenterId(), volume.getId(), volume.getName(), Volume.class.getName(), volume.getUuid());
+ _resourceLimitMgr.decrementResourceCount(oldAccount.getAccountId(), ResourceType.volume);
+ _resourceLimitMgr.decrementResourceCount(oldAccount.getAccountId(), ResourceType.primary_storage,
+ new Long(volume.getSize()));
+ volume.setAccountId(newAccount.getAccountId());
+ volume.setDomainId(newAccount.getDomainId());
+ _volsDao.persist(volume);
+ _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.volume);
+ _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.primary_storage,
+ new Long(volume.getSize()));
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(),
+ volume.getDataCenterId(), volume.getId(), volume.getName(),
+ volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(),
+ volume.getUuid());
+ //snapshots: mark these removed in db
+ List<SnapshotVO> snapshots = _snapshotDao.listByVolumeIdIncludingRemoved(volume.getId());
+ for (SnapshotVO snapshot: snapshots){
+ _snapshotDao.remove(snapshot.getId());
+ }
+ }
+
+ //update resource count of new account
+ resourceCountIncrement(newAccount.getAccountId(), new Long(offering.getCpu()), new Long(offering.getRamSize()));
+
+ //generate usage events to account for this change
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
+ vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString(),
+ VirtualMachine.class.getName(), vm.getUuid());
+ }
+ });
- // OS 2: update volume
- for (VolumeVO volume : volumes) {
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_DELETE, volume.getAccountId(),
- volume.getDataCenterId(), volume.getId(), volume.getName(), Volume.class.getName(), volume.getUuid());
- _resourceLimitMgr.decrementResourceCount(oldAccount.getAccountId(), ResourceType.volume);
- _resourceLimitMgr.decrementResourceCount(oldAccount.getAccountId(), ResourceType.primary_storage,
- new Long(volume.getSize()));
- volume.setAccountId(newAccount.getAccountId());
- volume.setDomainId(newAccount.getDomainId());
- _volsDao.persist(volume);
- _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.volume);
- _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.primary_storage,
- new Long(volume.getSize()));
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(),
- volume.getDataCenterId(), volume.getId(), volume.getName(),
- volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize(), Volume.class.getName(),
- volume.getUuid());
- //snapshots: mark these removed in db
- List<SnapshotVO> snapshots = _snapshotDao.listByVolumeIdIncludingRemoved(volume.getId());
- for (SnapshotVO snapshot: snapshots){
- _snapshotDao.remove(snapshot.getId());
- }
- }
-
- //update resource count of new account
- resourceCountIncrement(newAccount.getAccountId(), new Long(offering.getCpu()), new Long(offering.getRamSize()));
-
- //generate usage events to account for this change
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VM_CREATE, vm.getAccountId(), vm.getDataCenterId(), vm.getId(),
- vm.getHostName(), vm.getServiceOfferingId(), vm.getTemplateId(), vm.getHypervisorType().toString(),
- VirtualMachine.class.getName(), vm.getUuid());
-
- txn.commit();
VirtualMachine vmoi = _itMgr.findById(vm.getId());
VirtualMachineProfileImpl vmOldProfile = new VirtualMachineProfileImpl(vmoi);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
index aa772fe..18f17b8 100644
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -29,7 +29,6 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
-
import org.apache.cloudstack.api.command.user.vmsnapshot.ListVMSnapshotCmd;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -90,6 +89,10 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.fsm.NoTransitionException;
import com.cloud.utils.fsm.StateMachine2;
@@ -482,31 +485,32 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
}
@DB
- protected void processAnswer(VMSnapshotVO vmSnapshot, UserVmVO userVm, Answer as, Long hostId) {
- final Transaction txn = Transaction.currentTxn();
+ protected void processAnswer(final VMSnapshotVO vmSnapshot, UserVmVO userVm, final Answer as, Long hostId) {
try {
- txn.start();
- if (as instanceof CreateVMSnapshotAnswer) {
- CreateVMSnapshotAnswer answer = (CreateVMSnapshotAnswer) as;
- finalizeCreate(vmSnapshot, answer.getVolumeTOs());
- vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
- } else if (as instanceof RevertToVMSnapshotAnswer) {
- RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) as;
- finalizeRevert(vmSnapshot, answer.getVolumeTOs());
- vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
- } else if (as instanceof DeleteVMSnapshotAnswer) {
- DeleteVMSnapshotAnswer answer = (DeleteVMSnapshotAnswer) as;
- finalizeDelete(vmSnapshot, answer.getVolumeTOs());
- _vmSnapshotDao.remove(vmSnapshot.getId());
- }
- txn.commit();
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws NoTransitionException {
+ if (as instanceof CreateVMSnapshotAnswer) {
+ CreateVMSnapshotAnswer answer = (CreateVMSnapshotAnswer) as;
+ finalizeCreate(vmSnapshot, answer.getVolumeTOs());
+ vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
+ } else if (as instanceof RevertToVMSnapshotAnswer) {
+ RevertToVMSnapshotAnswer answer = (RevertToVMSnapshotAnswer) as;
+ finalizeRevert(vmSnapshot, answer.getVolumeTOs());
+ vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.OperationSucceeded);
+ } else if (as instanceof DeleteVMSnapshotAnswer) {
+ DeleteVMSnapshotAnswer answer = (DeleteVMSnapshotAnswer) as;
+ finalizeDelete(vmSnapshot, answer.getVolumeTOs());
+ _vmSnapshotDao.remove(vmSnapshot.getId());
+ }
+
+ return null;
+ }
+ }, NoTransitionException.class);
} catch (Exception e) {
String errMsg = "Error while process answer: " + as.getClass() + " due to " + e.getMessage();
s_logger.error(errMsg, e);
- txn.rollback();
throw new CloudRuntimeException(errMsg);
- } finally {
- txn.close();
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java b/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
index 8f2caad..b7b51c9 100644
--- a/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
+++ b/server/src/org/apache/cloudstack/affinity/AffinityGroupServiceImpl.java
@@ -34,12 +34,16 @@ import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
import org.apache.cloudstack.affinity.dao.AffinityGroupDomainMapDao;
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
import org.apache.cloudstack.context.CallContext;
-
import org.apache.log4j.Logger;
import org.springframework.context.annotation.Primary;
+
+
+
+
+
import com.cloud.deploy.DeploymentPlanner;
import com.cloud.domain.DomainVO;
import com.cloud.domain.dao.DomainDao;
@@ -65,6 +69,9 @@ import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.fsm.StateListener;
import com.cloud.vm.UserVmVO;
@@ -142,8 +149,8 @@ public class AffinityGroupServiceImpl extends ManagerBase implements AffinityGro
@DB
@Override
- public AffinityGroup createAffinityGroupInternal(String account, Long domainId, String affinityGroupName,
- String affinityGroupType, String description) {
+ public AffinityGroup createAffinityGroupInternal(String account, final Long domainId, final String affinityGroupName,
+ final String affinityGroupType, final String description) {
Account caller = CallContext.current().getCallingAccount();
@@ -159,7 +166,7 @@ public class AffinityGroupServiceImpl extends ManagerBase implements AffinityGro
"Unable to create affinity group, no Affinity Group Types configured");
}
- AffinityGroupProcessor processor = typeProcessorMap.get(affinityGroupType);
+ final AffinityGroupProcessor processor = typeProcessorMap.get(affinityGroupType);
if (processor.isAdminControlledGroup() && !_accountMgr.isRootAdmin(caller.getType())) {
throw new PermissionDeniedException("Cannot create the affinity group");
@@ -210,21 +217,26 @@ public class AffinityGroupServiceImpl extends ManagerBase implements AffinityGro
+ affinityGroupName + " already exisits under the domain.");
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- AffinityGroupVO group = new AffinityGroupVO(affinityGroupName, affinityGroupType, description, owner.getDomainId(),
- owner.getId(), aclType);
- _affinityGroupDao.persist(group);
-
- if (domainId != null && aclType == ACLType.Domain) {
- boolean subDomainAccess = false;
- subDomainAccess = processor.subDomainAccess();
- AffinityGroupDomainMapVO domainMap = new AffinityGroupDomainMapVO(group.getId(), domainId, subDomainAccess);
- _affinityGroupDomainMapDao.persist(domainMap);
- }
+ final Account ownerFinal = owner;
+ final ControlledEntity.ACLType aclTypeFinal = aclType;
+ AffinityGroupVO group = Transaction.execute(new TransactionCallback<AffinityGroupVO>() {
+ @Override
+ public AffinityGroupVO doInTransaction(TransactionStatus status) {
+ AffinityGroupVO group = new AffinityGroupVO(affinityGroupName, affinityGroupType, description, ownerFinal.getDomainId(),
+ ownerFinal.getId(), aclTypeFinal);
+ _affinityGroupDao.persist(group);
+
+ if (domainId != null && aclTypeFinal == ACLType.Domain) {
+ boolean subDomainAccess = false;
+ subDomainAccess = processor.subDomainAccess();
+ AffinityGroupDomainMapVO domainMap = new AffinityGroupDomainMapVO(group.getId(), domainId, subDomainAccess);
+ _affinityGroupDomainMapDao.persist(domainMap);
+ }
- txn.commit();
+ return group;
+ }
+ });
+
if (s_logger.isDebugEnabled()) {
s_logger.debug("Created affinity group =" + affinityGroupName);
@@ -265,35 +277,38 @@ public class AffinityGroupServiceImpl extends ManagerBase implements AffinityGro
// check permissions
_accountMgr.checkAccess(caller, AccessType.ModifyEntry, true, group);
- final Transaction txn = Transaction.currentTxn();
- txn.start();
-
- group = _affinityGroupDao.lockRow(affinityGroupId, true);
- if (group == null) {
- throw new InvalidParameterValueException("Unable to find affinity group by id " + affinityGroupId);
- }
-
- List<AffinityGroupVMMapVO> affinityGroupVmMap = _affinityGroupVMMapDao.listByAffinityGroup(affinityGroupId);
- if (!affinityGroupVmMap.isEmpty()) {
- SearchBuilder<AffinityGroupVMMapVO> listByAffinityGroup = _affinityGroupVMMapDao.createSearchBuilder();
- listByAffinityGroup.and("affinityGroupId", listByAffinityGroup.entity().getAffinityGroupId(),
- SearchCriteria.Op.EQ);
- listByAffinityGroup.done();
- SearchCriteria<AffinityGroupVMMapVO> sc = listByAffinityGroup.create();
- sc.setParameters("affinityGroupId", affinityGroupId);
-
- _affinityGroupVMMapDao.lockRows(sc, null, true);
- _affinityGroupVMMapDao.remove(sc);
- }
+ final Long affinityGroupIdFinal = affinityGroupId;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
- // call processor to handle the group delete
- AffinityGroupProcessor processor = getAffinityGroupProcessorForType(group.getType());
- if (processor != null) {
- processor.handleDeleteGroup(group);
- }
-
- _affinityGroupDao.expunge(affinityGroupId);
- txn.commit();
+ AffinityGroupVO group = _affinityGroupDao.lockRow(affinityGroupIdFinal, true);
+ if (group == null) {
+ throw new InvalidParameterValueException("Unable to find affinity group by id " + affinityGroupIdFinal);
+ }
+
+ List<AffinityGroupVMMapVO> affinityGroupVmMap = _affinityGroupVMMapDao.listByAffinityGroup(affinityGroupIdFinal);
+ if (!affinityGroupVmMap.isEmpty()) {
+ SearchBuilder<AffinityGroupVMMapVO> listByAffinityGroup = _affinityGroupVMMapDao.createSearchBuilder();
+ listByAffinityGroup.and("affinityGroupId", listByAffinityGroup.entity().getAffinityGroupId(),
+ SearchCriteria.Op.EQ);
+ listByAffinityGroup.done();
+ SearchCriteria<AffinityGroupVMMapVO> sc = listByAffinityGroup.create();
+ sc.setParameters("affinityGroupId", affinityGroupIdFinal);
+
+ _affinityGroupVMMapDao.lockRows(sc, null, true);
+ _affinityGroupVMMapDao.remove(sc);
+ }
+
+ // call processor to handle the group delete
+ AffinityGroupProcessor processor = getAffinityGroupProcessorForType(group.getType());
+ if (processor != null) {
+ processor.handleDeleteGroup(group);
+ }
+
+ _affinityGroupDao.expunge(affinityGroupIdFinal);
+ }
+ });
if (s_logger.isDebugEnabled()) {
s_logger.debug("Deleted affinity group id=" + affinityGroupId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
index 2385edc..c9db371 100644
--- a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
+++ b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
@@ -26,7 +26,6 @@ import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
-
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
import org.apache.cloudstack.api.command.user.loadbalancer.ListApplicationLoadBalancersCmd;
import org.apache.cloudstack.context.CallContext;
@@ -72,6 +71,9 @@ import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
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.Ip;
import com.cloud.utils.net.NetUtils;
@@ -156,30 +158,33 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A
@DB
- protected ApplicationLoadBalancerRule persistLbRule(ApplicationLoadBalancerRuleVO newRule) throws NetworkRuleConflictException {
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- //1) Persist the rule
- newRule = _lbDao.persist(newRule);
+ protected ApplicationLoadBalancerRule persistLbRule(final ApplicationLoadBalancerRuleVO newRuleFinal) throws NetworkRuleConflictException {
boolean success = true;
-
+ ApplicationLoadBalancerRuleVO newRule = null;
try {
- //2) Detect conflicts
- detectLbRulesConflicts(newRule);
- if (!_firewallDao.setStateToAdd(newRule)) {
- throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
- }
- s_logger.debug("Load balancer " + newRule.getId() + " for Ip address " + newRule.getSourceIp().addr() + ", source port "
- + newRule.getSourcePortStart() + ", instance port " + newRule.getDefaultPortStart() + " is added successfully.");
- CallContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
- Network ntwk = _networkModel.getNetwork(newRule.getNetworkId());
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_CREATE, newRule.getAccountId(),
- ntwk.getDataCenterId(), newRule.getId(), null, LoadBalancingRule.class.getName(),
- newRule.getUuid());
- txn.commit();
-
+ newRule = Transaction.executeWithException(new TransactionCallbackWithException<ApplicationLoadBalancerRuleVO>() {
+ @Override
+ public ApplicationLoadBalancerRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+ //1) Persist the rule
+ ApplicationLoadBalancerRuleVO newRule = _lbDao.persist(newRuleFinal);
+
+ //2) Detect conflicts
+ detectLbRulesConflicts(newRule);
+ if (!_firewallDao.setStateToAdd(newRule)) {
+ throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+ }
+ s_logger.debug("Load balancer " + newRule.getId() + " for Ip address " + newRule.getSourceIp().addr() + ", source port "
+ + newRule.getSourcePortStart() + ", instance port " + newRule.getDefaultPortStart() + " is added successfully.");
+ CallContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
+ Network ntwk = _networkModel.getNetwork(newRule.getNetworkId());
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_CREATE, newRule.getAccountId(),
+ ntwk.getDataCenterId(), newRule.getId(), null, LoadBalancingRule.class.getName(),
+ newRule.getUuid());
+
+ return newRule;
+ }
+ }, NetworkRuleConflictException.class);
+
return newRule;
} catch (Exception e) {
success = false;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java b/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
index 25a40ee..62b9748 100644
--- a/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
+++ b/server/src/org/apache/cloudstack/region/gslb/GlobalLoadBalancingRulesServiceImpl.java
@@ -37,6 +37,9 @@ import com.cloud.user.AccountManager;
import com.cloud.utils.Pair;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
@@ -46,7 +49,6 @@ import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.region.Region;
import org.apache.cloudstack.region.dao.RegionDao;
-
import org.apache.log4j.Logger;
import javax.ejb.Local;
@@ -94,15 +96,15 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
"balancer rule", create = true)
public GlobalLoadBalancerRule createGlobalLoadBalancerRule(CreateGlobalLoadBalancerRuleCmd newRule) {
- Integer regionId = newRule.getRegionId();
- String algorithm = newRule.getAlgorithm();
- String stickyMethod = newRule.getStickyMethod();
- String name = newRule.getName();
- String description = newRule.getDescription();
- String domainName = newRule.getServiceDomainName();
- String serviceType = newRule.getServiceType();
+ final Integer regionId = newRule.getRegionId();
+ final String algorithm = newRule.getAlgorithm();
+ final String stickyMethod = newRule.getStickyMethod();
+ final String name = newRule.getName();
+ final String description = newRule.getDescription();
+ final String domainName = newRule.getServiceDomainName();
+ final String serviceType = newRule.getServiceType();
- Account gslbOwner = _accountMgr.getAccount(newRule.getEntityOwnerId());
+ final Account gslbOwner = _accountMgr.getAccount(newRule.getEntityOwnerId());
if (!GlobalLoadBalancerRule.Algorithm.isValidAlgorithm(algorithm)) {
throw new InvalidParameterValueException("Invalid Algorithm: " + algorithm);
@@ -135,18 +137,21 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
throw new CloudRuntimeException("GSLB service is not enabled in region : " + region.getName());
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
- GlobalLoadBalancerRuleVO newGslbRule = new GlobalLoadBalancerRuleVO(name, description, domainName, algorithm,
- stickyMethod, serviceType, regionId, gslbOwner.getId(), gslbOwner.getDomainId(),
- GlobalLoadBalancerRule.State.Staged);
- _gslbRuleDao.persist(newGslbRule);
+ GlobalLoadBalancerRuleVO newGslbRule = Transaction.execute(new TransactionCallback<GlobalLoadBalancerRuleVO>() {
+ @Override
+ public GlobalLoadBalancerRuleVO doInTransaction(TransactionStatus status) {
+ GlobalLoadBalancerRuleVO newGslbRule = new GlobalLoadBalancerRuleVO(name, description, domainName, algorithm,
+ stickyMethod, serviceType, regionId, gslbOwner.getId(), gslbOwner.getDomainId(),
+ GlobalLoadBalancerRule.State.Staged);
+ _gslbRuleDao.persist(newGslbRule);
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_GLOBAL_LOAD_BALANCER_CREATE, newGslbRule.getAccountId(),
- 0, newGslbRule.getId(), name, GlobalLoadBalancerRule.class.getName(),
- newGslbRule.getUuid());
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_GLOBAL_LOAD_BALANCER_CREATE, newGslbRule.getAccountId(),
+ 0, newGslbRule.getId(), name, GlobalLoadBalancerRule.class.getName(),
+ newGslbRule.getUuid());
- txn.commit();
+ return newGslbRule;
+ }
+ });
s_logger.debug("successfully created new global load balancer rule for the account " + gslbOwner.getId());
@@ -162,8 +167,8 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
CallContext ctx = CallContext.current();
Account caller = ctx.getCallingAccount();
- long gslbRuleId = assignToGslbCmd.getGlobalLoadBalancerRuleId();
- GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
+ final long gslbRuleId = assignToGslbCmd.getGlobalLoadBalancerRuleId();
+ final GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
if (gslbRule == null) {
throw new InvalidParameterValueException("Invalid global load balancer rule id: " + gslbRuleId);
}
@@ -175,7 +180,7 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
+ " is in revoked state");
}
- List<Long> newLbRuleIds = assignToGslbCmd.getLoadBalancerRulesIds();
+ final List<Long> newLbRuleIds = assignToGslbCmd.getLoadBalancerRulesIds();
if (newLbRuleIds == null || newLbRuleIds.isEmpty()) {
throw new InvalidParameterValueException("empty list of load balancer rule Ids specified to be assigned"
+ " global load balancer rule");
@@ -244,30 +249,31 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
}
}
- Map<Long, Long> lbRuleWeightMap = assignToGslbCmd.getLoadBalancerRuleWeightMap();
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- // persist the mapping for the new Lb rule that needs to assigned to a gslb rule
- for (Long lbRuleId : newLbRuleIds) {
- GlobalLoadBalancerLbRuleMapVO newGslbLbMap = new GlobalLoadBalancerLbRuleMapVO();
- newGslbLbMap.setGslbLoadBalancerId(gslbRuleId);
- newGslbLbMap.setLoadBalancerId(lbRuleId);
- if (lbRuleWeightMap != null && lbRuleWeightMap.get(lbRuleId) != null) {
- newGslbLbMap.setWeight(lbRuleWeightMap.get(lbRuleId));
+ final Map<Long, Long> lbRuleWeightMap = assignToGslbCmd.getLoadBalancerRuleWeightMap();
+
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ // persist the mapping for the new Lb rule that needs to assigned to a gslb rule
+ for (Long lbRuleId : newLbRuleIds) {
+ GlobalLoadBalancerLbRuleMapVO newGslbLbMap = new GlobalLoadBalancerLbRuleMapVO();
+ newGslbLbMap.setGslbLoadBalancerId(gslbRuleId);
+ newGslbLbMap.setLoadBalancerId(lbRuleId);
+ if (lbRuleWeightMap != null && lbRuleWeightMap.get(lbRuleId) != null) {
+ newGslbLbMap.setWeight(lbRuleWeightMap.get(lbRuleId));
+ }
+ _gslbLbMapDao.persist(newGslbLbMap);
+ }
+
+ // mark the gslb rule state as add
+ if (gslbRule.getState() == GlobalLoadBalancerRule.State.Staged || gslbRule.getState() ==
+ GlobalLoadBalancerRule.State.Active ) {
+ gslbRule.setState(GlobalLoadBalancerRule.State.Add);
+ _gslbRuleDao.update(gslbRule.getId(), gslbRule);
+ }
}
- _gslbLbMapDao.persist(newGslbLbMap);
- }
-
- // mark the gslb rule state as add
- if (gslbRule.getState() == GlobalLoadBalancerRule.State.Staged || gslbRule.getState() ==
- GlobalLoadBalancerRule.State.Active ) {
- gslbRule.setState(GlobalLoadBalancerRule.State.Add);
- _gslbRuleDao.update(gslbRule.getId(), gslbRule);
- }
+ });
- txn.commit();
boolean success = false;
try {
@@ -304,8 +310,8 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
CallContext ctx = CallContext.current();
Account caller = ctx.getCallingAccount();
- long gslbRuleId = removeFromGslbCmd.getGlobalLoadBalancerRuleId();
- GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
+ final long gslbRuleId = removeFromGslbCmd.getGlobalLoadBalancerRuleId();
+ final GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
if (gslbRule == null) {
throw new InvalidParameterValueException("Invalid global load balancer rule id: " + gslbRuleId);
}
@@ -316,7 +322,7 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
throw new InvalidParameterValueException("global load balancer rule id: " + gslbRuleId + " is already in revoked state");
}
- List<Long> lbRuleIdsToremove = removeFromGslbCmd.getLoadBalancerRulesIds();
+ final List<Long> lbRuleIdsToremove = removeFromGslbCmd.getLoadBalancerRulesIds();
if (lbRuleIdsToremove == null || lbRuleIdsToremove.isEmpty()) {
throw new InvalidParameterValueException("empty list of load balancer rule Ids specified to be un-assigned"
+ " to global load balancer rule");
@@ -356,23 +362,24 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
}
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- // update the mapping of gslb rule to Lb rule, to revoke state
- for (Long lbRuleId : lbRuleIdsToremove) {
- GlobalLoadBalancerLbRuleMapVO removeGslbLbMap = _gslbLbMapDao.findByGslbRuleIdAndLbRuleId(gslbRuleId, lbRuleId);
- removeGslbLbMap.setRevoke(true);
- _gslbLbMapDao.update(removeGslbLbMap.getId(), removeGslbLbMap);
- }
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ // update the mapping of gslb rule to Lb rule, to revoke state
+ for (Long lbRuleId : lbRuleIdsToremove) {
+ GlobalLoadBalancerLbRuleMapVO removeGslbLbMap = _gslbLbMapDao.findByGslbRuleIdAndLbRuleId(gslbRuleId, lbRuleId);
+ removeGslbLbMap.setRevoke(true);
+ _gslbLbMapDao.update(removeGslbLbMap.getId(), removeGslbLbMap);
+ }
- // mark the gslb rule state as add
- if (gslbRule.getState() == GlobalLoadBalancerRule.State.Staged) {
- gslbRule.setState(GlobalLoadBalancerRule.State.Add);
- _gslbRuleDao.update(gslbRule.getId(), gslbRule);
- }
+ // mark the gslb rule state as add
+ if (gslbRule.getState() == GlobalLoadBalancerRule.State.Staged) {
+ gslbRule.setState(GlobalLoadBalancerRule.State.Add);
+ _gslbRuleDao.update(gslbRule.getId(), gslbRule);
+ }
- txn.commit();
+ }
+ });
boolean success = false;
try {
@@ -387,19 +394,21 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
throw ex;
}
- txn.start();
-
- // remove the mappings of gslb rule to Lb rule that are in revoked state
- for (Long lbRuleId : lbRuleIdsToremove) {
- GlobalLoadBalancerLbRuleMapVO removeGslbLbMap = _gslbLbMapDao.findByGslbRuleIdAndLbRuleId(gslbRuleId, lbRuleId);
- _gslbLbMapDao.remove(removeGslbLbMap.getId());
- }
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ // remove the mappings of gslb rule to Lb rule that are in revoked state
+ for (Long lbRuleId : lbRuleIdsToremove) {
+ GlobalLoadBalancerLbRuleMapVO removeGslbLbMap = _gslbLbMapDao.findByGslbRuleIdAndLbRuleId(gslbRuleId, lbRuleId);
+ _gslbLbMapDao.remove(removeGslbLbMap.getId());
+ }
- // on success set state back to Active
- gslbRule.setState(GlobalLoadBalancerRule.State.Active);
- _gslbRuleDao.update(gslbRule.getId(), gslbRule);
+ // on success set state back to Active
+ gslbRule.setState(GlobalLoadBalancerRule.State.Active);
+ _gslbRuleDao.update(gslbRule.getId(), gslbRule);
- txn.commit();
+ }
+ });
success = true;
} catch (ResourceUnavailableException e) {
@@ -429,9 +438,9 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
}
@DB
- private void revokeGslbRule(long gslbRuleId, Account caller) {
+ private void revokeGslbRule(final long gslbRuleId, Account caller) {
- GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
+ final GlobalLoadBalancerRuleVO gslbRule = _gslbRuleDao.findById(gslbRuleId);
if (gslbRule == null) {
throw new InvalidParameterValueException("Invalid global load balancer rule id: " + gslbRuleId);
@@ -454,19 +463,21 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
_gslbRuleDao.update(gslbRuleId, gslbRule);
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- List<GlobalLoadBalancerLbRuleMapVO> gslbLbMapVos = _gslbLbMapDao.listByGslbRuleId(gslbRuleId);
- if (gslbLbMapVos != null) {
- //mark all the GSLB-LB mapping to be in revoke state
- for (GlobalLoadBalancerLbRuleMapVO gslbLbMap : gslbLbMapVos) {
- gslbLbMap.setRevoke(true);
- _gslbLbMapDao.update(gslbLbMap.getId(), gslbLbMap);
+ final List<GlobalLoadBalancerLbRuleMapVO> gslbLbMapVos = Transaction.execute(new TransactionCallback<List<GlobalLoadBalancerLbRuleMapVO>>() {
+ @Override
+ public List<GlobalLoadBalancerLbRuleMapVO> doInTransaction(TransactionStatus status) {
+ List<GlobalLoadBalancerLbRuleMapVO> gslbLbMapVos = _gslbLbMapDao.listByGslbRuleId(gslbRuleId);
+ if (gslbLbMapVos != null) {
+ //mark all the GSLB-LB mapping to be in revoke state
+ for (GlobalLoadBalancerLbRuleMapVO gslbLbMap : gslbLbMapVos) {
+ gslbLbMap.setRevoke(true);
+ _gslbLbMapDao.update(gslbLbMap.getId(), gslbLbMap);
+ }
+ }
+
+ return gslbLbMapVos;
}
- }
-
- txn.commit();
+ });
boolean success = false;
try {
@@ -478,22 +489,25 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
throw new CloudRuntimeException("Failed to update the gloabal load balancer");
}
- txn.start();
- //remove all mappings between GSLB rule and load balancer rules
- if (gslbLbMapVos != null) {
- for (GlobalLoadBalancerLbRuleMapVO gslbLbMap : gslbLbMapVos) {
- _gslbLbMapDao.remove(gslbLbMap.getId());
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ //remove all mappings between GSLB rule and load balancer rules
+ if (gslbLbMapVos != null) {
+ for (GlobalLoadBalancerLbRuleMapVO gslbLbMap : gslbLbMapVos) {
+ _gslbLbMapDao.remove(gslbLbMap.getId());
+ }
+ }
+
+ //remove the GSLB rule itself
+ _gslbRuleDao.remove(gslbRuleId);
+
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_GLOBAL_LOAD_BALANCER_DELETE, gslbRule.getAccountId(),
+ 0, gslbRule.getId(), gslbRule.getName(), GlobalLoadBalancerRule.class.getName(),
+ gslbRule.getUuid());
}
- }
-
- //remove the GSLB rule itself
- _gslbRuleDao.remove(gslbRuleId);
-
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_GLOBAL_LOAD_BALANCER_DELETE, gslbRule.getAccountId(),
- 0, gslbRule.getId(), gslbRule.getName(), GlobalLoadBalancerRule.class.getName(),
- gslbRule.getUuid());
+ });
- txn.commit();
}
@Override
@@ -523,8 +537,6 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
throw new InvalidParameterValueException("Invalid persistence: " + stickyMethod);
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
if (algorithm != null) {
gslbRule.setAlgorithm(algorithm);
}
@@ -536,7 +548,6 @@ public class GlobalLoadBalancingRulesServiceImpl implements GlobalLoadBalancingR
}
gslbRule.setState(GlobalLoadBalancerRule.State.Add);
_gslbRuleDao.update(gslbRule.getId(), gslbRule);
- txn.commit();
try {
s_logger.debug("Updating global load balancer with id " + gslbRule.getUuid());
[14/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionLegacy.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionLegacy.java b/framework/db/src/com/cloud/utils/db/TransactionLegacy.java
new file mode 100755
index 0000000..b191491
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionLegacy.java
@@ -0,0 +1,1174 @@
+// 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
+// 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.utils.db;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Savepoint;
+import java.sql.Statement;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.sql.DataSource;
+
+import org.apache.commons.dbcp.ConnectionFactory;
+import org.apache.commons.dbcp.DriverManagerConnectionFactory;
+import org.apache.commons.dbcp.PoolableConnectionFactory;
+import org.apache.commons.dbcp.PoolingDataSource;
+import org.apache.commons.pool.KeyedObjectPoolFactory;
+import org.apache.commons.pool.impl.GenericObjectPool;
+import org.apache.commons.pool.impl.StackKeyedObjectPoolFactory;
+import org.apache.log4j.Logger;
+import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
+import org.jasypt.properties.EncryptableProperties;
+
+import com.cloud.utils.Pair;
+import com.cloud.utils.PropertiesUtil;
+import com.cloud.utils.crypt.EncryptionSecretKeyChecker;
+import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.mgmt.JmxUtil;
+
+/**
+ * Transaction abstracts away the Connection object in JDBC. It allows the
+ * following things that the Connection object does not.
+ *
+ * 1. Transaction can be started at an entry point and whether the DB
+ * actions should be auto-commit or not determined at that point.
+ * 2. DB Connection is allocated only when it is needed.
+ * 3. Code does not need to know if a transaction has been started or not.
+ * It just starts/ends a transaction and we resolve it correctly with
+ * the previous actions.
+ *
+ * Note that this class is not synchronous but it doesn't need to be because
+ * it is stored with TLS and is one per thread. Use appropriately.
+ */
+public class TransactionLegacy {
+ private static final Logger s_logger = Logger.getLogger(Transaction.class.getName() + "." + "Transaction");
+ private static final Logger s_stmtLogger = Logger.getLogger(Transaction.class.getName() + "." + "Statement");
+ private static final Logger s_lockLogger = Logger.getLogger(Transaction.class.getName() + "." + "Lock");
+ private static final Logger s_connLogger = Logger.getLogger(Transaction.class.getName() + "." + "Connection");
+
+ private static final ThreadLocal<TransactionLegacy> tls = new ThreadLocal<TransactionLegacy>();
+ private static final String START_TXN = "start_txn";
+ private static final String CURRENT_TXN = "current_txn";
+ private static final String CREATE_TXN = "create_txn";
+ private static final String CREATE_CONN = "create_conn";
+ private static final String STATEMENT = "statement";
+ private static final String ATTACHMENT = "attachment";
+
+ public static final short CLOUD_DB = 0;
+ public static final short USAGE_DB = 1;
+ public static final short AWSAPI_DB = 2;
+ public static final short SIMULATOR_DB = 3;
+
+ public static final short CONNECTED_DB = -1;
+
+ private static AtomicLong s_id = new AtomicLong();
+ private static final TransactionMBeanImpl s_mbean = new TransactionMBeanImpl();
+ static {
+ try {
+ JmxUtil.registerMBean("Transaction", "Transaction", s_mbean);
+ } catch (Exception e) {
+ s_logger.error("Unable to register mbean for transaction", e);
+ }
+
+ /* FIXME: We need a better solution for this
+ * Initialize encryption if we need it for db.properties
+ */
+ EncryptionSecretKeyChecker enc = new EncryptionSecretKeyChecker();
+ enc.check();
+ }
+
+ private final LinkedList<StackElement> _stack;
+ private long _id;
+
+ private final LinkedList<Pair<String, Long>> _lockTimes = new LinkedList<Pair<String, Long>>();
+
+ private String _name;
+ private Connection _conn;
+ private boolean _txn;
+ private short _dbId;
+ private long _txnTime;
+ private Statement _stmt;
+ private String _creator;
+
+ private TransactionLegacy _prev = null;
+
+ public static TransactionLegacy currentTxn() {
+ TransactionLegacy txn = tls.get();
+ assert txn != null : "No Transaction on stack. Did you mark the method with @DB?";
+
+ assert checkAnnotation(3, txn) : "Did you even read the guide to use Transaction...IOW...other people's code? Try method can't be private. What about @DB? hmmm... could that be it? " + txn;
+ return txn;
+ }
+
+ public static TransactionLegacy open(final short databaseId) {
+ String name = buildName();
+ if (name == null) {
+ name = CURRENT_TXN;
+ }
+ return open(name, databaseId, true);
+ }
+
+ //
+ // Usage of this transaction setup should be limited, it will always open a new transaction context regardless of whether or not there is other
+ // transaction context in the stack. It is used in special use cases that we want to control DB connection explicitly and in the mean time utilize
+ // the existing DAO features
+ //
+ public void transitToUserManagedConnection(Connection conn) {
+ assert(_conn == null /*&& _stack.size() <= 1*/) : "Can't change to a user managed connection unless the stack is empty and the db connection is null, you may have forgotten to invoke transitToAutoManagedConnection to close out the DB connection: " + toString();
+ _conn = conn;
+ _dbId = CONNECTED_DB;
+ }
+
+ public void transitToAutoManagedConnection(short dbId) {
+ // assert(_stack.size() <= 1) : "Can't change to auto managed connection unless your stack is empty";
+ _dbId = dbId;
+ _conn = null;
+ }
+
+ public static TransactionLegacy open(final String name) {
+ return open(name, TransactionLegacy.CLOUD_DB, false);
+ }
+
+ public static TransactionLegacy open(final String name, final short databaseId, final boolean forceDbChange) {
+ TransactionLegacy txn = tls.get();
+ boolean isNew = false;
+ if (txn == null) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Creating the transaction: " + name);
+ }
+ txn = new TransactionLegacy(name, false, databaseId);
+ tls.set(txn);
+ isNew = true;
+ } else if (forceDbChange) {
+ final short currentDbId = txn.getDatabaseId();
+ if (currentDbId != databaseId) {
+ // we need to end the current transaction and switch databases
+ txn.close(txn.getName());
+
+ txn = new TransactionLegacy(name, false, databaseId);
+ tls.set(txn);
+ isNew = true;
+ }
+ }
+
+ txn.takeOver(name, false);
+ if (isNew) {
+ s_mbean.addTransaction(txn);
+ }
+ return txn;
+ }
+
+ protected StackElement peekInStack(Object obj) {
+ final Iterator<StackElement> it = _stack.iterator();
+ while (it.hasNext()) {
+ StackElement next = it.next();
+ if (next.type == obj) {
+ return next;
+ }
+ }
+ return null;
+ }
+
+ public void registerLock(String sql) {
+ if (_txn && s_lockLogger.isDebugEnabled()) {
+ Pair<String, Long> time = new Pair<String, Long>(sql, System.currentTimeMillis());
+ _lockTimes.add(time);
+ }
+ }
+
+ public boolean dbTxnStarted() {
+ return _txn;
+ }
+
+ public static Connection getStandaloneConnectionWithException() throws SQLException {
+ Connection conn = s_ds.getConnection();
+ if (s_connLogger.isTraceEnabled()) {
+ s_connLogger.trace("Retrieving a standalone connection: dbconn" + System.identityHashCode(conn));
+ }
+ return conn;
+ }
+
+ public static Connection getStandaloneConnection() {
+ try {
+ return getStandaloneConnectionWithException();
+ } catch (SQLException e) {
+ s_logger.error("Unexpected exception: ", e);
+ return null;
+ }
+ }
+
+ public static Connection getStandaloneUsageConnection() {
+ try {
+ Connection conn = s_usageDS.getConnection();
+ if (s_connLogger.isTraceEnabled()) {
+ s_connLogger.trace("Retrieving a standalone connection for usage: dbconn" + System.identityHashCode(conn));
+ }
+ return conn;
+ } catch (SQLException e) {
+ s_logger.warn("Unexpected exception: ", e);
+ return null;
+ }
+ }
+
+ public static Connection getStandaloneAwsapiConnection() {
+ try {
+ Connection conn = s_awsapiDS.getConnection();
+ if (s_connLogger.isTraceEnabled()) {
+ s_connLogger.trace("Retrieving a standalone connection for usage: dbconn" + System.identityHashCode(conn));
+ }
+ return conn;
+ } catch (SQLException e) {
+ s_logger.warn("Unexpected exception: ", e);
+ return null;
+ }
+ }
+
+ public static Connection getStandaloneSimulatorConnection() {
+ try {
+ Connection conn = s_simulatorDS.getConnection();
+ if (s_connLogger.isTraceEnabled()) {
+ s_connLogger.trace("Retrieving a standalone connection for simulator: dbconn" + System.identityHashCode(conn));
+ }
+ return conn;
+ } catch (SQLException e) {
+ s_logger.warn("Unexpected exception: ", e);
+ return null;
+ }
+ }
+
+ protected void attach(TransactionAttachment value) {
+ _stack.push(new StackElement(ATTACHMENT, value));
+ }
+
+ protected TransactionAttachment detach(String name) {
+ Iterator<StackElement> it = _stack.descendingIterator();
+ while (it.hasNext()) {
+ StackElement element = it.next();
+ if (element.type == ATTACHMENT) {
+ TransactionAttachment att = (TransactionAttachment)element.ref;
+ if (name.equals(att.getName())) {
+ it.remove();
+ return att;
+ }
+ }
+ }
+ assert false : "Are you sure you attached this: " + name;
+ return null;
+ }
+
+ public static void attachToTxn(TransactionAttachment value) {
+ TransactionLegacy txn = tls.get();
+ assert txn != null && txn.peekInStack(CURRENT_TXN) != null: "Come on....how can we attach something to the transaction if you haven't started it?";
+
+ txn.attach(value);
+ }
+
+ public static TransactionAttachment detachFromTxn(String name) {
+ TransactionLegacy txn = tls.get();
+ assert txn != null : "No Transaction in TLS";
+ return txn.detach(name);
+ }
+
+ protected static boolean checkAnnotation(int stack, TransactionLegacy txn) {
+ final StackTraceElement[] stacks = Thread.currentThread().getStackTrace();
+ StackElement se = txn.peekInStack(CURRENT_TXN);
+ if (se == null) {
+ return false;
+ }
+
+ StringBuffer sb = new StringBuffer();
+ for (; stack < stacks.length; stack++) {
+ String methodName = stacks[stack].getMethodName();
+ sb.append(" ").append(methodName);
+ if (methodName.equals(se.ref)){
+ return true;
+ }
+ }
+
+ // relax stack structure for several places that @DB required injection is not in place
+ s_logger.warn("Non-standard stack context that Transaction context is manaully placed into the calling chain. Stack chain: " + sb);
+ return true;
+ }
+
+ protected static String buildName() {
+ if (s_logger.isDebugEnabled()) {
+ final StackTraceElement[] stacks = Thread.currentThread().getStackTrace();
+ final StringBuilder str = new StringBuilder();
+ int i = 3, j = 3;
+ while (j < 15 && i < stacks.length) {
+ StackTraceElement element = stacks[i];
+ String filename = element.getFileName();
+ String method = element.getMethodName();
+ if ((filename != null && filename.equals("<generated>")) || (method != null && method.equals("invokeSuper"))) {
+ i++;
+ continue;
+ }
+
+ str.append("-").append(stacks[i].getClassName().substring(stacks[i].getClassName().lastIndexOf(".") + 1)).append(".").append(stacks[i].getMethodName()).append(":").append(stacks[i].getLineNumber());
+ j++;
+ i++;
+ }
+ return str.toString();
+ }
+
+ return "";
+ }
+
+ public TransactionLegacy(final String name, final boolean forLocking, final short databaseId) {
+ _name = name;
+ _conn = null;
+ _stack = new LinkedList<StackElement>();
+ _txn = false;
+ _dbId = databaseId;
+ _id = s_id.incrementAndGet();
+ _creator = Thread.currentThread().getName();
+ }
+
+ public String getCreator() {
+ return _creator;
+ }
+
+ public long getId() {
+ return _id;
+ }
+
+ public String getName() {
+ return _name;
+ }
+
+ public Short getDatabaseId() {
+ return _dbId;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder str = new StringBuilder((_name != null ? _name : ""));
+ str.append(" : ");
+ for (final StackElement se : _stack) {
+ if (se.type == CURRENT_TXN) {
+ str.append(se.ref).append(", ");
+ }
+ }
+
+ return str.toString();
+ }
+
+ protected void mark(final String name) {
+ _stack.push(new StackElement(CURRENT_TXN, name));
+ }
+
+ public boolean lock(final String name, final int timeoutSeconds) {
+ Merovingian2 lockMaster = Merovingian2.getLockMaster();
+ if (lockMaster == null) {
+ throw new CloudRuntimeException("There's no support for locking yet");
+ }
+ return lockMaster.acquire(name, timeoutSeconds);
+ }
+
+ public boolean release(final String name) {
+ Merovingian2 lockMaster = Merovingian2.getLockMaster();
+ if (lockMaster == null) {
+ throw new CloudRuntimeException("There's no support for locking yet");
+ }
+ return lockMaster.release(name);
+ }
+
+ public void start() {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("txn: start requested by: " + buildName());
+ }
+
+ _stack.push(new StackElement(START_TXN, null));
+
+ if (_txn) {
+ s_logger.trace("txn: has already been started.");
+ return;
+ }
+
+ _txn = true;
+
+ _txnTime = System.currentTimeMillis();
+ if (_conn != null) {
+ try {
+ s_logger.trace("txn: set auto commit to false");
+ _conn.setAutoCommit(false);
+ } catch (final SQLException e) {
+ s_logger.warn("Unable to set auto commit: ", e);
+ throw new CloudRuntimeException("Unable to set auto commit: ", e);
+ }
+ }
+ }
+
+ protected void closePreviousStatement() {
+ if (_stmt != null) {
+ try {
+ if (s_stmtLogger.isTraceEnabled()) {
+ s_stmtLogger.trace("Closing: " + _stmt.toString());
+ }
+ try {
+ ResultSet rs = _stmt.getResultSet();
+ if (rs != null && _stmt.getResultSetHoldability() != ResultSet.HOLD_CURSORS_OVER_COMMIT) {
+ rs.close();
+ }
+ } catch(SQLException e) {
+ s_stmtLogger.trace("Unable to close resultset");
+ }
+ _stmt.close();
+ } catch (final SQLException e) {
+ s_stmtLogger.trace("Unable to close statement: " + _stmt.toString());
+ } finally {
+ _stmt = null;
+ }
+ }
+ }
+
+ /**
+ * Prepares an auto close statement. The statement is closed automatically if it is
+ * retrieved with this method.
+ *
+ * @param sql sql String
+ * @return PreparedStatement
+ * @throws SQLException if problem with JDBC layer.
+ *
+ * @see java.sql.Connection
+ */
+ public PreparedStatement prepareAutoCloseStatement(final String sql) throws SQLException {
+ PreparedStatement stmt = prepareStatement(sql);
+ closePreviousStatement();
+ _stmt = stmt;
+ return stmt;
+ }
+
+ public PreparedStatement prepareStatement(final String sql) throws SQLException {
+ final Connection conn = getConnection();
+ final PreparedStatement pstmt = conn.prepareStatement(sql);
+ if (s_stmtLogger.isTraceEnabled()) {
+ s_stmtLogger.trace("Preparing: " + sql);
+ }
+ return pstmt;
+ }
+
+ /**
+ * Prepares an auto close statement. The statement is closed automatically if it is
+ * retrieved with this method.
+ *
+ * @param sql sql String
+ * @param autoGeneratedKeys keys that are generated
+ * @return PreparedStatement
+ * @throws SQLException if problem with JDBC layer.
+ *
+ * @see java.sql.Connection
+ */
+ public PreparedStatement prepareAutoCloseStatement(final String sql, final int autoGeneratedKeys) throws SQLException {
+ final Connection conn = getConnection();
+ final PreparedStatement pstmt = conn.prepareStatement(sql, autoGeneratedKeys);
+ if (s_stmtLogger.isTraceEnabled()) {
+ s_stmtLogger.trace("Preparing: " + sql);
+ }
+ closePreviousStatement();
+ _stmt = pstmt;
+ return pstmt;
+ }
+
+ /**
+ * Prepares an auto close statement. The statement is closed automatically if it is
+ * retrieved with this method.
+ *
+ * @param sql sql String
+ * @param columnNames names of the columns
+ * @return PreparedStatement
+ * @throws SQLException if problem with JDBC layer.
+ *
+ * @see java.sql.Connection
+ */
+ public PreparedStatement prepareAutoCloseStatement(final String sql, final String[] columnNames) throws SQLException {
+ final Connection conn = getConnection();
+ final PreparedStatement pstmt = conn.prepareStatement(sql, columnNames);
+ if (s_stmtLogger.isTraceEnabled()) {
+ s_stmtLogger.trace("Preparing: " + sql);
+ }
+ closePreviousStatement();
+ _stmt = pstmt;
+ return pstmt;
+ }
+
+ /**
+ * Prepares an auto close statement. The statement is closed automatically if it is
+ * retrieved with this method.
+ *
+ * @param sql sql String
+ * @return PreparedStatement
+ * @throws SQLException if problem with JDBC layer.
+ *
+ * @see java.sql.Connection
+ */
+ public PreparedStatement prepareAutoCloseStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
+ final Connection conn = getConnection();
+ final PreparedStatement pstmt = conn.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability);
+ if (s_stmtLogger.isTraceEnabled()) {
+ s_stmtLogger.trace("Preparing: " + sql);
+ }
+ closePreviousStatement();
+ _stmt = pstmt;
+ return pstmt;
+ }
+
+ /**
+ * Returns the db connection.
+ *
+ * Note: that you can call getConnection() but beaware that
+ * all prepare statements from the Connection are not garbage
+ * collected!
+ *
+ * @return DB Connection but make sure you understand that
+ * you are responsible for closing the PreparedStatement.
+ * @throws SQLException
+ */
+ public Connection getConnection() throws SQLException {
+ if (_conn == null) {
+ switch (_dbId) {
+ case CLOUD_DB:
+ if(s_ds != null) {
+ _conn = s_ds.getConnection();
+ } else {
+ s_logger.warn("A static-initialized variable becomes null, process is dying?");
+ throw new CloudRuntimeException("Database is not initialized, process is dying?");
+ }
+ break;
+ case USAGE_DB:
+ if(s_usageDS != null) {
+ _conn = s_usageDS.getConnection();
+ } else {
+ s_logger.warn("A static-initialized variable becomes null, process is dying?");
+ throw new CloudRuntimeException("Database is not initialized, process is dying?");
+ }
+ break;
+ case AWSAPI_DB:
+ if(s_awsapiDS != null) {
+ _conn = s_awsapiDS.getConnection();
+ } else {
+ s_logger.warn("A static-initialized variable becomes null, process is dying?");
+ throw new CloudRuntimeException("Database is not initialized, process is dying?");
+ }
+ break;
+
+ case SIMULATOR_DB:
+ if(s_simulatorDS != null) {
+ _conn = s_simulatorDS.getConnection();
+ } else {
+ s_logger.warn("A static-initialized variable becomes null, process is dying?");
+ throw new CloudRuntimeException("Database is not initialized, process is dying?");
+ }
+ break;
+ default:
+
+ throw new CloudRuntimeException("No database selected for the transaction");
+ }
+ _conn.setAutoCommit(!_txn);
+
+ //
+ // MySQL default transaction isolation level is REPEATABLE READ,
+ // to reduce chances of DB deadlock, we will use READ COMMITED isolation level instead
+ // see http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html
+ //
+ _stack.push(new StackElement(CREATE_CONN, null));
+ if (s_connLogger.isTraceEnabled()) {
+ s_connLogger.trace("Creating a DB connection with " + (_txn ? " txn: " : " no txn: ") + " for " + _dbId + ": dbconn" + System.identityHashCode(_conn) + ". Stack: " + buildName());
+ }
+ } else {
+ s_logger.trace("conn: Using existing DB connection");
+ }
+
+ return _conn;
+ }
+
+ protected boolean takeOver(final String name, final boolean create) {
+ if (_stack.size() != 0) {
+ if (!create) {
+ // If it is not a create transaction, then let's just use the current one.
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Using current transaction: " + toString());
+ }
+ mark(name);
+ return false;
+ }
+
+ final StackElement se = _stack.getFirst();
+ if (se.type == CREATE_TXN) {
+ // This create is called inside of another create. Which is ok?
+ // We will let that create be responsible for cleaning up.
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Create using current transaction: " + toString());
+ }
+ mark(name);
+ return false;
+ }
+
+ s_logger.warn("Encountered a transaction that has leaked. Cleaning up. " + toString());
+ cleanup();
+ }
+
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Took over the transaction: " + name);
+ }
+ _stack.push(new StackElement(create ? CREATE_TXN : CURRENT_TXN, name));
+ _name = name;
+ return true;
+ }
+
+ public void cleanup() {
+ closePreviousStatement();
+
+ removeUpTo(null, null);
+ if (_txn) {
+ rollbackTransaction();
+ }
+ _txn = false;
+ _name = null;
+
+ closeConnection();
+
+ _stack.clear();
+ Merovingian2 lockMaster = Merovingian2.getLockMaster();
+ if (lockMaster != null) {
+ lockMaster.cleanupThread();
+ }
+ }
+
+ public void close() {
+ removeUpTo(CURRENT_TXN, null);
+
+ if (_stack.size() == 0) {
+ s_logger.trace("Transaction is done");
+ cleanup();
+ }
+ }
+
+ /**
+ * close() is used by endTxn to close the connection. This method only
+ * closes the connection if the name is the same as what's stored.
+ *
+ * @param name
+ * @return true if this close actually closes the connection. false if not.
+ */
+ public boolean close(final String name) {
+ if (_name == null) { // Already cleaned up.
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Already cleaned up." + buildName());
+ }
+ return true;
+ }
+
+ if (!_name.equals(name)) {
+ close();
+ return false;
+ }
+
+ if (s_logger.isDebugEnabled() && _stack.size() > 2) {
+ s_logger.debug("Transaction is not closed properly: " + toString() + ". Called by " + buildName());
+ }
+
+ cleanup();
+
+ s_logger.trace("All done");
+ return true;
+ }
+
+ protected boolean hasTxnInStack() {
+ return peekInStack(START_TXN) != null;
+ }
+
+ protected void clearLockTimes() {
+ if (s_lockLogger.isDebugEnabled()) {
+ for (Pair<String, Long> time : _lockTimes) {
+ s_lockLogger.trace("SQL " + time.first() + " took " + (System.currentTimeMillis() - time.second()));
+ }
+ _lockTimes.clear();
+ }
+ }
+
+ public boolean commit() {
+ if (!_txn) {
+ s_logger.warn("txn: Commit called when it is not a transaction: " + buildName());
+ return false;
+ }
+
+ Iterator<StackElement> it = _stack.iterator();
+ while (it.hasNext()) {
+ StackElement st = it.next();
+ if (st.type == START_TXN) {
+ it.remove();
+ break;
+ }
+ }
+
+ if (hasTxnInStack()) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("txn: Not committing because transaction started elsewhere: " + buildName() + " / " + toString());
+ }
+ return false;
+ }
+
+ _txn = false;
+ try {
+ if (_conn != null) {
+ _conn.commit();
+ s_logger.trace("txn: DB Changes committed. Time = " + (System.currentTimeMillis() - _txnTime));
+ clearLockTimes();
+ closeConnection();
+ }
+ return true;
+ } catch (final SQLException e) {
+ rollbackTransaction();
+ throw new CloudRuntimeException("Unable to commit or close the connection. ", e);
+ }
+ }
+
+ protected void closeConnection() {
+ closePreviousStatement();
+
+ if (_conn == null) {
+ return;
+ }
+
+ if (_txn) {
+ s_connLogger.trace("txn: Not closing DB connection because we're still in a transaction.");
+ return;
+ }
+
+ try {
+ // we should only close db connection when it is not user managed
+ if (this._dbId != CONNECTED_DB) {
+ if (s_connLogger.isTraceEnabled()) {
+ s_connLogger.trace("Closing DB connection: dbconn" + System.identityHashCode(_conn));
+ }
+ _conn.close();
+ _conn = null;
+ }
+
+ } catch (final SQLException e) {
+ s_logger.warn("Unable to close connection", e);
+ }
+ }
+
+ protected void removeUpTo(String type, Object ref) {
+ boolean rollback = false;
+ Iterator<StackElement> it = _stack.iterator();
+ while (it.hasNext()) {
+ StackElement item = it.next();
+
+ it.remove();
+
+ try {
+ if (item.type == type && (ref == null || item.ref == ref)) {
+ break;
+ }
+
+ if (item.type == CURRENT_TXN) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Releasing the current txn: " + (item.ref != null ? item.ref : ""));
+ }
+ } else if (item.type == CREATE_CONN) {
+ closeConnection();
+ } else if (item.type == START_TXN) {
+ if (item.ref == null) {
+ rollback = true;
+ } else {
+ try {
+ _conn.rollback((Savepoint)ref);
+ rollback = false;
+ } catch (final SQLException e) {
+ s_logger.warn("Unable to rollback Txn.", e);
+ }
+ }
+ } else if (item.type == STATEMENT) {
+ try {
+ if (s_stmtLogger.isTraceEnabled()) {
+ s_stmtLogger.trace("Closing: " + ref.toString());
+ }
+ Statement stmt = (Statement)ref;
+ try {
+ ResultSet rs = stmt.getResultSet();
+ if (rs != null) {
+ rs.close();
+ }
+ } catch(SQLException e) {
+ s_stmtLogger.trace("Unable to close resultset");
+ }
+ stmt.close();
+ } catch (final SQLException e) {
+ s_stmtLogger.trace("Unable to close statement: " + item);
+ }
+ } else if (item.type == ATTACHMENT) {
+ TransactionAttachment att = (TransactionAttachment)item.ref;
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Cleaning up " + att.getName());
+ }
+ att.cleanup();
+ }
+ } catch(Exception e) {
+ s_logger.error("Unable to clean up " + item, e);
+ }
+ }
+
+ if (rollback) {
+ rollback();
+ }
+ }
+
+ protected void rollbackTransaction() {
+ closePreviousStatement();
+ if (!_txn) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Rollback called for " + _name + " when there's no transaction: " + buildName());
+ }
+ return;
+ }
+ assert (!hasTxnInStack()) : "Who's rolling back transaction when there's still txn in stack?";
+ _txn = false;
+ try {
+ if (_conn != null) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Rolling back the transaction: Time = " + (System.currentTimeMillis() - _txnTime) + " Name = " + _name + "; called by " + buildName());
+ }
+ _conn.rollback();
+ }
+ clearLockTimes();
+ closeConnection();
+ } catch(final SQLException e) {
+ s_logger.warn("Unable to rollback", e);
+ }
+ }
+
+ protected void rollbackSavepoint(Savepoint sp) {
+ try {
+ if (_conn != null) {
+ _conn.rollback(sp);
+ }
+ } catch (SQLException e) {
+ s_logger.warn("Unable to rollback to savepoint " + sp);
+ }
+
+ if (!hasTxnInStack()) {
+ _txn = false;
+ closeConnection();
+ }
+ }
+
+ public void rollback() {
+ Iterator<StackElement> it = _stack.iterator();
+ while (it.hasNext()) {
+ StackElement st = it.next();
+ if (st.type == START_TXN) {
+ if (st.ref == null) {
+ it.remove();
+ } else {
+ rollback((Savepoint)st.ref);
+ return;
+ }
+ }
+ }
+
+ rollbackTransaction();
+ }
+
+ public Savepoint setSavepoint() throws SQLException {
+ _txn = true;
+ StackElement st = new StackElement(START_TXN, null);
+ _stack.push(st);
+ final Connection conn = getConnection();
+ final Savepoint sp = conn.setSavepoint();
+ st.ref = sp;
+
+ return sp;
+ }
+
+ public Savepoint setSavepoint(final String name) throws SQLException {
+ _txn = true;
+ StackElement st = new StackElement(START_TXN, null);
+ _stack.push(st);
+ final Connection conn = getConnection();
+ final Savepoint sp = conn.setSavepoint(name);
+ st.ref = sp;
+
+ return sp;
+ }
+
+ public void releaseSavepoint(final Savepoint sp) throws SQLException {
+ removeTxn(sp);
+ if (_conn != null) {
+ _conn.releaseSavepoint(sp);
+ }
+
+ if (!hasTxnInStack()) {
+ _txn = false;
+ closeConnection();
+ }
+ }
+
+ protected boolean hasSavepointInStack(Savepoint sp) {
+ Iterator<StackElement> it = _stack.iterator();
+ while (it.hasNext()) {
+ StackElement se = it.next();
+ if (se.type == START_TXN && se.ref == sp) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ protected void removeTxn(Savepoint sp) {
+ assert hasSavepointInStack(sp) : "Removing a save point that's not in the stack";
+
+ if (!hasSavepointInStack(sp)) {
+ return;
+ }
+
+ Iterator<StackElement> it = _stack.iterator();
+ while (it.hasNext()) {
+ StackElement se = it.next();
+ if (se.type == START_TXN) {
+ it.remove();
+ if (se.ref == sp) {
+ return;
+ }
+ }
+ }
+ }
+
+ public void rollback(final Savepoint sp) {
+ removeTxn(sp);
+
+ rollbackSavepoint(sp);
+ }
+
+ public Connection getCurrentConnection() {
+ return _conn;
+ }
+
+ public List<StackElement> getStack() {
+ return _stack;
+ }
+
+ protected TransactionLegacy() {
+ _name = null;
+ _conn = null;
+ _stack = null;
+ _txn = false;
+ _dbId = -1;
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ if (!(_conn == null && (_stack == null || _stack.size() == 0))) {
+ assert (false) : "Oh Alex oh alex...something is wrong with how we're doing this";
+ s_logger.error("Something went wrong that a transaction is orphaned before db connection is closed");
+ cleanup();
+ }
+ }
+
+ protected class StackElement {
+ public String type;
+ public Object ref;
+
+ public StackElement (String type, Object ref) {
+ this.type = type;
+ this.ref = ref;
+ }
+
+ @Override
+ public String toString() {
+ return type + "-" + ref;
+ }
+ }
+
+ private static DataSource s_ds;
+ private static DataSource s_usageDS;
+ private static DataSource s_awsapiDS;
+ private static DataSource s_simulatorDS;
+
+ static {
+ // Initialize with assumed db.properties file
+ initDataSource("db.properties");
+ }
+
+ public static void initDataSource(String propsFileName) {
+ try {
+ File dbPropsFile = PropertiesUtil.findConfigFile(propsFileName);
+ final Properties dbProps;
+ if (EncryptionSecretKeyChecker.useEncryption()) {
+ StandardPBEStringEncryptor encryptor = EncryptionSecretKeyChecker.getEncryptor();
+ dbProps = new EncryptableProperties(encryptor);
+ } else {
+ dbProps = new Properties();
+ }
+ try {
+ dbProps.load(new FileInputStream(dbPropsFile));
+ } catch (IOException e) {
+ s_logger.fatal("Unable to load db properties file, pl. check the classpath and file path configuration", e);
+ return;
+ } catch (NullPointerException e) {
+ s_logger.fatal("Unable to locate db properties file within classpath or absolute path: " + propsFileName);
+ return;
+ }
+
+ // FIXME: If params are missing...default them????
+ final int cloudMaxActive = Integer.parseInt(dbProps.getProperty("db.cloud.maxActive"));
+ final int cloudMaxIdle = Integer.parseInt(dbProps.getProperty("db.cloud.maxIdle"));
+ final long cloudMaxWait = Long.parseLong(dbProps.getProperty("db.cloud.maxWait"));
+ final String cloudUsername = dbProps.getProperty("db.cloud.username");
+ final String cloudPassword = dbProps.getProperty("db.cloud.password");
+ final String cloudHost = dbProps.getProperty("db.cloud.host");
+ final int cloudPort = Integer.parseInt(dbProps.getProperty("db.cloud.port"));
+ final String cloudDbName = dbProps.getProperty("db.cloud.name");
+ final boolean cloudAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.cloud.autoReconnect"));
+ final String cloudValidationQuery = dbProps.getProperty("db.cloud.validationQuery");
+ final String cloudIsolationLevel = dbProps.getProperty("db.cloud.isolation.level");
+
+ int isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
+ if (cloudIsolationLevel == null) {
+ isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
+ } else if (cloudIsolationLevel.equalsIgnoreCase("readcommitted")) {
+ isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
+ } else if (cloudIsolationLevel.equalsIgnoreCase("repeatableread")) {
+ isolationLevel = Connection.TRANSACTION_REPEATABLE_READ;
+ } else if (cloudIsolationLevel.equalsIgnoreCase("serializable")) {
+ isolationLevel = Connection.TRANSACTION_SERIALIZABLE;
+ } else if (cloudIsolationLevel.equalsIgnoreCase("readuncommitted")) {
+ isolationLevel = Connection.TRANSACTION_READ_UNCOMMITTED;
+ } else {
+ s_logger.warn("Unknown isolation level " + cloudIsolationLevel + ". Using read uncommitted");
+ }
+
+ final boolean cloudTestOnBorrow = Boolean.parseBoolean(dbProps.getProperty("db.cloud.testOnBorrow"));
+ final boolean cloudTestWhileIdle = Boolean.parseBoolean(dbProps.getProperty("db.cloud.testWhileIdle"));
+ final long cloudTimeBtwEvictionRunsMillis = Long.parseLong(dbProps.getProperty("db.cloud.timeBetweenEvictionRunsMillis"));
+ final long cloudMinEvcitableIdleTimeMillis = Long.parseLong(dbProps.getProperty("db.cloud.minEvictableIdleTimeMillis"));
+ final boolean cloudPoolPreparedStatements = Boolean.parseBoolean(dbProps.getProperty("db.cloud.poolPreparedStatements"));
+ final String url = dbProps.getProperty("db.cloud.url.params");
+
+ final boolean useSSL = Boolean.parseBoolean(dbProps.getProperty("db.cloud.useSSL"));
+ if (useSSL) {
+ System.setProperty("javax.net.ssl.keyStore", dbProps.getProperty("db.cloud.keyStore"));
+ System.setProperty("javax.net.ssl.keyStorePassword", dbProps.getProperty("db.cloud.keyStorePassword"));
+ System.setProperty("javax.net.ssl.trustStore", dbProps.getProperty("db.cloud.trustStore"));
+ System.setProperty("javax.net.ssl.trustStorePassword", dbProps.getProperty("db.cloud.trustStorePassword"));
+ }
+
+ final GenericObjectPool cloudConnectionPool = new GenericObjectPool(null, cloudMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
+ cloudMaxWait, cloudMaxIdle, cloudTestOnBorrow, false, cloudTimeBtwEvictionRunsMillis, 1, cloudMinEvcitableIdleTimeMillis, cloudTestWhileIdle);
+
+ final ConnectionFactory cloudConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + cloudHost + ":" + cloudPort + "/" + cloudDbName +
+ "?autoReconnect=" + cloudAutoReconnect + (url != null ? "&" + url : "") + (useSSL ? "&useSSL=true" : ""), cloudUsername, cloudPassword);
+
+ final KeyedObjectPoolFactory poolableObjFactory = (cloudPoolPreparedStatements ? new StackKeyedObjectPoolFactory() : null);
+
+ final PoolableConnectionFactory cloudPoolableConnectionFactory = new PoolableConnectionFactory(cloudConnectionFactory, cloudConnectionPool, poolableObjFactory,
+ cloudValidationQuery, false, false, isolationLevel);
+
+ // Default Data Source for CloudStack
+ s_ds = new PoolingDataSource(cloudPoolableConnectionFactory.getPool());
+
+ // Configure the usage db
+ final int usageMaxActive = Integer.parseInt(dbProps.getProperty("db.usage.maxActive"));
+ final int usageMaxIdle = Integer.parseInt(dbProps.getProperty("db.usage.maxIdle"));
+ final long usageMaxWait = Long.parseLong(dbProps.getProperty("db.usage.maxWait"));
+ final String usageUsername = dbProps.getProperty("db.usage.username");
+ final String usagePassword = dbProps.getProperty("db.usage.password");
+ final String usageHost = dbProps.getProperty("db.usage.host");
+ final int usagePort = Integer.parseInt(dbProps.getProperty("db.usage.port"));
+ final String usageDbName = dbProps.getProperty("db.usage.name");
+ final boolean usageAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.usage.autoReconnect"));
+ final String usageUrl = dbProps.getProperty("db.usage.url.params");
+
+ final GenericObjectPool usageConnectionPool = new GenericObjectPool(null, usageMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
+ usageMaxWait, usageMaxIdle);
+
+ final ConnectionFactory usageConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + usageHost + ":" + usagePort + "/" + usageDbName +
+ "?autoReconnect=" + usageAutoReconnect + (usageUrl != null ? "&" + usageUrl : ""), usageUsername, usagePassword);
+
+ final PoolableConnectionFactory usagePoolableConnectionFactory = new PoolableConnectionFactory(usageConnectionFactory, usageConnectionPool,
+ new StackKeyedObjectPoolFactory(), null, false, false);
+
+ // Data Source for usage server
+ s_usageDS = new PoolingDataSource(usagePoolableConnectionFactory.getPool());
+
+ // Configure awsapi db
+ final String awsapiDbName = dbProps.getProperty("db.awsapi.name");
+ final GenericObjectPool awsapiConnectionPool = new GenericObjectPool(null, usageMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
+ usageMaxWait, usageMaxIdle);
+ final ConnectionFactory awsapiConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + cloudHost + ":" + cloudPort + "/" + awsapiDbName +
+ "?autoReconnect=" + usageAutoReconnect, cloudUsername, cloudPassword);
+ final PoolableConnectionFactory awsapiPoolableConnectionFactory = new PoolableConnectionFactory(awsapiConnectionFactory, awsapiConnectionPool,
+ new StackKeyedObjectPoolFactory(), null, false, false);
+
+ // Data Source for awsapi
+ s_awsapiDS = new PoolingDataSource(awsapiPoolableConnectionFactory.getPool());
+
+ try {
+ // Configure the simulator db
+ final int simulatorMaxActive = Integer.parseInt(dbProps.getProperty("db.simulator.maxActive"));
+ final int simulatorMaxIdle = Integer.parseInt(dbProps.getProperty("db.simulator.maxIdle"));
+ final long simulatorMaxWait = Long.parseLong(dbProps.getProperty("db.simulator.maxWait"));
+ final String simulatorUsername = dbProps.getProperty("db.simulator.username");
+ final String simulatorPassword = dbProps.getProperty("db.simulator.password");
+ final String simulatorHost = dbProps.getProperty("db.simulator.host");
+ final int simulatorPort = Integer.parseInt(dbProps.getProperty("db.simulator.port"));
+ final String simulatorDbName = dbProps.getProperty("db.simulator.name");
+ final boolean simulatorAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.simulator.autoReconnect"));
+
+ final GenericObjectPool simulatorConnectionPool = new GenericObjectPool(null, simulatorMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
+ simulatorMaxWait, simulatorMaxIdle);
+
+ final ConnectionFactory simulatorConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + simulatorHost + ":" + simulatorPort + "/" + simulatorDbName +
+ "?autoReconnect=" + simulatorAutoReconnect, simulatorUsername, simulatorPassword);
+
+ final PoolableConnectionFactory simulatorPoolableConnectionFactory = new PoolableConnectionFactory(simulatorConnectionFactory, simulatorConnectionPool,
+ new StackKeyedObjectPoolFactory(), null, false, false);
+ s_simulatorDS = new PoolingDataSource(simulatorPoolableConnectionFactory.getPool());
+ } catch (Exception e) {
+ s_logger.debug("Simulator DB properties are not available. Not initializing simulator DS");
+ }
+ } catch (final Exception e) {
+ s_ds = getDefaultDataSource("cloud");
+ s_usageDS = getDefaultDataSource("cloud_usage");
+ s_simulatorDS = getDefaultDataSource("cloud_simulator");
+ s_logger.warn("Unable to load db configuration, using defaults with 5 connections. Falling back on assumed datasource on localhost:3306 using username:password=cloud:cloud. Please check your configuration", e);
+ }
+ }
+
+ private static DataSource getDefaultDataSource(final String database) {
+ final GenericObjectPool connectionPool = new GenericObjectPool(null, 5);
+ final ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
+ "jdbc:mysql://localhost:3306/" + database, "cloud", "cloud");
+ final PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
+ connectionFactory, connectionPool, null, null, false, true);
+ return new PoolingDataSource(
+ /* connectionPool */poolableConnectionFactory.getPool());
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java b/framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java
index d51a9bd..73511b1 100644
--- a/framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java
+++ b/framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java
@@ -25,21 +25,21 @@ import java.util.concurrent.ConcurrentHashMap;
import javax.management.StandardMBean;
-import com.cloud.utils.db.Transaction.StackElement;
+import com.cloud.utils.db.TransactionLegacy.StackElement;
public class TransactionMBeanImpl extends StandardMBean implements TransactionMBean {
- Map<Long, Transaction> _txns = new ConcurrentHashMap<Long, Transaction>();
+ Map<Long, TransactionLegacy> _txns = new ConcurrentHashMap<Long, TransactionLegacy>();
public TransactionMBeanImpl() {
super(TransactionMBean.class, false);
}
- public void addTransaction(Transaction txn) {
+ public void addTransaction(TransactionLegacy txn) {
_txns.put(txn.getId(), txn);
}
- public void removeTransaction(Transaction txn) {
+ public void removeTransaction(TransactionLegacy txn) {
_txns.remove(txn.getId());
}
@@ -53,7 +53,7 @@ public class TransactionMBeanImpl extends StandardMBean implements TransactionMB
int[] count = new int[2];
count[0] = 0;
count[1] = 0;
- for (Transaction txn : _txns.values()) {
+ for (TransactionLegacy txn : _txns.values()) {
if (txn.getStack().size() > 0) {
count[0]++;
}
@@ -67,7 +67,7 @@ public class TransactionMBeanImpl extends StandardMBean implements TransactionMB
@Override
public List<Map<String, String>> getTransactions() {
ArrayList<Map<String, String>> txns = new ArrayList<Map<String, String>>();
- for (Transaction info : _txns.values()) {
+ for (TransactionLegacy info : _txns.values()) {
txns.add(toMap(info));
}
return txns;
@@ -76,7 +76,7 @@ public class TransactionMBeanImpl extends StandardMBean implements TransactionMB
@Override
public List<Map<String, String>> getActiveTransactions() {
ArrayList<Map<String, String>> txns = new ArrayList<Map<String, String>>();
- for (Transaction txn : _txns.values()) {
+ for (TransactionLegacy txn : _txns.values()) {
if (txn.getStack().size() > 0 || txn.getCurrentConnection() != null) {
txns.add(toMap(txn));
}
@@ -84,7 +84,7 @@ public class TransactionMBeanImpl extends StandardMBean implements TransactionMB
return txns;
}
- protected Map<String, String> toMap(Transaction txn) {
+ protected Map<String, String> toMap(TransactionLegacy txn) {
Map<String, String> map = new HashMap<String, String>();
map.put("name", txn.getName());
map.put("id", Long.toString(txn.getId()));
@@ -103,7 +103,7 @@ public class TransactionMBeanImpl extends StandardMBean implements TransactionMB
@Override
public List<Map<String, String>> getTransactionsWithDatabaseConnection() {
ArrayList<Map<String, String>> txns = new ArrayList<Map<String, String>>();
- for (Transaction txn : _txns.values()) {
+ for (TransactionLegacy txn : _txns.values()) {
if (txn.getCurrentConnection() != null) {
txns.add(toMap(txn));
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionStatus.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionStatus.java b/framework/db/src/com/cloud/utils/db/TransactionStatus.java
new file mode 100644
index 0000000..a167797
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionStatus.java
@@ -0,0 +1,7 @@
+package com.cloud.utils.db;
+
+/**
+ * Placeholder for possible future features
+ */
+public interface TransactionStatus {
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java b/framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java
new file mode 100644
index 0000000..70d4c16
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java
@@ -0,0 +1,36 @@
+/*
+ * 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.utils.db;
+
+import com.cloud.utils.exception.CloudRuntimeException;
+
+public class TransactionWrappedExeception extends CloudRuntimeException {
+
+ private static final long serialVersionUID = -3254037624055143300L;
+
+ Exception e;
+
+ public TransactionWrappedExeception(Exception e) {
+ this.e = e;
+ }
+
+ public Exception getWrapped() {
+ return e;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/test/com/cloud/utils/db/DbTestDao.java
----------------------------------------------------------------------
diff --git a/framework/db/test/com/cloud/utils/db/DbTestDao.java b/framework/db/test/com/cloud/utils/db/DbTestDao.java
index 9530b3b..7db5ba8 100644
--- a/framework/db/test/com/cloud/utils/db/DbTestDao.java
+++ b/framework/db/test/com/cloud/utils/db/DbTestDao.java
@@ -29,7 +29,7 @@ public class DbTestDao extends GenericDaoBase<DbTestVO, Long> implements Generic
@DB
public void create(int fldInt, long fldLong, String fldString) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
txn.start();
@@ -48,7 +48,7 @@ public class DbTestDao extends GenericDaoBase<DbTestVO, Long> implements Generic
@DB
public void update(int fldInt, long fldLong, String fldString) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
txn.start();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/test/com/cloud/utils/db/DbTestUtils.java
----------------------------------------------------------------------
diff --git a/framework/db/test/com/cloud/utils/db/DbTestUtils.java b/framework/db/test/com/cloud/utils/db/DbTestUtils.java
index 11ae1aa..2458b8c 100644
--- a/framework/db/test/com/cloud/utils/db/DbTestUtils.java
+++ b/framework/db/test/com/cloud/utils/db/DbTestUtils.java
@@ -33,7 +33,7 @@ public class DbTestUtils {
throw new RuntimeException("Unable to clean the database because I can't find " + file);
}
- Connection conn = Transaction.getStandaloneConnection();
+ Connection conn = TransactionLegacy.getStandaloneConnection();
ScriptRunner runner = new ScriptRunner(conn, autoCommit, stopOnError);
FileReader reader;
@@ -63,7 +63,7 @@ public class DbTestUtils {
throw new RuntimeException("Unable to clean the database because I can't find " + file);
}
- Connection conn = Transaction.getStandaloneUsageConnection();
+ Connection conn = TransactionLegacy.getStandaloneUsageConnection();
ScriptRunner runner = new ScriptRunner(conn, autoCommit, stopOnError);
FileReader reader;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/test/com/cloud/utils/db/TransactionTest.java
----------------------------------------------------------------------
diff --git a/framework/db/test/com/cloud/utils/db/TransactionTest.java b/framework/db/test/com/cloud/utils/db/TransactionTest.java
index 101a533..92b2f36 100644
--- a/framework/db/test/com/cloud/utils/db/TransactionTest.java
+++ b/framework/db/test/com/cloud/utils/db/TransactionTest.java
@@ -41,7 +41,7 @@ public class TransactionTest {
Connection conn = null;
PreparedStatement pstmt = null;
try {
- conn = Transaction.getStandaloneConnection();
+ conn = TransactionLegacy.getStandaloneConnection();
pstmt = conn.prepareStatement("CREATE TABLE `cloud`.`test` ("
+ "`id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT," + "`fld_int` int unsigned,"
@@ -75,27 +75,27 @@ public class TransactionTest {
*/
public void testUserManagedConnection() {
DbTestDao testDao = ComponentContext.inject(DbTestDao.class);
- Transaction txn = Transaction.open("SingleConnectionThread");
+ TransactionLegacy txn = TransactionLegacy.open("SingleConnectionThread");
Connection conn = null;
try {
- conn = Transaction.getStandaloneConnectionWithException();
+ conn = TransactionLegacy.getStandaloneConnectionWithException();
txn.transitToUserManagedConnection(conn);
// try two SQLs to make sure that they are using the same connection
// acquired above.
testDao.create(1, 1, "Record 1");
- Connection checkConn = Transaction.currentTxn().getConnection();
+ Connection checkConn = TransactionLegacy.currentTxn().getConnection();
if (checkConn != conn) {
Assert.fail("A new db connection is acquired instead of using old one after create sql");
}
testDao.update(2, 2, "Record 1");
- Connection checkConn2 = Transaction.currentTxn().getConnection();
+ Connection checkConn2 = TransactionLegacy.currentTxn().getConnection();
if (checkConn2 != conn) {
Assert.fail("A new db connection is acquired instead of using old one after update sql");
}
} catch (SQLException e) {
Assert.fail(e.getMessage());
} finally {
- txn.transitToAutoManagedConnection(Transaction.CLOUD_DB);
+ txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB);
txn.close();
if (conn != null) {
@@ -117,28 +117,28 @@ public class TransactionTest {
// acquire a db connection and keep it
Connection conn = null;
try {
- conn = Transaction.getStandaloneConnectionWithException();
+ conn = TransactionLegacy.getStandaloneConnectionWithException();
} catch (SQLException ex) {
throw new CloudRuntimeException("Problem with getting db connection", ex);
}
// start heartbeat loop, make sure that each loop still use the same
// connection
- Transaction txn = null;
+ TransactionLegacy txn = null;
for (int i = 0; i < 3; i++) {
- txn = Transaction.open("HeartbeatSimulator");
+ txn = TransactionLegacy.open("HeartbeatSimulator");
try {
txn.transitToUserManagedConnection(conn);
testDao.create(i, i, "Record " + i);
- Connection checkConn = Transaction.currentTxn().getConnection();
+ Connection checkConn = TransactionLegacy.currentTxn().getConnection();
if (checkConn != conn) {
Assert.fail("A new db connection is acquired instead of using old one in loop " + i);
}
} catch (SQLException e) {
Assert.fail(e.getMessage());
} finally {
- txn.transitToAutoManagedConnection(Transaction.CLOUD_DB);
+ txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB);
txn.close();
}
}
@@ -161,7 +161,7 @@ public class TransactionTest {
Connection conn = null;
PreparedStatement pstmt = null;
try {
- conn = Transaction.getStandaloneConnection();
+ conn = TransactionLegacy.getStandaloneConnection();
pstmt = conn.prepareStatement("truncate table `cloud`.`test`");
pstmt.execute();
@@ -189,7 +189,7 @@ public class TransactionTest {
Connection conn = null;
PreparedStatement pstmt = null;
try {
- conn = Transaction.getStandaloneConnection();
+ conn = TransactionLegacy.getStandaloneConnection();
pstmt = conn.prepareStatement("DROP TABLE IF EXISTS `cloud`.`test`");
pstmt.execute();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
index fb3845c..ed161e7 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobDaoImpl.java
@@ -32,7 +32,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
public class AsyncJobDaoImpl extends GenericDaoBase<AsyncJobVO, Long> implements AsyncJobDao {
private static final Logger s_logger = Logger.getLogger(AsyncJobDaoImpl.class.getName());
@@ -182,7 +182,7 @@ public class AsyncJobDaoImpl extends GenericDaoBase<AsyncJobVO, Long> implements
+ ", job_result='" + jobResultMessage + "' where job_status=" + JobInfo.Status.IN_PROGRESS.ordinal()
+ " AND (job_executing_msid=? OR (job_executing_msid IS NULL AND job_init_msid=?))";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java
index 20d8ba6..d4ca0d7 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/AsyncJobJoinMapDaoImpl.java
@@ -34,7 +34,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -157,7 +157,7 @@ public class AsyncJobJoinMapDaoImpl extends GenericDaoBase<AsyncJobJoinMapVO, Lo
//
// Date cutDate = DateUtil.currentGMTTime();
//
-// Transaction txn = Transaction.currentTxn();
+// TransactionLegacy txn = TransactionLegacy.currentTxn();
// PreparedStatement pstmt = null;
// try {
// txn.start();
@@ -213,7 +213,7 @@ public class AsyncJobJoinMapDaoImpl extends GenericDaoBase<AsyncJobJoinMapVO, Lo
public List<Long> findJobsToWake(long joinedJobId) {
// TODO: We should fix this. We shouldn't be crossing daos in a dao code.
List<Long> standaloneList = new ArrayList<Long>();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
String sql = "SELECT job_id FROM async_job_join_map WHERE join_job_id = ? AND job_id NOT IN (SELECT content_id FROM sync_queue_item)";
try {
PreparedStatement pstmt = txn.prepareStatement(sql);
@@ -231,7 +231,7 @@ public class AsyncJobJoinMapDaoImpl extends GenericDaoBase<AsyncJobJoinMapVO, Lo
@Override
public List<Long> findJobsToWakeBetween(Date cutDate) {
List<Long> standaloneList = new ArrayList<Long>();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
String sql = "SELECT job_id FROM async_job_join_map WHERE next_wakeup < ? AND expiration > ? AND job_id NOT IN (SELECT content_id FROM sync_queue_item)";
PreparedStatement pstmt = txn.prepareStatement(sql);
@@ -260,7 +260,7 @@ public class AsyncJobJoinMapDaoImpl extends GenericDaoBase<AsyncJobJoinMapVO, Lo
// public List<Long> wakeupByJoinedJobCompletion(long joinedJobId) {
// List<Long> standaloneList = new ArrayList<Long>();
//
-// Transaction txn = Transaction.currentTxn();
+// TransactionLegacy txn = TransactionLegacy.currentTxn();
// PreparedStatement pstmt = null;
// try {
// txn.start();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java
index f7d9d72..01efc4e 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueDaoImpl.java
@@ -30,7 +30,7 @@ import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
public class SyncQueueDaoImpl extends GenericDaoBase<SyncQueueVO, Long> implements SyncQueueDao {
private static final Logger s_logger = Logger.getLogger(SyncQueueDaoImpl.class.getName());
@@ -51,7 +51,7 @@ public class SyncQueueDaoImpl extends GenericDaoBase<SyncQueueVO, Long> implemen
String sql = "INSERT IGNORE INTO sync_queue(sync_objtype, sync_objid, created, last_updated)" +
" values(?, ?, ?, ?)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
index 0cd231f..2f04a7c 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
@@ -37,7 +37,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@DB
public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long> implements SyncQueueItemDao {
@@ -83,7 +83,7 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long>
" ORDER BY i.id " +
" LIMIT 0, ?";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index 93d50c1..ffc7b3a 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -70,8 +70,11 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.exception.ExceptionUtil;
import com.cloud.utils.mgmt.JmxUtil;
@@ -177,19 +180,22 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
@SuppressWarnings("unchecked")
@Override
@DB
- public long submitAsyncJob(AsyncJob job, String syncObjType, long syncObjId) {
- Transaction txt = Transaction.currentTxn();
+ public long submitAsyncJob(final AsyncJob job, final String syncObjType, final long syncObjId) {
try {
@SuppressWarnings("rawtypes")
- GenericDao dao = GenericDaoBase.getDao(job.getClass());
+ final GenericDao dao = GenericDaoBase.getDao(job.getClass());
- txt.start();
- job.setInitMsid(getMsid());
- dao.persist(job);
+ return Transaction.execute(new TransactionCallback<Long>() {
+ @Override
+ public Long doInTransaction(TransactionStatus status) {
+ job.setInitMsid(getMsid());
+ dao.persist(job);
+
+ syncAsyncJobExecution(job, syncObjType, syncObjId, 1);
- syncAsyncJobExecution(job, syncObjType, syncObjId, 1);
- txt.commit();
- return job.getId();
+ return job.getId();
+ }
+ });
} catch (Exception e) {
String errMsg = "Unable to schedule async job for command " + job.getCmd() + ", unexpected exception.";
s_logger.warn(errMsg, e);
@@ -199,123 +205,110 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
@Override
@DB
- public void completeAsyncJob(long jobId, Status jobStatus, int resultCode, String resultObject) {
+ public void completeAsyncJob(final long jobId, final Status jobStatus, final int resultCode, final String resultObject) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Complete async job-" + jobId + ", jobStatus: " + jobStatus + ", resultCode: " + resultCode + ", result: " + resultObject);
}
- Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
- AsyncJobVO job = _jobDao.findById(jobId);
- if (job == null) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("job-" + jobId + " no longer exists, we just log completion info here. " + jobStatus + ", resultCode: " + resultCode + ", result: " +
- resultObject);
- }
-
- txn.rollback();
- return;
+ final AsyncJobVO job = _jobDao.findById(jobId);
+ if (job == null) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("job-" + jobId + " no longer exists, we just log completion info here. " + jobStatus + ", resultCode: " + resultCode + ", result: " +
+ resultObject);
}
- if (job.getStatus() != JobInfo.Status.IN_PROGRESS) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("job-" + jobId + " is already completed.");
- }
+ return;
+ }
- txn.rollback();
- return;
+ if (job.getStatus() != JobInfo.Status.IN_PROGRESS) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("job-" + jobId + " is already completed.");
}
- job.setCompleteMsid(getMsid());
- job.setStatus(jobStatus);
- job.setResultCode(resultCode);
+ return;
+ }
- // reset attached object
- job.setInstanceType(null);
- job.setInstanceId(null);
+ List<Long> wakeupList = Transaction.execute(new TransactionCallback<List<Long>>() {
+ @Override
+ public List<Long> doInTransaction(TransactionStatus status) {
+ job.setCompleteMsid(getMsid());
+ job.setStatus(jobStatus);
+ job.setResultCode(resultCode);
- if (resultObject != null) {
- job.setResult(resultObject);
- }
+ // reset attached object
+ job.setInstanceType(null);
+ job.setInstanceId(null);
- job.setLastUpdated(DateUtil.currentGMTTime());
- _jobDao.update(jobId, job);
+ if (resultObject != null) {
+ job.setResult(resultObject);
+ }
- List<Long> wakeupList = wakeupByJoinedJobCompletion(jobId);
- _joinMapDao.disjoinAllJobs(jobId);
+ job.setLastUpdated(DateUtil.currentGMTTime());
+ _jobDao.update(jobId, job);
- txn.commit();
+ List<Long> wakeupList = wakeupByJoinedJobCompletion(jobId);
+ _joinMapDao.disjoinAllJobs(jobId);
- for (Long id : wakeupList) {
- // TODO, we assume that all jobs in this category is API job only
- AsyncJobVO jobToWakeup = _jobDao.findById(id);
- if (jobToWakeup != null && (jobToWakeup.getPendingSignals() & AsyncJob.Constants.SIGNAL_MASK_WAKEUP) != 0)
- scheduleExecution(jobToWakeup, false);
+ return wakeupList;
}
+ });
- _messageBus.publish(null, AsyncJob.Topics.JOB_STATE, PublishScope.GLOBAL, jobId);
- } catch (Exception e) {
- s_logger.error("Unexpected exception while completing async job-" + jobId, e);
- txn.rollback();
+ for (Long id : wakeupList) {
+ // TODO, we assume that all jobs in this category is API job only
+ AsyncJobVO jobToWakeup = _jobDao.findById(id);
+ if (jobToWakeup != null && (jobToWakeup.getPendingSignals() & AsyncJob.Constants.SIGNAL_MASK_WAKEUP) != 0)
+ scheduleExecution(jobToWakeup, false);
}
+
+ _messageBus.publish(null, AsyncJob.Topics.JOB_STATE, PublishScope.GLOBAL, jobId);
}
@Override
@DB
- public void updateAsyncJobStatus(long jobId, int processStatus, String resultObject) {
+ public void updateAsyncJobStatus(final long jobId, final int processStatus, final String resultObject) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Update async-job progress, job-" + jobId + ", processStatus: " + processStatus + ", result: " + resultObject);
}
- Transaction txt = Transaction.currentTxn();
- try {
- txt.start();
- AsyncJobVO job = _jobDao.findById(jobId);
- if (job == null) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("job-" + jobId + " no longer exists, we just log progress info here. progress status: " + processStatus);
- }
-
- txt.rollback();
- return;
+ final AsyncJobVO job = _jobDao.findById(jobId);
+ if (job == null) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("job-" + jobId + " no longer exists, we just log progress info here. progress status: " + processStatus);
}
- job.setProcessStatus(processStatus);
- if (resultObject != null) {
- job.setResult(resultObject);
- }
- job.setLastUpdated(DateUtil.currentGMTTime());
- _jobDao.update(jobId, job);
- txt.commit();
- } catch (Exception e) {
- s_logger.error("Unexpected exception while updating async job-" + jobId + " status: ", e);
- txt.rollback();
+ return;
}
+
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ job.setProcessStatus(processStatus);
+ if (resultObject != null) {
+ job.setResult(resultObject);
+ }
+ job.setLastUpdated(DateUtil.currentGMTTime());
+ _jobDao.update(jobId, job);
+ }
+ });
}
@Override
@DB
- public void updateAsyncJobAttachment(long jobId, String instanceType, Long instanceId) {
+ public void updateAsyncJobAttachment(final long jobId, final String instanceType, final Long instanceId) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Update async-job attachment, job-" + jobId + ", instanceType: " + instanceType + ", instanceId: " + instanceId);
}
- Transaction txt = Transaction.currentTxn();
- try {
- txt.start();
-
- AsyncJobVO job = _jobDao.createForUpdate();
- job.setInstanceType(instanceType);
- job.setInstanceId(instanceId);
- job.setLastUpdated(DateUtil.currentGMTTime());
- _jobDao.update(jobId, job);
-
- txt.commit();
- } catch (Exception e) {
- s_logger.error("Unexpected exception while updating async job-" + jobId + " attachment: ", e);
- txt.rollback();
- }
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ AsyncJobVO job = _jobDao.createForUpdate();
+ job.setInstanceType(instanceType);
+ job.setInstanceId(instanceId);
+ job.setLastUpdated(DateUtil.currentGMTTime());
+ _jobDao.update(jobId, job);
+ }
+ });
}
@Override
@@ -493,15 +486,12 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
return new ManagedContextRunnable() {
@Override
protected void runInContext() {
- Transaction txn = null;
long runNumber = getJobRunNumber();
try {
//
// setup execution environment
//
- txn = Transaction.open(Transaction.CLOUD_DB);
-
try {
JmxUtil.registerMBean("AsyncJobManager", "Active Job " + job.getId(), new AsyncJobMBeanImpl(job));
} catch (Exception e) {
@@ -564,9 +554,6 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
s_logger.trace("Unable to unregister job " + job.getId() + " to JMX monitoring due to exception " + ExceptionUtil.toString(e));
}
- if (txn != null)
- txn.close();
-
//
// clean execution environment
//
@@ -690,7 +677,6 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
return new ManagedContextRunnable() {
@Override
protected void runInContext() {
- Transaction txn = Transaction.open("AsyncJobManagerImpl.getHeartbeatTask");
try {
List<SyncQueueItemVO> l = _queueMgr.dequeueFromAny(getMsid(), MAX_ONETIME_SCHEDULE_SIZE);
if (l != null && l.size() > 0) {
@@ -711,12 +697,6 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
}
} catch (Throwable e) {
s_logger.error("Unexpected exception when trying to execute queue item, ", e);
- } finally {
- try {
- txn.close();
- } catch (Throwable e) {
- s_logger.error("Unexpected exception", e);
- }
}
}
};
@@ -785,13 +765,15 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
}
@DB
- protected void expungeAsyncJob(AsyncJobVO job) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _jobDao.expunge(job.getId());
- //purge corresponding sync queue item
- _queueMgr.purgeAsyncJobQueueItemId(job.getId());
- txn.commit();
+ protected void expungeAsyncJob(final AsyncJobVO job) {
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _jobDao.expunge(job.getId());
+ //purge corresponding sync queue item
+ _queueMgr.purgeAsyncJobQueueItemId(job.getId());
+ }
+ });
}
private long getMsid() {
@@ -825,58 +807,60 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
Collections.sort(result);
Long[] ids = result.toArray(new Long[result.size()]);
- SearchCriteria<AsyncJobVO> jobsSC = JobIdsSearch.create("ids", ids);
- SearchCriteria<SyncQueueItemVO> queueItemsSC = QueueJobIdsSearch.create("contentIds", ids);
+ final SearchCriteria<AsyncJobVO> jobsSC = JobIdsSearch.create("ids", ids);
+ final SearchCriteria<SyncQueueItemVO> queueItemsSC = QueueJobIdsSearch.create("contentIds", ids);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- AsyncJobVO job = _jobDao.createForUpdate();
- job.setPendingSignals(AsyncJob.Constants.SIGNAL_MASK_WAKEUP);
- _jobDao.update(job, jobsSC);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ AsyncJobVO job = _jobDao.createForUpdate();
+ job.setPendingSignals(AsyncJob.Constants.SIGNAL_MASK_WAKEUP);
+ _jobDao.update(job, jobsSC);
- SyncQueueItemVO item = _queueItemDao.createForUpdate();
- item.setLastProcessNumber(null);
- item.setLastProcessMsid(null);
- _queueItemDao.update(item, queueItemsSC);
- txn.commit();
+ SyncQueueItemVO item = _queueItemDao.createForUpdate();
+ item.setLastProcessNumber(null);
+ item.setLastProcessMsid(null);
+ _queueItemDao.update(item, queueItemsSC);
+ }
+ });
}
return _joinMapDao.findJobsToWake(joinedJobId);
}
@DB
protected List<Long> wakeupScan() {
- Date cutDate = DateUtil.currentGMTTime();
- Transaction txn = Transaction.currentTxn();
+ final Date cutDate = DateUtil.currentGMTTime();
SearchCriteria<Long> sc = JoinJobTimeSearch.create();
sc.setParameters("beginTime", cutDate);
sc.setParameters("endTime", cutDate);
- List<Long> result = _joinMapDao.customSearch(sc, null);
-
- txn.start();
- if (result.size() > 0) {
- Collections.sort(result);
- Long[] ids = result.toArray(new Long[result.size()]);
+ final List<Long> result = _joinMapDao.customSearch(sc, null);
- AsyncJobVO job = _jobDao.createForUpdate();
- job.setPendingSignals(AsyncJob.Constants.SIGNAL_MASK_WAKEUP);
+ return Transaction.execute(new TransactionCallback<List<Long>>() {
+ @Override
+ public List<Long> doInTransaction(TransactionStatus status) {
+ if (result.size() > 0) {
+ Collections.sort(result);
+ Long[] ids = result.toArray(new Long[result.size()]);
- SearchCriteria<AsyncJobVO> sc2 = JobIdsSearch.create("ids", ids);
- SearchCriteria<SyncQueueItemVO> queueItemsSC = QueueJobIdsSearch.create("contentIds", ids);
+ AsyncJobVO job = _jobDao.createForUpdate();
+ job.setPendingSignals(AsyncJob.Constants.SIGNAL_MASK_WAKEUP);
- _jobDao.update(job, sc2);
+ SearchCriteria<AsyncJobVO> sc2 = JobIdsSearch.create("ids", ids);
+ SearchCriteria<SyncQueueItemVO> queueItemsSC = QueueJobIdsSearch.create("contentIds", ids);
- SyncQueueItemVO item = _queueItemDao.createForUpdate();
- item.setLastProcessNumber(null);
- item.setLastProcessMsid(null);
- _queueItemDao.update(item, queueItemsSC);
- }
+ _jobDao.update(job, sc2);
- List<Long> wakupIds = _joinMapDao.findJobsToWakeBetween(cutDate);
- txn.commit();
+ SyncQueueItemVO item = _queueItemDao.createForUpdate();
+ item.setLastProcessNumber(null);
+ item.setLastProcessMsid(null);
+ _queueItemDao.update(item, queueItemsSC);
+ }
- return wakupIds;
+ return _joinMapDao.findJobsToWakeBetween(cutDate);
+ }
+ });
}
@Override
@@ -933,18 +917,18 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
@Override
public void onManagementNodeLeft(List<? extends ManagementServerHost> nodeList, long selfNodeId) {
- for (ManagementServerHost msHost : nodeList) {
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ for (final ManagementServerHost msHost : nodeList) {
try {
- txn.start();
- List<SyncQueueItemVO> items = _queueMgr.getActiveQueueItems(msHost.getId(), true);
- cleanupPendingJobs(items);
- _jobDao.resetJobProcess(msHost.getId(), ApiErrorCode.INTERNAL_ERROR.getHttpCode(), "job cancelled because of management server restart");
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ List<SyncQueueItemVO> items = _queueMgr.getActiveQueueItems(msHost.getId(), true);
+ cleanupPendingJobs(items);
+ _jobDao.resetJobProcess(msHost.getId(), ApiErrorCode.INTERNAL_ERROR.getHttpCode(), "job cancelled because of management server restart");
+ }
+ });
} catch (Throwable e) {
s_logger.warn("Unexpected exception ", e);
- } finally {
- txn.close();
}
}
}
[13/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
index b9b5d6b..7fb0245 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
@@ -21,8 +21,8 @@ import java.util.Date;
import java.util.List;
import javax.inject.Inject;
-import org.apache.log4j.Logger;
+import org.apache.log4j.Logger;
import org.apache.cloudstack.framework.jobs.dao.SyncQueueDao;
import org.apache.cloudstack.framework.jobs.dao.SyncQueueItemDao;
@@ -30,6 +30,9 @@ import com.cloud.utils.DateUtil;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManager {
@@ -40,84 +43,83 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
@Override
@DB
- public SyncQueueVO queue(String syncObjType, long syncObjId, String itemType, long itemId, long queueSizeLimit) {
- Transaction txn = Transaction.currentTxn();
+ public SyncQueueVO queue(final String syncObjType, final long syncObjId, final String itemType, final long itemId, final long queueSizeLimit) {
try {
- txn.start();
-
- _syncQueueDao.ensureQueue(syncObjType, syncObjId);
- SyncQueueVO queueVO = _syncQueueDao.find(syncObjType, syncObjId);
- if(queueVO == null)
- throw new CloudRuntimeException("Unable to queue item into DB, DB is full?");
-
- queueVO.setQueueSizeLimit(queueSizeLimit);
- _syncQueueDao.update(queueVO.getId(), queueVO);
-
- Date dt = DateUtil.currentGMTTime();
- SyncQueueItemVO item = new SyncQueueItemVO();
- item.setQueueId(queueVO.getId());
- item.setContentType(itemType);
- item.setContentId(itemId);
- item.setCreated(dt);
-
- _syncQueueItemDao.persist(item);
- txn.commit();
+ return Transaction.execute(new TransactionCallback<SyncQueueVO>() {
+ @Override
+ public SyncQueueVO doInTransaction(TransactionStatus status) {
+ _syncQueueDao.ensureQueue(syncObjType, syncObjId);
+ SyncQueueVO queueVO = _syncQueueDao.find(syncObjType, syncObjId);
+ if(queueVO == null)
+ throw new CloudRuntimeException("Unable to queue item into DB, DB is full?");
+
+ queueVO.setQueueSizeLimit(queueSizeLimit);
+ _syncQueueDao.update(queueVO.getId(), queueVO);
- return queueVO;
+ Date dt = DateUtil.currentGMTTime();
+ SyncQueueItemVO item = new SyncQueueItemVO();
+ item.setQueueId(queueVO.getId());
+ item.setContentType(itemType);
+ item.setContentId(itemId);
+ item.setCreated(dt);
+
+ _syncQueueItemDao.persist(item);
+ return queueVO;
+ }
+ });
} catch(Exception e) {
s_logger.error("Unexpected exception: ", e);
- txn.rollback();
}
return null;
}
@Override
@DB
- public SyncQueueItemVO dequeueFromOne(long queueId, Long msid) {
- Transaction txt = Transaction.currentTxn();
+ public SyncQueueItemVO dequeueFromOne(final long queueId, final Long msid) {
try {
- txt.start();
-
- SyncQueueVO queueVO = _syncQueueDao.lockRow(queueId, true);
- if(queueVO == null) {
- s_logger.error("Sync queue(id: " + queueId + ") does not exist");
- txt.commit();
- return null;
- }
-
- if(queueReadyToProcess(queueVO)) {
- SyncQueueItemVO itemVO = _syncQueueItemDao.getNextQueueItem(queueVO.getId());
- if(itemVO != null) {
- Long processNumber = queueVO.getLastProcessNumber();
- if(processNumber == null)
- processNumber = new Long(1);
- else
- processNumber = processNumber + 1;
- Date dt = DateUtil.currentGMTTime();
- queueVO.setLastProcessNumber(processNumber);
- queueVO.setLastUpdated(dt);
- queueVO.setQueueSize(queueVO.getQueueSize() + 1);
- _syncQueueDao.update(queueVO.getId(), queueVO);
+ return Transaction.execute(new TransactionCallback<SyncQueueItemVO>() {
+ @Override
+ public SyncQueueItemVO doInTransaction(TransactionStatus status) {
+ SyncQueueVO queueVO = _syncQueueDao.lockRow(queueId, true);
+ if(queueVO == null) {
+ s_logger.error("Sync queue(id: " + queueId + ") does not exist");
+ return null;
+ }
- itemVO.setLastProcessMsid(msid);
- itemVO.setLastProcessNumber(processNumber);
- itemVO.setLastProcessTime(dt);
- _syncQueueItemDao.update(itemVO.getId(), itemVO);
+ if(queueReadyToProcess(queueVO)) {
+ SyncQueueItemVO itemVO = _syncQueueItemDao.getNextQueueItem(queueVO.getId());
+ if(itemVO != null) {
+ Long processNumber = queueVO.getLastProcessNumber();
+ if(processNumber == null)
+ processNumber = new Long(1);
+ else
+ processNumber = processNumber + 1;
+ Date dt = DateUtil.currentGMTTime();
+ queueVO.setLastProcessNumber(processNumber);
+ queueVO.setLastUpdated(dt);
+ queueVO.setQueueSize(queueVO.getQueueSize() + 1);
+ _syncQueueDao.update(queueVO.getId(), queueVO);
+
+ itemVO.setLastProcessMsid(msid);
+ itemVO.setLastProcessNumber(processNumber);
+ itemVO.setLastProcessTime(dt);
+ _syncQueueItemDao.update(itemVO.getId(), itemVO);
+
+ return itemVO;
+ } else {
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("Sync queue (" + queueId + ") is currently empty");
+ }
+ } else {
+ if(s_logger.isDebugEnabled())
+ s_logger.debug("There is a pending process in sync queue(id: " + queueId + ")");
+ }
- txt.commit();
- return itemVO;
- } else {
- if(s_logger.isDebugEnabled())
- s_logger.debug("Sync queue (" + queueId + ") is currently empty");
+ return null;
}
- } else {
- if(s_logger.isDebugEnabled())
- s_logger.debug("There is a pending process in sync queue(id: " + queueId + ")");
- }
- txt.commit();
+ });
} catch(Exception e) {
s_logger.error("Unexpected exception: ", e);
- txt.rollback();
}
return null;
@@ -125,101 +127,104 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
@Override
@DB
- public List<SyncQueueItemVO> dequeueFromAny(Long msid, int maxItems) {
-
- List<SyncQueueItemVO> resultList = new ArrayList<SyncQueueItemVO>();
- Transaction txt = Transaction.currentTxn();
- try {
- txt.start();
+ public List<SyncQueueItemVO> dequeueFromAny(final Long msid, final int maxItems) {
- List<SyncQueueItemVO> l = _syncQueueItemDao.getNextQueueItems(maxItems);
- if(l != null && l.size() > 0) {
- for(SyncQueueItemVO item : l) {
- SyncQueueVO queueVO = _syncQueueDao.lockRow(item.getQueueId(), true);
- SyncQueueItemVO itemVO = _syncQueueItemDao.lockRow(item.getId(), true);
- if(queueReadyToProcess(queueVO) && itemVO.getLastProcessNumber() == null) {
- Long processNumber = queueVO.getLastProcessNumber();
- if(processNumber == null)
- processNumber = new Long(1);
- else
- processNumber = processNumber + 1;
+ final List<SyncQueueItemVO> resultList = new ArrayList<SyncQueueItemVO>();
- Date dt = DateUtil.currentGMTTime();
- queueVO.setLastProcessNumber(processNumber);
- queueVO.setLastUpdated(dt);
- queueVO.setQueueSize(queueVO.getQueueSize() + 1);
- _syncQueueDao.update(queueVO.getId(), queueVO);
-
- itemVO.setLastProcessMsid(msid);
- itemVO.setLastProcessNumber(processNumber);
- itemVO.setLastProcessTime(dt);
- _syncQueueItemDao.update(item.getId(), itemVO);
-
- resultList.add(item);
+ try {
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ List<SyncQueueItemVO> l = _syncQueueItemDao.getNextQueueItems(maxItems);
+ if(l != null && l.size() > 0) {
+ for(SyncQueueItemVO item : l) {
+ SyncQueueVO queueVO = _syncQueueDao.lockRow(item.getQueueId(), true);
+ SyncQueueItemVO itemVO = _syncQueueItemDao.lockRow(item.getId(), true);
+ if(queueReadyToProcess(queueVO) && itemVO.getLastProcessNumber() == null) {
+ Long processNumber = queueVO.getLastProcessNumber();
+ if(processNumber == null)
+ processNumber = new Long(1);
+ else
+ processNumber = processNumber + 1;
+
+ Date dt = DateUtil.currentGMTTime();
+ queueVO.setLastProcessNumber(processNumber);
+ queueVO.setLastUpdated(dt);
+ queueVO.setQueueSize(queueVO.getQueueSize() + 1);
+ _syncQueueDao.update(queueVO.getId(), queueVO);
+
+ itemVO.setLastProcessMsid(msid);
+ itemVO.setLastProcessNumber(processNumber);
+ itemVO.setLastProcessTime(dt);
+ _syncQueueItemDao.update(item.getId(), itemVO);
+
+ resultList.add(item);
+ }
+ }
}
}
- }
- txt.commit();
+ });
+
return resultList;
} catch(Exception e) {
s_logger.error("Unexpected exception: ", e);
- txt.rollback();
}
+
return null;
}
@Override
@DB
- public void purgeItem(long queueItemId) {
- Transaction txt = Transaction.currentTxn();
+ public void purgeItem(final long queueItemId) {
try {
- txt.start();
-
- SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
- if(itemVO != null) {
- SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
-
- _syncQueueItemDao.expunge(itemVO.getId());
-
- // if item is active, reset queue information
- if (itemVO.getLastProcessMsid() != null) {
- queueVO.setLastUpdated(DateUtil.currentGMTTime());
- // decrement the count
- assert (queueVO.getQueueSize() > 0) : "Count reduce happens when it's already <= 0!";
- queueVO.setQueueSize(queueVO.getQueueSize() - 1);
- _syncQueueDao.update(queueVO.getId(), queueVO);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
+ if(itemVO != null) {
+ SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
+
+ _syncQueueItemDao.expunge(itemVO.getId());
+
+ // if item is active, reset queue information
+ if (itemVO.getLastProcessMsid() != null) {
+ queueVO.setLastUpdated(DateUtil.currentGMTTime());
+ // decrement the count
+ assert (queueVO.getQueueSize() > 0) : "Count reduce happens when it's already <= 0!";
+ queueVO.setQueueSize(queueVO.getQueueSize() - 1);
+ _syncQueueDao.update(queueVO.getId(), queueVO);
+ }
+ }
}
- }
- txt.commit();
+ });
} catch(Exception e) {
s_logger.error("Unexpected exception: ", e);
- txt.rollback();
}
}
@Override
@DB
- public void returnItem(long queueItemId) {
- Transaction txt = Transaction.currentTxn();
+ public void returnItem(final long queueItemId) {
try {
- txt.start();
-
- SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
- if(itemVO != null) {
- SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
-
- itemVO.setLastProcessMsid(null);
- itemVO.setLastProcessNumber(null);
- itemVO.setLastProcessTime(null);
- _syncQueueItemDao.update(queueItemId, itemVO);
-
- queueVO.setLastUpdated(DateUtil.currentGMTTime());
- _syncQueueDao.update(queueVO.getId(), queueVO);
- }
- txt.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ SyncQueueItemVO itemVO = _syncQueueItemDao.findById(queueItemId);
+ if(itemVO != null) {
+ SyncQueueVO queueVO = _syncQueueDao.lockRow(itemVO.getQueueId(), true);
+
+ itemVO.setLastProcessMsid(null);
+ itemVO.setLastProcessNumber(null);
+ itemVO.setLastProcessTime(null);
+ _syncQueueItemDao.update(queueItemId, itemVO);
+
+ queueVO.setLastUpdated(DateUtil.currentGMTTime());
+ _syncQueueDao.update(queueVO.getId(), queueVO);
+ }
+ }
+ });
} catch(Exception e) {
s_logger.error("Unexpected exception: ", e);
- txt.rollback();
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
----------------------------------------------------------------------
diff --git a/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java b/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
index da23172..cc1d3f3 100644
--- a/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
+++ b/plugins/affinity-group-processors/explicit-dedication/src/org/apache/cloudstack/affinity/ExplicitDedicationProcessor.java
@@ -24,7 +24,6 @@ import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.affinity.dao.AffinityGroupDao;
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
@@ -48,6 +47,8 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
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.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
@@ -410,7 +411,7 @@ public class ExplicitDedicationProcessor extends AffinityProcessorBase implement
@DB
@Override
- public void handleDeleteGroup(AffinityGroup group) {
+ public void handleDeleteGroup(final AffinityGroup group) {
// When a group of the 'ExplicitDedication' type gets deleted, make sure
// to remove the dedicated resources in the group as well.
if (group != null) {
@@ -419,20 +420,21 @@ public class ExplicitDedicationProcessor extends AffinityProcessorBase implement
if (s_logger.isDebugEnabled()) {
s_logger.debug("Releasing the dedicated resources under group: " + group);
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- SearchBuilder<DedicatedResourceVO> listByAffinityGroup = _dedicatedDao.createSearchBuilder();
- listByAffinityGroup.and("affinityGroupId", listByAffinityGroup.entity().getAffinityGroupId(),
- SearchCriteria.Op.EQ);
- listByAffinityGroup.done();
- SearchCriteria<DedicatedResourceVO> sc = listByAffinityGroup.create();
- sc.setParameters("affinityGroupId", group.getId());
- _dedicatedDao.lockRows(sc, null, true);
- _dedicatedDao.remove(sc);
-
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ SearchBuilder<DedicatedResourceVO> listByAffinityGroup = _dedicatedDao.createSearchBuilder();
+ listByAffinityGroup.and("affinityGroupId", listByAffinityGroup.entity().getAffinityGroupId(),
+ SearchCriteria.Op.EQ);
+ listByAffinityGroup.done();
+ SearchCriteria<DedicatedResourceVO> sc = listByAffinityGroup.create();
+ sc.setParameters("affinityGroupId", group.getId());
+
+ _dedicatedDao.lockRows(sc, null, true);
+ _dedicatedDao.remove(sc);
+ }
+ });
} else {
if (s_logger.isDebugEnabled()) {
s_logger.debug("No dedicated resources to releease under group: " + group);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java b/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
index 6a6b47c..cda46ef 100755
--- a/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
+++ b/plugins/dedicated-resources/src/org/apache/cloudstack/dedicated/DedicatedResourceManagerImpl.java
@@ -48,7 +48,6 @@ import org.apache.cloudstack.api.response.DedicatePodResponse;
import org.apache.cloudstack.api.response.DedicateZoneResponse;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@@ -79,6 +78,9 @@ import com.cloud.utils.NumbersUtil;
import com.cloud.utils.Pair;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.UserVmVO;
import com.cloud.vm.dao.UserVmDao;
@@ -113,7 +115,7 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Zone")
- public List<DedicatedResourceVO> dedicateZone(Long zoneId, Long domainId, String accountName) {
+ public List<DedicatedResourceVO> dedicateZone(final Long zoneId, final Long domainId, final String accountName) {
Long accountId = null;
List<HostVO> hosts = null;
if(accountName != null){
@@ -124,7 +126,7 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
List<Long> childDomainIds = getDomainChildIds(domainId);
childDomainIds.add(domainId);
checkAccountAndDomain(accountId, domainId);
- DataCenterVO dc = _zoneDao.findById(zoneId);
+ final DataCenterVO dc = _zoneDao.findById(zoneId);
if (dc == null) {
throw new InvalidParameterValueException("Unable to find zone by id " + zoneId);
} else {
@@ -220,46 +222,50 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
checkHostsSuitabilityForExplicitDedication(accountId, childDomainIds, hosts);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- // find or create the affinity group by name under this account/domain
- AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountId);
- if (group == null) {
- s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
- throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
- }
+ final Long accountIdFinal = accountId;
+ return Transaction.execute(new TransactionCallback<List<DedicatedResourceVO>>() {
+ @Override
+ public List<DedicatedResourceVO> doInTransaction(TransactionStatus status) {
+ // find or create the affinity group by name under this account/domain
+ AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountIdFinal);
+ if (group == null) {
+ s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
+ throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
+ }
- DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(zoneId, null, null, null, null, null,
- group.getId());
- try {
- dedicatedResource.setDomainId(domainId);
- if (accountId != null) {
- dedicatedResource.setAccountId(accountId);
- }
- dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+ DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(zoneId, null, null, null, null, null,
+ group.getId());
+ try {
+ dedicatedResource.setDomainId(domainId);
+ if (accountIdFinal != null) {
+ dedicatedResource.setAccountId(accountIdFinal);
+ }
+ dedicatedResource = _dedicatedDao.persist(dedicatedResource);
- // save the domainId in the zone
- dc.setDomainId(domainId);
- if (!_zoneDao.update(zoneId, dc)) {
- throw new CloudRuntimeException(
- "Failed to dedicate zone, could not set domainId. Please contact Cloud Support.");
- }
+ // save the domainId in the zone
+ dc.setDomainId(domainId);
+ if (!_zoneDao.update(zoneId, dc)) {
+ throw new CloudRuntimeException(
+ "Failed to dedicate zone, could not set domainId. Please contact Cloud Support.");
+ }
- } catch (Exception e) {
- s_logger.error("Unable to dedicate zone due to " + e.getMessage(), e);
- throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
- }
- txn.commit();
+ } catch (Exception e) {
+ s_logger.error("Unable to dedicate zone due to " + e.getMessage(), e);
+ throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
+ }
+
+ List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+ result.add(dedicatedResource);
+ return result;
- List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
- result.add(dedicatedResource);
- return result;
+ }
+ });
}
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Pod")
- public List<DedicatedResourceVO> dedicatePod(Long podId, Long domainId, String accountName) {
+ public List<DedicatedResourceVO> dedicatePod(final Long podId, final Long domainId, final String accountName) {
Long accountId = null;
if(accountName != null){
Account caller = CallContext.current().getCallingAccount();
@@ -353,37 +359,40 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
checkHostsSuitabilityForExplicitDedication(accountId, childDomainIds, hosts);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- // find or create the affinity group by name under this account/domain
- AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountId);
- if (group == null) {
- s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
- throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
- }
- DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, podId, null, null, null, null,
- group.getId());
- try {
- dedicatedResource.setDomainId(domainId);
- if (accountId != null) {
- dedicatedResource.setAccountId(accountId);
- }
- dedicatedResource = _dedicatedDao.persist(dedicatedResource);
- } catch (Exception e) {
- s_logger.error("Unable to dedicate pod due to " + e.getMessage(), e);
- throw new CloudRuntimeException("Failed to dedicate pod. Please contact Cloud Support.");
- }
- txn.commit();
+ final Long accountIdFinal = accountId;
+ return Transaction.execute(new TransactionCallback<List<DedicatedResourceVO>>() {
+ @Override
+ public List<DedicatedResourceVO> doInTransaction(TransactionStatus status) {
+ // find or create the affinity group by name under this account/domain
+ AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountIdFinal);
+ if (group == null) {
+ s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
+ throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
+ }
+ DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, podId, null, null, null, null,
+ group.getId());
+ try {
+ dedicatedResource.setDomainId(domainId);
+ if (accountIdFinal != null) {
+ dedicatedResource.setAccountId(accountIdFinal);
+ }
+ dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+ } catch (Exception e) {
+ s_logger.error("Unable to dedicate pod due to " + e.getMessage(), e);
+ throw new CloudRuntimeException("Failed to dedicate pod. Please contact Cloud Support.");
+ }
- List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
- result.add(dedicatedResource);
- return result;
+ List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+ result.add(dedicatedResource);
+ return result;
+ }
+ });
}
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Cluster")
- public List<DedicatedResourceVO> dedicateCluster(Long clusterId, Long domainId, String accountName) {
+ public List<DedicatedResourceVO> dedicateCluster(final Long clusterId, final Long domainId, final String accountName) {
Long accountId = null;
List<HostVO> hosts = null;
if(accountName != null){
@@ -463,37 +472,40 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
checkHostsSuitabilityForExplicitDedication(accountId, childDomainIds, hosts);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- // find or create the affinity group by name under this account/domain
- AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountId);
- if (group == null) {
- s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
- throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
- }
- DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, null, clusterId, null, null, null,
- group.getId());
- try {
- dedicatedResource.setDomainId(domainId);
- if (accountId != null) {
- dedicatedResource.setAccountId(accountId);
- }
- dedicatedResource = _dedicatedDao.persist(dedicatedResource);
- } catch (Exception e) {
- s_logger.error("Unable to dedicate host due to " + e.getMessage(), e);
- throw new CloudRuntimeException("Failed to dedicate cluster. Please contact Cloud Support.");
- }
- txn.commit();
+ final Long accountIdFinal = accountId;
+ return Transaction.execute(new TransactionCallback<List<DedicatedResourceVO>>() {
+ @Override
+ public List<DedicatedResourceVO> doInTransaction(TransactionStatus status) {
+ // find or create the affinity group by name under this account/domain
+ AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountIdFinal);
+ if (group == null) {
+ s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
+ throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
+ }
+ DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, null, clusterId, null, null, null,
+ group.getId());
+ try {
+ dedicatedResource.setDomainId(domainId);
+ if (accountIdFinal != null) {
+ dedicatedResource.setAccountId(accountIdFinal);
+ }
+ dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+ } catch (Exception e) {
+ s_logger.error("Unable to dedicate host due to " + e.getMessage(), e);
+ throw new CloudRuntimeException("Failed to dedicate cluster. Please contact Cloud Support.");
+ }
- List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
- result.add(dedicatedResource);
- return result;
+ List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+ result.add(dedicatedResource);
+ return result;
+ }
+ });
}
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE, eventDescription = "dedicating a Host")
- public List<DedicatedResourceVO> dedicateHost(Long hostId, Long domainId, String accountName) {
+ public List<DedicatedResourceVO> dedicateHost(final Long hostId, final Long domainId, final String accountName) {
Long accountId = null;
if(accountName != null){
Account caller = CallContext.current().getCallingAccount();
@@ -558,31 +570,35 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
childDomainIds.add(domainId);
checkHostSuitabilityForExplicitDedication(accountId, childDomainIds, hostId);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- // find or create the affinity group by name under this account/domain
- AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountId);
- if (group == null) {
- s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
- throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
- }
- DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, null, null, hostId, null, null,
- group.getId());
- try {
- dedicatedResource.setDomainId(domainId);
- if (accountId != null) {
- dedicatedResource.setAccountId(accountId);
- }
- dedicatedResource = _dedicatedDao.persist(dedicatedResource);
- } catch (Exception e) {
- s_logger.error("Unable to dedicate host due to " + e.getMessage(), e);
- throw new CloudRuntimeException("Failed to dedicate host. Please contact Cloud Support.");
- }
- txn.commit();
+ final Long accountIdFinal = accountId;
+ return Transaction.execute(new TransactionCallback<List<DedicatedResourceVO>>() {
+ @Override
+ public List<DedicatedResourceVO> doInTransaction(TransactionStatus status) {
+ // find or create the affinity group by name under this account/domain
+ AffinityGroup group = findOrCreateDedicatedAffinityGroup(domainId, accountIdFinal);
+ if (group == null) {
+ s_logger.error("Unable to dedicate zone due to, failed to create dedication affinity group");
+ throw new CloudRuntimeException("Failed to dedicate zone. Please contact Cloud Support.");
+ }
+ DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(null, null, null, hostId, null, null,
+ group.getId());
+ try {
+ dedicatedResource.setDomainId(domainId);
+ if (accountIdFinal != null) {
+ dedicatedResource.setAccountId(accountIdFinal);
+ }
+ dedicatedResource = _dedicatedDao.persist(dedicatedResource);
+ } catch (Exception e) {
+ s_logger.error("Unable to dedicate host due to " + e.getMessage(), e);
+ throw new CloudRuntimeException("Failed to dedicate host. Please contact Cloud Support.");
+ }
+
+ List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
+ result.add(dedicatedResource);
+ return result;
+ }
+ });
- List<DedicatedResourceVO> result = new ArrayList<DedicatedResourceVO>();
- result.add(dedicatedResource);
- return result;
}
private AffinityGroup findOrCreateDedicatedAffinityGroup(Long domainId, Long accountId) {
@@ -889,9 +905,8 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_DEDICATE_RESOURCE_RELEASE, eventDescription = "Releasing dedicated resource")
- public boolean releaseDedicatedResource(Long zoneId, Long podId, Long clusterId, Long hostId) throws InvalidParameterValueException{
+ public boolean releaseDedicatedResource(final Long zoneId, Long podId, Long clusterId, Long hostId) throws InvalidParameterValueException{
DedicatedResourceVO resource = null;
- Long resourceId = null;
if (zoneId != null) {
resource = _dedicatedDao.findByZoneId(zoneId);
}
@@ -907,26 +922,28 @@ public class DedicatedResourceManagerImpl implements DedicatedService {
if (resource == null){
throw new InvalidParameterValueException("No Dedicated Resource available to release");
} else {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- resourceId = resource.getId();
- if (!_dedicatedDao.remove(resourceId)) {
- throw new CloudRuntimeException("Failed to delete Resource " + resourceId);
- }
- if (zoneId != null) {
- // remove the domainId set in zone
- DataCenterVO dc = _zoneDao.findById(zoneId);
- if (dc != null) {
- dc.setDomainId(null);
- dc.setDomain(null);
- if (!_zoneDao.update(zoneId, dc)) {
- throw new CloudRuntimeException(
- "Failed to release dedicated zone, could not clear domainId. Please contact Cloud Support.");
+ final DedicatedResourceVO resourceFinal = resource;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ Long resourceId = resourceFinal.getId();
+ if (!_dedicatedDao.remove(resourceId)) {
+ throw new CloudRuntimeException("Failed to delete Resource " + resourceId);
+ }
+ if (zoneId != null) {
+ // remove the domainId set in zone
+ DataCenterVO dc = _zoneDao.findById(zoneId);
+ if (dc != null) {
+ dc.setDomainId(null);
+ dc.setDomain(null);
+ if (!_zoneDao.update(zoneId, dc)) {
+ throw new CloudRuntimeException(
+ "Failed to release dedicated zone, could not clear domainId. Please contact Cloud Support.");
+ }
+ }
}
}
- }
-
- txn.commit();
+ });
// find the group associated and check if there are any more
// resources under that group
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
index 314c957..4c07dae 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BareMetalPingServiceImpl.java
@@ -255,15 +255,12 @@ public class BareMetalPingServiceImpl extends BareMetalPxeServiceBase implements
}
BaremetalPxeVO vo = new BaremetalPxeVO();
- Transaction txn = Transaction.currentTxn();
vo.setHostId(pxeServer.getId());
vo.setNetworkServiceProviderId(ntwkSvcProvider.getId());
vo.setPodId(pod.getId());
vo.setPhysicalNetworkId(pcmd.getPhysicalNetworkId());
vo.setDeviceType(BaremetalPxeType.PING.toString());
- txn.start();
_pxeDao.persist(vo);
- txn.commit();
return vo;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
index 7871377..29e180d 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java
@@ -22,7 +22,6 @@ import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -53,6 +52,8 @@ import com.cloud.network.guru.DirectPodBasedNetworkGuru;
import com.cloud.network.guru.NetworkGuru;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
import com.cloud.vm.VirtualMachineProfile;
@@ -100,18 +101,18 @@ public class BaremetaNetworkGuru extends DirectPodBasedNetworkGuru {
} else {
// we need to get a new ip address if we try to deploy a vm in a
// different pod
- IPAddressVO ipVO = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), oldIp);
+ final IPAddressVO ipVO = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), oldIp);
if (ipVO != null) {
PodVlanMapVO mapVO = _podVlanDao.listPodVlanMapsByVlan(ipVO.getVlanId());
if (mapVO.getPodId() != dest.getPod().getId()) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- // release the old ip here
- _ipAddrMgr.markIpAsUnavailable(ipVO.getId());
- _ipAddressDao.unassignIpAddress(ipVO.getId());
-
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ // release the old ip here
+ _ipAddrMgr.markIpAsUnavailable(ipVO.getId());
+ _ipAddressDao.unassignIpAddress(ipVO.getId());
+ }
+ });
nic.setIp4Address(null);
getNewIp = true;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
index 6cf94f2..8057cd4 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java
@@ -50,7 +50,6 @@ import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.ReservationContext;
@@ -115,14 +114,11 @@ public class BaremetalDhcpElement extends AdapterBase implements DhcpServiceProv
return false;
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
nic.setMacAddress(host.getPrivateMacAddress());
NicVO vo = _nicDao.findById(nic.getId());
assert vo != null : "Where ths nic " + nic.getId() + " going???";
vo.setMacAddress(nic.getMacAddress());
_nicDao.update(vo.getId(), vo);
- txn.commit();
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
index 9e1fd65..82397f5 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpManagerImpl.java
@@ -69,7 +69,6 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
@@ -278,10 +277,7 @@ public class BaremetalDhcpManagerImpl extends ManagerBase implements BaremetalDh
vo.setHostId(dhcpServer.getId());
vo.setNetworkServiceProviderId(ntwkSvcProvider.getId());
vo.setPhysicalNetworkId(cmd.getPhysicalNetworkId());
- Transaction txn = Transaction.currentTxn();
- txn.start();
_extDhcpDao.persist(vo);
- txn.commit();
return vo;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartServiceImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartServiceImpl.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartServiceImpl.java
index aa0ff1c..cb4babf 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartServiceImpl.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalKickStartServiceImpl.java
@@ -27,11 +27,10 @@ import java.util.Map;
import javax.ejb.Local;
import javax.inject.Inject;
-import org.apache.log4j.Logger;
-
import org.apache.cloudstack.api.AddBaremetalKickStartPxeCmd;
import org.apache.cloudstack.api.AddBaremetalPxeCmd;
import org.apache.cloudstack.api.ListBaremetalPxeServersCmd;
+import org.apache.log4j.Logger;
import com.cloud.agent.api.Answer;
import com.cloud.agent.api.baremetal.IpmISetBootDevCommand;
@@ -58,7 +57,6 @@ import com.cloud.uservm.UserVm;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
@@ -225,14 +223,11 @@ public class BaremetalKickStartServiceImpl extends BareMetalPxeServiceBase imple
}
BaremetalPxeVO vo = new BaremetalPxeVO();
- Transaction txn = Transaction.currentTxn();
vo.setHostId(pxeServer.getId());
vo.setNetworkServiceProviderId(ntwkSvcProvider.getId());
vo.setPhysicalNetworkId(kcmd.getPhysicalNetworkId());
vo.setDeviceType(BaremetalPxeType.KICK_START.toString());
- txn.start();
_pxeDao.persist(vo);
- txn.commit();
return vo;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalPxeElement.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalPxeElement.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalPxeElement.java
index 244ce8c..b9dbc77 100755
--- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalPxeElement.java
+++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalPxeElement.java
@@ -48,7 +48,6 @@ import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
@@ -117,14 +116,11 @@ public class BaremetalPxeElement extends AdapterBase implements NetworkElement {
VMInstanceVO vo = _vmDao.findById(vm.getId());
if (vo.getLastHostId() == null) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
nic.setMacAddress(dest.getHost().getPrivateMacAddress());
NicVO nicVo = _nicDao.findById(nic.getId());
assert vo != null : "Where ths nic " + nic.getId() + " going???";
nicVo.setMacAddress(nic.getMacAddress());
_nicDao.update(nicVo.getId(), nicVo);
- txn.commit();
/*This vm is just being created */
if (!_pxeMgr.prepare(vm, nic, dest, context)) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
index 9dfe91d..4239482 100755
--- a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
+++ b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java
@@ -226,10 +226,7 @@ public class UcsManagerImpl implements UcsManager {
vo.setZoneId(cmd.getZoneId());
vo.setName(cmd.getName());
- Transaction txn = Transaction.currentTxn();
- txn.start();
mgrvo = ucsDao.persist(vo);
- txn.commit();
UcsManagerResponse rsp = new UcsManagerResponse();
rsp.setId(String.valueOf(vo.getId()));
rsp.setName(vo.getName());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
index 3f8fc5c..cf4c2f0 100644
--- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
+++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java
@@ -123,6 +123,10 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.Ip;
import com.cloud.vm.DomainRouterVO;
@@ -582,19 +586,21 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements Elast
}
@DB
- public PublicIp allocDirectIp(Account account, long guestNetworkId) throws InsufficientAddressCapacityException {
- Network frontEndNetwork = _networkModel.getNetwork(guestNetworkId);
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- PublicIp ip = _ipAddrMgr.assignPublicIpAddress(frontEndNetwork.getDataCenterId(), null, account, VlanType.DirectAttached, frontEndNetwork.getId(), null, true);
- IPAddressVO ipvo = _ipAddressDao.findById(ip.getId());
- ipvo.setAssociatedWithNetworkId(frontEndNetwork.getId());
- _ipAddressDao.update(ipvo.getId(), ipvo);
- txn.commit();
- s_logger.info("Acquired frontend IP for ELB " + ip);
-
- return ip;
+ public PublicIp allocDirectIp(final Account account, final long guestNetworkId) throws InsufficientAddressCapacityException {
+ return Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() {
+ @Override
+ public PublicIp doInTransaction(TransactionStatus status) throws Exception {
+ Network frontEndNetwork = _networkModel.getNetwork(guestNetworkId);
+
+ PublicIp ip = _ipAddrMgr.assignPublicIpAddress(frontEndNetwork.getDataCenterId(), null, account, VlanType.DirectAttached, frontEndNetwork.getId(), null, true);
+ IPAddressVO ipvo = _ipAddressDao.findById(ip.getId());
+ ipvo.setAssociatedWithNetworkId(frontEndNetwork.getId());
+ _ipAddressDao.update(ipvo.getId(), ipvo);
+ s_logger.info("Acquired frontend IP for ELB " + ip);
+
+ return ip;
+ }
+ }, InsufficientAddressCapacityException.class);
}
public void releaseIp(long ipId, long userId, Account caller) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/AopTestAdvice.java
----------------------------------------------------------------------
diff --git a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/AopTestAdvice.java b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/AopTestAdvice.java
index 902f595..233b046 100644
--- a/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/AopTestAdvice.java
+++ b/plugins/storage/volume/solidfire/test/org/apache/cloudstack/storage/test/AopTestAdvice.java
@@ -18,11 +18,11 @@ package org.apache.cloudstack.storage.test;
import org.aspectj.lang.ProceedingJoinPoint;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
public class AopTestAdvice {
public Object AopTestMethod(ProceedingJoinPoint call) throws Throwable {
- Transaction txn = Transaction.open(call.getSignature().getName());
+ TransactionLegacy txn = TransactionLegacy.open(call.getSignature().getName());
Object ret = null;
try {
ret = call.proceed();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java
index b73045d..329b3d5 100755
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@ -44,7 +44,6 @@ import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
-import javax.annotation.PostConstruct;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.inject.Inject;
@@ -52,37 +51,6 @@ import javax.naming.ConfigurationException;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
-import org.apache.commons.codec.binary.Base64;
-import org.apache.http.ConnectionClosedException;
-import org.apache.http.HttpException;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpServerConnection;
-import org.apache.http.HttpStatus;
-import org.apache.http.NameValuePair;
-import org.apache.http.client.utils.URLEncodedUtils;
-import org.apache.http.entity.BasicHttpEntity;
-import org.apache.http.impl.DefaultHttpResponseFactory;
-import org.apache.http.impl.DefaultHttpServerConnection;
-import org.apache.http.impl.NoConnectionReuseStrategy;
-import org.apache.http.impl.SocketHttpServerConnection;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.CoreConnectionPNames;
-import org.apache.http.params.CoreProtocolPNames;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.BasicHttpContext;
-import org.apache.http.protocol.BasicHttpProcessor;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.HttpRequestHandler;
-import org.apache.http.protocol.HttpRequestHandlerRegistry;
-import org.apache.http.protocol.HttpService;
-import org.apache.http.protocol.ResponseConnControl;
-import org.apache.http.protocol.ResponseContent;
-import org.apache.http.protocol.ResponseDate;
-import org.apache.http.protocol.ResponseServer;
-import org.apache.log4j.Logger;
-import org.springframework.stereotype.Component;
-
import org.apache.cloudstack.acl.APIChecker;
import org.apache.cloudstack.api.APICommand;
import org.apache.cloudstack.api.ApiErrorCode;
@@ -120,6 +88,36 @@ import org.apache.cloudstack.framework.jobs.AsyncJob;
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.http.ConnectionClosedException;
+import org.apache.http.HttpException;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpServerConnection;
+import org.apache.http.HttpStatus;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.utils.URLEncodedUtils;
+import org.apache.http.entity.BasicHttpEntity;
+import org.apache.http.impl.DefaultHttpResponseFactory;
+import org.apache.http.impl.DefaultHttpServerConnection;
+import org.apache.http.impl.NoConnectionReuseStrategy;
+import org.apache.http.impl.SocketHttpServerConnection;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.CoreConnectionPNames;
+import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.params.HttpParams;
+import org.apache.http.protocol.BasicHttpContext;
+import org.apache.http.protocol.BasicHttpProcessor;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.HttpRequestHandler;
+import org.apache.http.protocol.HttpRequestHandlerRegistry;
+import org.apache.http.protocol.HttpService;
+import org.apache.http.protocol.ResponseConnControl;
+import org.apache.http.protocol.ResponseContent;
+import org.apache.http.protocol.ResponseDate;
+import org.apache.http.protocol.ResponseServer;
+import org.apache.log4j.Logger;
+import org.springframework.stereotype.Component;
import com.cloud.api.response.ApiResponseSerializer;
import com.cloud.configuration.Config;
@@ -149,7 +147,6 @@ import com.cloud.utils.component.PluggableService;
import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.exception.ExceptionProxyObject;
@@ -708,8 +705,6 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer
}
}
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
- txn.close();
User user = null;
// verify there is a user with this api key
Pair<User, Account> userAcctPair = _accountMgr.findUserByApiKey(apiKey);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/capacity/CapacityManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/capacity/CapacityManagerImpl.java b/server/src/com/cloud/capacity/CapacityManagerImpl.java
index b28fe20..72905a7 100755
--- a/server/src/com/cloud/capacity/CapacityManagerImpl.java
+++ b/server/src/com/cloud/capacity/CapacityManagerImpl.java
@@ -28,7 +28,6 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.framework.config.ConfigDepot;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.Configurable;
@@ -61,6 +60,7 @@ import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.hypervisor.dao.HypervisorCapabilitiesDao;
import com.cloud.offering.ServiceOffering;
+import com.cloud.org.Cluster;
import com.cloud.org.Grouping.AllocationState;
import com.cloud.resource.ResourceListener;
import com.cloud.resource.ResourceManager;
@@ -81,6 +81,9 @@ import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.fsm.StateListener;
import com.cloud.vm.UserVmDetailVO;
import com.cloud.vm.UserVmVO;
@@ -170,100 +173,104 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
@DB
@Override
- public boolean releaseVmCapacity(VirtualMachine vm, boolean moveFromReserved, boolean moveToReservered, Long hostId) {
- ServiceOfferingVO svo = _offeringsDao.findById(vm.getServiceOfferingId());
+ public boolean releaseVmCapacity(VirtualMachine vm, final boolean moveFromReserved, final boolean moveToReservered, final Long hostId) {
+ final ServiceOfferingVO svo = _offeringsDao.findById(vm.getServiceOfferingId());
CapacityVO capacityCpu = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_CPU);
CapacityVO capacityMemory = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_MEMORY);
Long clusterId = null;
if (hostId != null) {
- HostVO host = _hostDao.findById(hostId);
+ HostVO host = _hostDao.findById(hostId);
clusterId = host.getClusterId();
}
if (capacityCpu == null || capacityMemory == null || svo == null) {
return false;
}
- Transaction txn = Transaction.currentTxn();
try {
- txn.start();
-
- capacityCpu = _capacityDao.lockRow(capacityCpu.getId(), true);
- capacityMemory = _capacityDao.lockRow(capacityMemory.getId(), true);
-
- long usedCpu = capacityCpu.getUsedCapacity();
- long usedMem = capacityMemory.getUsedCapacity();
- long reservedCpu = capacityCpu.getReservedCapacity();
- long reservedMem = capacityMemory.getReservedCapacity();
- long actualTotalCpu = capacityCpu.getTotalCapacity();
- float cpuOvercommitRatio =Float.parseFloat(_clusterDetailsDao.findDetail(clusterId,"cpuOvercommitRatio").getValue());
- float memoryOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterId,"memoryOvercommitRatio").getValue());
- int vmCPU = svo.getCpu() * svo.getSpeed();
- long vmMem = svo.getRamSize() * 1024L * 1024L;
- long actualTotalMem = capacityMemory.getTotalCapacity();
- long totalMem = (long) (actualTotalMem * memoryOvercommitRatio);
- long totalCpu = (long) (actualTotalCpu * cpuOvercommitRatio);
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Hosts's actual total CPU: " + actualTotalCpu + " and CPU after applying overprovisioning: " + totalCpu);
- s_logger.debug("Hosts's actual total RAM: " + actualTotalMem + " and RAM after applying overprovisioning: " + totalMem);
- }
-
+ final Long clusterIdFinal = clusterId;
+ final long capacityCpuId = capacityCpu.getId();
+ final long capacityMemoryId = capacityMemory.getId();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ CapacityVO capacityCpu = _capacityDao.lockRow(capacityCpuId, true);
+ CapacityVO capacityMemory = _capacityDao.lockRow(capacityMemoryId, true);
+
+ long usedCpu = capacityCpu.getUsedCapacity();
+ long usedMem = capacityMemory.getUsedCapacity();
+ long reservedCpu = capacityCpu.getReservedCapacity();
+ long reservedMem = capacityMemory.getReservedCapacity();
+ long actualTotalCpu = capacityCpu.getTotalCapacity();
+ float cpuOvercommitRatio =Float.parseFloat(_clusterDetailsDao.findDetail(clusterIdFinal,"cpuOvercommitRatio").getValue());
+ float memoryOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterIdFinal,"memoryOvercommitRatio").getValue());
+ int vmCPU = svo.getCpu() * svo.getSpeed();
+ long vmMem = svo.getRamSize() * 1024L * 1024L;
+ long actualTotalMem = capacityMemory.getTotalCapacity();
+ long totalMem = (long) (actualTotalMem * memoryOvercommitRatio);
+ long totalCpu = (long) (actualTotalCpu * cpuOvercommitRatio);
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Hosts's actual total CPU: " + actualTotalCpu + " and CPU after applying overprovisioning: " + totalCpu);
+ s_logger.debug("Hosts's actual total RAM: " + actualTotalMem + " and RAM after applying overprovisioning: " + totalMem);
+ }
- if (!moveFromReserved) {
- /* move resource from used */
- if (usedCpu >= vmCPU) {
- capacityCpu.setUsedCapacity(usedCpu - vmCPU);
- }
- if (usedMem >= vmMem) {
- capacityMemory.setUsedCapacity(usedMem - vmMem);
- }
- if (moveToReservered) {
- if (reservedCpu + vmCPU <= totalCpu) {
- capacityCpu.setReservedCapacity(reservedCpu + vmCPU);
+ if (!moveFromReserved) {
+ /* move resource from used */
+ if (usedCpu >= vmCPU) {
+ capacityCpu.setUsedCapacity(usedCpu - vmCPU);
+ }
+ if (usedMem >= vmMem) {
+ capacityMemory.setUsedCapacity(usedMem - vmMem);
+ }
+
+ if (moveToReservered) {
+ if (reservedCpu + vmCPU <= totalCpu) {
+ capacityCpu.setReservedCapacity(reservedCpu + vmCPU);
+ }
+ if (reservedMem + vmMem <= totalMem) {
+ capacityMemory.setReservedCapacity(reservedMem + vmMem);
+ }
+ }
+ } else {
+ if (reservedCpu >= vmCPU) {
+ capacityCpu.setReservedCapacity(reservedCpu - vmCPU);
+ }
+ if (reservedMem >= vmMem) {
+ capacityMemory.setReservedCapacity(reservedMem - vmMem);
+ }
}
- if (reservedMem + vmMem <= totalMem) {
- capacityMemory.setReservedCapacity(reservedMem + vmMem);
- }
- }
- } else {
- if (reservedCpu >= vmCPU) {
- capacityCpu.setReservedCapacity(reservedCpu - vmCPU);
- }
- if (reservedMem >= vmMem) {
- capacityMemory.setReservedCapacity(reservedMem - vmMem);
- }
- }
- s_logger.debug("release cpu from host: " + hostId + ", old used: " + usedCpu + ",reserved: " + reservedCpu + ", actual total: "
- + actualTotalCpu + ", total with overprovisioning: " + totalCpu + "; new used: " + capacityCpu.getUsedCapacity() + ",reserved:"
- + capacityCpu.getReservedCapacity() + "; movedfromreserved: " + moveFromReserved + ",moveToReservered" + moveToReservered);
+ s_logger.debug("release cpu from host: " + hostId + ", old used: " + usedCpu + ",reserved: " + reservedCpu + ", actual total: "
+ + actualTotalCpu + ", total with overprovisioning: " + totalCpu + "; new used: " + capacityCpu.getUsedCapacity() + ",reserved:"
+ + capacityCpu.getReservedCapacity() + "; movedfromreserved: " + moveFromReserved + ",moveToReservered" + moveToReservered);
+
+ s_logger.debug("release mem from host: " + hostId + ", old used: " + usedMem + ",reserved: " + reservedMem + ", total: " + totalMem
+ + "; new used: " + capacityMemory.getUsedCapacity() + ",reserved:" + capacityMemory.getReservedCapacity()
+ + "; movedfromreserved: " + moveFromReserved + ",moveToReservered" + moveToReservered);
- s_logger.debug("release mem from host: " + hostId + ", old used: " + usedMem + ",reserved: " + reservedMem + ", total: " + totalMem
- + "; new used: " + capacityMemory.getUsedCapacity() + ",reserved:" + capacityMemory.getReservedCapacity()
- + "; movedfromreserved: " + moveFromReserved + ",moveToReservered" + moveToReservered);
+ _capacityDao.update(capacityCpu.getId(), capacityCpu);
+ _capacityDao.update(capacityMemory.getId(), capacityMemory);
+ }
+ });
- _capacityDao.update(capacityCpu.getId(), capacityCpu);
- _capacityDao.update(capacityMemory.getId(), capacityMemory);
- txn.commit();
return true;
} catch (Exception e) {
s_logger.debug("Failed to transit vm's state, due to " + e.getMessage());
- txn.rollback();
return false;
}
}
@DB
@Override
- public void allocateVmCapacity(VirtualMachine vm, boolean fromLastHost) {
+ public void allocateVmCapacity(VirtualMachine vm, final boolean fromLastHost) {
- long hostId = vm.getHostId();
+ final long hostId = vm.getHostId();
HostVO host = _hostDao.findById(hostId);
- long clusterId = host.getClusterId();
- float cpuOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterId, "cpuOvercommitRatio").getValue());
- float memoryOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterId, "memoryOvercommitRatio").getValue());
+ final long clusterId = host.getClusterId();
+ final float cpuOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterId, "cpuOvercommitRatio").getValue());
+ final float memoryOvercommitRatio = Float.parseFloat(_clusterDetailsDao.findDetail(clusterId, "memoryOvercommitRatio").getValue());
- ServiceOfferingVO svo = _offeringsDao.findById(vm.getServiceOfferingId());
+ final ServiceOfferingVO svo = _offeringsDao.findById(vm.getServiceOfferingId());
CapacityVO capacityCpu = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_CPU);
CapacityVO capacityMem = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_MEMORY);
@@ -272,74 +279,78 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
return;
}
- int cpu = svo.getCpu() * svo.getSpeed();
- long ram = svo.getRamSize() * 1024L * 1024L;
-
+ final int cpu = svo.getCpu() * svo.getSpeed();
+ final long ram = svo.getRamSize() * 1024L * 1024L;
- Transaction txn = Transaction.currentTxn();
try {
- txn.start();
- capacityCpu = _capacityDao.lockRow(capacityCpu.getId(), true);
- capacityMem = _capacityDao.lockRow(capacityMem.getId(), true);
-
- long usedCpu = capacityCpu.getUsedCapacity();
- long usedMem = capacityMem.getUsedCapacity();
- long reservedCpu = capacityCpu.getReservedCapacity();
- long reservedMem = capacityMem.getReservedCapacity();
- long actualTotalCpu = capacityCpu.getTotalCapacity();
- long actualTotalMem = capacityMem.getTotalCapacity();
- long totalCpu = (long) (actualTotalCpu * cpuOvercommitRatio);
- long totalMem = (long) (actualTotalMem * memoryOvercommitRatio);
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Hosts's actual total CPU: " + actualTotalCpu + " and CPU after applying overprovisioning: " + totalCpu);
- }
+ final long capacityCpuId = capacityCpu.getId();
+ final long capacityMemId = capacityMem.getId();
+
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ CapacityVO capacityCpu = _capacityDao.lockRow(capacityCpuId, true);
+ CapacityVO capacityMem = _capacityDao.lockRow(capacityMemId, true);
+
+ long usedCpu = capacityCpu.getUsedCapacity();
+ long usedMem = capacityMem.getUsedCapacity();
+ long reservedCpu = capacityCpu.getReservedCapacity();
+ long reservedMem = capacityMem.getReservedCapacity();
+ long actualTotalCpu = capacityCpu.getTotalCapacity();
+ long actualTotalMem = capacityMem.getTotalCapacity();
+ long totalCpu = (long) (actualTotalCpu * cpuOvercommitRatio);
+ long totalMem = (long) (actualTotalMem * memoryOvercommitRatio);
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Hosts's actual total CPU: " + actualTotalCpu + " and CPU after applying overprovisioning: " + totalCpu);
+ }
- long freeCpu = totalCpu - (reservedCpu + usedCpu);
- long freeMem = totalMem - (reservedMem + usedMem);
+ long freeCpu = totalCpu - (reservedCpu + usedCpu);
+ long freeMem = totalMem - (reservedMem + usedMem);
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("We are allocating VM, increasing the used capacity of this host:" + hostId);
- s_logger.debug("Current Used CPU: " + usedCpu + " , Free CPU:" + freeCpu + " ,Requested CPU: " + cpu);
- s_logger.debug("Current Used RAM: " + usedMem + " , Free RAM:" + freeMem + " ,Requested RAM: " + ram);
- }
- capacityCpu.setUsedCapacity(usedCpu + cpu);
- capacityMem.setUsedCapacity(usedMem + ram);
-
- if (fromLastHost) {
- /* alloc from reserved */
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("We are allocating VM to the last host again, so adjusting the reserved capacity if it is not less than required");
- s_logger.debug("Reserved CPU: " + reservedCpu + " , Requested CPU: " + cpu);
- s_logger.debug("Reserved RAM: " + reservedMem + " , Requested RAM: " + ram);
- }
- if (reservedCpu >= cpu && reservedMem >= ram) {
- capacityCpu.setReservedCapacity(reservedCpu - cpu);
- capacityMem.setReservedCapacity(reservedMem - ram);
- }
- } else {
- /* alloc from free resource */
- if (!((reservedCpu + usedCpu + cpu <= totalCpu) && (reservedMem + usedMem + ram <= totalMem))) {
if (s_logger.isDebugEnabled()) {
- s_logger.debug("Host doesnt seem to have enough free capacity, but increasing the used capacity anyways, since the VM is already starting on this host ");
+ s_logger.debug("We are allocating VM, increasing the used capacity of this host:" + hostId);
+ s_logger.debug("Current Used CPU: " + usedCpu + " , Free CPU:" + freeCpu + " ,Requested CPU: " + cpu);
+ s_logger.debug("Current Used RAM: " + usedMem + " , Free RAM:" + freeMem + " ,Requested RAM: " + ram);
+ }
+ capacityCpu.setUsedCapacity(usedCpu + cpu);
+ capacityMem.setUsedCapacity(usedMem + ram);
+
+ if (fromLastHost) {
+ /* alloc from reserved */
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("We are allocating VM to the last host again, so adjusting the reserved capacity if it is not less than required");
+ s_logger.debug("Reserved CPU: " + reservedCpu + " , Requested CPU: " + cpu);
+ s_logger.debug("Reserved RAM: " + reservedMem + " , Requested RAM: " + ram);
+ }
+ if (reservedCpu >= cpu && reservedMem >= ram) {
+ capacityCpu.setReservedCapacity(reservedCpu - cpu);
+ capacityMem.setReservedCapacity(reservedMem - ram);
+ }
+ } else {
+ /* alloc from free resource */
+ if (!((reservedCpu + usedCpu + cpu <= totalCpu) && (reservedMem + usedMem + ram <= totalMem))) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Host doesnt seem to have enough free capacity, but increasing the used capacity anyways, since the VM is already starting on this host ");
+ }
+ }
}
- }
- }
- s_logger.debug("CPU STATS after allocation: for host: " + hostId + ", old used: " + usedCpu + ", old reserved: " + reservedCpu
- + ", actual total: " + actualTotalCpu + ", total with overprovisioning: " + totalCpu + "; new used:"
- + capacityCpu.getUsedCapacity() + ", reserved:" + capacityCpu.getReservedCapacity() + "; requested cpu:" + cpu
- + ",alloc_from_last:" + fromLastHost);
+ s_logger.debug("CPU STATS after allocation: for host: " + hostId + ", old used: " + usedCpu + ", old reserved: " + reservedCpu
+ + ", actual total: " + actualTotalCpu + ", total with overprovisioning: " + totalCpu + "; new used:"
+ + capacityCpu.getUsedCapacity() + ", reserved:" + capacityCpu.getReservedCapacity() + "; requested cpu:" + cpu
+ + ",alloc_from_last:" + fromLastHost);
- s_logger.debug("RAM STATS after allocation: for host: " + hostId + ", old used: " + usedMem + ", old reserved: " + reservedMem
- + ", total: " + totalMem + "; new used: " + capacityMem.getUsedCapacity() + ", reserved: " + capacityMem.getReservedCapacity()
- + "; requested mem: " + ram + ",alloc_from_last:" + fromLastHost);
+ s_logger.debug("RAM STATS after allocation: for host: " + hostId + ", old used: " + usedMem + ", old reserved: " + reservedMem
+ + ", total: " + totalMem + "; new used: " + capacityMem.getUsedCapacity() + ", reserved: " + capacityMem.getReservedCapacity()
+ + "; requested mem: " + ram + ",alloc_from_last:" + fromLastHost);
- _capacityDao.update(capacityCpu.getId(), capacityCpu);
- _capacityDao.update(capacityMem.getId(), capacityMem);
- txn.commit();
+ _capacityDao.update(capacityCpu.getId(), capacityCpu);
+ _capacityDao.update(capacityMem.getId(), capacityMem);
+ }
+ });
} catch (Exception e) {
- txn.rollback();
+ s_logger.error("Exception allocating VM capacity", e);
return;
}
}
@@ -512,7 +523,7 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
@DB
@Override
- public void updateCapacityForHost(Host host){
+ public void updateCapacityForHost(final Host host){
// prepare the service offerings
List<ServiceOfferingVO> offerings = _offeringsDao.listAllIncludingRemoved();
Map<Long, ServiceOfferingVO> offeringsMap = new HashMap<Long, ServiceOfferingVO>();
@@ -625,36 +636,42 @@ public class CapacityManagerImpl extends ManagerBase implements CapacityManager,
s_logger.error("Caught exception while updating cpu/memory capacity for the host " +host.getId(), e);
}
}else {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- CapacityVO capacity = new CapacityVO(host.getId(),
- host.getDataCenterId(), host.getPodId(), host.getClusterId(), usedMemory,
- host.getTotalMemory(),
- CapacityVO.CAPACITY_TYPE_MEMORY);
- capacity.setReservedCapacity(reservedMemory);
- CapacityState capacityState = CapacityState.Enabled;
- if (host.getClusterId() != null) {
- cluster = ApiDBUtils.findClusterById(host.getClusterId());
- if (cluster != null) {
- capacityState = _configMgr.findClusterAllocationState(cluster) == AllocationState.Disabled ? CapacityState.Disabled
- : CapacityState.Enabled;
+ final long usedMemoryFinal = usedMemory;
+ final long reservedMemoryFinal = reservedMemory;
+ final long usedCpuFinal = usedCpu;
+ final long reservedCpuFinal = reservedCpu;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ CapacityVO capacity = new CapacityVO(host.getId(),
+ host.getDataCenterId(), host.getPodId(), host.getClusterId(), usedMemoryFinal,
+ host.getTotalMemory(),
+ CapacityVO.CAPACITY_TYPE_MEMORY);
+ capacity.setReservedCapacity(reservedMemoryFinal);
+ CapacityState capacityState = CapacityState.Enabled;
+ if (host.getClusterId() != null) {
+ ClusterVO cluster = ApiDBUtils.findClusterById(host.getClusterId());
+ if (cluster != null) {
+ capacityState = _configMgr.findClusterAllocationState(cluster) == AllocationState.Disabled ? CapacityState.Disabled
+ : CapacityState.Enabled;
+ capacity.setCapacityState(capacityState);
+ }
+ }
+ _capacityDao.persist(capacity);
+
+ capacity = new CapacityVO(
+ host.getId(),
+ host.getDataCenterId(),
+ host.getPodId(),
+ host.getClusterId(),
+ usedCpuFinal,
+ host.getCpus().longValue() * host.getSpeed().longValue(),
+ CapacityVO.CAPACITY_TYPE_CPU);
+ capacity.setReservedCapacity(reservedCpuFinal);
capacity.setCapacityState(capacityState);
+ _capacityDao.persist(capacity);
}
- }
- _capacityDao.persist(capacity);
-
- capacity = new CapacityVO(
- host.getId(),
- host.getDataCenterId(),
- host.getPodId(),
- host.getClusterId(),
- usedCpu,
- host.getCpus().longValue() * host.getSpeed().longValue(),
- CapacityVO.CAPACITY_TYPE_CPU);
- capacity.setReservedCapacity(reservedCpu);
- capacity.setCapacityState(capacityState);
- _capacityDao.persist(capacity);
- txn.commit();
+ });
}
[04/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/server/ConfigurationServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java
index 4c5c8a1..1761a32 100755
--- a/server/src/com/cloud/server/ConfigurationServerImpl.java
+++ b/server/src/com/cloud/server/ConfigurationServerImpl.java
@@ -45,7 +45,6 @@ import javax.naming.ConfigurationException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.framework.config.ConfigDepot;
import org.apache.cloudstack.framework.config.ConfigDepotAdmin;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
@@ -107,6 +106,11 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
import com.cloud.utils.script.Script;
@@ -249,11 +253,9 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
// Create userIpAddress ranges
// Update existing vlans with networkId
- Transaction txn = Transaction.currentTxn();
-
List<VlanVO> vlans = _vlanDao.listAll();
if (vlans != null && !vlans.isEmpty()) {
- for (VlanVO vlan : vlans) {
+ for (final VlanVO vlan : vlans) {
if (vlan.getNetworkId().longValue() == 0) {
updateVlanWithNetworkId(vlan);
}
@@ -261,15 +263,19 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
// Create vlan user_ip_address range
String ipPange = vlan.getIpRange();
String[] range = ipPange.split("-");
- String startIp = range[0];
- String endIp = range[1];
-
- txn.start();
- IPRangeConfig config = new IPRangeConfig();
- long startIPLong = NetUtils.ip2Long(startIp);
- long endIPLong = NetUtils.ip2Long(endIp);
- config.savePublicIPRange(txn, startIPLong, endIPLong, vlan.getDataCenterId(), vlan.getId(), vlan.getNetworkId(), vlan.getPhysicalNetworkId());
- txn.commit();
+ final String startIp = range[0];
+ final String endIp = range[1];
+
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ IPRangeConfig config = new IPRangeConfig();
+ long startIPLong = NetUtils.ip2Long(startIp);
+ long endIPLong = NetUtils.ip2Long(endIp);
+ config.savePublicIPRange(TransactionLegacy.currentTxn(), startIPLong, endIPLong, vlan.getDataCenterId(), vlan.getId(), vlan.getNetworkId(), vlan.getPhysicalNetworkId());
+ }
+ });
+
}
}
}
@@ -352,7 +358,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
protected void saveUser() {
// insert system account
String insertSql = "INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id, account.default) VALUES (1, UUID(), 'system', '1', '1', 1)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
stmt.executeUpdate();
@@ -361,7 +367,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
// insert system user
insertSql = "INSERT INTO `cloud`.`user` (id, uuid, username, password, account_id, firstname, lastname, created, user.default)" +
" VALUES (1, UUID(), 'system', RAND(), 1, 'system', 'cloud', now(), 1)";
- txn = Transaction.currentTxn();
+ txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
stmt.executeUpdate();
@@ -377,7 +383,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
// create an account for the admin user first
insertSql = "INSERT INTO `cloud`.`account` (id, uuid, account_name, type, domain_id, account.default) VALUES (" + id + ", UUID(), '" + username + "', '1', '1', 1)";
- txn = Transaction.currentTxn();
+ txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
stmt.executeUpdate();
@@ -388,7 +394,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
insertSql = "INSERT INTO `cloud`.`user` (id, uuid, username, password, account_id, firstname, lastname, created, state, user.default) " +
"VALUES (" + id + ", UUID(), '" + username + "', RAND(), 2, '" + firstname + "','" + lastname + "',now(), 'disabled', 1)";
- txn = Transaction.currentTxn();
+ txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
stmt.executeUpdate();
@@ -419,7 +425,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
"VALUES ('default', 'Default Security Group', 2, 1, 'admin')";
}
- txn = Transaction.currentTxn();
+ txn = TransactionLegacy.currentTxn();
try {
stmt = txn.prepareAutoCloseStatement(insertSql);
stmt.executeUpdate();
@@ -559,7 +565,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
String already = _configDao.getValue("system.vm.password");
if (already == null) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
String rpassword = PasswordGenerator.generatePresharedKey(8);
String wSql = "INSERT INTO `cloud`.`configuration` (category, instance, component, name, value, description) "
@@ -643,7 +649,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
String insertSql2 = "INSERT INTO `cloud`.`configuration` (category, instance, component, name, value, description) " +
"VALUES ('Hidden','DEFAULT', 'management-server','ssh.publickey', '" + DBEncryptionUtil.encrypt(publicKey) + "','Public key for the entire CloudStack')";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt1 = txn.prepareAutoCloseStatement(insertSql1);
stmt1.executeUpdate();
@@ -778,7 +784,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
String insertSql1 = "INSERT INTO `cloud`.`configuration` (category, instance, component, name, value, description) " +
"VALUES ('Hidden','DEFAULT', 'management-server','secstorage.copy.password', '" + DBEncryptionUtil.encrypt(password) + "','Password used to authenticate zone-to-zone template copy requests')";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt1 = txn.prepareAutoCloseStatement(insertSql1);
stmt1.executeUpdate();
@@ -806,7 +812,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
}
@DB
- protected HostPodVO createPod(long userId, String podName, long zoneId, String gateway, String cidr, String startIp, String endIp) throws InternalErrorException {
+ protected HostPodVO createPod(long userId, String podName, final long zoneId, String gateway, String cidr, final String startIp, String endIp) throws InternalErrorException {
String[] cidrPair = cidr.split("\\/");
String cidrAddress = cidrPair[0];
int cidrSize = Integer.parseInt(cidrPair[1]);
@@ -828,37 +834,37 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
ipRange = "";
}
- HostPodVO pod = new HostPodVO(podName, zoneId, gateway, cidrAddress, cidrSize, ipRange);
- Transaction txn = Transaction.currentTxn();
+ final HostPodVO pod = new HostPodVO(podName, zoneId, gateway, cidrAddress, cidrSize, ipRange);
try {
- txn.start();
-
- if (_podDao.persist(pod) == null) {
- txn.rollback();
- throw new InternalErrorException("Failed to create new pod. Please contact Cloud Support.");
- }
-
- if (startIp != null) {
- _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIp);
- }
-
- String ipNums = _configDao.getValue("linkLocalIp.nums");
- int nums = Integer.parseInt(ipNums);
- if (nums > 16 || nums <= 0) {
- throw new InvalidParameterValueException("The linkLocalIp.nums: " + nums + "is wrong, should be 1~16");
- }
- /* local link ip address starts from 169.254.0.2 - 169.254.(nums) */
- String[] linkLocalIpRanges = NetUtils.getLinkLocalIPRange(nums);
- if (linkLocalIpRanges == null) {
- throw new InvalidParameterValueException("The linkLocalIp.nums: " + nums + "may be wrong, should be 1~16");
- } else {
- _zoneDao.addLinkLocalIpAddress(zoneId, pod.getId(), linkLocalIpRanges[0], linkLocalIpRanges[1]);
- }
-
- txn.commit();
-
+ final String endIpFinal = endIp;
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws InternalErrorException {
+ if (_podDao.persist(pod) == null) {
+ throw new InternalErrorException("Failed to create new pod. Please contact Cloud Support.");
+ }
+
+ if (startIp != null) {
+ _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIpFinal);
+ }
+
+ String ipNums = _configDao.getValue("linkLocalIp.nums");
+ int nums = Integer.parseInt(ipNums);
+ if (nums > 16 || nums <= 0) {
+ throw new InvalidParameterValueException("The linkLocalIp.nums: " + nums + "is wrong, should be 1~16");
+ }
+ /* local link ip address starts from 169.254.0.2 - 169.254.(nums) */
+ String[] linkLocalIpRanges = NetUtils.getLinkLocalIPRange(nums);
+ if (linkLocalIpRanges == null) {
+ throw new InvalidParameterValueException("The linkLocalIp.nums: " + nums + "may be wrong, should be 1~16");
+ } else {
+ _zoneDao.addLinkLocalIpAddress(zoneId, pod.getId(), linkLocalIpRanges[0], linkLocalIpRanges[1]);
+ }
+
+ return null;
+ }
+ }, InternalErrorException.class);
} catch (Exception e) {
- txn.rollback();
s_logger.error("Unable to create new pod due to " + e.getMessage(), e);
throw new InternalErrorException("Failed to create new pod. Please contact Cloud Support.");
}
@@ -919,20 +925,20 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
privateGatewayNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(privateGatewayNetworkOffering);
//populate providers
- Map<Network.Service, Network.Provider> defaultSharedNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
+ final Map<Network.Service, Network.Provider> defaultSharedNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
defaultSharedNetworkOfferingProviders.put(Service.Dhcp, Provider.VirtualRouter);
defaultSharedNetworkOfferingProviders.put(Service.Dns, Provider.VirtualRouter);
defaultSharedNetworkOfferingProviders.put(Service.UserData, Provider.VirtualRouter);
- Map<Network.Service, Network.Provider> defaultIsolatedNetworkOfferingProviders = defaultSharedNetworkOfferingProviders;
+ final Map<Network.Service, Network.Provider> defaultIsolatedNetworkOfferingProviders = defaultSharedNetworkOfferingProviders;
- Map<Network.Service, Network.Provider> defaultSharedSGNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
+ final Map<Network.Service, Network.Provider> defaultSharedSGNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
defaultSharedSGNetworkOfferingProviders.put(Service.Dhcp, Provider.VirtualRouter);
defaultSharedSGNetworkOfferingProviders.put(Service.Dns, Provider.VirtualRouter);
defaultSharedSGNetworkOfferingProviders.put(Service.UserData, Provider.VirtualRouter);
defaultSharedSGNetworkOfferingProviders.put(Service.SecurityGroup, Provider.SecurityGroupProvider);
- Map<Network.Service, Network.Provider> defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
+ final Map<Network.Service, Network.Provider> defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dhcp, Provider.VirtualRouter);
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dns, Provider.VirtualRouter);
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.UserData, Provider.VirtualRouter);
@@ -944,7 +950,7 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.PortForwarding, Provider.VirtualRouter);
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Vpn, Provider.VirtualRouter);
- Map<Network.Service, Network.Provider> netscalerServiceProviders = new HashMap<Network.Service, Network.Provider>();
+ final Map<Network.Service, Network.Provider> netscalerServiceProviders = new HashMap<Network.Service, Network.Provider>();
netscalerServiceProviders.put(Service.Dhcp, Provider.VirtualRouter);
netscalerServiceProviders.put(Service.Dns, Provider.VirtualRouter);
netscalerServiceProviders.put(Service.UserData, Provider.VirtualRouter);
@@ -954,182 +960,182 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
// The only one diff between 1 and 2 network offerings is that the first one has SG enabled. In Basic zone only
// first network offering has to be enabled, in Advance zone - the second one
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- // Offering #1
- NetworkOfferingVO defaultSharedSGNetworkOffering = new NetworkOfferingVO(
- NetworkOffering.DefaultSharedNetworkOfferingWithSGService,
- "Offering for Shared Security group enabled networks",
- TrafficType.Guest,
- false, true, null, null, true, Availability.Optional,
- null, Network.GuestType.Shared, true, true, false, false, false);
-
- defaultSharedSGNetworkOffering.setState(NetworkOffering.State.Enabled);
- defaultSharedSGNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultSharedSGNetworkOffering);
-
- for (Service service : defaultSharedSGNetworkOfferingProviders.keySet()) {
- NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultSharedSGNetworkOffering.getId(), service, defaultSharedSGNetworkOfferingProviders.get(service));
- _ntwkOfferingServiceMapDao.persist(offService);
- s_logger.trace("Added service for the network offering: " + offService);
- }
-
- // Offering #2
- NetworkOfferingVO defaultSharedNetworkOffering = new NetworkOfferingVO(
- NetworkOffering.DefaultSharedNetworkOffering,
- "Offering for Shared networks",
- TrafficType.Guest,
- false, true, null, null, true, Availability.Optional,
- null, Network.GuestType.Shared, true, true, false, false, false);
-
- defaultSharedNetworkOffering.setState(NetworkOffering.State.Enabled);
- defaultSharedNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultSharedNetworkOffering);
-
- for (Service service : defaultSharedNetworkOfferingProviders.keySet()) {
- NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultSharedNetworkOffering.getId(), service, defaultSharedNetworkOfferingProviders.get(service));
- _ntwkOfferingServiceMapDao.persist(offService);
- s_logger.trace("Added service for the network offering: " + offService);
- }
-
- // Offering #3
- NetworkOfferingVO defaultIsolatedSourceNatEnabledNetworkOffering = new NetworkOfferingVO(
- NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
- "Offering for Isolated networks with Source Nat service enabled",
- TrafficType.Guest,
- false, false, null, null, true, Availability.Required,
- null, Network.GuestType.Isolated, true, false, false, false, true);
-
- defaultIsolatedSourceNatEnabledNetworkOffering.setState(NetworkOffering.State.Enabled);
- defaultIsolatedSourceNatEnabledNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultIsolatedSourceNatEnabledNetworkOffering);
-
- for (Service service : defaultIsolatedSourceNatEnabledNetworkOfferingProviders.keySet()) {
- NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
- (defaultIsolatedSourceNatEnabledNetworkOffering.getId(), service, defaultIsolatedSourceNatEnabledNetworkOfferingProviders.get(service));
- _ntwkOfferingServiceMapDao.persist(offService);
- s_logger.trace("Added service for the network offering: " + offService);
- }
-
- // Offering #4
- NetworkOfferingVO defaultIsolatedEnabledNetworkOffering = new NetworkOfferingVO(
- NetworkOffering.DefaultIsolatedNetworkOffering,
- "Offering for Isolated networks with no Source Nat service",
- TrafficType.Guest,
- false, true, null, null, true, Availability.Optional,
- null, Network.GuestType.Isolated, true, true, false, false, false);
-
- defaultIsolatedEnabledNetworkOffering.setState(NetworkOffering.State.Enabled);
- defaultIsolatedEnabledNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultIsolatedEnabledNetworkOffering);
-
- for (Service service : defaultIsolatedNetworkOfferingProviders.keySet()) {
- NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultIsolatedEnabledNetworkOffering.getId(), service, defaultIsolatedNetworkOfferingProviders.get(service));
- _ntwkOfferingServiceMapDao.persist(offService);
- s_logger.trace("Added service for the network offering: " + offService);
- }
-
- // Offering #5
- NetworkOfferingVO defaultNetscalerNetworkOffering = new NetworkOfferingVO(
- NetworkOffering.DefaultSharedEIPandELBNetworkOffering,
- "Offering for Shared networks with Elastic IP and Elastic LB capabilities",
- TrafficType.Guest,
- false, true, null, null, true, Availability.Optional,
- null, Network.GuestType.Shared, true, false, false, false, true, true, true, false, false, true, true, false, false);
-
- defaultNetscalerNetworkOffering.setState(NetworkOffering.State.Enabled);
- defaultNetscalerNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetscalerNetworkOffering);
-
- for (Service service : netscalerServiceProviders.keySet()) {
- NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultNetscalerNetworkOffering.getId(), service, netscalerServiceProviders.get(service));
- _ntwkOfferingServiceMapDao.persist(offService);
- s_logger.trace("Added service for the network offering: " + offService);
- }
-
- // Offering #6
- NetworkOfferingVO defaultNetworkOfferingForVpcNetworks = new NetworkOfferingVO(
- NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
- "Offering for Isolated Vpc networks with Source Nat service enabled",
- TrafficType.Guest,
- false, false, null, null, true, Availability.Optional,
- null, Network.GuestType.Isolated, false, false, false, false, true);
-
- defaultNetworkOfferingForVpcNetworks.setState(NetworkOffering.State.Enabled);
- defaultNetworkOfferingForVpcNetworks = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetworkOfferingForVpcNetworks);
-
- Map<Network.Service, Network.Provider> defaultVpcNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
- defaultVpcNetworkOfferingProviders.put(Service.Dhcp, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProviders.put(Service.Dns, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProviders.put(Service.UserData, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProviders.put(Service.NetworkACL, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProviders.put(Service.Gateway, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProviders.put(Service.Lb, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProviders.put(Service.SourceNat, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProviders.put(Service.StaticNat, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProviders.put(Service.PortForwarding, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProviders.put(Service.Vpn, Provider.VPCVirtualRouter);
-
- for (Service service : defaultVpcNetworkOfferingProviders.keySet()) {
- NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
- (defaultNetworkOfferingForVpcNetworks.getId(), service, defaultVpcNetworkOfferingProviders.get(service));
- _ntwkOfferingServiceMapDao.persist(offService);
- s_logger.trace("Added service for the network offering: " + offService);
- }
-
- // Offering #7
- NetworkOfferingVO defaultNetworkOfferingForVpcNetworksNoLB = new NetworkOfferingVO(
- NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB,
- "Offering for Isolated Vpc networks with Source Nat service enabled and LB service Disabled",
- TrafficType.Guest,
- false, false, null, null, true, Availability.Optional,
- null, Network.GuestType.Isolated, false, false, false, false, false);
-
- defaultNetworkOfferingForVpcNetworksNoLB.setState(NetworkOffering.State.Enabled);
- defaultNetworkOfferingForVpcNetworksNoLB = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetworkOfferingForVpcNetworksNoLB);
-
- Map<Network.Service, Network.Provider> defaultVpcNetworkOfferingProvidersNoLB = new HashMap<Network.Service, Network.Provider>();
- defaultVpcNetworkOfferingProvidersNoLB.put(Service.Dhcp, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProvidersNoLB.put(Service.Dns, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProvidersNoLB.put(Service.UserData, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProvidersNoLB.put(Service.NetworkACL, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProvidersNoLB.put(Service.Gateway, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProvidersNoLB.put(Service.SourceNat, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProvidersNoLB.put(Service.StaticNat, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProvidersNoLB.put(Service.PortForwarding, Provider.VPCVirtualRouter);
- defaultVpcNetworkOfferingProvidersNoLB.put(Service.Vpn, Provider.VPCVirtualRouter);
-
- for (Service service : defaultVpcNetworkOfferingProvidersNoLB.keySet()) {
- NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
- (defaultNetworkOfferingForVpcNetworksNoLB.getId(), service, defaultVpcNetworkOfferingProvidersNoLB.get(service));
- _ntwkOfferingServiceMapDao.persist(offService);
- s_logger.trace("Added service for the network offering: " + offService);
- }
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ // Offering #1
+ NetworkOfferingVO defaultSharedSGNetworkOffering = new NetworkOfferingVO(
+ NetworkOffering.DefaultSharedNetworkOfferingWithSGService,
+ "Offering for Shared Security group enabled networks",
+ TrafficType.Guest,
+ false, true, null, null, true, Availability.Optional,
+ null, Network.GuestType.Shared, true, true, false, false, false);
- //offering #8 - network offering with internal lb service
- NetworkOfferingVO internalLbOff = new NetworkOfferingVO(
- NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB,
- "Offering for Isolated Vpc networks with Internal LB support",
- TrafficType.Guest,
- false, false, null, null, true, Availability.Optional,
- null, Network.GuestType.Isolated, false, false, false, true, false);
-
- internalLbOff.setState(NetworkOffering.State.Enabled);
- internalLbOff = _networkOfferingDao.persistDefaultNetworkOffering(internalLbOff);
-
- Map<Network.Service, Network.Provider> internalLbOffProviders = new HashMap<Network.Service, Network.Provider>();
- internalLbOffProviders.put(Service.Dhcp, Provider.VPCVirtualRouter);
- internalLbOffProviders.put(Service.Dns, Provider.VPCVirtualRouter);
- internalLbOffProviders.put(Service.UserData, Provider.VPCVirtualRouter);
- internalLbOffProviders.put(Service.NetworkACL, Provider.VPCVirtualRouter);
- internalLbOffProviders.put(Service.Gateway, Provider.VPCVirtualRouter);
- internalLbOffProviders.put(Service.Lb, Provider.InternalLbVm);
- internalLbOffProviders.put(Service.SourceNat, Provider.VPCVirtualRouter);
-
- for (Service service : internalLbOffProviders.keySet()) {
- NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
- (internalLbOff.getId(), service, internalLbOffProviders.get(service));
- _ntwkOfferingServiceMapDao.persist(offService);
- s_logger.trace("Added service for the network offering: " + offService);
- }
-
- txn.commit();
+ defaultSharedSGNetworkOffering.setState(NetworkOffering.State.Enabled);
+ defaultSharedSGNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultSharedSGNetworkOffering);
+
+ for (Service service : defaultSharedSGNetworkOfferingProviders.keySet()) {
+ NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultSharedSGNetworkOffering.getId(), service, defaultSharedSGNetworkOfferingProviders.get(service));
+ _ntwkOfferingServiceMapDao.persist(offService);
+ s_logger.trace("Added service for the network offering: " + offService);
+ }
+
+ // Offering #2
+ NetworkOfferingVO defaultSharedNetworkOffering = new NetworkOfferingVO(
+ NetworkOffering.DefaultSharedNetworkOffering,
+ "Offering for Shared networks",
+ TrafficType.Guest,
+ false, true, null, null, true, Availability.Optional,
+ null, Network.GuestType.Shared, true, true, false, false, false);
+
+ defaultSharedNetworkOffering.setState(NetworkOffering.State.Enabled);
+ defaultSharedNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultSharedNetworkOffering);
+
+ for (Service service : defaultSharedNetworkOfferingProviders.keySet()) {
+ NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultSharedNetworkOffering.getId(), service, defaultSharedNetworkOfferingProviders.get(service));
+ _ntwkOfferingServiceMapDao.persist(offService);
+ s_logger.trace("Added service for the network offering: " + offService);
+ }
+
+ // Offering #3
+ NetworkOfferingVO defaultIsolatedSourceNatEnabledNetworkOffering = new NetworkOfferingVO(
+ NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
+ "Offering for Isolated networks with Source Nat service enabled",
+ TrafficType.Guest,
+ false, false, null, null, true, Availability.Required,
+ null, Network.GuestType.Isolated, true, false, false, false, true);
+
+ defaultIsolatedSourceNatEnabledNetworkOffering.setState(NetworkOffering.State.Enabled);
+ defaultIsolatedSourceNatEnabledNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultIsolatedSourceNatEnabledNetworkOffering);
+
+ for (Service service : defaultIsolatedSourceNatEnabledNetworkOfferingProviders.keySet()) {
+ NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
+ (defaultIsolatedSourceNatEnabledNetworkOffering.getId(), service, defaultIsolatedSourceNatEnabledNetworkOfferingProviders.get(service));
+ _ntwkOfferingServiceMapDao.persist(offService);
+ s_logger.trace("Added service for the network offering: " + offService);
+ }
+
+ // Offering #4
+ NetworkOfferingVO defaultIsolatedEnabledNetworkOffering = new NetworkOfferingVO(
+ NetworkOffering.DefaultIsolatedNetworkOffering,
+ "Offering for Isolated networks with no Source Nat service",
+ TrafficType.Guest,
+ false, true, null, null, true, Availability.Optional,
+ null, Network.GuestType.Isolated, true, true, false, false, false);
+
+ defaultIsolatedEnabledNetworkOffering.setState(NetworkOffering.State.Enabled);
+ defaultIsolatedEnabledNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultIsolatedEnabledNetworkOffering);
+
+ for (Service service : defaultIsolatedNetworkOfferingProviders.keySet()) {
+ NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultIsolatedEnabledNetworkOffering.getId(), service, defaultIsolatedNetworkOfferingProviders.get(service));
+ _ntwkOfferingServiceMapDao.persist(offService);
+ s_logger.trace("Added service for the network offering: " + offService);
+ }
+
+ // Offering #5
+ NetworkOfferingVO defaultNetscalerNetworkOffering = new NetworkOfferingVO(
+ NetworkOffering.DefaultSharedEIPandELBNetworkOffering,
+ "Offering for Shared networks with Elastic IP and Elastic LB capabilities",
+ TrafficType.Guest,
+ false, true, null, null, true, Availability.Optional,
+ null, Network.GuestType.Shared, true, false, false, false, true, true, true, false, false, true, true, false, false);
+
+ defaultNetscalerNetworkOffering.setState(NetworkOffering.State.Enabled);
+ defaultNetscalerNetworkOffering = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetscalerNetworkOffering);
+
+ for (Service service : netscalerServiceProviders.keySet()) {
+ NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(defaultNetscalerNetworkOffering.getId(), service, netscalerServiceProviders.get(service));
+ _ntwkOfferingServiceMapDao.persist(offService);
+ s_logger.trace("Added service for the network offering: " + offService);
+ }
+
+ // Offering #6
+ NetworkOfferingVO defaultNetworkOfferingForVpcNetworks = new NetworkOfferingVO(
+ NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
+ "Offering for Isolated Vpc networks with Source Nat service enabled",
+ TrafficType.Guest,
+ false, false, null, null, true, Availability.Optional,
+ null, Network.GuestType.Isolated, false, false, false, false, true);
+
+ defaultNetworkOfferingForVpcNetworks.setState(NetworkOffering.State.Enabled);
+ defaultNetworkOfferingForVpcNetworks = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetworkOfferingForVpcNetworks);
+
+ Map<Network.Service, Network.Provider> defaultVpcNetworkOfferingProviders = new HashMap<Network.Service, Network.Provider>();
+ defaultVpcNetworkOfferingProviders.put(Service.Dhcp, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProviders.put(Service.Dns, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProviders.put(Service.UserData, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProviders.put(Service.NetworkACL, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProviders.put(Service.Gateway, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProviders.put(Service.Lb, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProviders.put(Service.SourceNat, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProviders.put(Service.StaticNat, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProviders.put(Service.PortForwarding, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProviders.put(Service.Vpn, Provider.VPCVirtualRouter);
+
+ for (Service service : defaultVpcNetworkOfferingProviders.keySet()) {
+ NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
+ (defaultNetworkOfferingForVpcNetworks.getId(), service, defaultVpcNetworkOfferingProviders.get(service));
+ _ntwkOfferingServiceMapDao.persist(offService);
+ s_logger.trace("Added service for the network offering: " + offService);
+ }
+
+ // Offering #7
+ NetworkOfferingVO defaultNetworkOfferingForVpcNetworksNoLB = new NetworkOfferingVO(
+ NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB,
+ "Offering for Isolated Vpc networks with Source Nat service enabled and LB service Disabled",
+ TrafficType.Guest,
+ false, false, null, null, true, Availability.Optional,
+ null, Network.GuestType.Isolated, false, false, false, false, false);
+
+ defaultNetworkOfferingForVpcNetworksNoLB.setState(NetworkOffering.State.Enabled);
+ defaultNetworkOfferingForVpcNetworksNoLB = _networkOfferingDao.persistDefaultNetworkOffering(defaultNetworkOfferingForVpcNetworksNoLB);
+
+ Map<Network.Service, Network.Provider> defaultVpcNetworkOfferingProvidersNoLB = new HashMap<Network.Service, Network.Provider>();
+ defaultVpcNetworkOfferingProvidersNoLB.put(Service.Dhcp, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProvidersNoLB.put(Service.Dns, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProvidersNoLB.put(Service.UserData, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProvidersNoLB.put(Service.NetworkACL, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProvidersNoLB.put(Service.Gateway, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProvidersNoLB.put(Service.SourceNat, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProvidersNoLB.put(Service.StaticNat, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProvidersNoLB.put(Service.PortForwarding, Provider.VPCVirtualRouter);
+ defaultVpcNetworkOfferingProvidersNoLB.put(Service.Vpn, Provider.VPCVirtualRouter);
+
+ for (Service service : defaultVpcNetworkOfferingProvidersNoLB.keySet()) {
+ NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
+ (defaultNetworkOfferingForVpcNetworksNoLB.getId(), service, defaultVpcNetworkOfferingProvidersNoLB.get(service));
+ _ntwkOfferingServiceMapDao.persist(offService);
+ s_logger.trace("Added service for the network offering: " + offService);
+ }
+
+ //offering #8 - network offering with internal lb service
+ NetworkOfferingVO internalLbOff = new NetworkOfferingVO(
+ NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB,
+ "Offering for Isolated Vpc networks with Internal LB support",
+ TrafficType.Guest,
+ false, false, null, null, true, Availability.Optional,
+ null, Network.GuestType.Isolated, false, false, false, true, false);
+
+ internalLbOff.setState(NetworkOffering.State.Enabled);
+ internalLbOff = _networkOfferingDao.persistDefaultNetworkOffering(internalLbOff);
+
+ Map<Network.Service, Network.Provider> internalLbOffProviders = new HashMap<Network.Service, Network.Provider>();
+ internalLbOffProviders.put(Service.Dhcp, Provider.VPCVirtualRouter);
+ internalLbOffProviders.put(Service.Dns, Provider.VPCVirtualRouter);
+ internalLbOffProviders.put(Service.UserData, Provider.VPCVirtualRouter);
+ internalLbOffProviders.put(Service.NetworkACL, Provider.VPCVirtualRouter);
+ internalLbOffProviders.put(Service.Gateway, Provider.VPCVirtualRouter);
+ internalLbOffProviders.put(Service.Lb, Provider.InternalLbVm);
+ internalLbOffProviders.put(Service.SourceNat, Provider.VPCVirtualRouter);
+
+ for (Service service : internalLbOffProviders.keySet()) {
+ NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO
+ (internalLbOff.getId(), service, internalLbOffProviders.get(service));
+ _ntwkOfferingServiceMapDao.persist(offService);
+ s_logger.trace("Added service for the network offering: " + offService);
+ }
+ }
+ });
}
private void createDefaultNetworks() {
@@ -1243,8 +1249,8 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
List<ResourceCountVO> domainResourceCount = _resourceCountDao.listResourceCountByOwnerType(ResourceOwnerType.Domain);
List<ResourceCountVO> accountResourceCount = _resourceCountDao.listResourceCountByOwnerType(ResourceOwnerType.Account);
- List<ResourceType> accountSupportedResourceTypes = new ArrayList<ResourceType>();
- List<ResourceType> domainSupportedResourceTypes = new ArrayList<ResourceType>();
+ final List<ResourceType> accountSupportedResourceTypes = new ArrayList<ResourceType>();
+ final List<ResourceType> domainSupportedResourceTypes = new ArrayList<ResourceType>();
for (ResourceType resourceType : resourceTypes) {
if (resourceType.supportsOwner(ResourceOwnerType.Account)) {
@@ -1255,59 +1261,63 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
}
}
- int accountExpectedCount = accountSupportedResourceTypes.size();
- int domainExpectedCount = domainSupportedResourceTypes.size();
+ final int accountExpectedCount = accountSupportedResourceTypes.size();
+ final int domainExpectedCount = domainSupportedResourceTypes.size();
if ((domainResourceCount.size() < domainExpectedCount * domains.size())) {
s_logger.debug("resource_count table has records missing for some domains...going to insert them");
- for (DomainVO domain : domains) {
+ for (final DomainVO domain : domains) {
// Lock domain
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _domainDao.lockRow(domain.getId(), true);
- List<ResourceCountVO> domainCounts = _resourceCountDao.listByOwnerId(domain.getId(), ResourceOwnerType.Domain);
- List<String> domainCountStr = new ArrayList<String>();
- for (ResourceCountVO domainCount : domainCounts) {
- domainCountStr.add(domainCount.getType().toString());
- }
-
- if (domainCountStr.size() < domainExpectedCount) {
- for (ResourceType resourceType : domainSupportedResourceTypes) {
- if (!domainCountStr.contains(resourceType.toString())) {
- ResourceCountVO resourceCountVO = new ResourceCountVO(resourceType, 0, domain.getId(), ResourceOwnerType.Domain);
- s_logger.debug("Inserting resource count of type " + resourceType + " for domain id=" + domain.getId());
- _resourceCountDao.persist(resourceCountVO);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _domainDao.lockRow(domain.getId(), true);
+ List<ResourceCountVO> domainCounts = _resourceCountDao.listByOwnerId(domain.getId(), ResourceOwnerType.Domain);
+ List<String> domainCountStr = new ArrayList<String>();
+ for (ResourceCountVO domainCount : domainCounts) {
+ domainCountStr.add(domainCount.getType().toString());
+ }
+
+ if (domainCountStr.size() < domainExpectedCount) {
+ for (ResourceType resourceType : domainSupportedResourceTypes) {
+ if (!domainCountStr.contains(resourceType.toString())) {
+ ResourceCountVO resourceCountVO = new ResourceCountVO(resourceType, 0, domain.getId(), ResourceOwnerType.Domain);
+ s_logger.debug("Inserting resource count of type " + resourceType + " for domain id=" + domain.getId());
+ _resourceCountDao.persist(resourceCountVO);
+ }
+ }
}
}
- }
- txn.commit();
+ });
+
}
}
if ((accountResourceCount.size() < accountExpectedCount * accounts.size())) {
s_logger.debug("resource_count table has records missing for some accounts...going to insert them");
- for (AccountVO account : accounts) {
+ for (final AccountVO account : accounts) {
// lock account
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _accountDao.lockRow(account.getId(), true);
- List<ResourceCountVO> accountCounts = _resourceCountDao.listByOwnerId(account.getId(), ResourceOwnerType.Account);
- List<String> accountCountStr = new ArrayList<String>();
- for (ResourceCountVO accountCount : accountCounts) {
- accountCountStr.add(accountCount.getType().toString());
- }
-
- if (accountCountStr.size() < accountExpectedCount) {
- for (ResourceType resourceType : accountSupportedResourceTypes) {
- if (!accountCountStr.contains(resourceType.toString())) {
- ResourceCountVO resourceCountVO = new ResourceCountVO(resourceType, 0, account.getId(), ResourceOwnerType.Account);
- s_logger.debug("Inserting resource count of type " + resourceType + " for account id=" + account.getId());
- _resourceCountDao.persist(resourceCountVO);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _accountDao.lockRow(account.getId(), true);
+ List<ResourceCountVO> accountCounts = _resourceCountDao.listByOwnerId(account.getId(), ResourceOwnerType.Account);
+ List<String> accountCountStr = new ArrayList<String>();
+ for (ResourceCountVO accountCount : accountCounts) {
+ accountCountStr.add(accountCount.getType().toString());
+ }
+
+ if (accountCountStr.size() < accountExpectedCount) {
+ for (ResourceType resourceType : accountSupportedResourceTypes) {
+ if (!accountCountStr.contains(resourceType.toString())) {
+ ResourceCountVO resourceCountVO = new ResourceCountVO(resourceType, 0, account.getId(), ResourceOwnerType.Account);
+ s_logger.debug("Inserting resource count of type " + resourceType + " for account id=" + account.getId());
+ _resourceCountDao.persist(resourceCountVO);
+ }
+ }
}
}
- }
-
- txn.commit();
+ });
}
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index 7173044..f7da8bb 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -565,6 +565,9 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.JoinBuilder;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.db.JoinBuilder.JoinType;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
@@ -2166,12 +2169,12 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
@Override
@DB
public DomainVO updateDomain(UpdateDomainCmd cmd) {
- Long domainId = cmd.getId();
- String domainName = cmd.getDomainName();
- String networkDomain = cmd.getNetworkDomain();
+ final Long domainId = cmd.getId();
+ final String domainName = cmd.getDomainName();
+ final String networkDomain = cmd.getNetworkDomain();
// check if domain exists in the system
- DomainVO domain = _domainDao.findById(domainId);
+ final DomainVO domain = _domainDao.findById(domainId);
if (domain == null) {
InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find domain with specified domain id");
ex.addProxyObject(domainId.toString(), "domainId");
@@ -2212,27 +2215,26 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
}
}
- Transaction txn = Transaction.currentTxn();
-
- txn.start();
-
- if (domainName != null) {
- String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
- updateDomainChildren(domain, updatedDomainPath);
- domain.setName(domainName);
- domain.setPath(updatedDomainPath);
- }
-
- if (networkDomain != null) {
- if (networkDomain.isEmpty()) {
- domain.setNetworkDomain(null);
- } else {
- domain.setNetworkDomain(networkDomain);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ if (domainName != null) {
+ String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
+ updateDomainChildren(domain, updatedDomainPath);
+ domain.setName(domainName);
+ domain.setPath(updatedDomainPath);
+ }
+
+ if (networkDomain != null) {
+ if (networkDomain.isEmpty()) {
+ domain.setNetworkDomain(null);
+ } else {
+ domain.setNetworkDomain(networkDomain);
+ }
+ }
+ _domainDao.update(domainId, domain);
}
- }
- _domainDao.update(domainId, domain);
-
- txn.commit();
+ });
return _domainDao.findById(domainId);
@@ -3651,7 +3653,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
@Override
@DB
- public boolean updateHostPassword(UpdateHostPasswordCmd cmd) {
+ public boolean updateHostPassword(final UpdateHostPasswordCmd cmd) {
if (cmd.getClusterId() == null && cmd.getHostId() == null) {
throw new InvalidParameterValueException("You should provide one of cluster id or a host id.");
} else if (cmd.getClusterId() == null) {
@@ -3668,35 +3670,30 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
throw new InvalidParameterValueException("This operation is not supported for this hypervisor type");
}
// get all the hosts in this cluster
- List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cmd.getClusterId());
- Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
- for (HostVO h : hosts) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Changing password for host name = " + h.getName());
- }
- // update password for this host
- DetailVO nv = _detailsDao.findDetail(h.getId(), ApiConstants.USERNAME);
- if (nv.getValue().equals(cmd.getUsername())) {
- DetailVO nvp = _detailsDao.findDetail(h.getId(), ApiConstants.PASSWORD);
- nvp.setValue(DBEncryptionUtil.encrypt(cmd.getPassword()));
- _detailsDao.persist(nvp);
- } else {
- // if one host in the cluster has diff username then
- // rollback to maintain consistency
- txn.rollback();
- throw new InvalidParameterValueException(
- "The username is not same for all hosts, please modify passwords for individual hosts.");
+ final List<HostVO> hosts = _resourceMgr.listAllHostsInCluster(cmd.getClusterId());
+
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (HostVO h : hosts) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Changing password for host name = " + h.getName());
+ }
+ // update password for this host
+ DetailVO nv = _detailsDao.findDetail(h.getId(), ApiConstants.USERNAME);
+ if (nv.getValue().equals(cmd.getUsername())) {
+ DetailVO nvp = _detailsDao.findDetail(h.getId(), ApiConstants.PASSWORD);
+ nvp.setValue(DBEncryptionUtil.encrypt(cmd.getPassword()));
+ _detailsDao.persist(nvp);
+ } else {
+ // if one host in the cluster has diff username then
+ // rollback to maintain consistency
+ throw new InvalidParameterValueException(
+ "The username is not same for all hosts, please modify passwords for individual hosts.");
+ }
}
}
- txn.commit();
- // if hypervisor is xenserver then we update it in
- // CitrixResourceBase
- } catch (Exception e) {
- txn.rollback();
- throw new CloudRuntimeException("Failed to update password " + e.getMessage());
- }
+ });
}
return true;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/server/StatsCollector.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/StatsCollector.java b/server/src/com/cloud/server/StatsCollector.java
index b4ec915..699c3c0 100755
--- a/server/src/com/cloud/server/StatsCollector.java
+++ b/server/src/com/cloud/server/StatsCollector.java
@@ -85,6 +85,8 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.net.MacAddress;
import com.cloud.vm.UserVmManager;
import com.cloud.vm.UserVmVO;
@@ -365,29 +367,29 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc
scanLock.unlock();
return;
}
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
try {
- txn.start();
- //get all stats with delta > 0
- List<VmDiskStatisticsVO> updatedVmNetStats = _vmDiskStatsDao.listUpdatedStats();
- for(VmDiskStatisticsVO stat : updatedVmNetStats){
- if (_dailyOrHourly) {
- //update agg bytes
- stat.setAggBytesRead(stat.getCurrentBytesRead() + stat.getNetBytesRead());
- stat.setAggBytesWrite(stat.getCurrentBytesWrite() + stat.getNetBytesWrite());
- stat.setAggIORead(stat.getCurrentIORead() + stat.getNetIORead());
- stat.setAggIOWrite(stat.getCurrentIOWrite() + stat.getNetIOWrite());
- _vmDiskStatsDao.update(stat.getId(), stat);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ //get all stats with delta > 0
+ List<VmDiskStatisticsVO> updatedVmNetStats = _vmDiskStatsDao.listUpdatedStats();
+ for(VmDiskStatisticsVO stat : updatedVmNetStats){
+ if (_dailyOrHourly) {
+ //update agg bytes
+ stat.setAggBytesRead(stat.getCurrentBytesRead() + stat.getNetBytesRead());
+ stat.setAggBytesWrite(stat.getCurrentBytesWrite() + stat.getNetBytesWrite());
+ stat.setAggIORead(stat.getCurrentIORead() + stat.getNetIORead());
+ stat.setAggIOWrite(stat.getCurrentIOWrite() + stat.getNetIOWrite());
+ _vmDiskStatsDao.update(stat.getId(), stat);
+ }
+ }
+ s_logger.debug("Successfully updated aggregate vm disk stats");
}
- }
- s_logger.debug("Successfully updated aggregate vm disk stats");
- txn.commit();
+ });
} catch (Exception e){
- txn.rollback();
s_logger.debug("Failed to update aggregate disk stats", e);
} finally {
scanLock.unlock();
- txn.close();
}
}
} catch (Exception e){
@@ -402,122 +404,121 @@ public class StatsCollector extends ManagerBase implements ComponentMethodInterc
@Override
protected void runInContext() {
// collect the vm disk statistics(total) from hypervisor. added by weizhou, 2013.03.
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
try {
- txn.start();
- SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria();
- sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString());
- sc.addAnd("resourceState", SearchCriteria.Op.NIN, ResourceState.Maintenance, ResourceState.PrepareForMaintenance, ResourceState.ErrorInMaintenance);
- sc.addAnd("type", SearchCriteria.Op.EQ, Host.Type.Routing.toString());
- sc.addAnd("hypervisorType", SearchCriteria.Op.EQ, HypervisorType.KVM); // support KVM only util 2013.06.25
- List<HostVO> hosts = _hostDao.search(sc, null);
-
- for (HostVO host : hosts) {
- List<UserVmVO> vms = _userVmDao.listRunningByHostId(host.getId());
- List<Long> vmIds = new ArrayList<Long>();
-
- for (UserVmVO vm : vms) {
- if (vm.getType() == VirtualMachine.Type.User) // user vm
- vmIds.add(vm.getId());
- }
-
- HashMap<Long, List<VmDiskStatsEntry>> vmDiskStatsById = _userVmMgr.getVmDiskStatistics(host.getId(), host.getName(), vmIds);
- if (vmDiskStatsById == null)
- continue;
-
- Set<Long> vmIdSet = vmDiskStatsById.keySet();
- for(Long vmId : vmIdSet)
- {
- List<VmDiskStatsEntry> vmDiskStats = vmDiskStatsById.get(vmId);
- if (vmDiskStats == null)
- continue;
- UserVmVO userVm = _userVmDao.findById(vmId);
- for (VmDiskStatsEntry vmDiskStat:vmDiskStats) {
- SearchCriteria<VolumeVO> sc_volume = _volsDao.createSearchCriteria();
- sc_volume.addAnd("path", SearchCriteria.Op.EQ, vmDiskStat.getPath());
- VolumeVO volume = _volsDao.search(sc_volume, null).get(0);
- VmDiskStatisticsVO previousVmDiskStats = _vmDiskStatsDao.findBy(userVm.getAccountId(), userVm.getDataCenterId(), vmId, volume.getId());
- VmDiskStatisticsVO vmDiskStat_lock = _vmDiskStatsDao.lock(userVm.getAccountId(), userVm.getDataCenterId(), vmId, volume.getId());
-
- if ((vmDiskStat.getBytesRead() == 0) && (vmDiskStat.getBytesWrite() == 0)
- && (vmDiskStat.getIORead() == 0) && (vmDiskStat.getIOWrite() == 0)) {
- s_logger.debug("IO/bytes read and write are all 0. Not updating vm_disk_statistics");
- continue;
- }
-
- if (vmDiskStat_lock == null) {
- s_logger.warn("unable to find vm disk stats from host for account: " + userVm.getAccountId() + " with vmId: " + userVm.getId()+ " and volumeId:" + volume.getId());
- continue;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ SearchCriteria<HostVO> sc = _hostDao.createSearchCriteria();
+ sc.addAnd("status", SearchCriteria.Op.EQ, Status.Up.toString());
+ sc.addAnd("resourceState", SearchCriteria.Op.NIN, ResourceState.Maintenance, ResourceState.PrepareForMaintenance, ResourceState.ErrorInMaintenance);
+ sc.addAnd("type", SearchCriteria.Op.EQ, Host.Type.Routing.toString());
+ sc.addAnd("hypervisorType", SearchCriteria.Op.EQ, HypervisorType.KVM); // support KVM only util 2013.06.25
+ List<HostVO> hosts = _hostDao.search(sc, null);
+
+ for (HostVO host : hosts) {
+ List<UserVmVO> vms = _userVmDao.listRunningByHostId(host.getId());
+ List<Long> vmIds = new ArrayList<Long>();
+
+ for (UserVmVO vm : vms) {
+ if (vm.getType() == VirtualMachine.Type.User) // user vm
+ vmIds.add(vm.getId());
}
-
- if (previousVmDiskStats != null
- && ((previousVmDiskStats.getCurrentBytesRead() != vmDiskStat_lock.getCurrentBytesRead())
- || (previousVmDiskStats.getCurrentBytesWrite() != vmDiskStat_lock.getCurrentBytesWrite())
- || (previousVmDiskStats.getCurrentIORead() != vmDiskStat_lock.getCurrentIORead())
- || (previousVmDiskStats.getCurrentIOWrite() != vmDiskStat_lock.getCurrentIOWrite()))) {
- s_logger.debug("vm disk stats changed from the time GetVmDiskStatsCommand was sent. " +
- "Ignoring current answer. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
- " Read(Bytes): " + vmDiskStat.getBytesRead() + " write(Bytes): " + vmDiskStat.getBytesWrite() +
- " Read(IO): " + vmDiskStat.getIORead() + " write(IO): " + vmDiskStat.getIOWrite());
+
+ HashMap<Long, List<VmDiskStatsEntry>> vmDiskStatsById = _userVmMgr.getVmDiskStatistics(host.getId(), host.getName(), vmIds);
+ if (vmDiskStatsById == null)
continue;
- }
-
- if (vmDiskStat_lock.getCurrentBytesRead() > vmDiskStat.getBytesRead()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Read # of bytes that's less than the last one. " +
- "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
- " Reported: " + vmDiskStat.getBytesRead() + " Stored: " + vmDiskStat_lock.getCurrentBytesRead());
- }
- vmDiskStat_lock.setNetBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
- }
- vmDiskStat_lock.setCurrentBytesRead(vmDiskStat.getBytesRead());
- if (vmDiskStat_lock.getCurrentBytesWrite() > vmDiskStat.getBytesWrite()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Write # of bytes that's less than the last one. " +
- "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
- " Reported: " + vmDiskStat.getBytesWrite() + " Stored: " + vmDiskStat_lock.getCurrentBytesWrite());
- }
- vmDiskStat_lock.setNetBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
- }
- vmDiskStat_lock.setCurrentBytesWrite(vmDiskStat.getBytesWrite());
- if (vmDiskStat_lock.getCurrentIORead() > vmDiskStat.getIORead()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Read # of IO that's less than the last one. " +
- "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
- " Reported: " + vmDiskStat.getIORead() + " Stored: " + vmDiskStat_lock.getCurrentIORead());
+
+ Set<Long> vmIdSet = vmDiskStatsById.keySet();
+ for(Long vmId : vmIdSet)
+ {
+ List<VmDiskStatsEntry> vmDiskStats = vmDiskStatsById.get(vmId);
+ if (vmDiskStats == null)
+ continue;
+ UserVmVO userVm = _userVmDao.findById(vmId);
+ for (VmDiskStatsEntry vmDiskStat:vmDiskStats) {
+ SearchCriteria<VolumeVO> sc_volume = _volsDao.createSearchCriteria();
+ sc_volume.addAnd("path", SearchCriteria.Op.EQ, vmDiskStat.getPath());
+ VolumeVO volume = _volsDao.search(sc_volume, null).get(0);
+ VmDiskStatisticsVO previousVmDiskStats = _vmDiskStatsDao.findBy(userVm.getAccountId(), userVm.getDataCenterId(), vmId, volume.getId());
+ VmDiskStatisticsVO vmDiskStat_lock = _vmDiskStatsDao.lock(userVm.getAccountId(), userVm.getDataCenterId(), vmId, volume.getId());
+
+ if ((vmDiskStat.getBytesRead() == 0) && (vmDiskStat.getBytesWrite() == 0)
+ && (vmDiskStat.getIORead() == 0) && (vmDiskStat.getIOWrite() == 0)) {
+ s_logger.debug("IO/bytes read and write are all 0. Not updating vm_disk_statistics");
+ continue;
+ }
+
+ if (vmDiskStat_lock == null) {
+ s_logger.warn("unable to find vm disk stats from host for account: " + userVm.getAccountId() + " with vmId: " + userVm.getId()+ " and volumeId:" + volume.getId());
+ continue;
+ }
+
+ if (previousVmDiskStats != null
+ && ((previousVmDiskStats.getCurrentBytesRead() != vmDiskStat_lock.getCurrentBytesRead())
+ || (previousVmDiskStats.getCurrentBytesWrite() != vmDiskStat_lock.getCurrentBytesWrite())
+ || (previousVmDiskStats.getCurrentIORead() != vmDiskStat_lock.getCurrentIORead())
+ || (previousVmDiskStats.getCurrentIOWrite() != vmDiskStat_lock.getCurrentIOWrite()))) {
+ s_logger.debug("vm disk stats changed from the time GetVmDiskStatsCommand was sent. " +
+ "Ignoring current answer. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Read(Bytes): " + vmDiskStat.getBytesRead() + " write(Bytes): " + vmDiskStat.getBytesWrite() +
+ " Read(IO): " + vmDiskStat.getIORead() + " write(IO): " + vmDiskStat.getIOWrite());
+ continue;
+ }
+
+ if (vmDiskStat_lock.getCurrentBytesRead() > vmDiskStat.getBytesRead()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Read # of bytes that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getBytesRead() + " Stored: " + vmDiskStat_lock.getCurrentBytesRead());
+ }
+ vmDiskStat_lock.setNetBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
+ }
+ vmDiskStat_lock.setCurrentBytesRead(vmDiskStat.getBytesRead());
+ if (vmDiskStat_lock.getCurrentBytesWrite() > vmDiskStat.getBytesWrite()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Write # of bytes that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getBytesWrite() + " Stored: " + vmDiskStat_lock.getCurrentBytesWrite());
+ }
+ vmDiskStat_lock.setNetBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
+ }
+ vmDiskStat_lock.setCurrentBytesWrite(vmDiskStat.getBytesWrite());
+ if (vmDiskStat_lock.getCurrentIORead() > vmDiskStat.getIORead()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Read # of IO that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getIORead() + " Stored: " + vmDiskStat_lock.getCurrentIORead());
+ }
+ vmDiskStat_lock.setNetIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
+ }
+ vmDiskStat_lock.setCurrentIORead(vmDiskStat.getIORead());
+ if (vmDiskStat_lock.getCurrentIOWrite() > vmDiskStat.getIOWrite()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Write # of IO that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
+ " Reported: " + vmDiskStat.getIOWrite() + " Stored: " + vmDiskStat_lock.getCurrentIOWrite());
+ }
+ vmDiskStat_lock.setNetIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
+ }
+ vmDiskStat_lock.setCurrentIOWrite(vmDiskStat.getIOWrite());
+
+ if (! _dailyOrHourly) {
+ //update agg bytes
+ vmDiskStat_lock.setAggBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
+ vmDiskStat_lock.setAggBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
+ vmDiskStat_lock.setAggIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
+ vmDiskStat_lock.setAggIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
+ }
+
+ _vmDiskStatsDao.update(vmDiskStat_lock.getId(), vmDiskStat_lock);
}
- vmDiskStat_lock.setNetIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
}
- vmDiskStat_lock.setCurrentIORead(vmDiskStat.getIORead());
- if (vmDiskStat_lock.getCurrentIOWrite() > vmDiskStat.getIOWrite()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Write # of IO that's less than the last one. " +
- "Assuming something went wrong and persisting it. Host: " + host.getName() + " . VM: " + vmDiskStat.getVmName() +
- " Reported: " + vmDiskStat.getIOWrite() + " Stored: " + vmDiskStat_lock.getCurrentIOWrite());
- }
- vmDiskStat_lock.setNetIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
- }
- vmDiskStat_lock.setCurrentIOWrite(vmDiskStat.getIOWrite());
-
- if (! _dailyOrHourly) {
- //update agg bytes
- vmDiskStat_lock.setAggBytesWrite(vmDiskStat_lock.getNetBytesWrite() + vmDiskStat_lock.getCurrentBytesWrite());
- vmDiskStat_lock.setAggBytesRead(vmDiskStat_lock.getNetBytesRead() + vmDiskStat_lock.getCurrentBytesRead());
- vmDiskStat_lock.setAggIOWrite(vmDiskStat_lock.getNetIOWrite() + vmDiskStat_lock.getCurrentIOWrite());
- vmDiskStat_lock.setAggIORead(vmDiskStat_lock.getNetIORead() + vmDiskStat_lock.getCurrentIORead());
- }
-
- _vmDiskStatsDao.update(vmDiskStat_lock.getId(), vmDiskStat_lock);
}
}
- }
- txn.commit();
+ });
} catch (Exception e) {
s_logger.warn("Error while collecting vm disk stats from hosts", e);
- } finally {
- txn.close();
}
-
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/servlet/CloudStartupServlet.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/servlet/CloudStartupServlet.java b/server/src/com/cloud/servlet/CloudStartupServlet.java
index 8fbae92..4fe96aa 100755
--- a/server/src/com/cloud/servlet/CloudStartupServlet.java
+++ b/server/src/com/cloud/servlet/CloudStartupServlet.java
@@ -30,6 +30,7 @@ import com.cloud.utils.LogUtils;
import com.cloud.utils.SerialVersionUID;
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
public class CloudStartupServlet extends HttpServlet {
public static final Logger s_logger = Logger.getLogger(CloudStartupServlet.class.getName());
@@ -49,7 +50,7 @@ public class CloudStartupServlet extends HttpServlet {
if(ComponentContext.getApplicationContext() != null) {
_timer.cancel();
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
ComponentContext.initComponentsLifeCycle();
} finally {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/servlet/ConsoleProxyServlet.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
index e01d959..b3415db 100644
--- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java
+++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
@@ -57,6 +57,7 @@ import com.cloud.utils.Pair;
import com.cloud.utils.Ternary;
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineManager;
@@ -573,7 +574,7 @@ public class ConsoleProxyServlet extends HttpServlet {
return false; // no signature, bad request
}
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
txn.close();
User user = null;
// verify there is a user with this api key
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/storage/StorageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java
index c046057..75cedd0 100755
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -158,6 +158,10 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.JoinBuilder;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.db.JoinBuilder.JoinType;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
@@ -1066,7 +1070,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
String sql = "SELECT volume_id from snapshots, snapshot_store_ref WHERE snapshots.id = snapshot_store_ref.snapshot_id and store_id=? GROUP BY volume_id";
List<Long> list = new ArrayList<Long>();
try {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
ResultSet rs = null;
PreparedStatement pstmt = null;
pstmt = txn.prepareAutoCloseStatement(sql);
@@ -1086,7 +1090,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
List<String> findAllSnapshotForVolume(Long volumeId) {
String sql = "SELECT backup_snap_id FROM snapshots WHERE volume_id=? and backup_snap_id is not NULL";
try {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
ResultSet rs = null;
PreparedStatement pstmt = null;
pstmt = txn.prepareAutoCloseStatement(sql);
@@ -1752,7 +1756,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
@Override
public boolean deleteImageStore(DeleteImageStoreCmd cmd) {
- long storeId = cmd.getId();
+ final long storeId = cmd.getId();
// Verify that image store exists
ImageStoreVO store = _imageStoreDao.findById(storeId);
if (store == null) {
@@ -1778,17 +1782,20 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
}
// ready to delete
- Transaction txn = Transaction.currentTxn();
- txn.start();
- // first delete from image_store_details table, we need to do that since
- // we are not actually deleting record from main
- // image_data_store table, so delete cascade will not work
- _imageStoreDetailsDao.deleteDetails(storeId);
- _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.Image);
- _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
- _templateStoreDao.deletePrimaryRecordsForStore(storeId);
- _imageStoreDao.remove(storeId);
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ // first delete from image_store_details table, we need to do that since
+ // we are not actually deleting record from main
+ // image_data_store table, so delete cascade will not work
+ _imageStoreDetailsDao.deleteDetails(storeId);
+ _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.Image);
+ _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
+ _templateStoreDao.deletePrimaryRecordsForStore(storeId);
+ _imageStoreDao.remove(storeId);
+ }
+ });
+
return true;
}
@@ -1862,7 +1869,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
@Override
public boolean deleteSecondaryStagingStore(DeleteSecondaryStagingStoreCmd cmd) {
- long storeId = cmd.getId();
+ final long storeId = cmd.getId();
// Verify that cache store exists
ImageStoreVO store = _imageStoreDao.findById(storeId);
if (store == null) {
@@ -1887,17 +1894,20 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C
}
// ready to delete
- Transaction txn = Transaction.currentTxn();
- txn.start();
- // first delete from image_store_details table, we need to do that since
- // we are not actually deleting record from main
- // image_data_store table, so delete cascade will not work
- _imageStoreDetailsDao.deleteDetails(storeId);
- _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.ImageCache);
- _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
- _templateStoreDao.deletePrimaryRecordsForStore(storeId);
- _imageStoreDao.remove(storeId);
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ // first delete from image_store_details table, we need to do that since
+ // we are not actually deleting record from main
+ // image_data_store table, so delete cascade will not work
+ _imageStoreDetailsDao.deleteDetails(storeId);
+ _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.ImageCache);
+ _volumeStoreDao.deletePrimaryRecordsForStore(storeId);
+ _templateStoreDao.deletePrimaryRecordsForStore(storeId);
+ _imageStoreDao.remove(storeId);
+ }
+ });
+
return true;
}
[18/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostDaoImpl.java
index 8debe2e..65abae3 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostDaoImpl.java
@@ -54,7 +54,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -336,7 +336,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
@Override @DB
public List<EngineHostVO> findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<EngineHostVO> sc = UnmanagedDirectConnectSearch.create();
sc.setParameters("lastPinged", lastPingSecondsAfter);
@@ -356,7 +356,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
@Override @DB
public List<EngineHostVO> findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<EngineHostVO> sc = UnmanagedApplianceSearch.create();
@@ -495,7 +495,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
@DB
@Override
public List<EngineHostVO> findLostHosts(long timeout) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<EngineHostVO> result = new ArrayList<EngineHostVO>();
ResultSet rs = null;
@@ -546,7 +546,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
public EngineHostVO persist(EngineHostVO host) {
final String InsertSequenceSql = "INSERT INTO op_host(id) VALUES(?)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
EngineHostVO dbHost = super.persist(host);
@@ -572,7 +572,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
@Override
@DB
public boolean update(Long hostId, EngineHostVO host) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
boolean persisted = super.update(hostId, host);
@@ -598,7 +598,7 @@ public class EngineHostDaoImpl extends GenericDaoBase<EngineHostVO, Long> implem
ArrayList<RunningHostCountInfo> l = new ArrayList<RunningHostCountInfo>();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
;
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java
index 7bf85d5..2bcfdd1 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java
@@ -41,7 +41,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component(value="EngineHostPodDao")
@Local(value={EngineHostPodDao.class})
@@ -97,7 +97,7 @@ public class EngineHostPodDaoImpl extends GenericDaoBase<EngineHostPodVO, Long>
HashMap<Long, List<Object>> currentPodCidrSubnets = new HashMap<Long, List<Object>>();
String selectSql = "SELECT id, cidr_address, cidr_size FROM host_pod_ref WHERE data_center_id=" + zoneId +" and removed IS NULL";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
ResultSet rs = stmt.executeQuery();
@@ -123,7 +123,7 @@ public class EngineHostPodDaoImpl extends GenericDaoBase<EngineHostPodVO, Long>
@Override
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
EngineHostPodVO pod = createForUpdate();
pod.setName(null);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostDetailsDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostDetailsDaoImpl.java
index e0ae778..e0a6dce 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostDetailsDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostDetailsDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.crypt.DBEncryptionUtil;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component(value="EngineHostDetailsDao")
@@ -96,7 +96,7 @@ public class HostDetailsDaoImpl extends GenericDaoBase<DetailVO, Long> implement
public void persist(long hostId, Map<String, String> details) {
final String InsertOrUpdateSql = "INSERT INTO `cloud`.`host_details` (host_id, name, value) VALUES (?,?,?) ON DUPLICATE KEY UPDATE value=?";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
for (Map.Entry<String, String> detail : details.entrySet()) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostTagsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostTagsDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostTagsDaoImpl.java
index a70b7d1..17d6f81 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostTagsDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/HostTagsDaoImpl.java
@@ -27,7 +27,7 @@ import com.cloud.host.HostTagVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component(value="EngineHostTagsDao")
@Local(value=HostTagsDao.class)
@@ -56,7 +56,7 @@ public class HostTagsDaoImpl extends GenericDaoBase<HostTagVO, Long> implements
@Override
public void persist(long hostId, List<String> hostTags) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<HostTagVO> sc = HostSearch.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
index 3c4b1ed..7ba9b1b 100755
--- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@ -167,6 +167,10 @@ import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.db.GlobalLock;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.db.JoinBuilder.JoinType;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria.Op;
@@ -346,7 +350,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
@DB
public boolean configure(final String name, final Map<String, Object> params) throws ConfigurationException {
// populate providers
- Map<Network.Service, Set<Network.Provider>> defaultSharedNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+ final Map<Network.Service, Set<Network.Provider>> defaultSharedNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
Set<Network.Provider> defaultProviders = new HashSet<Network.Provider>();
defaultProviders.add(Network.Provider.VirtualRouter);
@@ -354,7 +358,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
defaultSharedNetworkOfferingProviders.put(Service.Dns, defaultProviders);
defaultSharedNetworkOfferingProviders.put(Service.UserData, defaultProviders);
- Map<Network.Service, Set<Network.Provider>> defaultIsolatedNetworkOfferingProviders = defaultSharedNetworkOfferingProviders;
+ final Map<Network.Service, Set<Network.Provider>> defaultIsolatedNetworkOfferingProviders = defaultSharedNetworkOfferingProviders;
defaultIsolatedNetworkOfferingProviders.put(Service.Dhcp, defaultProviders);
defaultIsolatedNetworkOfferingProviders.put(Service.Dns, defaultProviders);
defaultIsolatedNetworkOfferingProviders.put(Service.UserData, defaultProviders);
@@ -365,7 +369,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
defaultIsolatedNetworkOfferingProviders.put(Service.PortForwarding, defaultProviders);
defaultIsolatedNetworkOfferingProviders.put(Service.Vpn, defaultProviders);
- Map<Network.Service, Set<Network.Provider>> defaultSharedSGEnabledNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+ final Map<Network.Service, Set<Network.Provider>> defaultSharedSGEnabledNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
defaultSharedSGEnabledNetworkOfferingProviders.put(Service.Dhcp, defaultProviders);
defaultSharedSGEnabledNetworkOfferingProviders.put(Service.Dns, defaultProviders);
defaultSharedSGEnabledNetworkOfferingProviders.put(Service.UserData, defaultProviders);
@@ -373,7 +377,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
sgProviders.add(Provider.SecurityGroupProvider);
defaultSharedSGEnabledNetworkOfferingProviders.put(Service.SecurityGroup, sgProviders);
- Map<Network.Service, Set<Network.Provider>> defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+ final Map<Network.Service, Set<Network.Provider>> defaultIsolatedSourceNatEnabledNetworkOfferingProviders = new HashMap<Network.Service, Set<Network.Provider>>();
defaultProviders.clear();
defaultProviders.add(Network.Provider.VirtualRouter);
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Dhcp, defaultProviders);
@@ -387,7 +391,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.PortForwarding, defaultProviders);
defaultIsolatedSourceNatEnabledNetworkOfferingProviders.put(Service.Vpn, defaultProviders);
- Map<Network.Service, Set<Network.Provider>> defaultVPCOffProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+ final Map<Network.Service, Set<Network.Provider>> defaultVPCOffProviders = new HashMap<Network.Service, Set<Network.Provider>>();
defaultProviders.clear();
defaultProviders.add(Network.Provider.VPCVirtualRouter);
defaultVPCOffProviders.put(Service.Dhcp, defaultProviders);
@@ -401,133 +405,134 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
defaultVPCOffProviders.put(Service.PortForwarding, defaultProviders);
defaultVPCOffProviders.put(Service.Vpn, defaultProviders);
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- NetworkOfferingVO offering = null;
- //#1 - quick cloud network offering
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.QuickCloudNoServices) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.QuickCloudNoServices, "Offering for QuickCloud with no services", TrafficType.Guest, null, true,
- Availability.Optional, null, new HashMap<Network.Service, Set<Network.Provider>>(), true, Network.GuestType.Shared, false, null, true, null, true, false, null,
- false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#2 - SG enabled network offering
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOfferingWithSGService) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOfferingWithSGService, "Offering for Shared Security group enabled networks",
- TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true,
- false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#3 - shared network offering with no SG service
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOffering) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOffering, "Offering for Shared networks", TrafficType.Guest, null, true,
- Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#4 - default isolated offering with Source nat service
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
- "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Required, null,
- defaultIsolatedSourceNatEnabledNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null);
-
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#5 - default vpc offering with LB service
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
- "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Optional, null, defaultVPCOffProviders, true,
- Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#6 - default vpc offering with no LB service
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB) == null) {
- //remove LB service
- defaultVPCOffProviders.remove(Service.Lb);
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB,
- "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest, null, false, Availability.Optional, null,
- defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#7 - isolated offering with source nat disabled
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOffering) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOffering, "Offering for Isolated networks with no Source Nat service",
- TrafficType.Guest, null, true, Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null,
- true, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- //#8 - network offering with internal lb service
- Map<Network.Service, Set<Network.Provider>> internalLbOffProviders = new HashMap<Network.Service, Set<Network.Provider>>();
- Set<Network.Provider> defaultVpcProvider = new HashSet<Network.Provider>();
- defaultVpcProvider.add(Network.Provider.VPCVirtualRouter);
-
- Set<Network.Provider> defaultInternalLbProvider = new HashSet<Network.Provider>();
- defaultInternalLbProvider.add(Network.Provider.InternalLbVm);
-
- internalLbOffProviders.put(Service.Dhcp, defaultVpcProvider);
- internalLbOffProviders.put(Service.Dns, defaultVpcProvider);
- internalLbOffProviders.put(Service.UserData, defaultVpcProvider);
- internalLbOffProviders.put(Service.NetworkACL, defaultVpcProvider);
- internalLbOffProviders.put(Service.Gateway, defaultVpcProvider);
- internalLbOffProviders.put(Service.Lb, defaultInternalLbProvider);
- internalLbOffProviders.put(Service.SourceNat, defaultVpcProvider);
-
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB,
- "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest, null, false, Availability.Optional, null, internalLbOffProviders, true,
- Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- offering.setInternalLb(true);
- offering.setPublicLb(false);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- Map<Network.Service, Set<Network.Provider>> netscalerServiceProviders = new HashMap<Network.Service, Set<Network.Provider>>();
- Set<Network.Provider> vrProvider = new HashSet<Network.Provider>();
- vrProvider.add(Provider.VirtualRouter);
- Set<Network.Provider> sgProvider = new HashSet<Network.Provider>();
- sgProvider.add(Provider.SecurityGroupProvider);
- Set<Network.Provider> nsProvider = new HashSet<Network.Provider>();
- nsProvider.add(Provider.Netscaler);
- netscalerServiceProviders.put(Service.Dhcp, vrProvider);
- netscalerServiceProviders.put(Service.Dns, vrProvider);
- netscalerServiceProviders.put(Service.UserData, vrProvider);
- netscalerServiceProviders.put(Service.SecurityGroup, sgProvider);
- netscalerServiceProviders.put(Service.StaticNat, nsProvider);
- netscalerServiceProviders.put(Service.Lb, nsProvider);
-
- Map<Service, Map<Capability, String>> serviceCapabilityMap = new HashMap<Service, Map<Capability, String>>();
- Map<Capability, String> elb = new HashMap<Capability, String>();
- elb.put(Capability.ElasticLb, "true");
- Map<Capability, String> eip = new HashMap<Capability, String>();
- eip.put(Capability.ElasticIp, "true");
- serviceCapabilityMap.put(Service.Lb, elb);
- serviceCapabilityMap.put(Service.StaticNat, eip);
-
- if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedEIPandELBNetworkOffering) == null) {
- offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedEIPandELBNetworkOffering,
- "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true, Availability.Optional, null, netscalerServiceProviders,
- true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null);
- offering.setState(NetworkOffering.State.Enabled);
- offering.setDedicatedLB(false);
- _networkOfferingDao.update(offering.getId(), offering);
- }
-
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ NetworkOfferingVO offering = null;
+ //#1 - quick cloud network offering
+ if (_networkOfferingDao.findByUniqueName(NetworkOffering.QuickCloudNoServices) == null) {
+ offering = _configMgr.createNetworkOffering(NetworkOffering.QuickCloudNoServices, "Offering for QuickCloud with no services", TrafficType.Guest, null, true,
+ Availability.Optional, null, new HashMap<Network.Service, Set<Network.Provider>>(), true, Network.GuestType.Shared, false, null, true, null, true, false, null,
+ false, null);
+ offering.setState(NetworkOffering.State.Enabled);
+ _networkOfferingDao.update(offering.getId(), offering);
+ }
+
+ //#2 - SG enabled network offering
+ if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOfferingWithSGService) == null) {
+ offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOfferingWithSGService, "Offering for Shared Security group enabled networks",
+ TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true,
+ false, null, false, null);
+ offering.setState(NetworkOffering.State.Enabled);
+ _networkOfferingDao.update(offering.getId(), offering);
+ }
+
+ //#3 - shared network offering with no SG service
+ if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOffering) == null) {
+ offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOffering, "Offering for Shared networks", TrafficType.Guest, null, true,
+ Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null, false, null);
+ offering.setState(NetworkOffering.State.Enabled);
+ _networkOfferingDao.update(offering.getId(), offering);
+ }
+
+ //#4 - default isolated offering with Source nat service
+ if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService) == null) {
+ offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService,
+ "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Required, null,
+ defaultIsolatedSourceNatEnabledNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null);
+
+ offering.setState(NetworkOffering.State.Enabled);
+ _networkOfferingDao.update(offering.getId(), offering);
+ }
+
+ //#5 - default vpc offering with LB service
+ if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks) == null) {
+ offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks,
+ "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Optional, null, defaultVPCOffProviders, true,
+ Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
+ offering.setState(NetworkOffering.State.Enabled);
+ _networkOfferingDao.update(offering.getId(), offering);
+ }
+
+ //#6 - default vpc offering with no LB service
+ if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB) == null) {
+ //remove LB service
+ defaultVPCOffProviders.remove(Service.Lb);
+ offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB,
+ "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest, null, false, Availability.Optional, null,
+ defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
+ offering.setState(NetworkOffering.State.Enabled);
+ _networkOfferingDao.update(offering.getId(), offering);
+ }
+
+ //#7 - isolated offering with source nat disabled
+ if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOffering) == null) {
+ offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOffering, "Offering for Isolated networks with no Source Nat service",
+ TrafficType.Guest, null, true, Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null,
+ true, false, null, false, null);
+ offering.setState(NetworkOffering.State.Enabled);
+ _networkOfferingDao.update(offering.getId(), offering);
+ }
+
+ //#8 - network offering with internal lb service
+ Map<Network.Service, Set<Network.Provider>> internalLbOffProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+ Set<Network.Provider> defaultVpcProvider = new HashSet<Network.Provider>();
+ defaultVpcProvider.add(Network.Provider.VPCVirtualRouter);
+
+ Set<Network.Provider> defaultInternalLbProvider = new HashSet<Network.Provider>();
+ defaultInternalLbProvider.add(Network.Provider.InternalLbVm);
+
+ internalLbOffProviders.put(Service.Dhcp, defaultVpcProvider);
+ internalLbOffProviders.put(Service.Dns, defaultVpcProvider);
+ internalLbOffProviders.put(Service.UserData, defaultVpcProvider);
+ internalLbOffProviders.put(Service.NetworkACL, defaultVpcProvider);
+ internalLbOffProviders.put(Service.Gateway, defaultVpcProvider);
+ internalLbOffProviders.put(Service.Lb, defaultInternalLbProvider);
+ internalLbOffProviders.put(Service.SourceNat, defaultVpcProvider);
+
+ if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB) == null) {
+ offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB,
+ "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest, null, false, Availability.Optional, null, internalLbOffProviders, true,
+ Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null);
+ offering.setState(NetworkOffering.State.Enabled);
+ offering.setInternalLb(true);
+ offering.setPublicLb(false);
+ _networkOfferingDao.update(offering.getId(), offering);
+ }
+
+ Map<Network.Service, Set<Network.Provider>> netscalerServiceProviders = new HashMap<Network.Service, Set<Network.Provider>>();
+ Set<Network.Provider> vrProvider = new HashSet<Network.Provider>();
+ vrProvider.add(Provider.VirtualRouter);
+ Set<Network.Provider> sgProvider = new HashSet<Network.Provider>();
+ sgProvider.add(Provider.SecurityGroupProvider);
+ Set<Network.Provider> nsProvider = new HashSet<Network.Provider>();
+ nsProvider.add(Provider.Netscaler);
+ netscalerServiceProviders.put(Service.Dhcp, vrProvider);
+ netscalerServiceProviders.put(Service.Dns, vrProvider);
+ netscalerServiceProviders.put(Service.UserData, vrProvider);
+ netscalerServiceProviders.put(Service.SecurityGroup, sgProvider);
+ netscalerServiceProviders.put(Service.StaticNat, nsProvider);
+ netscalerServiceProviders.put(Service.Lb, nsProvider);
+
+ Map<Service, Map<Capability, String>> serviceCapabilityMap = new HashMap<Service, Map<Capability, String>>();
+ Map<Capability, String> elb = new HashMap<Capability, String>();
+ elb.put(Capability.ElasticLb, "true");
+ Map<Capability, String> eip = new HashMap<Capability, String>();
+ eip.put(Capability.ElasticIp, "true");
+ serviceCapabilityMap.put(Service.Lb, elb);
+ serviceCapabilityMap.put(Service.StaticNat, eip);
+
+ if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedEIPandELBNetworkOffering) == null) {
+ offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedEIPandELBNetworkOffering,
+ "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true, Availability.Optional, null, netscalerServiceProviders,
+ true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null);
+ offering.setState(NetworkOffering.State.Enabled);
+ offering.setDedicatedLB(false);
+ _networkOfferingDao.update(offering.getId(), offering);
+ }
+ }
+ });
+
AssignIpAddressSearch = _ipAddressDao.createSearchBuilder();
AssignIpAddressSearch.and("dc", AssignIpAddressSearch.entity().getDataCenterId(), Op.EQ);
@@ -590,8 +595,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
@Override
@DB
- public List<? extends Network> setupNetwork(Account owner, NetworkOffering offering, Network predefined, DeploymentPlan plan, String name, String displayText,
- boolean errorIfAlreadySetup, Long domainId, ACLType aclType, Boolean subdomainAccess, Long vpcId, Boolean isDisplayNetworkEnabled) throws ConcurrentOperationException {
+ public List<? extends Network> setupNetwork(final Account owner, final NetworkOffering offering, final Network predefined, final DeploymentPlan plan, final String name, final String displayText,
+ boolean errorIfAlreadySetup, final Long domainId, final ACLType aclType, final Boolean subdomainAccess, final Long vpcId, final Boolean isDisplayNetworkEnabled) throws ConcurrentOperationException {
Account locked = _accountDao.acquireInLockTable(owner.getId());
if (locked == null) {
@@ -622,12 +627,12 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
}
}
- List<NetworkVO> networks = new ArrayList<NetworkVO>();
+ final List<NetworkVO> networks = new ArrayList<NetworkVO>();
long related = -1;
- for (NetworkGuru guru : _networkGurus) {
- Network network = guru.design(offering, plan, predefined, owner);
+ for (final NetworkGuru guru : _networkGurus) {
+ final Network network = guru.design(offering, plan, predefined, owner);
if (network == null) {
continue;
}
@@ -641,28 +646,26 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
continue;
}
- long id = _networksDao.getNextInSequence(Long.class, "id");
+ final long id = _networksDao.getNextInSequence(Long.class, "id");
if (related == -1) {
related = id;
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- NetworkVO vo = new NetworkVO(id, network, offering.getId(), guru.getName(), owner.getDomainId(), owner.getId(), related, name, displayText,
- predefined.getNetworkDomain(), offering.getGuestType(), plan.getDataCenterId(), plan.getPhysicalNetworkId(), aclType, offering.getSpecifyIpRanges(), vpcId);
- vo.setDisplayNetwork(isDisplayNetworkEnabled == null ? true : isDisplayNetworkEnabled);
- networks.add(_networksDao.persist(vo, vo.getGuestType() == Network.GuestType.Isolated,
- finalizeServicesAndProvidersForNetwork(offering, plan.getPhysicalNetworkId())));
-
- if (domainId != null && aclType == ACLType.Domain) {
- if (subdomainAccess == null) {
- subdomainAccess = true;
+ final long relatedFile = related;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ NetworkVO vo = new NetworkVO(id, network, offering.getId(), guru.getName(), owner.getDomainId(), owner.getId(), relatedFile, name, displayText,
+ predefined.getNetworkDomain(), offering.getGuestType(), plan.getDataCenterId(), plan.getPhysicalNetworkId(), aclType, offering.getSpecifyIpRanges(), vpcId);
+ vo.setDisplayNetwork(isDisplayNetworkEnabled == null ? true : isDisplayNetworkEnabled);
+ networks.add(_networksDao.persist(vo, vo.getGuestType() == Network.GuestType.Isolated,
+ finalizeServicesAndProvidersForNetwork(offering, plan.getPhysicalNetworkId())));
+
+ if (domainId != null && aclType == ACLType.Domain) {
+ _networksDao.addDomainToNetwork(id, domainId, subdomainAccess == null ? true : subdomainAccess);
+ }
}
- _networksDao.addDomainToNetwork(id, domainId, subdomainAccess);
- }
-
- txn.commit();
+ });
}
if (networks.size() < 1) {
@@ -681,73 +684,76 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
@Override
@DB
- public void allocate(VirtualMachineProfile vm, LinkedHashMap<? extends Network, ? extends NicProfile> networks) throws InsufficientCapacityException,
+ public void allocate(final VirtualMachineProfile vm, final LinkedHashMap<? extends Network, ? extends NicProfile> networks) throws InsufficientCapacityException,
ConcurrentOperationException {
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- int deviceId = 0;
-
- boolean[] deviceIds = new boolean[networks.size()];
- Arrays.fill(deviceIds, false);
-
- List<NicProfile> nics = new ArrayList<NicProfile>(networks.size());
- NicProfile defaultNic = null;
-
- for (Map.Entry<? extends Network, ? extends NicProfile> network : networks.entrySet()) {
- Network config = network.getKey();
- NicProfile requested = network.getValue();
-
- Boolean isDefaultNic = false;
- if (vm != null && (requested != null && requested.isDefaultNic())) {
- isDefaultNic = true;
- }
-
- while (deviceIds[deviceId] && deviceId < deviceIds.length) {
- deviceId++;
- }
- Pair<NicProfile, Integer> vmNicPair = allocateNic(requested, config, isDefaultNic, deviceId, vm);
-
- NicProfile vmNic = vmNicPair.first();
- if (vmNic == null) {
- continue;
- }
-
- deviceId = vmNicPair.second();
-
- int devId = vmNic.getDeviceId();
- if (devId > deviceIds.length) {
- throw new IllegalArgumentException("Device id for nic is too large: " + vmNic);
- }
- if (deviceIds[devId]) {
- throw new IllegalArgumentException("Conflicting device id for two different nics: " + vmNic);
- }
-
- deviceIds[devId] = true;
-
- if (vmNic.isDefaultNic()) {
- if (defaultNic != null) {
- throw new IllegalArgumentException("You cannot specify two nics as default nics: nic 1 = " + defaultNic + "; nic 2 = " + vmNic);
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
+ int deviceId = 0;
+
+ boolean[] deviceIds = new boolean[networks.size()];
+ Arrays.fill(deviceIds, false);
+
+ List<NicProfile> nics = new ArrayList<NicProfile>(networks.size());
+ NicProfile defaultNic = null;
+
+ for (Map.Entry<? extends Network, ? extends NicProfile> network : networks.entrySet()) {
+ Network config = network.getKey();
+ NicProfile requested = network.getValue();
+
+ Boolean isDefaultNic = false;
+ if (vm != null && (requested != null && requested.isDefaultNic())) {
+ isDefaultNic = true;
+ }
+
+ while (deviceIds[deviceId] && deviceId < deviceIds.length) {
+ deviceId++;
+ }
+
+ Pair<NicProfile, Integer> vmNicPair = allocateNic(requested, config, isDefaultNic, deviceId, vm);
+
+ NicProfile vmNic = vmNicPair.first();
+ if (vmNic == null) {
+ continue;
+ }
+
+ deviceId = vmNicPair.second();
+
+ int devId = vmNic.getDeviceId();
+ if (devId > deviceIds.length) {
+ throw new IllegalArgumentException("Device id for nic is too large: " + vmNic);
+ }
+ if (deviceIds[devId]) {
+ throw new IllegalArgumentException("Conflicting device id for two different nics: " + vmNic);
+ }
+
+ deviceIds[devId] = true;
+
+ if (vmNic.isDefaultNic()) {
+ if (defaultNic != null) {
+ throw new IllegalArgumentException("You cannot specify two nics as default nics: nic 1 = " + defaultNic + "; nic 2 = " + vmNic);
+ }
+ defaultNic = vmNic;
+ }
+
+ nics.add(vmNic);
+ vm.addNic(vmNic);
+
}
- defaultNic = vmNic;
+
+ if (nics.size() != networks.size()) {
+ s_logger.warn("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
+ throw new CloudRuntimeException("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
+ }
+
+ if (nics.size() == 1) {
+ nics.get(0).setDefaultNic(true);
+ }
+
+ return null;
}
-
- nics.add(vmNic);
- vm.addNic(vmNic);
-
- }
-
- if (nics.size() != networks.size()) {
- s_logger.warn("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
- throw new CloudRuntimeException("Number of nics " + nics.size() + " doesn't match number of requested networks " + networks.size());
- }
-
- if (nics.size() == 1) {
- nics.get(0).setDefaultNic(true);
- }
-
- txn.commit();
+ }, InsufficientCapacityException.class);
}
@DB
@@ -900,7 +906,6 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
@DB
public Pair<NetworkGuru, NetworkVO> implementNetwork(long networkId, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException,
ResourceUnavailableException, InsufficientCapacityException {
- Transaction.currentTxn();
Pair<NetworkGuru, NetworkVO> implemented = new Pair<NetworkGuru, NetworkVO>(null, null);
NetworkVO network = _networksDao.findById(networkId);
@@ -1176,22 +1181,23 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
}
@DB
- protected void updateNic(NicVO nic, long networkId, int count) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _nicDao.update(nic.getId(), nic);
-
- if (nic.getVmType() == VirtualMachine.Type.User) {
- s_logger.debug("Changing active number of nics for network id=" + networkId + " on " + count);
- _networksDao.changeActiveNicsBy(networkId, count);
- }
-
- if (nic.getVmType() == VirtualMachine.Type.User ||
- (nic.getVmType() == VirtualMachine.Type.DomainRouter && _networksDao.findById(networkId).getTrafficType() == TrafficType.Guest)) {
- _networksDao.setCheckForGc(networkId);
- }
-
- txn.commit();
+ protected void updateNic(final NicVO nic, final long networkId, final int count) {
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _nicDao.update(nic.getId(), nic);
+
+ if (nic.getVmType() == VirtualMachine.Type.User) {
+ s_logger.debug("Changing active number of nics for network id=" + networkId + " on " + count);
+ _networksDao.changeActiveNicsBy(networkId, count);
+ }
+
+ if (nic.getVmType() == VirtualMachine.Type.User ||
+ (nic.getVmType() == VirtualMachine.Type.DomainRouter && _networksDao.findById(networkId).getTrafficType() == TrafficType.Guest)) {
+ _networksDao.setCheckForGc(networkId);
+ }
+ }
+ });
}
@Override
@@ -1414,59 +1420,63 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
}
@DB
- protected void releaseNic(VirtualMachineProfile vmProfile, long nicId) throws ConcurrentOperationException, ResourceUnavailableException {
- //lock the nic
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- NicVO nic = _nicDao.lockRow(nicId, true);
- if (nic == null) {
- throw new ConcurrentOperationException("Unable to acquire lock on nic " + nic);
- }
+ protected void releaseNic(final VirtualMachineProfile vmProfile, final long nicId) throws ConcurrentOperationException, ResourceUnavailableException {
+ Pair<Network,NicProfile> networkToRelease = Transaction.execute(new TransactionCallback<Pair<Network,NicProfile>>() {
+ @Override
+ public Pair<Network,NicProfile> doInTransaction(TransactionStatus status) {
+ NicVO nic = _nicDao.lockRow(nicId, true);
+ if (nic == null) {
+ throw new ConcurrentOperationException("Unable to acquire lock on nic " + nic);
+ }
- Nic.State originalState = nic.getState();
- NetworkVO network = _networksDao.findById(nic.getNetworkId());
+ Nic.State originalState = nic.getState();
+ NetworkVO network = _networksDao.findById(nic.getNetworkId());
- if (originalState == Nic.State.Reserved || originalState == Nic.State.Reserving) {
- if (nic.getReservationStrategy() == Nic.ReservationStrategy.Start) {
- NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
- nic.setState(Nic.State.Releasing);
- _nicDao.update(nic.getId(), nic);
- NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), null, _networkModel.isSecurityGroupSupportedInNetwork(network),
- _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network));
- if (guru.release(profile, vmProfile, nic.getReservationId())) {
- applyProfileToNicForRelease(nic, profile);
- nic.setState(Nic.State.Allocated);
- if (originalState == Nic.State.Reserved) {
- updateNic(nic, network.getId(), -1);
- } else {
+ if (originalState == Nic.State.Reserved || originalState == Nic.State.Reserving) {
+ if (nic.getReservationStrategy() == Nic.ReservationStrategy.Start) {
+ NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
+ nic.setState(Nic.State.Releasing);
_nicDao.update(nic.getId(), nic);
+ NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), null, _networkModel.isSecurityGroupSupportedInNetwork(network),
+ _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network));
+ if (guru.release(profile, vmProfile, nic.getReservationId())) {
+ applyProfileToNicForRelease(nic, profile);
+ nic.setState(Nic.State.Allocated);
+ if (originalState == Nic.State.Reserved) {
+ updateNic(nic, network.getId(), -1);
+ } else {
+ _nicDao.update(nic.getId(), nic);
+ }
+ }
+ // Perform release on network elements
+ return new Pair<Network,NicProfile>(network, profile);
+ } else {
+ nic.setState(Nic.State.Allocated);
+ updateNic(nic, network.getId(), -1);
}
}
- //commit the transaction before proceeding releasing nic profile on the network elements
- txn.commit();
- // Perform release on network elements
- List<Provider> providersToImplement = getNetworkProviders(network.getId());
- for (NetworkElement element : _networkElements) {
- if (providersToImplement.contains(element.getProvider())) {
- if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) {
- throw new CloudRuntimeException("Service provider " + element.getProvider().getName() +
- " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId());
- }
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Asking " + element.getName() + " to release " + nic);
- }
- //NOTE: Context appear to never be used in release method
- //implementations. Consider removing it from interface Element
- element.release(network, profile, vmProfile, null);
+ return null;
+ }
+ });
+
+ if (networkToRelease != null) {
+ Network network = networkToRelease.first();
+ NicProfile profile = networkToRelease.second();
+ List<Provider> providersToImplement = getNetworkProviders(network.getId());
+ for (NetworkElement element : _networkElements) {
+ if (providersToImplement.contains(element.getProvider())) {
+ if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) {
+ throw new CloudRuntimeException("Service provider " + element.getProvider().getName() +
+ " either doesn't exist or is not enabled in physical network id: " + network.getPhysicalNetworkId());
}
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Asking " + element.getName() + " to release " + profile);
+ }
+ //NOTE: Context appear to never be used in release method
+ //implementations. Consider removing it from interface Element
+ element.release(network, profile, vmProfile, null);
}
-
- } else {
- nic.setState(Nic.State.Allocated);
- updateNic(nic, network.getId(), -1);
- txn.commit();
}
}
}
@@ -1563,15 +1573,17 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
Network network = _networksDao.findById(nic.getNetworkId());
DhcpServiceProvider dhcpServiceProvider = getDhcpServiceProvider(network);
try {
- NicIpAliasVO ipAlias = _nicIpAliasDao.findByGatewayAndNetworkIdAndState(nic.getGateway(), network.getId(), NicIpAlias.state.active);
+ final NicIpAliasVO ipAlias = _nicIpAliasDao.findByGatewayAndNetworkIdAndState(nic.getGateway(), network.getId(), NicIpAlias.state.active);
if (ipAlias != null) {
ipAlias.setState(NicIpAlias.state.revoked);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _nicIpAliasDao.update(ipAlias.getId(), ipAlias);
- IPAddressVO aliasIpaddressVo = _publicIpAddressDao.findByIpAndSourceNetworkId(ipAlias.getNetworkId(), ipAlias.getIp4Address());
- _publicIpAddressDao.unassignIpAddress(aliasIpaddressVo.getId());
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _nicIpAliasDao.update(ipAlias.getId(), ipAlias);
+ IPAddressVO aliasIpaddressVo = _publicIpAddressDao.findByIpAndSourceNetworkId(ipAlias.getNetworkId(), ipAlias.getIp4Address());
+ _publicIpAddressDao.unassignIpAddress(aliasIpaddressVo.getId());
+ }
+ });
if (!dhcpServiceProvider.removeDhcpSupportForSubnet(network)) {
s_logger.warn("Failed to remove the ip alias on the router, marking it as removed in db and freed the allocated ip " + ipAlias.getIp4Address());
}
@@ -1593,18 +1605,18 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
@Override
@DB
- public Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr, String vlanId, String networkDomain, Account owner,
- Long domainId, PhysicalNetwork pNtwk, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String ip6Gateway, String ip6Cidr,
- Boolean isDisplayNetworkEnabled, String isolatedPvlan) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
+ public Network createGuestNetwork(long networkOfferingId, final String name, final String displayText, final String gateway, final String cidr, String vlanId, String networkDomain, final Account owner,
+ final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr,
+ final Boolean isDisplayNetworkEnabled, final String isolatedPvlan) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException {
- NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId);
+ final NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId);
// this method supports only guest network creation
if (ntwkOff.getTrafficType() != TrafficType.Guest) {
s_logger.warn("Only guest networks can be created using this method");
return null;
}
- boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, aclType);
+ final boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, aclType);
//check resource limits
if (updateResourceCount) {
_resourceLimitMgr.checkResourceLimit(owner, ResourceType.network);
@@ -1632,7 +1644,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
ipv6 = true;
}
// Validate zone
- DataCenterVO zone = _dcDao.findById(zoneId);
+ final DataCenterVO zone = _dcDao.findById(zoneId);
if (zone.getNetworkType() == NetworkType.Basic) {
if (ipv6) {
throw new InvalidParameterValueException("IPv6 is not supported in Basic zone");
@@ -1819,79 +1831,84 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
}
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- Long physicalNetworkId = null;
- if (pNtwk != null) {
- physicalNetworkId = pNtwk.getId();
- }
- DataCenterDeployment plan = new DataCenterDeployment(zoneId, null, null, null, null, physicalNetworkId);
- NetworkVO userNetwork = new NetworkVO();
- userNetwork.setNetworkDomain(networkDomain);
-
- if (cidr != null && gateway != null) {
- userNetwork.setCidr(cidr);
- userNetwork.setGateway(gateway);
- }
-
- if (ip6Cidr != null && ip6Gateway != null) {
- userNetwork.setIp6Cidr(ip6Cidr);
- userNetwork.setIp6Gateway(ip6Gateway);
- }
-
- if (vlanId != null) {
- if (isolatedPvlan == null) {
- URI uri = BroadcastDomainType.fromString(vlanId);
- userNetwork.setBroadcastUri(uri);
- if (!vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) {
- userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
- } else {
- userNetwork.setBroadcastDomainType(BroadcastDomainType.Native);
- }
- } else {
- if (vlanId.equalsIgnoreCase(Vlan.UNTAGGED)) {
- throw new InvalidParameterValueException("Cannot support pvlan with untagged primary vlan!");
- }
- userNetwork.setBroadcastUri(NetUtils.generateUriForPvlan(vlanId, isolatedPvlan));
- userNetwork.setBroadcastDomainType(BroadcastDomainType.Pvlan);
- }
- }
+ final String networkDomainFinal = networkDomain;
+ final String vlanIdFinal = vlanId;
+ final Boolean subdomainAccessFinal = subdomainAccess;
+ Network network = Transaction.execute(new TransactionCallback<Network>() {
+ @Override
+ public Network doInTransaction(TransactionStatus status) {
+ Long physicalNetworkId = null;
+ if (pNtwk != null) {
+ physicalNetworkId = pNtwk.getId();
+ }
+ DataCenterDeployment plan = new DataCenterDeployment(zoneId, null, null, null, null, physicalNetworkId);
+ NetworkVO userNetwork = new NetworkVO();
+ userNetwork.setNetworkDomain(networkDomainFinal);
- List<? extends Network> networks = setupNetwork(owner, ntwkOff, userNetwork, plan, name, displayText, true, domainId, aclType, subdomainAccess, vpcId,
- isDisplayNetworkEnabled);
-
- Network network = null;
- if (networks == null || networks.isEmpty()) {
- throw new CloudRuntimeException("Fail to create a network");
- } else {
- if (networks.size() > 0 && networks.get(0).getGuestType() == Network.GuestType.Isolated && networks.get(0).getTrafficType() == TrafficType.Guest) {
- Network defaultGuestNetwork = networks.get(0);
- for (Network nw : networks) {
- if (nw.getCidr() != null && nw.getCidr().equals(zone.getGuestNetworkCidr())) {
- defaultGuestNetwork = nw;
+ if (cidr != null && gateway != null) {
+ userNetwork.setCidr(cidr);
+ userNetwork.setGateway(gateway);
+ }
+
+ if (ip6Cidr != null && ip6Gateway != null) {
+ userNetwork.setIp6Cidr(ip6Cidr);
+ userNetwork.setIp6Gateway(ip6Gateway);
+ }
+
+ if (vlanIdFinal != null) {
+ if (isolatedPvlan == null) {
+ URI uri = BroadcastDomainType.fromString(vlanIdFinal);
+ userNetwork.setBroadcastUri(uri);
+ if (!vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
+ userNetwork.setBroadcastDomainType(BroadcastDomainType.Vlan);
+ } else {
+ userNetwork.setBroadcastDomainType(BroadcastDomainType.Native);
+ }
+ } else {
+ if (vlanIdFinal.equalsIgnoreCase(Vlan.UNTAGGED)) {
+ throw new InvalidParameterValueException("Cannot support pvlan with untagged primary vlan!");
+ }
+ userNetwork.setBroadcastUri(NetUtils.generateUriForPvlan(vlanIdFinal, isolatedPvlan));
+ userNetwork.setBroadcastDomainType(BroadcastDomainType.Pvlan);
+ }
+ }
+
+ List<? extends Network> networks = setupNetwork(owner, ntwkOff, userNetwork, plan, name, displayText, true, domainId, aclType, subdomainAccessFinal, vpcId,
+ isDisplayNetworkEnabled);
+
+ Network network = null;
+ if (networks == null || networks.isEmpty()) {
+ throw new CloudRuntimeException("Fail to create a network");
+ } else {
+ if (networks.size() > 0 && networks.get(0).getGuestType() == Network.GuestType.Isolated && networks.get(0).getTrafficType() == TrafficType.Guest) {
+ Network defaultGuestNetwork = networks.get(0);
+ for (Network nw : networks) {
+ if (nw.getCidr() != null && nw.getCidr().equals(zone.getGuestNetworkCidr())) {
+ defaultGuestNetwork = nw;
+ }
+ }
+ network = defaultGuestNetwork;
+ } else {
+ // For shared network
+ network = networks.get(0);
}
}
- network = defaultGuestNetwork;
- } else {
- // For shared network
- network = networks.get(0);
+
+ if (updateResourceCount) {
+ _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.network);
+ }
+
+ return network;
}
- }
-
- if (updateResourceCount) {
- _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.network);
- }
+ });
- txn.commit();
CallContext.current().setEventDetails("Network Id: " + network.getId());
return network;
}
@Override
@DB
- public boolean shutdownNetwork(long networkId, ReservationContext context, boolean cleanupElements) {
- boolean result = false;
+ public boolean shutdownNetwork(final long networkId, ReservationContext context, boolean cleanupElements) {
NetworkVO network = _networksDao.findById(networkId);
if (network.getState() == Network.State.Allocated) {
s_logger.debug("Network is already shutdown: " + network);
@@ -1936,43 +1953,51 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
}
}
- boolean success = shutdownNetworkElementsAndResources(context, cleanupElements, network);
+ final boolean success = shutdownNetworkElementsAndResources(context, cleanupElements, network);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- if (success) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Network id=" + networkId + " is shutdown successfully, cleaning up corresponding resources now.");
- }
- NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
- NetworkProfile profile = convertNetworkToNetworkProfile(network.getId());
- guru.shutdown(profile, _networkOfferingDao.findById(network.getNetworkOfferingId()));
+ final NetworkVO networkFinal = network;
+ boolean result = Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ boolean result = false;
- applyProfileToNetwork(network, profile);
- DataCenterVO zone = _dcDao.findById(network.getDataCenterId());
- if (isSharedNetworkOfferingWithServices(network.getNetworkOfferingId()) && (zone.getNetworkType() == NetworkType.Advanced)) {
- network.setState(Network.State.Setup);
- } else {
- try {
- stateTransitTo(network, Event.OperationSucceeded);
- } catch (NoTransitionException e) {
- network.setState(Network.State.Allocated);
- network.setRestartRequired(false);
+ if (success) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Network id=" + networkId + " is shutdown successfully, cleaning up corresponding resources now.");
+ }
+ NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, networkFinal.getGuruName());
+ NetworkProfile profile = convertNetworkToNetworkProfile(networkFinal.getId());
+ guru.shutdown(profile, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId()));
+
+ applyProfileToNetwork(networkFinal, profile);
+ DataCenterVO zone = _dcDao.findById(networkFinal.getDataCenterId());
+ if (isSharedNetworkOfferingWithServices(networkFinal.getNetworkOfferingId()) && (zone.getNetworkType() == NetworkType.Advanced)) {
+ networkFinal.setState(Network.State.Setup);
+ } else {
+ try {
+ stateTransitTo(networkFinal, Event.OperationSucceeded);
+ } catch (NoTransitionException e) {
+ networkFinal.setState(Network.State.Allocated);
+ networkFinal.setRestartRequired(false);
+ }
+ }
+ _networksDao.update(networkFinal.getId(), networkFinal);
+ _networksDao.clearCheckForGc(networkId);
+ result = true;
+ } else {
+ try {
+ stateTransitTo(networkFinal, Event.OperationFailed);
+ } catch (NoTransitionException e) {
+ networkFinal.setState(Network.State.Implemented);
+ _networksDao.update(networkFinal.getId(), networkFinal);
+ }
+ result = false;
}
+
+ return result;
}
- _networksDao.update(network.getId(), network);
- _networksDao.clearCheckForGc(networkId);
- result = true;
- } else {
- try {
- stateTransitTo(network, Event.OperationFailed);
- } catch (NoTransitionException e) {
- network.setState(Network.State.Implemented);
- _networksDao.update(network.getId(), network);
- }
- result = false;
- }
- txn.commit();
+ });
+
return result;
} finally {
if (network != null) {
@@ -2036,8 +2061,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
@Override
@DB
- public boolean destroyNetwork(long networkId, ReservationContext context) {
- Account callerAccount = context.getAccount();
+ public boolean destroyNetwork(long networkId, final ReservationContext context) {
+ final Account callerAccount = context.getAccount();
NetworkVO network = _networksDao.findById(networkId);
if (network == null) {
@@ -2126,38 +2151,48 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
if (s_logger.isDebugEnabled()) {
s_logger.debug("Network id=" + networkId + " is destroyed successfully, cleaning up corresponding resources now.");
}
- NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, network.getGuruName());
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
- guru.trash(network, _networkOfferingDao.findById(network.getNetworkOfferingId()));
- if (!deleteVlansInNetwork(network.getId(), context.getCaller().getId(), callerAccount)) {
- success = false;
- s_logger.warn("Failed to delete network " + network + "; was unable to cleanup corresponding ip ranges");
- } else {
- // commit transaction only when ips and vlans for the network are released successfully
- try {
- stateTransitTo(network, Event.DestroyNetwork);
- } catch (NoTransitionException e) {
- s_logger.debug(e.getMessage());
- }
- if (_networksDao.remove(network.getId())) {
- NetworkDomainVO networkDomain = _networkDomainDao.getDomainNetworkMapByNetworkId(network.getId());
- if (networkDomain != null)
- _networkDomainDao.remove(networkDomain.getId());
-
- NetworkAccountVO networkAccount = _networkAccountDao.getAccountNetworkMapByNetworkId(network.getId());
- if (networkAccount != null)
- _networkAccountDao.remove(networkAccount.getId());
- }
-
- NetworkOffering ntwkOff = _entityMgr.findById(NetworkOffering.class, network.getNetworkOfferingId());
- boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, network.getAclType());
- if (updateResourceCount) {
- _resourceLimitMgr.decrementResourceCount(network.getAccountId(), ResourceType.network);
- }
- txn.commit();
+ final NetworkVO networkFinal = network;
+ try {
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ NetworkGuru guru = AdapterBase.getAdapterByName(_networkGurus, networkFinal.getGuruName());
+
+ guru.trash(networkFinal, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId()));
+
+ if (!deleteVlansInNetwork(networkFinal.getId(), context.getCaller().getId(), callerAccount)) {
+ 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");
+ } else {
+ // commit transaction only when ips and vlans for the network are released successfully
+ try {
+ stateTransitTo(networkFinal, Event.DestroyNetwork);
+ } catch (NoTransitionException e) {
+ s_logger.debug(e.getMessage());
+ }
+ if (_networksDao.remove(networkFinal.getId())) {
+ NetworkDomainVO networkDomain = _networkDomainDao.getDomainNetworkMapByNetworkId(networkFinal.getId());
+ if (networkDomain != null)
+ _networkDomainDao.remove(networkDomain.getId());
+
+ NetworkAccountVO networkAccount = _networkAccountDao.getAccountNetworkMapByNetworkId(networkFinal.getId());
+ if (networkAccount != null)
+ _networkAccountDao.remove(networkAccount.getId());
+ }
+
+ NetworkOffering ntwkOff = _entityMgr.findById(NetworkOffering.class, networkFinal.getNetworkOfferingId());
+ boolean updateResourceCount = resourceCountNeedsUpdate(ntwkOff, networkFinal.getAclType());
+ if (updateResourceCount) {
+ _resourceLimitMgr.decrementResourceCount(networkFinal.getAccountId(), ResourceType.network);
+ }
+ }
+ }
+ });
+ return false;
+ } catch ( CloudRuntimeException e ) {
+ s_logger.error("Failed to delete network", e);
+ return false;
}
}
@@ -2426,24 +2461,24 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
@DB
@Override
- public boolean reallocate(VirtualMachineProfile vm, DataCenterDeployment dest) throws InsufficientCapacityException, ConcurrentOperationException {
+ public boolean reallocate(final VirtualMachineProfile vm, DataCenterDeployment dest) throws InsufficientCapacityException, ConcurrentOperationException {
VMInstanceVO vmInstance = _vmDao.findById(vm.getId());
DataCenterVO dc = _dcDao.findById(vmInstance.getDataCenterId());
if (dc.getNetworkType() == NetworkType.Basic) {
List<NicVO> nics = _nicDao.listByVmId(vmInstance.getId());
NetworkVO network = _networksDao.findById(nics.get(0).getNetworkId());
- LinkedHashMap<Network, NicProfile> profiles = new LinkedHashMap<Network, NicProfile>();
+ final LinkedHashMap<Network, NicProfile> profiles = new LinkedHashMap<Network, NicProfile>();
profiles.put(network, null);
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws Exception {
+ cleanupNics(vm);
+ allocate(vm, profiles);
- try {
- cleanupNics(vm);
- allocate(vm, profiles);
- } finally {
- txn.commit();
- }
+ return null;
+ }
+ }, InsufficientCapacityException.class);
}
return true;
}
@@ -3050,17 +3085,20 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
return nic.getSecondaryIp();
}
- private boolean removeVmSecondaryIpsOfNic(long nicId) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- List<NicSecondaryIpVO> ipList = _nicSecondaryIpDao.listByNicId(nicId);
- if (ipList != null) {
- for (NicSecondaryIpVO ip : ipList) {
- _nicSecondaryIpDao.remove(ip.getId());
+ private boolean removeVmSecondaryIpsOfNic(final long nicId) {
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ List<NicSecondaryIpVO> ipList = _nicSecondaryIpDao.listByNicId(nicId);
+ if (ipList != null) {
+ for (NicSecondaryIpVO ip : ipList) {
+ _nicSecondaryIpDao.remove(ip.getId());
+ }
+ s_logger.debug("Revoving nic secondary ip entry ...");
+ }
}
- s_logger.debug("Revoving nic secondary ip entry ...");
- }
- txn.commit();
+ });
+
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
index 0817393..7d81232 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java
@@ -31,7 +31,6 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStore;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
@@ -97,6 +96,9 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.fsm.NoTransitionException;
import com.cloud.utils.fsm.StateMachine2;
@@ -681,9 +683,7 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
}
@DB
- protected VolumeVO switchVolume(VolumeVO existingVolume, VirtualMachineProfile vm) throws StorageUnavailableException {
- Transaction txn = Transaction.currentTxn();
-
+ protected VolumeVO switchVolume(final VolumeVO existingVolume, final VirtualMachineProfile vm) throws StorageUnavailableException {
Long templateIdToUse = null;
Long volTemplateId = existingVolume.getTemplateId();
long vmTemplateId = vm.getTemplateId();
@@ -695,22 +695,26 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
templateIdToUse = vmTemplateId;
}
- txn.start();
- VolumeVO newVolume = allocateDuplicateVolumeVO(existingVolume, templateIdToUse);
- // In case of Vmware if vm reference is not removed then during root
- // disk cleanup
- // the vm also gets deleted, so remove the reference
- if (vm.getHypervisorType() == HypervisorType.VMware) {
- _volsDao.detachVolume(existingVolume.getId());
- }
- try {
- stateTransitTo(existingVolume, Volume.Event.DestroyRequested);
- } catch (NoTransitionException e) {
- s_logger.debug("Unable to destroy existing volume: " + e.toString());
- }
- txn.commit();
- return newVolume;
-
+ final Long templateIdToUseFinal = templateIdToUse;
+ return Transaction.execute(new TransactionCallback<VolumeVO>() {
+ @Override
+ public VolumeVO doInTransaction(TransactionStatus status) {
+ VolumeVO newVolume = allocateDuplicateVolumeVO(existingVolume, templateIdToUseFinal);
+ // In case of Vmware if vm reference is not removed then during root
+ // disk cleanup
+ // the vm also gets deleted, so remove the reference
+ if (vm.getHypervisorType() == HypervisorType.VMware) {
+ _volsDao.detachVolume(existingVolume.getId());
+ }
+ try {
+ stateTransitTo(existingVolume, Volume.Event.DestroyRequested);
+ } catch (NoTransitionException e) {
+ s_logger.debug("Unable to destroy existing volume: " + e.toString());
+ }
+
+ return newVolume;
+ }
+ });
}
@Override
@@ -724,28 +728,32 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati
if (s_logger.isDebugEnabled()) {
s_logger.debug("Cleaning storage for vm: " + vmId);
}
- List<VolumeVO> volumesForVm = _volsDao.findByInstance(vmId);
- List<VolumeVO> toBeExpunged = new ArrayList<VolumeVO>();
- Transaction txn = Transaction.currentTxn();
- txn.start();
- for (VolumeVO vol : volumesForVm) {
- if (vol.getVolumeType().equals(Type.ROOT)) {
- // Destroy volume if not already destroyed
- boolean volumeAlreadyDestroyed = (vol.getState() == Volume.State.Destroy || vol.getState() == Volume.State.Expunged || vol.getState() == Volume.State.Expunging);
- if (!volumeAlreadyDestroyed) {
- volService.destroyVolume(vol.getId());
- } else {
- s_logger.debug("Skipping destroy for the volume " + vol + " as its in state " + vol.getState().toString());
- }
- toBeExpunged.add(vol);
- } else {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Detaching " + vol);
+ final List<VolumeVO> volumesForVm = _volsDao.findByInstance(vmId);
+ final List<VolumeVO> toBeExpunged = new ArrayList<VolumeVO>();
+
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (VolumeVO vol : volumesForVm) {
+ if (vol.getVolumeType().equals(Type.ROOT)) {
+ // Destroy volume if not already destroyed
+ boolean volumeAlreadyDestroyed = (vol.getState() == Volume.State.Destroy || vol.getState() == Volume.State.Expunged || vol.getState() == Volume.State.Expunging);
+ if (!volumeAlreadyDestroyed) {
+ volService.destroyVolume(vol.getId());
+ } else {
+ s_logger.debug("Skipping destroy for the volume " + vol + " as its in state " + vol.getState().toString());
+ }
+ toBeExpunged.add(vol);
+ } else {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Detaching " + vol);
+ }
+ _volsDao.detachVolume(vol.getId());
+ }
}
- _volsDao.detachVolume(vol.getId());
}
- }
- txn.commit();
+ });
+
AsyncCallFuture<VolumeApiResult> future = null;
for (VolumeVO expunge : toBeExpunged) {
future = volService.expungeVolumeAsync(volFactory.getVolume(expunge.getId()));
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java b/engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java
index 7c0a562..57102cb 100755
--- a/engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java
+++ b/engine/schema/src/com/cloud/alert/dao/AlertDaoImpl.java
@@ -29,7 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = { AlertDao.class })
@@ -116,7 +116,7 @@ public class AlertDaoImpl extends GenericDaoBase<AlertVO, Long> implements Alert
return result;
}
if (alerts != null && !alerts.isEmpty()) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
for (AlertVO alert : alerts) {
alert = lockRow(alert.getId(), true);
[07/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/rules/RulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/rules/RulesManagerImpl.java b/server/src/com/cloud/network/rules/RulesManagerImpl.java
index 6e326b0..83f0493 100755
--- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@ -26,7 +26,6 @@ import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.api.command.user.firewall.ListPortForwardingRulesCmd;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -76,8 +75,11 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.Ip;
import com.cloud.utils.net.NetUtils;
@@ -197,12 +199,12 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_NET_RULE_ADD, eventDescription = "creating forwarding rule", create = true)
- public PortForwardingRule createPortForwardingRule(PortForwardingRule rule, Long vmId, Ip vmIp, boolean openFirewall)
+ public PortForwardingRule createPortForwardingRule(final PortForwardingRule rule, final Long vmId, Ip vmIp, final boolean openFirewall)
throws NetworkRuleConflictException {
CallContext ctx = CallContext.current();
- Account caller = ctx.getCallingAccount();
+ final Account caller = ctx.getCallingAccount();
- Long ipAddrId = rule.getSourceIpAddressId();
+ final Long ipAddrId = rule.getSourceIpAddressId();
IPAddressVO ipAddress = _ipAddressDao.findById(ipAddrId);
@@ -213,7 +215,7 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
throw new InvalidParameterValueException("Unable to create port forwarding rule; ip id=" + ipAddrId + " has static nat enabled");
}
- Long networkId = rule.getNetworkId();
+ final Long networkId = rule.getNetworkId();
Network network = _networkModel.getNetwork(networkId);
//associate ip address to network (if needed)
boolean performedIpAssoc = false;
@@ -245,8 +247,8 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
_firewallMgr.validateFirewallRule(caller, ipAddress, rule.getSourcePortStart(), rule.getSourcePortEnd(),
rule.getProtocol(), Purpose.PortForwarding, FirewallRuleType.User, networkId, rule.getTrafficType());
- Long accountId = ipAddress.getAllocatedToAccountId();
- Long domainId = ipAddress.getAllocatedInDomainId();
+ final Long accountId = ipAddress.getAllocatedToAccountId();
+ final Long domainId = ipAddress.getAllocatedInDomainId();
// start port can't be bigger than end port
if (rule.getDestinationPortStart() > rule.getDestinationPortEnd()) {
@@ -308,46 +310,48 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
}
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- PortForwardingRuleVO newRule = new PortForwardingRuleVO(rule.getXid(), rule.getSourceIpAddressId(),
- rule.getSourcePortStart(), rule.getSourcePortEnd(), dstIp, rule.getDestinationPortStart(),
- rule.getDestinationPortEnd(), rule.getProtocol().toLowerCase(), networkId, accountId, domainId, vmId);
- newRule = _portForwardingDao.persist(newRule);
-
- // create firewallRule for 0.0.0.0/0 cidr
- if (openFirewall) {
- _firewallMgr.createRuleForAllCidrs(ipAddrId, caller, rule.getSourcePortStart(), rule.getSourcePortEnd(),
- rule.getProtocol(), null, null, newRule.getId(), networkId);
- }
-
- try {
- _firewallMgr.detectRulesConflict(newRule);
- if (!_firewallDao.setStateToAdd(newRule)) {
- throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
- }
- CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(),
- ipAddress.getDataCenterId(), newRule.getId(), null, PortForwardingRule.class.getName(),
- newRule.getUuid());
- txn.commit();
- return newRule;
- } catch (Exception e) {
- if (newRule != null) {
- txn.start();
- // no need to apply the rule as it wasn't programmed on the backend yet
- _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
- removePFRule(newRule);
- txn.commit();
- }
-
- if (e instanceof NetworkRuleConflictException) {
- throw (NetworkRuleConflictException) e;
+ final Ip dstIpFinal = dstIp;
+ final IPAddressVO ipAddressFinal = ipAddress;
+ return Transaction.executeWithException(new TransactionCallbackWithException<PortForwardingRuleVO>() {
+ @Override
+ public PortForwardingRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+ PortForwardingRuleVO newRule = new PortForwardingRuleVO(rule.getXid(), rule.getSourceIpAddressId(),
+ rule.getSourcePortStart(), rule.getSourcePortEnd(), dstIpFinal, rule.getDestinationPortStart(),
+ rule.getDestinationPortEnd(), rule.getProtocol().toLowerCase(), networkId, accountId, domainId, vmId);
+ newRule = _portForwardingDao.persist(newRule);
+
+ // create firewallRule for 0.0.0.0/0 cidr
+ if (openFirewall) {
+ _firewallMgr.createRuleForAllCidrs(ipAddrId, caller, rule.getSourcePortStart(), rule.getSourcePortEnd(),
+ rule.getProtocol(), null, null, newRule.getId(), networkId);
+ }
+
+ try {
+ _firewallMgr.detectRulesConflict(newRule);
+ if (!_firewallDao.setStateToAdd(newRule)) {
+ throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+ }
+ CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(),
+ ipAddressFinal.getDataCenterId(), newRule.getId(), null, PortForwardingRule.class.getName(),
+ newRule.getUuid());
+ return newRule;
+ } catch (Exception e) {
+ if (newRule != null) {
+ // no need to apply the rule as it wasn't programmed on the backend yet
+ _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
+ removePFRule(newRule);
+ }
+
+ if (e instanceof NetworkRuleConflictException) {
+ throw (NetworkRuleConflictException) e;
+ }
+
+ throw new CloudRuntimeException("Unable to add rule for the ip id=" + ipAddrId, e);
+ }
}
+ }, NetworkRuleConflictException.class);
- throw new CloudRuntimeException("Unable to add rule for the ip id=" + ipAddrId, e);
- }
} finally {
// release ip address if ipassoc was perfored
if (performedIpAssoc) {
@@ -361,10 +365,10 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_NET_RULE_ADD, eventDescription = "creating static nat rule", create = true)
- public StaticNatRule createStaticNatRule(StaticNatRule rule, boolean openFirewall) throws NetworkRuleConflictException {
- Account caller = CallContext.current().getCallingAccount();
+ public StaticNatRule createStaticNatRule(final StaticNatRule rule, final boolean openFirewall) throws NetworkRuleConflictException {
+ final Account caller = CallContext.current().getCallingAccount();
- Long ipAddrId = rule.getSourceIpAddressId();
+ final Long ipAddrId = rule.getSourceIpAddressId();
IPAddressVO ipAddress = _ipAddressDao.findById(ipAddrId);
@@ -377,9 +381,9 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
_firewallMgr.validateFirewallRule(caller, ipAddress, rule.getSourcePortStart(), rule.getSourcePortEnd(), rule.getProtocol(), Purpose.StaticNat, FirewallRuleType.User,null, rule.getTrafficType() );
- Long networkId = ipAddress.getAssociatedWithNetworkId();
- Long accountId = ipAddress.getAllocatedToAccountId();
- Long domainId = ipAddress.getAllocatedInDomainId();
+ final Long networkId = ipAddress.getAssociatedWithNetworkId();
+ final Long accountId = ipAddress.getAllocatedToAccountId();
+ final Long domainId = ipAddress.getAllocatedInDomainId();
_networkModel.checkIpForService(ipAddress, Service.StaticNat, null);
@@ -390,48 +394,48 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
}
//String dstIp = _networkModel.getIpInNetwork(ipAddress.getAssociatedWithVmId(), networkId);
- String dstIp = ipAddress.getVmIp();
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ final String dstIp = ipAddress.getVmIp();
+ return Transaction.executeWithException(new TransactionCallbackWithException<StaticNatRule>() {
+ @Override
+ public StaticNatRule doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
- FirewallRuleVO newRule = new FirewallRuleVO(rule.getXid(), rule.getSourceIpAddressId(), rule.getSourcePortStart(), rule.getSourcePortEnd(), rule.getProtocol().toLowerCase(),
- networkId, accountId, domainId, rule.getPurpose(), null, null, null, null, null);
+ FirewallRuleVO newRule = new FirewallRuleVO(rule.getXid(), rule.getSourceIpAddressId(), rule.getSourcePortStart(), rule.getSourcePortEnd(), rule.getProtocol().toLowerCase(),
+ networkId, accountId, domainId, rule.getPurpose(), null, null, null, null, null);
- newRule = _firewallDao.persist(newRule);
+ newRule = _firewallDao.persist(newRule);
- // create firewallRule for 0.0.0.0/0 cidr
- if (openFirewall) {
- _firewallMgr.createRuleForAllCidrs(ipAddrId, caller, rule.getSourcePortStart(), rule.getSourcePortEnd(), rule.getProtocol(), null, null, newRule.getId(), networkId);
- }
+ // create firewallRule for 0.0.0.0/0 cidr
+ if (openFirewall) {
+ _firewallMgr.createRuleForAllCidrs(ipAddrId, caller, rule.getSourcePortStart(), rule.getSourcePortEnd(), rule.getProtocol(), null, null, newRule.getId(), networkId);
+ }
- try {
- _firewallMgr.detectRulesConflict(newRule);
- if (!_firewallDao.setStateToAdd(newRule)) {
- throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
- }
- CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(), 0, newRule.getId(),
- null, FirewallRule.class.getName(), newRule.getUuid());
-
- txn.commit();
- StaticNatRule staticNatRule = new StaticNatRuleImpl(newRule, dstIp);
-
- return staticNatRule;
- } catch (Exception e) {
-
- if (newRule != null) {
- txn.start();
- // no need to apply the rule as it wasn't programmed on the backend yet
- _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
- _firewallMgr.removeRule(newRule);
- txn.commit();
- }
+ try {
+ _firewallMgr.detectRulesConflict(newRule);
+ if (!_firewallDao.setStateToAdd(newRule)) {
+ throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+ }
+ CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_ADD, newRule.getAccountId(), 0, newRule.getId(),
+ null, FirewallRule.class.getName(), newRule.getUuid());
+
+ StaticNatRule staticNatRule = new StaticNatRuleImpl(newRule, dstIp);
+
+ return staticNatRule;
+ } catch (Exception e) {
+ if (newRule != null) {
+ // no need to apply the rule as it wasn't programmed on the backend yet
+ _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
+ _firewallMgr.removeRule(newRule);
+ }
- if (e instanceof NetworkRuleConflictException) {
- throw (NetworkRuleConflictException) e;
+ if (e instanceof NetworkRuleConflictException) {
+ throw (NetworkRuleConflictException) e;
+ }
+ throw new CloudRuntimeException("Unable to add static nat rule for the ip id=" + newRule.getSourceIpAddressId(), e);
+ }
}
- throw new CloudRuntimeException("Unable to add static nat rule for the ip id=" + newRule.getSourceIpAddressId(), e);
- }
+ }, NetworkRuleConflictException.class);
+
}
@Override
@@ -1146,23 +1150,27 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
@Override
@DB
- public FirewallRuleVO[] reservePorts(IpAddress ip, String protocol, FirewallRule.Purpose purpose,
- boolean openFirewall, Account caller, int... ports) throws NetworkRuleConflictException {
- FirewallRuleVO[] rules = new FirewallRuleVO[ports.length];
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
- for (int i = 0; i < ports.length; i++) {
-
- rules[i] = new FirewallRuleVO(null, ip.getId(), ports[i], protocol, ip.getAssociatedWithNetworkId(), ip.getAllocatedToAccountId(), ip.getAllocatedInDomainId(), purpose, null, null, null, null);
- rules[i] = _firewallDao.persist(rules[i]);
-
- if (openFirewall) {
- _firewallMgr.createRuleForAllCidrs(ip.getId(), caller, ports[i], ports[i], protocol, null, null,
- rules[i].getId(), ip.getAssociatedWithNetworkId());
+ public FirewallRuleVO[] reservePorts(final IpAddress ip, final String protocol, final FirewallRule.Purpose purpose,
+ final boolean openFirewall, final Account caller, final int... ports) throws NetworkRuleConflictException {
+ final FirewallRuleVO[] rules = new FirewallRuleVO[ports.length];
+
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+ for (int i = 0; i < ports.length; i++) {
+
+ rules[i] = new FirewallRuleVO(null, ip.getId(), ports[i], protocol, ip.getAssociatedWithNetworkId(), ip.getAllocatedToAccountId(), ip.getAllocatedInDomainId(), purpose, null, null, null, null);
+ rules[i] = _firewallDao.persist(rules[i]);
+
+ if (openFirewall) {
+ _firewallMgr.createRuleForAllCidrs(ip.getId(), caller, ports[i], ports[i], protocol, null, null,
+ rules[i].getId(), ip.getAssociatedWithNetworkId());
+ }
+ }
+
+ return null;
}
- }
- txn.commit();
+ }, NetworkRuleConflictException.class);
boolean success = false;
try {
@@ -1173,12 +1181,14 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
return rules;
} finally {
if (!success) {
- txn.start();
-
- for (FirewallRuleVO newRule : rules) {
- _firewallMgr.removeRule(newRule);
- }
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (FirewallRuleVO newRule : rules) {
+ _firewallMgr.removeRule(newRule);
+ }
+ }
+ });
}
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
index 8b2db9d..85b01b3 100755
--- a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
+++ b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
+import java.util.ConcurrentModificationException;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
@@ -34,6 +35,7 @@ import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+import javax.ejb.ConcurrentAccessException;
import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
@@ -96,6 +98,10 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.fsm.StateListener;
import com.cloud.utils.net.NetUtils;
@@ -191,12 +197,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
@Override
protected void runInContext() {
try {
- Transaction txn = Transaction.open("SG Work");
- try {
- work();
- } finally {
- txn.close("SG Work");
- }
+ work();
} catch (Throwable th) {
try {
s_logger.error("Problem with SG work", th);
@@ -204,24 +205,15 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
}
}
}
-
- WorkerThread() {
-
- }
}
public class CleanupThread extends ManagedContextRunnable {
@Override
protected void runInContext() {
try {
- Transaction txn = Transaction.open("SG Cleanup");
- try {
- cleanupFinishedWork();
- cleanupUnfinishedWork();
- //processScheduledWork();
- } finally {
- txn.close("SG Cleanup");
- }
+ cleanupFinishedWork();
+ cleanupUnfinishedWork();
+ //processScheduledWork();
} catch (Throwable th) {
try {
s_logger.error("Problem with SG Cleanup", th);
@@ -229,10 +221,6 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
}
}
}
-
- CleanupThread() {
-
- }
}
public static class PortAndProto implements Comparable<PortAndProto> {
@@ -400,7 +388,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
}
@DB
- public void scheduleRulesetUpdateToHosts(List<Long> affectedVms, boolean updateSeqno, Long delayMs) {
+ public void scheduleRulesetUpdateToHosts(final List<Long> affectedVms, final boolean updateSeqno, Long delayMs) {
if (affectedVms.size() == 0) {
return;
}
@@ -422,39 +410,43 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
if (s_logger.isTraceEnabled()) {
s_logger.trace("Security Group Mgr: acquired global work lock");
}
- Transaction txn = Transaction.currentTxn();
+
try {
- txn.start();
- for (Long vmId : affectedVms) {
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Security Group Mgr: scheduling ruleset update for " + vmId);
- }
- VmRulesetLogVO log = null;
- SecurityGroupWorkVO work = null;
-
- log = _rulesetLogDao.findByVmId(vmId);
- if (log == null) {
- log = new VmRulesetLogVO(vmId);
- log = _rulesetLogDao.persist(log);
- }
-
- if (log != null && updateSeqno) {
- log.incrLogsequence();
- _rulesetLogDao.update(log.getId(), log);
- }
- work = _workDao.findByVmIdStep(vmId, Step.Scheduled);
- if (work == null) {
- work = new SecurityGroupWorkVO(vmId, null, null, SecurityGroupWork.Step.Scheduled, null);
- work = _workDao.persist(work);
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Security Group Mgr: created new work item for " + vmId + "; id = " + work.getId());
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (Long vmId : affectedVms) {
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Security Group Mgr: scheduling ruleset update for " + vmId);
+ }
+ VmRulesetLogVO log = null;
+ SecurityGroupWorkVO work = null;
+
+ log = _rulesetLogDao.findByVmId(vmId);
+ if (log == null) {
+ log = new VmRulesetLogVO(vmId);
+ log = _rulesetLogDao.persist(log);
+ }
+
+ if (log != null && updateSeqno) {
+ log.incrLogsequence();
+ _rulesetLogDao.update(log.getId(), log);
+ }
+ work = _workDao.findByVmIdStep(vmId, Step.Scheduled);
+ if (work == null) {
+ work = new SecurityGroupWorkVO(vmId, null, null, SecurityGroupWork.Step.Scheduled, null);
+ work = _workDao.persist(work);
+ if (s_logger.isTraceEnabled()) {
+ s_logger.trace("Security Group Mgr: created new work item for " + vmId + "; id = " + work.getId());
+ }
+ }
+
+ work.setLogsequenceNumber(log.getLogsequence());
+ _workDao.update(work.getId(), work);
}
}
+ });
- work.setLogsequenceNumber(log.getLogsequence());
- _workDao.update(work.getId(), work);
- }
- txn.commit();
for (Long vmId : affectedVms) {
_executorPool.schedule(new WorkerThread(), delayMs, TimeUnit.MILLISECONDS);
}
@@ -595,7 +587,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
return authorizeSecurityGroupRule(securityGroupId,protocol,startPort,endPort,icmpType,icmpCode,cidrList,groupList,SecurityRuleType.IngressRule);
}
- private List<SecurityGroupRuleVO> authorizeSecurityGroupRule(Long securityGroupId,String protocol,Integer startPort,Integer endPort,Integer icmpType,Integer icmpCode,List<String> cidrList,Map groupList,SecurityRuleType ruleType) {
+ private List<SecurityGroupRuleVO> authorizeSecurityGroupRule(final Long securityGroupId, String protocol,Integer startPort,Integer endPort,Integer icmpType,Integer icmpCode,final List<String> cidrList,Map groupList, final SecurityRuleType ruleType) {
Integer startPortOrType = null;
Integer endPortOrCode = null;
@@ -713,66 +705,71 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
}
}
- final Transaction txn = Transaction.currentTxn();
final Set<SecurityGroupVO> authorizedGroups2 = new TreeSet<SecurityGroupVO>(new SecurityGroupVOComparator());
authorizedGroups2.addAll(authorizedGroups); // Ensure we don't re-lock the same row
- txn.start();
- // Prevents other threads/management servers from creating duplicate security rules
- securityGroup = _securityGroupDao.acquireInLockTable(securityGroupId);
- if (securityGroup == null) {
- s_logger.warn("Could not acquire lock on network security group: id= " + securityGroupId);
- return null;
- }
- List<SecurityGroupRuleVO> newRules = new ArrayList<SecurityGroupRuleVO>();
- try {
- for (final SecurityGroupVO ngVO : authorizedGroups2) {
- final Long ngId = ngVO.getId();
- // Don't delete the referenced group from under us
- if (ngVO.getId() != securityGroup.getId()) {
- final SecurityGroupVO tmpGrp = _securityGroupDao.lockRow(ngId, false);
- if (tmpGrp == null) {
- s_logger.warn("Failed to acquire lock on security group: " + ngId);
- txn.rollback();
- return null;
- }
+ final Integer startPortOrTypeFinal = startPortOrType;
+ final Integer endPortOrCodeFinal = endPortOrCode;
+ final String protocolFinal = protocol;
+ return Transaction.execute(new TransactionCallback<List<SecurityGroupRuleVO>>() {
+ @Override
+ public List<SecurityGroupRuleVO> doInTransaction(TransactionStatus status) {
+ // Prevents other threads/management servers from creating duplicate security rules
+ SecurityGroup securityGroup = _securityGroupDao.acquireInLockTable(securityGroupId);
+ if (securityGroup == null) {
+ s_logger.warn("Could not acquire lock on network security group: id= " + securityGroupId);
+ return null;
}
- SecurityGroupRuleVO securityGroupRule = _securityGroupRuleDao.findByProtoPortsAndAllowedGroupId(securityGroup.getId(), protocol, startPortOrType, endPortOrCode, ngVO.getId());
- if ((securityGroupRule != null) && (securityGroupRule.getRuleType() == ruleType)) {
- continue; // rule already exists.
- }
- securityGroupRule = new SecurityGroupRuleVO(ruleType, securityGroup.getId(), startPortOrType, endPortOrCode, protocol, ngVO.getId());
- securityGroupRule = _securityGroupRuleDao.persist(securityGroupRule);
- newRules.add(securityGroupRule);
- }
- if (cidrList != null) {
- for (String cidr : cidrList) {
- SecurityGroupRuleVO securityGroupRule = _securityGroupRuleDao.findByProtoPortsAndCidr(securityGroup.getId(), protocol, startPortOrType, endPortOrCode, cidr);
- if ((securityGroupRule != null) && (securityGroupRule.getRuleType() == ruleType)) {
- continue;
+ List<SecurityGroupRuleVO> newRules = new ArrayList<SecurityGroupRuleVO>();
+ try {
+ for (final SecurityGroupVO ngVO : authorizedGroups2) {
+ final Long ngId = ngVO.getId();
+ // Don't delete the referenced group from under us
+ if (ngVO.getId() != securityGroup.getId()) {
+ final SecurityGroupVO tmpGrp = _securityGroupDao.lockRow(ngId, false);
+ if (tmpGrp == null) {
+ s_logger.warn("Failed to acquire lock on security group: " + ngId);
+ throw new ConcurrentAccessException("Failed to acquire lock on security group: " + ngId);
+ }
+ }
+ SecurityGroupRuleVO securityGroupRule = _securityGroupRuleDao.findByProtoPortsAndAllowedGroupId(securityGroup.getId(), protocolFinal, startPortOrTypeFinal, endPortOrCodeFinal, ngVO.getId());
+ if ((securityGroupRule != null) && (securityGroupRule.getRuleType() == ruleType)) {
+ continue; // rule already exists.
+ }
+ securityGroupRule = new SecurityGroupRuleVO(ruleType, securityGroup.getId(), startPortOrTypeFinal, endPortOrCodeFinal, protocolFinal, ngVO.getId());
+ securityGroupRule = _securityGroupRuleDao.persist(securityGroupRule);
+ newRules.add(securityGroupRule);
+ }
+ if (cidrList != null) {
+ for (String cidr : cidrList) {
+ SecurityGroupRuleVO securityGroupRule = _securityGroupRuleDao.findByProtoPortsAndCidr(securityGroup.getId(), protocolFinal, startPortOrTypeFinal, endPortOrCodeFinal, cidr);
+ if ((securityGroupRule != null) && (securityGroupRule.getRuleType() == ruleType)) {
+ continue;
+ }
+ securityGroupRule = new SecurityGroupRuleVO(ruleType, securityGroup.getId(), startPortOrTypeFinal, endPortOrCodeFinal, protocolFinal, cidr);
+ securityGroupRule = _securityGroupRuleDao.persist(securityGroupRule);
+ newRules.add(securityGroupRule);
+ }
+ }
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Added " + newRules.size() + " rules to security group " + securityGroup.getName());
+ }
+ final ArrayList<Long> affectedVms = new ArrayList<Long>();
+ affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(securityGroup.getId()));
+ scheduleRulesetUpdateToHosts(affectedVms, true, null);
+ return newRules;
+ } catch (Exception e) {
+ s_logger.warn("Exception caught when adding security group rules ", e);
+ throw new CloudRuntimeException("Exception caught when adding security group rules", e);
+ } finally {
+ if (securityGroup != null) {
+ _securityGroupDao.releaseFromLockTable(securityGroup.getId());
}
- securityGroupRule = new SecurityGroupRuleVO(ruleType, securityGroup.getId(), startPortOrType, endPortOrCode, protocol, cidr);
- securityGroupRule = _securityGroupRuleDao.persist(securityGroupRule);
- newRules.add(securityGroupRule);
}
}
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Added " + newRules.size() + " rules to security group " + securityGroup.getName());
- }
- txn.commit();
- final ArrayList<Long> affectedVms = new ArrayList<Long>();
- affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(securityGroup.getId()));
- scheduleRulesetUpdateToHosts(affectedVms, true, null);
- return newRules;
- } catch (Exception e) {
- s_logger.warn("Exception caught when adding security group rules ", e);
- throw new CloudRuntimeException("Exception caught when adding security group rules", e);
- } finally {
- if (securityGroup != null) {
- _securityGroupDao.releaseFromLockTable(securityGroup.getId());
- }
- }
+ });
+
}
@Override
@@ -792,11 +789,11 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
return revokeSecurityGroupRule(id, SecurityRuleType.IngressRule);
}
- private boolean revokeSecurityGroupRule(Long id, SecurityRuleType type) {
+ private boolean revokeSecurityGroupRule(final Long id, SecurityRuleType type) {
// input validation
Account caller = CallContext.current().getCallingAccount();
- SecurityGroupRuleVO rule = _securityGroupRuleDao.findById(id);
+ final SecurityGroupRuleVO rule = _securityGroupRuleDao.findById(id);
if (rule == null) {
s_logger.debug("Unable to find security rule with id " + id);
throw new InvalidParameterValueException("Unable to find security rule with id " + id);
@@ -812,36 +809,37 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
SecurityGroup securityGroup = _securityGroupDao.findById(rule.getSecurityGroupId());
_accountMgr.checkAccess(caller, null, true, securityGroup);
- SecurityGroupVO groupHandle = null;
- final Transaction txn = Transaction.currentTxn();
-
- try {
- txn.start();
- // acquire lock on parent group (preserving this logic)
- groupHandle = _securityGroupDao.acquireInLockTable(rule.getSecurityGroupId());
- if (groupHandle == null) {
- s_logger.warn("Could not acquire lock on security group id: " + rule.getSecurityGroupId());
- return false;
- }
-
- _securityGroupRuleDao.remove(id);
- s_logger.debug("revokeSecurityGroupRule succeeded for security rule id: " + id);
-
- final ArrayList<Long> affectedVms = new ArrayList<Long>();
- affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(groupHandle.getId()));
- scheduleRulesetUpdateToHosts(affectedVms, true, null);
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ SecurityGroupVO groupHandle = null;
- return true;
- } catch (Exception e) {
- s_logger.warn("Exception caught when deleting security rules ", e);
- throw new CloudRuntimeException("Exception caught when deleting security rules", e);
- } finally {
- if (groupHandle != null) {
- _securityGroupDao.releaseFromLockTable(groupHandle.getId());
+ try {
+ // acquire lock on parent group (preserving this logic)
+ groupHandle = _securityGroupDao.acquireInLockTable(rule.getSecurityGroupId());
+ if (groupHandle == null) {
+ s_logger.warn("Could not acquire lock on security group id: " + rule.getSecurityGroupId());
+ return false;
+ }
+
+ _securityGroupRuleDao.remove(id);
+ s_logger.debug("revokeSecurityGroupRule succeeded for security rule id: " + id);
+
+ final ArrayList<Long> affectedVms = new ArrayList<Long>();
+ affectedVms.addAll(_securityGroupVMMapDao.listVmIdsBySecurityGroup(groupHandle.getId()));
+ scheduleRulesetUpdateToHosts(affectedVms, true, null);
+
+ return true;
+ } catch (Exception e) {
+ s_logger.warn("Exception caught when deleting security rules ", e);
+ throw new CloudRuntimeException("Exception caught when deleting security rules", e);
+ } finally {
+ if (groupHandle != null) {
+ _securityGroupDao.releaseFromLockTable(groupHandle.getId());
+ }
+ }
}
- txn.commit();
- }
-
+ });
}
@Override
@@ -939,7 +937,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
}
return;
}
- Long userVmId = work.getInstanceId();
+ final Long userVmId = work.getInstanceId();
if (work.getStep() == Step.Done) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Security Group work: found a job in done state, rescheduling for vm: " + userVmId);
@@ -949,68 +947,73 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
scheduleRulesetUpdateToHosts(affectedVms, false, _timeBetweenCleanups*1000l);
return;
}
- UserVm vm = null;
- Long seqnum = null;
s_logger.debug("Working on " + work);
- final Transaction txn = Transaction.currentTxn();
- txn.start();
- boolean locked = false;
- try {
- vm = _userVMDao.acquireInLockTable(work.getInstanceId());
- if (vm == null) {
- vm = _userVMDao.findById(work.getInstanceId());
- if (vm == null) {
- s_logger.info("VM " + work.getInstanceId() + " is removed");
+
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ UserVm vm = null;
+ Long seqnum = null;
+
+ boolean locked = false;
+ try {
+ vm = _userVMDao.acquireInLockTable(work.getInstanceId());
+ if (vm == null) {
+ vm = _userVMDao.findById(work.getInstanceId());
+ if (vm == null) {
+ s_logger.info("VM " + work.getInstanceId() + " is removed");
+ locked = true;
+ return;
+ }
+ s_logger.warn("Unable to acquire lock on vm id=" + userVmId);
+ return;
+ }
locked = true;
- return;
- }
- s_logger.warn("Unable to acquire lock on vm id=" + userVmId);
- return;
- }
- locked = true;
- Long agentId = null;
- VmRulesetLogVO log = _rulesetLogDao.findByVmId(userVmId);
- if (log == null) {
- s_logger.warn("Cannot find log record for vm id=" + userVmId);
- return;
- }
- seqnum = log.getLogsequence();
-
- if (vm != null && vm.getState() == State.Running) {
- Map<PortAndProto, Set<String>> ingressRules = generateRulesForVM(userVmId, SecurityRuleType.IngressRule);
- Map<PortAndProto, Set<String>> egressRules = generateRulesForVM(userVmId, SecurityRuleType.EgressRule);
- agentId = vm.getHostId();
- if (agentId != null) {
- // get nic secondary ip address
- String privateIp = vm.getPrivateIpAddress();
- NicVO nic = _nicDao.findByIp4AddressAndVmId(privateIp, vm.getId());
- List<String> nicSecIps = null;
- if (nic != null) {
- if (nic.getSecondaryIp()) {
- //get secondary ips of the vm
- long networkId = nic.getNetworkId();
- nicSecIps = _nicSecIpDao.getSecondaryIpAddressesForNic(nic.getId());
+ Long agentId = null;
+ VmRulesetLogVO log = _rulesetLogDao.findByVmId(userVmId);
+ if (log == null) {
+ s_logger.warn("Cannot find log record for vm id=" + userVmId);
+ return;
+ }
+ seqnum = log.getLogsequence();
+
+ if (vm != null && vm.getState() == State.Running) {
+ Map<PortAndProto, Set<String>> ingressRules = generateRulesForVM(userVmId, SecurityRuleType.IngressRule);
+ Map<PortAndProto, Set<String>> egressRules = generateRulesForVM(userVmId, SecurityRuleType.EgressRule);
+ agentId = vm.getHostId();
+ if (agentId != null) {
+ // get nic secondary ip address
+ String privateIp = vm.getPrivateIpAddress();
+ NicVO nic = _nicDao.findByIp4AddressAndVmId(privateIp, vm.getId());
+ List<String> nicSecIps = null;
+ if (nic != null) {
+ if (nic.getSecondaryIp()) {
+ //get secondary ips of the vm
+ long networkId = nic.getNetworkId();
+ nicSecIps = _nicSecIpDao.getSecondaryIpAddressesForNic(nic.getId());
+ }
+ }
+ SecurityGroupRulesCmd cmd = generateRulesetCmd( vm.getInstanceName(), vm.getPrivateIpAddress(), vm.getPrivateMacAddress(), vm.getId(), generateRulesetSignature(ingressRules, egressRules), seqnum,
+ ingressRules, egressRules, nicSecIps);
+ Commands cmds = new Commands(cmd);
+ try {
+ _agentMgr.send(agentId, cmds, _answerListener);
+ } catch (AgentUnavailableException e) {
+ s_logger.debug("Unable to send ingress rules updates for vm: " + userVmId + "(agentid=" + agentId + ")");
+ _workDao.updateStep(work.getInstanceId(), seqnum, Step.Done);
+ }
+
}
}
- SecurityGroupRulesCmd cmd = generateRulesetCmd( vm.getInstanceName(), vm.getPrivateIpAddress(), vm.getPrivateMacAddress(), vm.getId(), generateRulesetSignature(ingressRules, egressRules), seqnum,
- ingressRules, egressRules, nicSecIps);
- Commands cmds = new Commands(cmd);
- try {
- _agentMgr.send(agentId, cmds, _answerListener);
- } catch (AgentUnavailableException e) {
- s_logger.debug("Unable to send ingress rules updates for vm: " + userVmId + "(agentid=" + agentId + ")");
- _workDao.updateStep(work.getInstanceId(), seqnum, Step.Done);
+ } finally {
+ if (locked) {
+ _userVMDao.releaseFromLockTable(userVmId);
+ _workDao.updateStep(work.getId(), Step.Done);
}
-
}
}
- } finally {
- if (locked) {
- _userVMDao.releaseFromLockTable(userVmId);
- _workDao.updateStep(work.getId(), Step.Done);
- }
- txn.commit();
- }
+ });
+
}
@Override
@@ -1021,41 +1024,40 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
return false;
}
if (groups != null && !groups.isEmpty()) {
-
- final Transaction txn = Transaction.currentTxn();
- txn.start();
- UserVm userVm = _userVMDao.acquireInLockTable(userVmId); // ensures that duplicate entries are not created.
- List<SecurityGroupVO> sgs = new ArrayList<SecurityGroupVO>();
- for (Long sgId : groups) {
- sgs.add(_securityGroupDao.findById(sgId));
- }
- final Set<SecurityGroupVO> uniqueGroups = new TreeSet<SecurityGroupVO>(new SecurityGroupVOComparator());
- uniqueGroups.addAll(sgs);
- if (userVm == null) {
- s_logger.warn("Failed to acquire lock on user vm id=" + userVmId);
- }
- try {
- for (SecurityGroupVO securityGroup : uniqueGroups) {
- // don't let the group be deleted from under us.
- SecurityGroupVO ngrpLock = _securityGroupDao.lockRow(securityGroup.getId(), false);
- if (ngrpLock == null) {
- s_logger.warn("Failed to acquire lock on network group id=" + securityGroup.getId() + " name=" + securityGroup.getName());
- txn.rollback();
- return false;
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ UserVm userVm = _userVMDao.acquireInLockTable(userVmId); // ensures that duplicate entries are not created.
+ List<SecurityGroupVO> sgs = new ArrayList<SecurityGroupVO>();
+ for (Long sgId : groups) {
+ sgs.add(_securityGroupDao.findById(sgId));
}
- if (_securityGroupVMMapDao.findByVmIdGroupId(userVmId, securityGroup.getId()) == null) {
- SecurityGroupVMMapVO groupVmMapVO = new SecurityGroupVMMapVO(securityGroup.getId(), userVmId);
- _securityGroupVMMapDao.persist(groupVmMapVO);
+ final Set<SecurityGroupVO> uniqueGroups = new TreeSet<SecurityGroupVO>(new SecurityGroupVOComparator());
+ uniqueGroups.addAll(sgs);
+ if (userVm == null) {
+ s_logger.warn("Failed to acquire lock on user vm id=" + userVmId);
+ }
+ try {
+ for (SecurityGroupVO securityGroup : uniqueGroups) {
+ // don't let the group be deleted from under us.
+ SecurityGroupVO ngrpLock = _securityGroupDao.lockRow(securityGroup.getId(), false);
+ if (ngrpLock == null) {
+ s_logger.warn("Failed to acquire lock on network group id=" + securityGroup.getId() + " name=" + securityGroup.getName());
+ throw new ConcurrentModificationException("Failed to acquire lock on network group id=" + securityGroup.getId() + " name=" + securityGroup.getName());
+ }
+ if (_securityGroupVMMapDao.findByVmIdGroupId(userVmId, securityGroup.getId()) == null) {
+ SecurityGroupVMMapVO groupVmMapVO = new SecurityGroupVMMapVO(securityGroup.getId(), userVmId);
+ _securityGroupVMMapDao.persist(groupVmMapVO);
+ }
+ }
+ return true;
+ } finally {
+ if (userVm != null) {
+ _userVMDao.releaseFromLockTable(userVmId);
+ }
}
}
- txn.commit();
- return true;
- } finally {
- if (userVm != null) {
- _userVMDao.releaseFromLockTable(userVmId);
- }
- }
-
+ });
}
return false;
@@ -1063,22 +1065,24 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
@Override
@DB
- public void removeInstanceFromGroups(long userVmId) {
+ public void removeInstanceFromGroups(final long userVmId) {
if (_securityGroupVMMapDao.countSGForVm(userVmId) < 1) {
s_logger.trace("No security groups found for vm id=" + userVmId + ", returning");
return;
}
- final Transaction txn = Transaction.currentTxn();
- txn.start();
- UserVm userVm = _userVMDao.acquireInLockTable(userVmId); // ensures that duplicate entries are not created in
- // addInstance
- if (userVm == null) {
- s_logger.warn("Failed to acquire lock on user vm id=" + userVmId);
- }
- int n = _securityGroupVMMapDao.deleteVM(userVmId);
- s_logger.info("Disassociated " + n + " network groups " + " from uservm " + userVmId);
- _userVMDao.releaseFromLockTable(userVmId);
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ UserVm userVm = _userVMDao.acquireInLockTable(userVmId); // ensures that duplicate entries are not created in
+ // addInstance
+ if (userVm == null) {
+ s_logger.warn("Failed to acquire lock on user vm id=" + userVmId);
+ }
+ int n = _securityGroupVMMapDao.deleteVM(userVmId);
+ s_logger.info("Disassociated " + n + " network groups " + " from uservm " + userVmId);
+ _userVMDao.releaseFromLockTable(userVmId);
+ }
+ });
s_logger.debug("Security group mappings are removed successfully for vm id=" + userVmId);
}
@@ -1086,7 +1090,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
@Override
@ActionEvent(eventType = EventTypes.EVENT_SECURITY_GROUP_DELETE, eventDescription = "deleting security group")
public boolean deleteSecurityGroup(DeleteSecurityGroupCmd cmd) throws ResourceInUseException {
- Long groupId = cmd.getId();
+ final Long groupId = cmd.getId();
Account caller = CallContext.current().getCallingAccount();
SecurityGroupVO group = _securityGroupDao.findById(groupId);
@@ -1097,32 +1101,34 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
// check permissions
_accountMgr.checkAccess(caller, null, true, group);
- final Transaction txn = Transaction.currentTxn();
- txn.start();
-
- group = _securityGroupDao.lockRow(groupId, true);
- if (group == null) {
- throw new InvalidParameterValueException("Unable to find security group by id " + groupId);
- }
-
- if (group.getName().equalsIgnoreCase(SecurityGroupManager.DEFAULT_GROUP_NAME)) {
- throw new InvalidParameterValueException("The network group default is reserved");
- }
-
- List<SecurityGroupRuleVO> allowingRules = _securityGroupRuleDao.listByAllowedSecurityGroupId(groupId);
- List<SecurityGroupVMMapVO> securityGroupVmMap = _securityGroupVMMapDao.listBySecurityGroup(groupId);
- if (!allowingRules.isEmpty()) {
- throw new ResourceInUseException("Cannot delete group when there are security rules that allow this group");
- } else if (!securityGroupVmMap.isEmpty()) {
- throw new ResourceInUseException("Cannot delete group when it's in use by virtual machines");
- }
-
- _securityGroupDao.expunge(groupId);
- txn.commit();
+ return Transaction.executeWithException(new TransactionCallbackWithException<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) throws ResourceInUseException {
+ SecurityGroupVO group = _securityGroupDao.lockRow(groupId, true);
+ if (group == null) {
+ throw new InvalidParameterValueException("Unable to find security group by id " + groupId);
+ }
+
+ if (group.getName().equalsIgnoreCase(SecurityGroupManager.DEFAULT_GROUP_NAME)) {
+ throw new InvalidParameterValueException("The network group default is reserved");
+ }
+
+ List<SecurityGroupRuleVO> allowingRules = _securityGroupRuleDao.listByAllowedSecurityGroupId(groupId);
+ List<SecurityGroupVMMapVO> securityGroupVmMap = _securityGroupVMMapDao.listBySecurityGroup(groupId);
+ if (!allowingRules.isEmpty()) {
+ throw new ResourceInUseException("Cannot delete group when there are security rules that allow this group");
+ } else if (!securityGroupVmMap.isEmpty()) {
+ throw new ResourceInUseException("Cannot delete group when it's in use by virtual machines");
+ }
+
+ _securityGroupDao.expunge(groupId);
- s_logger.debug("Deleted security group id=" + groupId);
+ s_logger.debug("Deleted security group id=" + groupId);
+
+ return true;
+ }
+ }, ResourceInUseException.class);
- return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java b/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
index 9923db5..30d39e0 100644
--- a/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/NetworkACLManagerImpl.java
@@ -23,7 +23,6 @@ import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.context.CallContext;
import com.cloud.configuration.ConfigurationManager;
@@ -48,6 +47,8 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -214,30 +215,35 @@ public class NetworkACLManagerImpl extends ManagerBase implements NetworkACLMana
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_NETWORK_ACL_ITEM_CREATE, eventDescription = "creating network ACL Item", create = true)
- public NetworkACLItem createNetworkACLItem(Integer portStart, Integer portEnd, String protocol, List<String> sourceCidrList,
- Integer icmpCode, Integer icmpType, NetworkACLItem.TrafficType trafficType, Long aclId,
- String action, Integer number) {
- NetworkACLItem.Action ruleAction = NetworkACLItem.Action.Allow;
- if("deny".equalsIgnoreCase(action)){
- ruleAction = NetworkACLItem.Action.Deny;
- }
+ public NetworkACLItem createNetworkACLItem(final Integer portStart, final Integer portEnd, final String protocol, final List<String> sourceCidrList,
+ final Integer icmpCode, final Integer icmpType, final NetworkACLItem.TrafficType trafficType, final Long aclId,
+ final String action, Integer number) {
// If number is null, set it to currentMax + 1 (for backward compatibility)
if(number == null){
number = _networkACLItemDao.getMaxNumberByACL(aclId) + 1;
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ final Integer numberFinal = number;
+ NetworkACLItemVO newRule = Transaction.execute(new TransactionCallback<NetworkACLItemVO>() {
+ @Override
+ public NetworkACLItemVO doInTransaction(TransactionStatus status) {
+ NetworkACLItem.Action ruleAction = NetworkACLItem.Action.Allow;
+ if("deny".equalsIgnoreCase(action)){
+ ruleAction = NetworkACLItem.Action.Deny;
+ }
- NetworkACLItemVO newRule = new NetworkACLItemVO(portStart, portEnd, protocol.toLowerCase(), aclId, sourceCidrList, icmpCode, icmpType, trafficType, ruleAction, number);
- newRule = _networkACLItemDao.persist(newRule);
+ NetworkACLItemVO newRule = new NetworkACLItemVO(portStart, portEnd, protocol.toLowerCase(), aclId, sourceCidrList, icmpCode, icmpType, trafficType, ruleAction, numberFinal);
+ newRule = _networkACLItemDao.persist(newRule);
- if (!_networkACLItemDao.setStateToAdd(newRule)) {
- throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
- }
- CallContext.current().setEventDetails("ACL Item Id: " + newRule.getId());
+ if (!_networkACLItemDao.setStateToAdd(newRule)) {
+ throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+ }
+ CallContext.current().setEventDetails("ACL Item Id: " + newRule.getId());
+
+ return newRule;
+ }
+ });
- txn.commit();
return getNetworkACLItem(newRule.getId());
}
[12/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 4fda3b1..9131fa6 100755
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -36,7 +36,6 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.acl.SecurityChecker;
import org.apache.cloudstack.affinity.AffinityGroup;
import org.apache.cloudstack.affinity.AffinityGroupService;
@@ -192,6 +191,10 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.NicIpAlias;
@@ -508,7 +511,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
}
// Execute all updates in a single transaction
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
if (!_configDao.update(name, category, value)) {
@@ -906,7 +909,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
selectSql += " and removed IS NULL";
}
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
stmt.setLong(1, podId);
@@ -992,9 +995,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@Override
@DB
public boolean deletePod(DeletePodCmd cmd) {
- Long podId = cmd.getId();
-
- Transaction txn = Transaction.currentTxn();
+ final Long podId = cmd.getId();
// Make sure the pod exists
if (!validPod(podId)) {
@@ -1003,50 +1004,52 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
checkIfPodIsDeletable(podId);
- HostPodVO pod = _podDao.findById(podId);
-
- txn.start();
-
- // Delete private ip addresses for the pod if there are any
- List<DataCenterIpAddressVO> privateIps = _privateIpAddressDao.listByPodIdDcId(Long.valueOf(podId),
- pod.getDataCenterId());
- if (!privateIps.isEmpty()) {
- if (!(_privateIpAddressDao.deleteIpAddressByPod(podId))) {
- throw new CloudRuntimeException("Failed to cleanup private ip addresses for pod " + podId);
- }
- }
+ final HostPodVO pod = _podDao.findById(podId);
+
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ // Delete private ip addresses for the pod if there are any
+ List<DataCenterIpAddressVO> privateIps = _privateIpAddressDao.listByPodIdDcId(Long.valueOf(podId),
+ pod.getDataCenterId());
+ if (!privateIps.isEmpty()) {
+ if (!(_privateIpAddressDao.deleteIpAddressByPod(podId))) {
+ throw new CloudRuntimeException("Failed to cleanup private ip addresses for pod " + podId);
+ }
+ }
- // Delete link local ip addresses for the pod
- List<DataCenterLinkLocalIpAddressVO> localIps = _LinkLocalIpAllocDao.listByPodIdDcId(podId,
- pod.getDataCenterId());
- if (!localIps.isEmpty()) {
- if (!(_LinkLocalIpAllocDao.deleteIpAddressByPod(podId))) {
- throw new CloudRuntimeException("Failed to cleanup private ip addresses for pod " + podId);
- }
- }
+ // Delete link local ip addresses for the pod
+ List<DataCenterLinkLocalIpAddressVO> localIps = _LinkLocalIpAllocDao.listByPodIdDcId(podId,
+ pod.getDataCenterId());
+ if (!localIps.isEmpty()) {
+ if (!(_LinkLocalIpAllocDao.deleteIpAddressByPod(podId))) {
+ throw new CloudRuntimeException("Failed to cleanup private ip addresses for pod " + podId);
+ }
+ }
- // Delete vlans associated with the pod
- List<? extends Vlan> vlans = _networkModel.listPodVlans(podId);
- if (vlans != null && !vlans.isEmpty()) {
- for (Vlan vlan : vlans) {
- _vlanDao.remove(vlan.getId());
- }
- }
+ // Delete vlans associated with the pod
+ List<? extends Vlan> vlans = _networkModel.listPodVlans(podId);
+ if (vlans != null && !vlans.isEmpty()) {
+ for (Vlan vlan : vlans) {
+ _vlanDao.remove(vlan.getId());
+ }
+ }
- // Delete corresponding capacity records
- _capacityDao.removeBy(null, null, podId, null, null);
+ // Delete corresponding capacity records
+ _capacityDao.removeBy(null, null, podId, null, null);
- // Delete the pod
- if (!(_podDao.remove(podId))) {
- throw new CloudRuntimeException("Failed to delete pod " + podId);
- }
+ // Delete the pod
+ if (!(_podDao.remove(podId))) {
+ throw new CloudRuntimeException("Failed to delete pod " + podId);
+ }
- // remove from dedicated resources
- DedicatedResourceVO dr = _dedicatedDao.findByPodId(podId);
- if (dr != null) {
- _dedicatedDao.remove(dr.getId());
- }
- txn.commit();
+ // remove from dedicated resources
+ DedicatedResourceVO dr = _dedicatedDao.findByPodId(podId);
+ if (dr != null) {
+ _dedicatedDao.remove(dr.getId());
+ }
+ }
+ });
return true;
}
@@ -1059,12 +1062,12 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@Override
@DB
- public Pod editPod(long id, String name, String startIp, String endIp, String gateway, String netmask,
+ public Pod editPod(final long id, String name, String startIp, String endIp, String gateway, String netmask,
String allocationStateStr) {
// verify parameters
- HostPodVO pod = _podDao.findById(id);
- ;
+ final HostPodVO pod = _podDao.findById(id);
+
if (pod == null) {
throw new InvalidParameterValueException("Unable to find pod by id " + id);
}
@@ -1146,59 +1149,73 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
}
// Verify pod's attributes
- String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
+ final String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
boolean checkForDuplicates = !oldPodName.equals(name);
checkPodAttributes(id, name, pod.getDataCenterId(), gateway, cidr, startIp, endIp, allocationStateStr,
checkForDuplicates, false);
- Transaction txn = Transaction.currentTxn();
try {
- txn.start();
- long zoneId = pod.getDataCenterId();
-
- if (!allowToDownsize) {
- if (leftRangeToAdd != null) {
- _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), leftRangeToAdd[0], leftRangeToAdd[1]);
- }
- if (rightRangeToAdd != null) {
- _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), rightRangeToAdd[0], rightRangeToAdd[1]);
- }
-
- } else {
- // delete the old range
- _zoneDao.deletePrivateIpAddressByPod(pod.getId());
-
- // add the new one
- if (startIp == null) {
- startIp = existingPodIpRange[0];
- }
+ final String[] existingPodIpRangeFinal = existingPodIpRange;
+ final String[] leftRangeToAddFinal = leftRangeToAdd;
+ final String[] rightRangeToAddFinal = rightRangeToAdd;
+ final boolean allowToDownsizeFinal = allowToDownsize;
+ final String allocationStateStrFinal = allocationStateStr;
+ final String startIpFinal = startIp;
+ final String endIpFinal = endIp;
+ final String nameFinal = name;
+ final String gatewayFinal = gateway;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ long zoneId = pod.getDataCenterId();
+
+ String startIp = startIpFinal;
+ String endIp = endIpFinal;
+
+ if (!allowToDownsizeFinal) {
+ if (leftRangeToAddFinal != null) {
+ _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), leftRangeToAddFinal[0], leftRangeToAddFinal[1]);
+ }
- if (endIp == null) {
- endIp = existingPodIpRange[1];
- }
+ if (rightRangeToAddFinal != null) {
+ _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), rightRangeToAddFinal[0], rightRangeToAddFinal[1]);
+ }
- _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIp);
- }
+ } else {
+ // delete the old range
+ _zoneDao.deletePrivateIpAddressByPod(pod.getId());
- pod.setName(name);
- pod.setDataCenterId(zoneId);
- pod.setGateway(gateway);
- pod.setCidrAddress(getCidrAddress(cidr));
- pod.setCidrSize(getCidrSize(cidr));
+ // add the new one
+ if (startIp == null) {
+ startIp = existingPodIpRangeFinal[0];
+ }
- String ipRange = startIp + "-" + endIp;
- pod.setDescription(ipRange);
- Grouping.AllocationState allocationState = null;
- if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
- allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
- _capacityDao.updateCapacityState(null, pod.getId(), null, null, allocationStateStr);
- pod.setAllocationState(allocationState);
- }
+ if (endIp == null) {
+ endIp = existingPodIpRangeFinal[1];
+ }
- _podDao.update(id, pod);
+ _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIp);
+ }
- txn.commit();
+ pod.setName(nameFinal);
+ pod.setDataCenterId(zoneId);
+ pod.setGateway(gatewayFinal);
+ pod.setCidrAddress(getCidrAddress(cidr));
+ pod.setCidrSize(getCidrSize(cidr));
+
+ String ipRange = startIp + "-" + endIp;
+ pod.setDescription(ipRange);
+ Grouping.AllocationState allocationState = null;
+ if (allocationStateStrFinal != null && !allocationStateStrFinal.isEmpty()) {
+ allocationState = Grouping.AllocationState.valueOf(allocationStateStrFinal);
+ _capacityDao.updateCapacityState(null, pod.getId(), null, null, allocationStateStrFinal);
+ pod.setAllocationState(allocationState);
+ }
+
+ _podDao.update(id, pod);
+ }
+ });
} catch (Exception e) {
s_logger.error("Unable to edit pod due to " + e.getMessage(), e);
throw new CloudRuntimeException("Failed to edit pod. Please contact Cloud Support.");
@@ -1221,7 +1238,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@Override
@DB
- public HostPodVO createPod(long userId, String podName, long zoneId, String gateway, String cidr, String startIp,
+ public HostPodVO createPod(long userId, String podName, final long zoneId, String gateway, String cidr, final String startIp,
String endIp, String allocationStateStr, boolean skipGatewayOverlapCheck) {
// Check if the zone is valid
@@ -1260,31 +1277,33 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
throw new InvalidParameterValueException("Start ip is required parameter");
}
- HostPodVO pod = new HostPodVO(podName, zoneId, gateway, cidrAddress, cidrSize, ipRange);
+ final HostPodVO podFinal = new HostPodVO(podName, zoneId, gateway, cidrAddress, cidrSize, ipRange);
Grouping.AllocationState allocationState = null;
if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
- pod.setAllocationState(allocationState);
+ podFinal.setAllocationState(allocationState);
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- pod = _podDao.persist(pod);
+ final String endIpFinal = endIp;
+ return Transaction.execute(new TransactionCallback<HostPodVO>() {
+ @Override
+ public HostPodVO doInTransaction(TransactionStatus status) {
- if (startIp != null) {
- _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIp);
- }
+ HostPodVO pod = _podDao.persist(podFinal);
- String[] linkLocalIpRanges = getLinkLocalIPRange();
- if (linkLocalIpRanges != null) {
- _zoneDao.addLinkLocalIpAddress(zoneId, pod.getId(), linkLocalIpRanges[0], linkLocalIpRanges[1]);
- }
+ if (startIp != null) {
+ _zoneDao.addPrivateIpAddress(zoneId, pod.getId(), startIp, endIpFinal);
+ }
- txn.commit();
+ String[] linkLocalIpRanges = getLinkLocalIPRange();
+ if (linkLocalIpRanges != null) {
+ _zoneDao.addLinkLocalIpAddress(zoneId, pod.getId(), linkLocalIpRanges[0], linkLocalIpRanges[1]);
+ }
- return pod;
+ return pod;
+ }
+ });
}
@DB
@@ -1369,7 +1388,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
selectSql += " AND state != '" + VirtualMachine.State.Expunging.toString() + "'";
}
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
stmt.setLong(1, zoneId);
@@ -1504,11 +1523,8 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@ActionEvent(eventType = EventTypes.EVENT_ZONE_DELETE, eventDescription = "deleting zone", async = false)
public boolean deleteZone(DeleteZoneCmd cmd) {
- Transaction txn = Transaction.currentTxn();
- boolean success = false;
-
Long userId = CallContext.current().getCallingUserId();
- Long zoneId = cmd.getId();
+ final Long zoneId = cmd.getId();
if (userId == null) {
userId = Long.valueOf(User.UID_SYSTEM);
@@ -1521,38 +1537,38 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
checkIfZoneIsDeletable(zoneId);
- txn.start();
-
- // delete vlans for this zone
- List<VlanVO> vlans = _vlanDao.listByZone(zoneId);
- for (VlanVO vlan : vlans) {
- _vlanDao.remove(vlan.getId());
- }
-
- success = _zoneDao.remove(zoneId);
-
- if (success) {
- // delete all capacity records for the zone
- _capacityDao.removeBy(null, zoneId, null, null, null);
- // remove from dedicated resources
- DedicatedResourceVO dr = _dedicatedDao.findByZoneId(zoneId);
- if (dr != null) {
- _dedicatedDao.remove(dr.getId());
- // find the group associated and check if there are any more
- // resources under that group
- List<DedicatedResourceVO> resourcesInGroup = _dedicatedDao.listByAffinityGroupId(dr
- .getAffinityGroupId());
- if (resourcesInGroup.isEmpty()) {
- // delete the group
- _affinityGroupService.deleteAffinityGroup(dr.getAffinityGroupId(), null, null, null);
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ // delete vlans for this zone
+ List<VlanVO> vlans = _vlanDao.listByZone(zoneId);
+ for (VlanVO vlan : vlans) {
+ _vlanDao.remove(vlan.getId());
}
- }
- }
- txn.commit();
-
- return success;
+ boolean success = _zoneDao.remove(zoneId);
+
+ if (success) {
+ // delete all capacity records for the zone
+ _capacityDao.removeBy(null, zoneId, null, null, null);
+ // remove from dedicated resources
+ DedicatedResourceVO dr = _dedicatedDao.findByZoneId(zoneId);
+ if (dr != null) {
+ _dedicatedDao.remove(dr.getId());
+ // find the group associated and check if there are any more
+ // resources under that group
+ List<DedicatedResourceVO> resourcesInGroup = _dedicatedDao.listByAffinityGroupId(dr
+ .getAffinityGroupId());
+ if (resourcesInGroup.isEmpty()) {
+ // delete the group
+ _affinityGroupService.deleteAffinityGroup(dr.getAffinityGroupId(), null, null, null);
+ }
+ }
+ }
+ return success;
+ }
+ });
}
@Override
@@ -1560,7 +1576,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@ActionEvent(eventType = EventTypes.EVENT_ZONE_EDIT, eventDescription = "editing zone", async = false)
public DataCenter editZone(UpdateZoneCmd cmd) {
// Parameter validation as from execute() method in V1
- Long zoneId = cmd.getId();
+ final Long zoneId = cmd.getId();
String zoneName = cmd.getZoneName();
String dns1 = cmd.getDns1();
String dns2 = cmd.getDns2();
@@ -1570,14 +1586,14 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
String internalDns2 = cmd.getInternalDns2();
String guestCidr = cmd.getGuestCidrAddress();
List<String> dnsSearchOrder = cmd.getDnsSearchOrder();
- Boolean isPublic = cmd.isPublic();
- String allocationStateStr = cmd.getAllocationState();
- String dhcpProvider = cmd.getDhcpProvider();
+ final Boolean isPublic = cmd.isPublic();
+ final String allocationStateStr = cmd.getAllocationState();
+ final String dhcpProvider = cmd.getDhcpProvider();
Map<?, ?> detailsMap = cmd.getDetails();
String networkDomain = cmd.getDomain();
Boolean localStorageEnabled = cmd.getLocalStorageEnabled();
- Map<String, String> newDetails = new HashMap<String, String>();
+ final Map<String, String> newDetails = new HashMap<String, String>();
if (detailsMap != null) {
Collection<?> zoneDetailsCollection = detailsMap.values();
Iterator<?> iter = zoneDetailsCollection.iterator();
@@ -1611,7 +1627,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
newDetails.put(ZoneConfig.DnsSearchOrder.getName(), StringUtils.join(dnsSearchOrder, ","));
}
- DataCenterVO zone = _zoneDao.findById(zoneId);
+ final DataCenterVO zone = _zoneDao.findById(zoneId);
if (zone == null) {
throw new InvalidParameterValueException("unable to find zone by id " + zoneId);
}
@@ -1698,93 +1714,94 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
}
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- Map<String, String> updatedDetails = new HashMap<String, String>();
- _zoneDao.loadDetails(zone);
- if (zone.getDetails() != null) {
- updatedDetails.putAll(zone.getDetails());
- }
- updatedDetails.putAll(newDetails);
- zone.setDetails(updatedDetails);
-
- if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
- Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
-
- if (allocationState == Grouping.AllocationState.Enabled) {
- // check if zone has necessary trafficTypes before enabling
- try {
- PhysicalNetwork mgmtPhyNetwork;
- // zone should have a physical network with management
- // traffiType
- mgmtPhyNetwork = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId,
- TrafficType.Management);
- if (NetworkType.Advanced == zone.getNetworkType() && !zone.isSecurityGroupEnabled()) {
- // advanced zone without SG should have a physical
- // network with public Thpe
- _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId, TrafficType.Public);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ Map<String, String> updatedDetails = new HashMap<String, String>();
+ _zoneDao.loadDetails(zone);
+ if (zone.getDetails() != null) {
+ updatedDetails.putAll(zone.getDetails());
+ }
+ updatedDetails.putAll(newDetails);
+ zone.setDetails(updatedDetails);
+
+ if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
+ Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
+
+ if (allocationState == Grouping.AllocationState.Enabled) {
+ // check if zone has necessary trafficTypes before enabling
+ try {
+ PhysicalNetwork mgmtPhyNetwork;
+ // zone should have a physical network with management
+ // traffiType
+ mgmtPhyNetwork = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId,
+ TrafficType.Management);
+ if (NetworkType.Advanced == zone.getNetworkType() && !zone.isSecurityGroupEnabled()) {
+ // advanced zone without SG should have a physical
+ // network with public Thpe
+ _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId, TrafficType.Public);
+ }
+
+ try {
+ _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId, TrafficType.Storage);
+ } catch (InvalidParameterValueException noStorage) {
+ PhysicalNetworkTrafficTypeVO mgmtTraffic = _trafficTypeDao.findBy(mgmtPhyNetwork.getId(),
+ TrafficType.Management);
+ _networkSvc.addTrafficTypeToPhysicalNetwork(mgmtPhyNetwork.getId(),
+ TrafficType.Storage.toString(), mgmtTraffic.getXenNetworkLabel(),
+ mgmtTraffic.getKvmNetworkLabel(), mgmtTraffic.getVmwareNetworkLabel(),
+ mgmtTraffic.getSimulatorNetworkLabel(), mgmtTraffic.getVlan());
+ s_logger.info("No storage traffic type was specified by admin, create default storage traffic on physical network "
+ + mgmtPhyNetwork.getId() + " with same configure of management traffic type");
+ }
+ } catch (InvalidParameterValueException ex) {
+ throw new InvalidParameterValueException("Cannot enable this Zone since: " + ex.getMessage());
+ }
}
+ _capacityDao.updateCapacityState(zone.getId(), null, null, null, allocationStateStr);
+ zone.setAllocationState(allocationState);
+ }
- try {
- _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(zoneId, TrafficType.Storage);
- } catch (InvalidParameterValueException noStorage) {
- PhysicalNetworkTrafficTypeVO mgmtTraffic = _trafficTypeDao.findBy(mgmtPhyNetwork.getId(),
- TrafficType.Management);
- _networkSvc.addTrafficTypeToPhysicalNetwork(mgmtPhyNetwork.getId(),
- TrafficType.Storage.toString(), mgmtTraffic.getXenNetworkLabel(),
- mgmtTraffic.getKvmNetworkLabel(), mgmtTraffic.getVmwareNetworkLabel(),
- mgmtTraffic.getSimulatorNetworkLabel(), mgmtTraffic.getVlan());
- s_logger.info("No storage traffic type was specified by admin, create default storage traffic on physical network "
- + mgmtPhyNetwork.getId() + " with same configure of management traffic type");
- }
- } catch (InvalidParameterValueException ex) {
- throw new InvalidParameterValueException("Cannot enable this Zone since: " + ex.getMessage());
+ if (dhcpProvider != null) {
+ zone.setDhcpProvider(dhcpProvider);
}
- }
- _capacityDao.updateCapacityState(zone.getId(), null, null, null, allocationStateStr);
- zone.setAllocationState(allocationState);
- }
- if (dhcpProvider != null) {
- zone.setDhcpProvider(dhcpProvider);
- }
-
- // update a private zone to public; not vice versa
- if (isPublic != null && isPublic) {
- zone.setDomainId(null);
- zone.setDomain(null);
-
- // release the dedication for this zone
- DedicatedResourceVO resource = _dedicatedDao.findByZoneId(zoneId);
- Long resourceId = null;
- if (resource != null) {
- resourceId = resource.getId();
- if (!_dedicatedDao.remove(resourceId)) {
- throw new CloudRuntimeException("Failed to delete dedicated Zone Resource " + resourceId);
+ // update a private zone to public; not vice versa
+ if (isPublic != null && isPublic) {
+ zone.setDomainId(null);
+ zone.setDomain(null);
+
+ // release the dedication for this zone
+ DedicatedResourceVO resource = _dedicatedDao.findByZoneId(zoneId);
+ Long resourceId = null;
+ if (resource != null) {
+ resourceId = resource.getId();
+ if (!_dedicatedDao.remove(resourceId)) {
+ throw new CloudRuntimeException("Failed to delete dedicated Zone Resource " + resourceId);
+ }
+ // find the group associated and check if there are any more
+ // resources under that group
+ List<DedicatedResourceVO> resourcesInGroup = _dedicatedDao.listByAffinityGroupId(resource.getAffinityGroupId());
+ if (resourcesInGroup.isEmpty()) {
+ // delete the group
+ _affinityGroupService.deleteAffinityGroup(resource.getAffinityGroupId(), null, null, null);
+ }
+ }
}
- // find the group associated and check if there are any more
- // resources under that group
- List<DedicatedResourceVO> resourcesInGroup = _dedicatedDao.listByAffinityGroupId(resource.getAffinityGroupId());
- if (resourcesInGroup.isEmpty()) {
- // delete the group
- _affinityGroupService.deleteAffinityGroup(resource.getAffinityGroupId(), null, null, null);
+
+ if (!_zoneDao.update(zoneId, zone)) {
+ throw new CloudRuntimeException("Failed to edit zone. Please contact Cloud Support.");
}
}
- }
+ });
- if (!_zoneDao.update(zoneId, zone)) {
- throw new CloudRuntimeException("Failed to edit zone. Please contact Cloud Support.");
- }
-
- txn.commit();
return zone;
}
@Override
@DB
public DataCenterVO createZone(long userId, String zoneName, String dns1, String dns2, String internalDns1,
- String internalDns2, String guestCidr, String domain, Long domainId, NetworkType zoneType,
+ String internalDns2, String guestCidr, String domain, final Long domainId, NetworkType zoneType,
String allocationStateStr, String networkDomain, boolean isSecurityGroupEnabled,
boolean isLocalStorageEnabled, String ip6Dns1, String ip6Dns2) {
@@ -1809,43 +1826,40 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
byte[] bytes = (zoneName + System.currentTimeMillis()).getBytes();
String zoneToken = UUID.nameUUIDFromBytes(bytes).toString();
- Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
- // Create the new zone in the database
- DataCenterVO zone = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr,
- domain, domainId, zoneType, zoneToken, networkDomain, isSecurityGroupEnabled,
- isLocalStorageEnabled,
- ip6Dns1, ip6Dns2);
- if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
- Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
- zone.setAllocationState(allocationState);
- } else {
- // Zone will be disabled since 3.0. Admin should enable it after
- // physical network and providers setup.
- zone.setAllocationState(Grouping.AllocationState.Disabled);
- }
- zone = _zoneDao.persist(zone);
- if (domainId != null) {
- // zone is explicitly dedicated to this domain
- // create affinity group associated and dedicate the zone.
- AffinityGroup group = createDedicatedAffinityGroup(null, domainId, null);
- DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(zone.getId(), null, null, null,
- domainId, null, group.getId());
- _dedicatedDao.persist(dedicatedResource);
- }
-
- // Create default system networks
- createDefaultSystemNetworks(zone.getId());
- txn.commit();
- return zone;
- } catch (Exception ex) {
- txn.rollback();
- s_logger.warn("Exception: ", ex);
- throw new CloudRuntimeException("Fail to create a network");
- } finally {
- txn.close();
- }
+
+ // Create the new zone in the database
+ final DataCenterVO zoneFinal = new DataCenterVO(zoneName, null, dns1, dns2, internalDns1, internalDns2, guestCidr,
+ domain, domainId, zoneType, zoneToken, networkDomain, isSecurityGroupEnabled,
+ isLocalStorageEnabled,
+ ip6Dns1, ip6Dns2);
+ if (allocationStateStr != null && !allocationStateStr.isEmpty()) {
+ Grouping.AllocationState allocationState = Grouping.AllocationState.valueOf(allocationStateStr);
+ zoneFinal.setAllocationState(allocationState);
+ } else {
+ // Zone will be disabled since 3.0. Admin should enable it after
+ // physical network and providers setup.
+ zoneFinal.setAllocationState(Grouping.AllocationState.Disabled);
+ }
+
+ return Transaction.execute(new TransactionCallback<DataCenterVO>() {
+ @Override
+ public DataCenterVO doInTransaction(TransactionStatus status) {
+ DataCenterVO zone = _zoneDao.persist(zoneFinal);
+ if (domainId != null) {
+ // zone is explicitly dedicated to this domain
+ // create affinity group associated and dedicate the zone.
+ AffinityGroup group = createDedicatedAffinityGroup(null, domainId, null);
+ DedicatedResourceVO dedicatedResource = new DedicatedResourceVO(zone.getId(), null, null, null,
+ domainId, null, group.getId());
+ _dedicatedDao.persist(dedicatedResource);
+ }
+
+ // Create default system networks
+ createDefaultSystemNetworks(zone.getId());
+
+ return zone;
+ }
+ });
}
private AffinityGroup createDedicatedAffinityGroup(String affinityGroupName, Long domainId, Long accountId) {
@@ -2662,31 +2676,43 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
if (ipv4) {
checkOverlapPrivateIpRange(zoneId, startIP, endIP);
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
- if ((sameSubnet == null || sameSubnet.first() == false) && (network.getTrafficType()== TrafficType.Guest) && (network.getGuestType() == GuestType.Shared) && (_vlanDao.listVlansByNetworkId(networkId) != null)) {
- Map<Capability, String> dhcpCapabilities = _networkSvc.getNetworkOfferingServiceCapabilities(_networkOfferingDao.findById(network.getNetworkOfferingId()), Service.Dhcp);
- String supportsMultipleSubnets = dhcpCapabilities.get(Capability.DhcpAccrossMultipleSubnets);
- if (supportsMultipleSubnets == null || !Boolean.valueOf(supportsMultipleSubnets)) {
- throw new InvalidParameterValueException("The Dhcp serivice provider for this network dose not support the dhcp across multiple subnets");
- }
- s_logger.info("adding a new subnet to the network " + network.getId());
- } else if (sameSubnet != null) {
- // if it is same subnet the user might not send the vlan and the
- // netmask details. so we are
- // figuring out while validation and setting them here.
- newVlanGateway = sameSubnet.second().first();
- newVlanNetmask = sameSubnet.second().second();
- }
- Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, podId, startIP,
- endIP, newVlanGateway, newVlanNetmask, vlanId, vlanOwner, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
- // create an entry in the nic_secondary table. This will be the new
- // gateway that will be configured on the corresponding routervm.
-
- txn.commit();
+ return commitVlan(zoneId, podId, startIP, endIP, newVlanGateway, newVlanNetmask, vlanId,
+ forVirtualNetwork, networkId, physicalNetworkId, startIPv6, endIPv6, ip6Gateway, ip6Cidr, vlanOwner,
+ network, sameSubnet);
+ }
- return vlan;
+ private Vlan commitVlan(final Long zoneId, final Long podId, final String startIP, final String endIP, final String newVlanGatewayFinal,
+ final String newVlanNetmaskFinal, final String vlanId, final Boolean forVirtualNetwork, final Long networkId, final Long physicalNetworkId,
+ final String startIPv6, final String endIPv6, final String ip6Gateway, final String ip6Cidr, final Account vlanOwner, final Network network,
+ final Pair<Boolean, Pair<String, String>> sameSubnet) {
+ return Transaction.execute(new TransactionCallback<Vlan>() {
+ @Override
+ public Vlan doInTransaction(TransactionStatus status) {
+ String newVlanNetmask = newVlanNetmaskFinal;
+ String newVlanGateway = newVlanGatewayFinal;
+
+ if ((sameSubnet == null || sameSubnet.first() == false) && (network.getTrafficType()== TrafficType.Guest) && (network.getGuestType() == GuestType.Shared) && (_vlanDao.listVlansByNetworkId(networkId) != null)) {
+ Map<Capability, String> dhcpCapabilities = _networkSvc.getNetworkOfferingServiceCapabilities(_networkOfferingDao.findById(network.getNetworkOfferingId()), Service.Dhcp);
+ String supportsMultipleSubnets = dhcpCapabilities.get(Capability.DhcpAccrossMultipleSubnets);
+ if (supportsMultipleSubnets == null || !Boolean.valueOf(supportsMultipleSubnets)) {
+ throw new InvalidParameterValueException("The Dhcp serivice provider for this network dose not support the dhcp across multiple subnets");
+ }
+ s_logger.info("adding a new subnet to the network " + network.getId());
+ } else if (sameSubnet != null) {
+ // if it is same subnet the user might not send the vlan and the
+ // netmask details. so we are
+ // figuring out while validation and setting them here.
+ newVlanGateway = sameSubnet.second().first();
+ newVlanNetmask = sameSubnet.second().second();
+ }
+ Vlan vlan = createVlanAndPublicIpRange(zoneId, networkId, physicalNetworkId, forVirtualNetwork, podId, startIP,
+ endIP, newVlanGateway, newVlanNetmask, vlanId, vlanOwner, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
+ // create an entry in the nic_secondary table. This will be the new
+ // gateway that will be configured on the corresponding routervm.
+ return vlan;
+ }
+ });
}
public NetUtils.supersetOrSubset checkIfSubsetOrSuperset(String newVlanGateway, String newVlanNetmask, VlanVO vlan, String startIP,
@@ -3014,52 +3040,62 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
}
// Everything was fine, so persist the VLAN
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ VlanVO vlan = commitVlanAndIpRange(zoneId, networkId, physicalNetworkId, podId, startIP, endIP, vlanGateway,
+ vlanNetmask, vlanId, vlanOwner, vlanIp6Gateway, vlanIp6Cidr, ipv4, zone, vlanType, ipv6Range, ipRange);
- VlanVO vlan = new VlanVO(vlanType, vlanId, vlanGateway, vlanNetmask, zone.getId(), ipRange, networkId,
- physicalNetworkId, vlanIp6Gateway, vlanIp6Cidr, ipv6Range);
- s_logger.debug("Saving vlan range " + vlan);
- vlan = _vlanDao.persist(vlan);
+ return vlan;
+ }
- // IPv6 use a used ip map, is different from ipv4, no need to save
- // public ip range
- if (ipv4) {
- if (!savePublicIPRange(startIP, endIP, zoneId, vlan.getId(), networkId, physicalNetworkId)) {
- throw new CloudRuntimeException("Failed to save IPv4 range. Please contact Cloud Support.");
- }
- }
+ private VlanVO commitVlanAndIpRange(final long zoneId, final long networkId, final long physicalNetworkId, final Long podId,
+ final String startIP, final String endIP, final String vlanGateway, final String vlanNetmask, final String vlanId, final Account vlanOwner,
+ final String vlanIp6Gateway, final String vlanIp6Cidr, final boolean ipv4, final DataCenterVO zone, final VlanType vlanType,
+ final String ipv6Range, final String ipRange) {
+ return Transaction.execute(new TransactionCallback<VlanVO>() {
+ @Override
+ public VlanVO doInTransaction(TransactionStatus status) {
+ VlanVO vlan = new VlanVO(vlanType, vlanId, vlanGateway, vlanNetmask, zone.getId(), ipRange, networkId,
+ physicalNetworkId, vlanIp6Gateway, vlanIp6Cidr, ipv6Range);
+ s_logger.debug("Saving vlan range " + vlan);
+ vlan = _vlanDao.persist(vlan);
+
+ // IPv6 use a used ip map, is different from ipv4, no need to save
+ // public ip range
+ if (ipv4) {
+ if (!savePublicIPRange(startIP, endIP, zoneId, vlan.getId(), networkId, physicalNetworkId)) {
+ throw new CloudRuntimeException("Failed to save IPv4 range. Please contact Cloud Support.");
+ }
+ }
- if (vlanOwner != null) {
- // This VLAN is account-specific, so create an AccountVlanMapVO
- // entry
- AccountVlanMapVO accountVlanMapVO = new AccountVlanMapVO(vlanOwner.getId(), vlan.getId());
- _accountVlanMapDao.persist(accountVlanMapVO);
+ if (vlanOwner != null) {
+ // This VLAN is account-specific, so create an AccountVlanMapVO
+ // entry
+ AccountVlanMapVO accountVlanMapVO = new AccountVlanMapVO(vlanOwner.getId(), vlan.getId());
+ _accountVlanMapDao.persist(accountVlanMapVO);
- // generate usage event for dedication of every ip address in the
- // range
- List<IPAddressVO> ips = _publicIpAddressDao.listByVlanId(vlan.getId());
- for (IPAddressVO ip : ips) {
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip
- .getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(), vlan
- .getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid());
+ // generate usage event for dedication of every ip address in the
+ // range
+ List<IPAddressVO> ips = _publicIpAddressDao.listByVlanId(vlan.getId());
+ for (IPAddressVO ip : ips) {
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip
+ .getDataCenterId(), ip.getId(), ip.getAddress().toString(), ip.isSourceNat(), vlan
+ .getVlanType().toString(), ip.getSystem(), ip.getClass().getName(), ip.getUuid());
+ }
+ // increment resource count for dedicated public ip's
+ _resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size()));
+ } else if (podId != null) {
+ // This VLAN is pod-wide, so create a PodVlanMapVO entry
+ PodVlanMapVO podVlanMapVO = new PodVlanMapVO(podId, vlan.getId());
+ _podVlanMapDao.persist(podVlanMapVO);
+ }
+ return vlan;
}
- // increment resource count for dedicated public ip's
- _resourceLimitMgr.incrementResourceCount(vlanOwner.getId(), ResourceType.public_ip, new Long(ips.size()));
- } else if (podId != null) {
- // This VLAN is pod-wide, so create a PodVlanMapVO entry
- PodVlanMapVO podVlanMapVO = new PodVlanMapVO(podId, vlan.getId());
- _podVlanMapDao.persist(podVlanMapVO);
- }
+ });
- txn.commit();
-
- return vlan;
}
@Override
@DB
- public boolean deleteVlanAndPublicIpRange(long userId, long vlanDbId, Account caller) {
+ public boolean deleteVlanAndPublicIpRange(long userId, final long vlanDbId, Account caller) {
VlanVO vlanRange = _vlanDao.findById(vlanDbId);
if (vlanRange == null) {
throw new InvalidParameterValueException("Please specify a valid IP range id.");
@@ -3146,12 +3182,13 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
}
}
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _publicIpAddressDao.deletePublicIPRange(vlanDbId);
- _vlanDao.expunge(vlanDbId);
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _publicIpAddressDao.deletePublicIPRange(vlanDbId);
+ _vlanDao.expunge(vlanDbId);
+ }
+ });
return true;
}
@@ -3229,15 +3266,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
}
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
// Create an AccountVlanMapVO entry
AccountVlanMapVO accountVlanMapVO = new AccountVlanMapVO(vlanOwner.getId(), vlan.getId());
_accountVlanMapDao.persist(accountVlanMapVO);
- txn.commit();
-
// generate usage event for dedication of every ip address in the range
for (IPAddressVO ip : ips) {
UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN, vlanOwner.getId(), ip.getDataCenterId(),
@@ -3332,16 +3364,20 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
}
@DB
- protected boolean savePublicIPRange(String startIP, String endIP, long zoneId, long vlanDbId, long sourceNetworkid,
- long physicalNetworkId) {
- long startIPLong = NetUtils.ip2Long(startIP);
- long endIPLong = NetUtils.ip2Long(endIP);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- IPRangeConfig config = new IPRangeConfig();
- List<String> problemIps = config.savePublicIPRange(txn, startIPLong, endIPLong, zoneId, vlanDbId,
- sourceNetworkid, physicalNetworkId);
- txn.commit();
+ protected boolean savePublicIPRange(String startIP, String endIP, final long zoneId, final long vlanDbId, final long sourceNetworkid,
+ final long physicalNetworkId) {
+ final long startIPLong = NetUtils.ip2Long(startIP);
+ final long endIPLong = NetUtils.ip2Long(endIP);
+
+ List<String> problemIps = Transaction.execute(new TransactionCallback<List<String>>() {
+ @Override
+ public List<String> doInTransaction(TransactionStatus status) {
+ IPRangeConfig config = new IPRangeConfig();
+ return config.savePublicIPRange(TransactionLegacy.currentTxn(), startIPLong, endIPLong, zoneId, vlanDbId,
+ sourceNetworkid, physicalNetworkId);
+ }
+ });
+
return problemIps != null && problemIps.size() == 0;
}
@@ -3957,10 +3993,10 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@DB
public NetworkOfferingVO createNetworkOffering(String name, String displayText, TrafficType trafficType,
String tags, boolean specifyVlan, Availability availability, Integer networkRate,
- Map<Service, Set<Provider>> serviceProviderMap, boolean isDefault, Network.GuestType type,
+ final Map<Service, Set<Provider>> serviceProviderMap, boolean isDefault, Network.GuestType type,
boolean systemOnly, Long serviceOfferingId, boolean conserveMode,
Map<Service, Map<Capability, String>> serviceCapabilityMap, boolean specifyIpRanges, boolean isPersistent,
- Map<NetworkOffering.Detail, String> details, boolean egressDefaultPolicy, Integer maxconn) {
+ final Map<NetworkOffering.Detail, String> details, boolean egressDefaultPolicy, final Integer maxconn) {
String multicastRateStr = _configDao.getValue("multicast.throttling.rate");
int multicastRate = ((multicastRateStr == null) ? 10 : Integer.parseInt(multicastRateStr));
@@ -4100,13 +4136,13 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
publicLb = true;
}
- NetworkOfferingVO offering = new NetworkOfferingVO(name, displayText, trafficType, systemOnly, specifyVlan,
+ final NetworkOfferingVO offeringFinal = new NetworkOfferingVO(name, displayText, trafficType, systemOnly, specifyVlan,
networkRate, multicastRate, isDefault, availability, tags, type, conserveMode, dedicatedLb,
sharedSourceNat, redundantRouter, elasticIp, elasticLb, specifyIpRanges, inline, isPersistent,
associatePublicIp, publicLb, internalLb, egressDefaultPolicy);
if (serviceOfferingId != null) {
- offering.setServiceOfferingId(serviceOfferingId);
+ offeringFinal.setServiceOfferingId(serviceOfferingId);
}
// validate the details
@@ -4114,46 +4150,49 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
validateNtwkOffDetails(details, serviceProviderMap);
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
- // 1) create network offering object
- s_logger.debug("Adding network offering " + offering);
- offering.setConcurrentConnections(maxconn);
- offering = _networkOfferingDao.persist(offering, details);
- // 2) populate services and providers
- if (serviceProviderMap != null) {
- for (Network.Service service : serviceProviderMap.keySet()) {
- Set<Provider> providers = serviceProviderMap.get(service);
- if (providers != null && !providers.isEmpty()) {
- boolean vpcOff = false;
- for (Network.Provider provider : providers) {
- if (provider == Provider.VPCVirtualRouter) {
- vpcOff = true;
+ return Transaction.execute(new TransactionCallback<NetworkOfferingVO>() {
+ @Override
+ public NetworkOfferingVO doInTransaction(TransactionStatus status) {
+ NetworkOfferingVO offering = offeringFinal;
+
+ // 1) create network offering object
+ s_logger.debug("Adding network offering " + offering);
+ offering.setConcurrentConnections(maxconn);
+ offering = _networkOfferingDao.persist(offering, details);
+ // 2) populate services and providers
+ if (serviceProviderMap != null) {
+ for (Network.Service service : serviceProviderMap.keySet()) {
+ Set<Provider> providers = serviceProviderMap.get(service);
+ if (providers != null && !providers.isEmpty()) {
+ boolean vpcOff = false;
+ for (Network.Provider provider : providers) {
+ if (provider == Provider.VPCVirtualRouter) {
+ vpcOff = true;
+ }
+ NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(offering.getId(),
+ service, provider);
+ _ntwkOffServiceMapDao.persist(offService);
+ s_logger.trace("Added service for the network offering: " + offService + " with provider "
+ + provider.getName());
+ }
+
+ if (vpcOff) {
+ List<Service> supportedSvcs = new ArrayList<Service>();
+ supportedSvcs.addAll(serviceProviderMap.keySet());
+ _vpcMgr.validateNtwkOffForVpc(offering, supportedSvcs);
+ }
+ } else {
+ NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(offering.getId(), service,
+ null);
+ _ntwkOffServiceMapDao.persist(offService);
+ s_logger.trace("Added service for the network offering: " + offService + " with null provider");
}
- NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(offering.getId(),
- service, provider);
- _ntwkOffServiceMapDao.persist(offService);
- s_logger.trace("Added service for the network offering: " + offService + " with provider "
- + provider.getName());
- }
-
- if (vpcOff) {
- List<Service> supportedSvcs = new ArrayList<Service>();
- supportedSvcs.addAll(serviceProviderMap.keySet());
- _vpcMgr.validateNtwkOffForVpc(offering, supportedSvcs);
}
- } else {
- NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(offering.getId(), service,
- null);
- _ntwkOffServiceMapDao.persist(offService);
- s_logger.trace("Added service for the network offering: " + offService + " with null provider");
}
- }
- }
-
- txn.commit();
- return offering;
+ return offering;
+ }
+ });
}
protected void validateNtwkOffDetails(Map<Detail, String> details, Map<Service, Set<Provider>> serviceProviderMap) {
@@ -4680,27 +4719,29 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@Override
@DB
- public boolean releaseAccountSpecificVirtualRanges(long accountId) {
- List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(accountId);
- boolean result = true;
+ public boolean releaseAccountSpecificVirtualRanges(final long accountId) {
+ final List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(accountId);
if (maps != null && !maps.isEmpty()) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- for (AccountVlanMapVO map : maps) {
- if (!releasePublicIpRange(map.getVlanDbId(), _accountMgr.getSystemUser().getId(),
- _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM))) {
- result = false;
- }
- }
- if (result) {
- txn.commit();
- } else {
- s_logger.error("Failed to release account specific virtual ip ranges for account id=" + accountId);
+ try {
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (AccountVlanMapVO map : maps) {
+ if (!releasePublicIpRange(map.getVlanDbId(), _accountMgr.getSystemUser().getId(),
+ _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM))) {
+ throw new CloudRuntimeException("Failed to release account specific virtual ip ranges for account id=" + accountId);
+ }
+ }
+ }
+ });
+ } catch ( CloudRuntimeException e ) {
+ s_logger.error(e);
+ return false;
}
} else {
s_logger.trace("Account id=" + accountId + " has no account specific virtual ip ranges, nothing to release");
}
- return result;
+ return true;
}
@Override
@@ -4771,14 +4812,14 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
@ActionEvent(eventType = EventTypes.EVENT_PORTABLE_IP_RANGE_CREATE,
eventDescription = "creating portable ip range", async = false)
public PortableIpRange createPortableIpRange(CreatePortableIpRangeCmd cmd) throws ConcurrentOperationException {
- Integer regionId = cmd.getRegionId();
- String startIP = cmd.getStartIp();
- String endIP = cmd.getEndIp();
- String gateway = cmd.getGateway();
- String netmask = cmd.getNetmask();
+ final Integer regionId = cmd.getRegionId();
+ final String startIP = cmd.getStartIp();
+ final String endIP = cmd.getEndIp();
+ final String gateway = cmd.getGateway();
+ final String netmask = cmd.getNetmask();
String vlanId = cmd.getVlan();
- RegionVO region = _regionDao.findById(regionId);
+ final RegionVO region = _regionDao.findById(regionId);
if (region == null) {
throw new InvalidParameterValueException("Invalid region ID: " + regionId);
}
@@ -4822,28 +4863,33 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati
}
GlobalLock portableIpLock = GlobalLock.getInternLock("PortablePublicIpRange");
portableIpLock.lock(5);
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- PortableIpRangeVO portableIpRange = new PortableIpRangeVO(regionId, vlanId, gateway, netmask, startIP, endIP);
- portableIpRange = _portableIpRangeDao.persist(portableIpRange);
+ try {
+ final String vlanIdFinal = vlanId;
+ return Transaction.execute(new TransactionCallback<PortableIpRangeVO>() {
+ @Override
+ public PortableIpRangeVO doInTransaction(TransactionStatus status) {
+ PortableIpRangeVO portableIpRange = new PortableIpRangeVO(regionId, vlanIdFinal, gateway, netmask, startIP, endIP);
+ portableIpRange = _portableIpRangeDao.persist(portableIpRange);
+
+ long startIpLong = NetUtils.ip2Long(startIP);
+ long endIpLong = NetUtils.ip2Long(endIP);
+ while (startIpLong <= endIpLong) {
+ PortableIpVO portableIP = new PortableIpVO(regionId, portableIpRange.getId(), vlanIdFinal, gateway, netmask,
+ NetUtils.long2Ip(startIpLong));
+ _portableIpDao.persist(portableIP);
+ startIpLong++;
+ }
- long startIpLong = NetUtils.ip2Long(startIP);
- long endIpLong = NetUtils.ip2Long(endIP);
- while (startIpLong <= endIpLong) {
- PortableIpVO portableIP = new PortableIpVO(regionId, portableIpRange.getId(), vlanId, gateway, netmask,
- NetUtils.long2Ip(startIpLong));
- _portableIpDao.persist(portableIP);
- startIpLong++;
+ // implicitly enable portable IP service for the region
+ region.setPortableipEnabled(true);
+ _regionDao.update(region.getId(), region);
+
+ return portableIpRange;
+ }
+ });
+ } finally {
+ portableIpLock.unlock();
}
-
- // implicitly enable portable IP service for the region
- region.setPortableipEnabled(true);
- _regionDao.update(region.getId(), region);
-
- txn.commit();
- portableIpLock.unlock();
- return portableIpRange;
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
index 030a31f..e55477a 100755
--- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
+++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
@@ -118,6 +118,8 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.QueryBuilder;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.events.SubscriptionMgr;
@@ -569,10 +571,10 @@ VirtualMachineGuru, SystemVmLoadScanHandler<Long>, ResourceStateAdapter {
} catch (ResourceUnavailableException e) {
s_logger.warn("Exception while trying to start console proxy", e);
return null;
- } catch (CloudRuntimeException e) {
+ } catch (ConcurrentOperationException e) {
s_logger.warn("Runtime Exception while trying to start console proxy", e);
return null;
- } catch (ConcurrentOperationException e) {
+ } catch (CloudRuntimeException e) {
s_logger.warn("Runtime Exception while trying to start console proxy", e);
return null;
} catch (OperationTimedoutException e) {
@@ -1049,25 +1051,24 @@ VirtualMachineGuru, SystemVmLoadScanHandler<Long>, ResourceStateAdapter {
@Override
@DB
- public void setManagementState(ConsoleProxyManagementState state) {
- Transaction txn = Transaction.currentTxn();
+ public void setManagementState(final ConsoleProxyManagementState state) {
try {
- txn.start();
-
- ConsoleProxyManagementState lastState = getManagementState();
+ final ConsoleProxyManagementState lastState = getManagementState();
if (lastState == null) {
- txn.commit();
return;
}
if (lastState != state) {
- _configDao.update(Config.ConsoleProxyManagementLastState.key(), Config.ConsoleProxyManagementLastState.getCategory(), lastState.toString());
- _configDao.update(Config.ConsoleProxyManagementState.key(), Config.ConsoleProxyManagementState.getCategory(), state.toString());
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _configDao.update(Config.ConsoleProxyManagementLastState.key(), Config.ConsoleProxyManagementLastState.getCategory(), lastState.toString());
+ _configDao.update(Config.ConsoleProxyManagementState.key(), Config.ConsoleProxyManagementState.getCategory(), state.toString());
+ }
+ });
}
-
- txn.commit();
} catch (Throwable e) {
- txn.rollback();
+ s_logger.error("Failed to set managment state", e);
}
}
@@ -1090,23 +1091,18 @@ VirtualMachineGuru, SystemVmLoadScanHandler<Long>, ResourceStateAdapter {
@Override
@DB
public void resumeLastManagementState() {
- Transaction txn = Transaction.currentTxn();
try {
- txn.start();
ConsoleProxyManagementState state = getManagementState();
ConsoleProxyManagementState lastState = getLastManagementState();
if (lastState == null) {
- txn.commit();
return;
}
if (lastState != state) {
_configDao.update(Config.ConsoleProxyManagementState.key(), Config.ConsoleProxyManagementState.getCategory(), lastState.toString());
}
-
- txn.commit();
} catch (Throwable e) {
- txn.rollback();
+ s_logger.error("Failed to resume last management state", e);
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java b/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java
index 1936b85..3902847 100644
--- a/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java
+++ b/server/src/com/cloud/dc/dao/DedicatedResourceDaoImpl.java
@@ -29,6 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
@@ -338,7 +339,7 @@ public class DedicatedResourceDaoImpl extends GenericDaoBase<DedicatedResourceVO
@Override
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
DedicatedResourceVO resource = createForUpdate();
update(id, resource);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
index dcfb24c..98b74d1 100644
--- a/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
+++ b/server/src/com/cloud/deploy/DeploymentPlanningManagerImpl.java
@@ -99,6 +99,9 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.fsm.StateListener;
import com.cloud.vm.DiskProfile;
@@ -540,7 +543,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
}
@DB
- private boolean checkIfHostFitsPlannerUsage(long hostId, PlannerResourceUsage resourceUsageRequired) {
+ private boolean checkIfHostFitsPlannerUsage(final long hostId, final PlannerResourceUsage resourceUsageRequired) {
// TODO Auto-generated method stub
// check if this host has been picked up by some other planner
// exclusively
@@ -550,7 +553,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
PlannerHostReservationVO reservationEntry = _plannerHostReserveDao.findByHostId(hostId);
if (reservationEntry != null) {
- long id = reservationEntry.getId();
+ final long id = reservationEntry.getId();
PlannerResourceUsage hostResourceType = reservationEntry.getResourceUsage();
if (hostResourceType != null) {
@@ -562,36 +565,35 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
return false;
}
} else {
+ final PlannerResourceUsage hostResourceTypeFinal = hostResourceType;
// reserve the host for required resourceType
// let us lock the reservation entry before updating.
- final Transaction txn = Transaction.currentTxn();
-
- try {
- txn.start();
-
- final PlannerHostReservationVO lockedEntry = _plannerHostReserveDao.lockRow(id, true);
- if (lockedEntry == null) {
- s_logger.error("Unable to lock the host entry for reservation, host: " + hostId);
- return false;
- }
- // check before updating
- if (lockedEntry.getResourceUsage() == null) {
- lockedEntry.setResourceUsage(resourceUsageRequired);
- _plannerHostReserveDao.persist(lockedEntry);
- return true;
- } else {
- // someone updated it earlier. check if we can still use it
- if (lockedEntry.getResourceUsage() == resourceUsageRequired) {
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ final PlannerHostReservationVO lockedEntry = _plannerHostReserveDao.lockRow(id, true);
+ if (lockedEntry == null) {
+ s_logger.error("Unable to lock the host entry for reservation, host: " + hostId);
+ return false;
+ }
+ // check before updating
+ if (lockedEntry.getResourceUsage() == null) {
+ lockedEntry.setResourceUsage(resourceUsageRequired);
+ _plannerHostReserveDao.persist(lockedEntry);
return true;
} else {
- s_logger.debug("Cannot use this host for usage: " + resourceUsageRequired
- + ", since this host has been reserved for planner usage : " + hostResourceType);
- return false;
+ // someone updated it earlier. check if we can still use it
+ if (lockedEntry.getResourceUsage() == resourceUsageRequired) {
+ return true;
+ } else {
+ s_logger.debug("Cannot use this host for usage: " + resourceUsageRequired
+ + ", since this host has been reserved for planner usage : " + hostResourceTypeFinal);
+ return false;
+ }
}
}
- } finally {
- txn.commit();
- }
+ });
+
}
}
@@ -600,7 +602,7 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
}
@DB
- public boolean checkHostReservationRelease(Long hostId) {
+ public boolean checkHostReservationRelease(final Long hostId) {
if (hostId != null) {
PlannerHostReservationVO reservationEntry = _plannerHostReserveDao.findByHostId(hostId);
@@ -662,26 +664,26 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
s_logger.debug("Host has no VMs associated, releasing the planner reservation for host " + hostId);
}
- long id = reservationEntry.getId();
- final Transaction txn = Transaction.currentTxn();
+ final long id = reservationEntry.getId();
- try {
- txn.start();
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ final PlannerHostReservationVO lockedEntry = _plannerHostReserveDao.lockRow(id, true);
+ if (lockedEntry == null) {
+ s_logger.error("Unable to lock the host entry for reservation, host: " + hostId);
+ return false;
+ }
+ // check before updating
+ if (lockedEntry.getResourceUsage() != null) {
+ lockedEntry.setResourceUsage(null);
+ _plannerHostReserveDao.persist(lockedEntry);
+ return true;
+ }
- final PlannerHostReservationVO lockedEntry = _plannerHostReserveDao.lockRow(id, true);
- if (lockedEntry == null) {
- s_logger.error("Unable to lock the host entry for reservation, host: " + hostId);
return false;
}
- // check before updating
- if (lockedEntry.getResourceUsage() != null) {
- lockedEntry.setResourceUsage(null);
- _plannerHostReserveDao.persist(lockedEntry);
- return true;
- }
- } finally {
- txn.commit();
- }
+ });
}
}
@@ -1230,50 +1232,51 @@ public class DeploymentPlanningManagerImpl extends ManagerBase implements Deploy
@DB
@Override
- public String finalizeReservation(DeployDestination plannedDestination,
- VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids)
+ public String finalizeReservation(final DeployDestination plannedDestination,
+ final VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoids)
throws InsufficientServerCapacityException, AffinityConflictException {
- VirtualMachine vm = vmProfile.getVirtualMachine();
- long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId());
+ final VirtualMachine vm = vmProfile.getVirtualMachine();
+ final long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId());
- boolean saveReservation = true;
- final Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
- if (vmGroupCount > 0) {
- List<Long> groupIds = _affinityGroupVMMapDao.listAffinityGroupIdsByVmId(vm.getId());
- SearchCriteria<AffinityGroupVO> criteria = _affinityGroupDao.createSearchCriteria();
- criteria.addAnd("id", SearchCriteria.Op.IN, groupIds.toArray(new Object[groupIds.size()]));
- List<AffinityGroupVO> groups = _affinityGroupDao.lockRows(criteria, null, true);
-
- for (AffinityGroupProcessor processor : _affinityProcessors) {
- if (!processor.check(vmProfile, plannedDestination)) {
- saveReservation = false;
- break;
+ return Transaction.execute(new TransactionCallback<String>() {
+ @Override
+ public String doInTransaction(TransactionStatus status) {
+ boolean saveReservation = true;
+
+ if (vmGroupCount > 0) {
+ List<Long> groupIds = _affinityGroupVMMapDao.listAffinityGroupIdsByVmId(vm.getId());
+ SearchCriteria<AffinityGroupVO> criteria = _affinityGroupDao.createSearchCriteria();
+ criteria.addAnd("id", SearchCriteria.Op.IN, groupIds.toArray(new Object[groupIds.size()]));
+ List<AffinityGroupVO> groups = _affinityGroupDao.lockRows(criteria, null, true);
+
+ for (AffinityGroupProcessor processor : _affinityProcessors) {
+ if (!processor.check(vmProfile, plannedDestination)) {
+ saveReservation = false;
+ break;
+ }
}
}
- }
- if (saveReservation) {
- VMReservationVO vmReservation = new VMReservationVO(vm.getId(), plannedDestination.getDataCenter()
- .getId(), plannedDestination.getPod().getId(), plannedDestination.getCluster().getId(),
- plannedDestination.getHost().getId());
- Map<Long, Long> volumeReservationMap = new HashMap<Long, Long>();
+ if (saveReservation) {
+ VMReservationVO vmReservation = new VMReservationVO(vm.getId(), plannedDestination.getDataCenter()
+ .getId(), plannedDestination.getPod().getId(), plannedDestination.getCluster().getId(),
+ plannedDestination.getHost().getId());
+ Map<Long, Long> volumeReservationMap = new HashMap<Long, Long>();
- if (vm.getHypervisorType() != HypervisorType.BareMetal) {
- for (Volume vo : plannedDestination.getStorageForDisks().keySet()) {
- volumeReservationMap.put(vo.getId(), plannedDestination.getStorageForDisks().get(vo).getId());
+ if (vm.getHypervisorType() != HypervisorType.BareMetal) {
+ for (Volume vo : plannedDestination.getStorageForDisks().keySet()) {
+ volumeReservationMap.put(vo.getId(), plannedDestination.getStorageForDisks().get(vo).getId());
+ }
+ vmReservation.setVolumeReservation(volumeReservationMap);
}
- vmReservation.setVolumeReservation(volumeReservationMap);
+ _reservationDao.persist(vmReservation);
+ return vmReservation.getUuid();
}
- _reservationDao.persist(vmReservation);
- return vmReservation.getUuid();
+
+ return null;
}
- } finally {
- txn.commit();
- }
- return null;
+ });
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
index 1107a7a..801e7da 100644
--- a/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerExtImpl.java
@@ -24,14 +24,13 @@ import javax.ejb.Local;
import javax.inject.Inject;
import javax.naming.ConfigurationException;
-import org.springframework.context.annotation.Primary;
-import org.springframework.stereotype.Component;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
import com.cloud.alert.AlertManager;
import com.cloud.usage.dao.UsageJobDao;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Local(value={HighAvailabilityManager.class})
public class HighAvailabilityManagerExtImpl extends HighAvailabilityManagerImpl {
@@ -74,7 +73,7 @@ public class HighAvailabilityManagerExtImpl extends HighAvailabilityManagerImpl
try {
boolean isRunning = false;
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
try {
Date lastHeartbeat = _usageJobDao.getLastHeartbeat();
if (lastHeartbeat != null) {
@@ -91,7 +90,7 @@ public class HighAvailabilityManagerExtImpl extends HighAvailabilityManagerImpl
txn.close();
// switch back to VMOPS db
- Transaction swap = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy swap = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
swap.close();
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java b/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
index 83a71b8..d800483 100644
--- a/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
+++ b/server/src/com/cloud/ha/dao/HighAvailabilityDaoImpl.java
@@ -33,6 +33,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -130,7 +131,7 @@ public class HighAvailabilityDaoImpl extends GenericDaoBase<HaWorkVO, Long> impl
@Override
public HaWorkVO take(final long serverId) {
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
final SearchCriteria<HaWorkVO> sc = TBASearch.create();
sc.setParameters("time", System.currentTimeMillis() >> 10);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
index 5481ebb..6f43c96 100644
--- a/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
+++ b/server/src/com/cloud/metadata/ResourceMetaDataManagerImpl.java
@@ -36,6 +36,7 @@ import com.cloud.vm.UserVmDetailVO;
import com.cloud.vm.dao.NicDao;
import com.cloud.vm.dao.NicDetailDao;
import com.cloud.vm.dao.UserVmDetailsDao;
+
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@@ -66,6 +67,8 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDao;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.uuididentity.dao.IdentityDao;
import com.cloud.vm.dao.UserVmDao;
import com.cloud.vm.snapshot.dao.VMSnapshotDao;
@@ -190,51 +193,50 @@ public class ResourceMetaDataManagerImpl extends ManagerBase implements Resource
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_RESOURCE_DETAILS_CREATE, eventDescription = "creating resource meta data")
- public boolean addResourceMetaData(String resourceId, TaggedResourceType resourceType, Map<String, String> details){
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ public boolean addResourceMetaData(final String resourceId, final TaggedResourceType resourceType, final Map<String, String> details){
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ for (String key : details.keySet()) {
+ Long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
+
+ //check if object exists
+ if (_daoMap.get(resourceType).findById(id) == null) {
+ throw new InvalidParameterValueException("Unable to find resource by id " + resourceId +
+ " and type " + resourceType);
+ }
+
+ String value = details.get(key);
+
+ if (value == null || value.isEmpty()) {
+ throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty");
+ }
+
+ // TODO - Have a better design here.
+ if(resourceType == TaggedResourceType.Volume){
+ VolumeDetailVO v = new VolumeDetailVO(id, key, value);
+ _volumeDetailDao.persist(v);
+ } else if (resourceType == TaggedResourceType.Nic){
+ NicDetailVO n = new NicDetailVO(id, key, value);
+ _nicDetailDao.persist(n);
+ }else if (resourceType == TaggedResourceType.UserVm){
+ UserVmDetailVO userVmDetail = new UserVmDetailVO(id, key, value);
+ _userVmDetailDao.persist(userVmDetail);
+ } else if (resourceType == TaggedResourceType.Zone){
+ DcDetailVO dataCenterDetail = new DcDetailVO(id, key, value);
+ _dcDetailsDao.persist(dataCenterDetail);
+ } else if (resourceType == TaggedResourceType.Network){
+ NetworkDetailVO networkDetail = new NetworkDetailVO(id, key, value);
+ _networkDetailsDao.persist(networkDetail);
+ } else {
+ throw new InvalidParameterValueException("The resource type " + resourceType + " is not supported by the API yet");
+ }
- for (String key : details.keySet()) {
- Long id = _taggedResourceMgr.getResourceId(resourceId, resourceType);
-
- //check if object exists
- if (_daoMap.get(resourceType).findById(id) == null) {
- throw new InvalidParameterValueException("Unable to find resource by id " + resourceId +
- " and type " + resourceType);
}
- String value = details.get(key);
-
- if (value == null || value.isEmpty()) {
- throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty");
- }
-
- // TODO - Have a better design here.
- if(resourceType == TaggedResourceType.Volume){
- VolumeDetailVO v = new VolumeDetailVO(id, key, value);
- _volumeDetailDao.persist(v);
- } else if (resourceType == TaggedResourceType.Nic){
- NicDetailVO n = new NicDetailVO(id, key, value);
- _nicDetailDao.persist(n);
- }else if (resourceType == TaggedResourceType.UserVm){
- UserVmDetailVO userVmDetail = new UserVmDetailVO(id, key, value);
- _userVmDetailDao.persist(userVmDetail);
- } else if (resourceType == TaggedResourceType.Zone){
- DcDetailVO dataCenterDetail = new DcDetailVO(id, key, value);
- _dcDetailsDao.persist(dataCenterDetail);
- } else if (resourceType == TaggedResourceType.Network){
- NetworkDetailVO networkDetail = new NetworkDetailVO(id, key, value);
- _networkDetailsDao.persist(networkDetail);
- } else {
- throw new InvalidParameterValueException("The resource type " + resourceType + " is not supported by the API yet");
- }
-
- }
-
- txn.commit();
-
- return true;
+ return true;
+ }
+ });
}
[06/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/vpc/VpcManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
index 651e82c..8ab06b8 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -118,9 +118,14 @@ import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.exception.ExceptionUtil;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.ReservationContext;
import com.cloud.vm.ReservationContextImpl;
@@ -206,50 +211,50 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
@DB
public boolean configure(String name, Map<String, Object> params) throws ConfigurationException {
//configure default vpc offering
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- if (_vpcOffDao.findByUniqueName(VpcOffering.defaultVPCOfferingName) == null) {
- s_logger.debug("Creating default VPC offering " + VpcOffering.defaultVPCOfferingName);
-
- Map<Service, Set<Provider>> svcProviderMap = new HashMap<Service, Set<Provider>>();
- Set<Provider> defaultProviders = new HashSet<Provider>();
- defaultProviders.add(Provider.VPCVirtualRouter);
- for (Service svc : getSupportedServices()) {
- if (svc == Service.Lb) {
- Set<Provider> lbProviders = new HashSet<Provider>();
- lbProviders.add(Provider.VPCVirtualRouter);
- lbProviders.add(Provider.InternalLbVm);
- svcProviderMap.put(svc, lbProviders);
- } else {
- svcProviderMap.put(svc, defaultProviders);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ if (_vpcOffDao.findByUniqueName(VpcOffering.defaultVPCOfferingName) == null) {
+ s_logger.debug("Creating default VPC offering " + VpcOffering.defaultVPCOfferingName);
+
+ Map<Service, Set<Provider>> svcProviderMap = new HashMap<Service, Set<Provider>>();
+ Set<Provider> defaultProviders = new HashSet<Provider>();
+ defaultProviders.add(Provider.VPCVirtualRouter);
+ for (Service svc : getSupportedServices()) {
+ if (svc == Service.Lb) {
+ Set<Provider> lbProviders = new HashSet<Provider>();
+ lbProviders.add(Provider.VPCVirtualRouter);
+ lbProviders.add(Provider.InternalLbVm);
+ svcProviderMap.put(svc, lbProviders);
+ } else {
+ svcProviderMap.put(svc, defaultProviders);
+ }
+ }
+ createVpcOffering(VpcOffering.defaultVPCOfferingName, VpcOffering.defaultVPCOfferingName, svcProviderMap,
+ true, State.Enabled);
}
- }
- createVpcOffering(VpcOffering.defaultVPCOfferingName, VpcOffering.defaultVPCOfferingName, svcProviderMap,
- true, State.Enabled);
- }
-
- //configure default vpc offering with Netscaler as LB Provider
- if (_vpcOffDao.findByUniqueName(VpcOffering.defaultVPCNSOfferingName ) == null) {
- s_logger.debug("Creating default VPC offering with Netscaler as LB Provider" + VpcOffering.defaultVPCNSOfferingName);
- Map<Service, Set<Provider>> svcProviderMap = new HashMap<Service, Set<Provider>>();
- Set<Provider> defaultProviders = new HashSet<Provider>();
- defaultProviders.add(Provider.VPCVirtualRouter);
- for (Service svc : getSupportedServices()) {
- if (svc == Service.Lb) {
- Set<Provider> lbProviders = new HashSet<Provider>();
- lbProviders.add(Provider.Netscaler);
- lbProviders.add(Provider.InternalLbVm);
- svcProviderMap.put(svc, lbProviders);
- } else {
- svcProviderMap.put(svc, defaultProviders);
+
+ //configure default vpc offering with Netscaler as LB Provider
+ if (_vpcOffDao.findByUniqueName(VpcOffering.defaultVPCNSOfferingName ) == null) {
+ s_logger.debug("Creating default VPC offering with Netscaler as LB Provider" + VpcOffering.defaultVPCNSOfferingName);
+ Map<Service, Set<Provider>> svcProviderMap = new HashMap<Service, Set<Provider>>();
+ Set<Provider> defaultProviders = new HashSet<Provider>();
+ defaultProviders.add(Provider.VPCVirtualRouter);
+ for (Service svc : getSupportedServices()) {
+ if (svc == Service.Lb) {
+ Set<Provider> lbProviders = new HashSet<Provider>();
+ lbProviders.add(Provider.Netscaler);
+ lbProviders.add(Provider.InternalLbVm);
+ svcProviderMap.put(svc, lbProviders);
+ } else {
+ svcProviderMap.put(svc, defaultProviders);
+ }
+ }
+ createVpcOffering(VpcOffering.defaultVPCNSOfferingName, VpcOffering.defaultVPCNSOfferingName,
+ svcProviderMap, false, State.Enabled);
}
}
- createVpcOffering(VpcOffering.defaultVPCNSOfferingName, VpcOffering.defaultVPCNSOfferingName,
- svcProviderMap, false, State.Enabled);
- }
-
- txn.commit();
+ });
Map<String, String> configs = _configDao.getConfiguration(params);
String value = configs.get(Config.VpcCleanupInterval.key());
@@ -375,36 +380,38 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
@DB
- protected VpcOffering createVpcOffering(String name, String displayText, Map<Network.Service,
- Set<Network.Provider>> svcProviderMap, boolean isDefault, State state) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- // create vpc offering object
- VpcOfferingVO offering = new VpcOfferingVO(name, displayText, isDefault, null);
-
- if (state != null) {
- offering.setState(state);
- }
- s_logger.debug("Adding vpc offering " + offering);
- offering = _vpcOffDao.persist(offering);
- // populate services and providers
- if (svcProviderMap != null) {
- for (Network.Service service : svcProviderMap.keySet()) {
- Set<Provider> providers = svcProviderMap.get(service);
- if (providers != null && !providers.isEmpty()) {
- for (Network.Provider provider : providers) {
- VpcOfferingServiceMapVO offService = new VpcOfferingServiceMapVO(offering.getId(), service, provider);
- _vpcOffSvcMapDao.persist(offService);
- s_logger.trace("Added service for the vpc offering: " + offService + " with provider " + provider.getName());
+ protected VpcOffering createVpcOffering(final String name, final String displayText, final Map<Network.Service,
+ Set<Network.Provider>> svcProviderMap, final boolean isDefault, final State state) {
+ return Transaction.execute(new TransactionCallback<VpcOffering>() {
+ @Override
+ public VpcOffering doInTransaction(TransactionStatus status) {
+ // create vpc offering object
+ VpcOfferingVO offering = new VpcOfferingVO(name, displayText, isDefault, null);
+
+ if (state != null) {
+ offering.setState(state);
+ }
+ s_logger.debug("Adding vpc offering " + offering);
+ offering = _vpcOffDao.persist(offering);
+ // populate services and providers
+ if (svcProviderMap != null) {
+ for (Network.Service service : svcProviderMap.keySet()) {
+ Set<Provider> providers = svcProviderMap.get(service);
+ if (providers != null && !providers.isEmpty()) {
+ for (Network.Provider provider : providers) {
+ VpcOfferingServiceMapVO offService = new VpcOfferingServiceMapVO(offering.getId(), service, provider);
+ _vpcOffSvcMapDao.persist(offService);
+ s_logger.trace("Added service for the vpc offering: " + offService + " with provider " + provider.getName());
+ }
+ } else {
+ throw new InvalidParameterValueException("Provider is missing for the VPC offering service " + service.getName());
+ }
}
- } else {
- throw new InvalidParameterValueException("Provider is missing for the VPC offering service " + service.getName());
}
- }
- }
- txn.commit();
- return offering;
+ return offering;
+ }
+ });
}
@Override
@@ -635,14 +642,14 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
@DB
- protected Vpc createVpc(long zoneId, long vpcOffId, Account vpcOwner, String vpcName, String displayText, String cidr,
- String networkDomain) {
-
+ protected Vpc createVpc(final long zoneId, final long vpcOffId, final Account vpcOwner, final String vpcName, final String displayText, final String cidr,
+ final String networkDomain) {
+
//Validate CIDR
if (!NetUtils.isValidCIDR(cidr)) {
throw new InvalidParameterValueException("Invalid CIDR specified " + cidr);
}
-
+
//cidr has to be RFC 1918 complient
if (!NetUtils.validateGuestCidr(cidr)) {
throw new InvalidParameterValueException("Guest Cidr " + cidr + " is not RFC1918 compliant");
@@ -657,17 +664,19 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
+ "and the hyphen ('-'); can't start or end with \"-\"");
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
- VpcVO vpc = new VpcVO (zoneId, vpcName, displayText, vpcOwner.getId(), vpcOwner.getDomainId(), vpcOffId, cidr,
- networkDomain);
- vpc = _vpcDao.persist(vpc, finalizeServicesAndProvidersForVpc(zoneId, vpcOffId));
- _resourceLimitMgr.incrementResourceCount(vpcOwner.getId(), ResourceType.vpc);
- txn.commit();
+ return Transaction.execute(new TransactionCallback<VpcVO>() {
+ @Override
+ public VpcVO doInTransaction(TransactionStatus status) {
+ VpcVO vpc = new VpcVO (zoneId, vpcName, displayText, vpcOwner.getId(), vpcOwner.getDomainId(), vpcOffId, cidr,
+ networkDomain);
+ vpc = _vpcDao.persist(vpc, finalizeServicesAndProvidersForVpc(zoneId, vpcOffId));
+ _resourceLimitMgr.incrementResourceCount(vpcOwner.getId(), ResourceType.vpc);
- s_logger.debug("Created VPC " + vpc);
+ s_logger.debug("Created VPC " + vpc);
- return vpc;
+ return vpc;
+ }
+ });
}
private Map<String, List<String>> finalizeServicesAndProvidersForVpc(long zoneId, long offeringId) {
@@ -722,7 +731,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
@Override
@DB
- public boolean destroyVpc(Vpc vpc, Account caller, Long callerUserId) throws ConcurrentOperationException, ResourceUnavailableException {
+ public boolean destroyVpc(final Vpc vpc, Account caller, Long callerUserId) throws ConcurrentOperationException, ResourceUnavailableException {
s_logger.debug("Destroying vpc " + vpc);
//don't allow to delete vpc if it's in use by existing non system networks (system networks are networks of a private gateway of the VPC,
@@ -735,16 +744,18 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
//mark VPC as inactive
if (vpc.getState() != Vpc.State.Inactive) {
s_logger.debug("Updating VPC " + vpc + " with state " + Vpc.State.Inactive + " as a part of vpc delete");
- VpcVO vpcVO = _vpcDao.findById(vpc.getId());
+ final VpcVO vpcVO = _vpcDao.findById(vpc.getId());
vpcVO.setState(Vpc.State.Inactive);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _vpcDao.update(vpc.getId(), vpcVO);
-
- //decrement resource count
- _resourceLimitMgr.decrementResourceCount(vpc.getAccountId(), ResourceType.vpc);
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _vpcDao.update(vpc.getId(), vpcVO);
+
+ //decrement resource count
+ _resourceLimitMgr.decrementResourceCount(vpc.getAccountId(), ResourceType.vpc);
+ }
+ });
}
//shutdown VPC
@@ -1140,67 +1151,68 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
}
@DB
- protected void validateNewVpcGuestNetwork(String cidr, String gateway, Account networkOwner, Vpc vpc, String networkDomain) {
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
- Vpc locked = _vpcDao.acquireInLockTable(vpc.getId());
- if (locked == null) {
- throw new CloudRuntimeException("Unable to acquire lock on " + vpc);
- }
-
- try {
- //check number of active networks in vpc
- if (_ntwkDao.countVpcNetworks(vpc.getId()) >= _maxNetworks) {
- throw new CloudRuntimeException("Number of networks per VPC can't extend "
- + _maxNetworks + "; increase it using global config " + Config.VpcMaxNetworks);
- }
-
-
- //1) CIDR is required
- if (cidr == null) {
- throw new InvalidParameterValueException("Gateway/netmask are required when create network for VPC");
- }
-
- //2) Network cidr should be within vpcCidr
- if (!NetUtils.isNetworkAWithinNetworkB(cidr, vpc.getCidr())) {
- throw new InvalidParameterValueException("Network cidr " + cidr + " is not within vpc " + vpc + " cidr");
- }
-
- //3) Network cidr shouldn't cross the cidr of other vpc network cidrs
- List<? extends Network> ntwks = _ntwkDao.listByVpc(vpc.getId());
- for (Network ntwk : ntwks) {
- assert (cidr != null) : "Why the network cidr is null when it belongs to vpc?";
+ protected void validateNewVpcGuestNetwork(final String cidr, final String gateway, final Account networkOwner, final Vpc vpc, final String networkDomain) {
+
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ Vpc locked = _vpcDao.acquireInLockTable(vpc.getId());
+ if (locked == null) {
+ throw new CloudRuntimeException("Unable to acquire lock on " + vpc);
+ }
- if (NetUtils.isNetworkAWithinNetworkB(ntwk.getCidr(), cidr)
- || NetUtils.isNetworkAWithinNetworkB(cidr, ntwk.getCidr())) {
- throw new InvalidParameterValueException("Network cidr " + cidr + " crosses other network cidr " + ntwk +
- " belonging to the same vpc " + vpc);
+ try {
+ //check number of active networks in vpc
+ if (_ntwkDao.countVpcNetworks(vpc.getId()) >= _maxNetworks) {
+ throw new CloudRuntimeException("Number of networks per VPC can't extend "
+ + _maxNetworks + "; increase it using global config " + Config.VpcMaxNetworks);
+ }
+
+
+ //1) CIDR is required
+ if (cidr == null) {
+ throw new InvalidParameterValueException("Gateway/netmask are required when create network for VPC");
+ }
+
+ //2) Network cidr should be within vpcCidr
+ if (!NetUtils.isNetworkAWithinNetworkB(cidr, vpc.getCidr())) {
+ throw new InvalidParameterValueException("Network cidr " + cidr + " is not within vpc " + vpc + " cidr");
+ }
+
+ //3) Network cidr shouldn't cross the cidr of other vpc network cidrs
+ List<? extends Network> ntwks = _ntwkDao.listByVpc(vpc.getId());
+ for (Network ntwk : ntwks) {
+ assert (cidr != null) : "Why the network cidr is null when it belongs to vpc?";
+
+ if (NetUtils.isNetworkAWithinNetworkB(ntwk.getCidr(), cidr)
+ || NetUtils.isNetworkAWithinNetworkB(cidr, ntwk.getCidr())) {
+ throw new InvalidParameterValueException("Network cidr " + cidr + " crosses other network cidr " + ntwk +
+ " belonging to the same vpc " + vpc);
+ }
+ }
+
+ //4) vpc and network should belong to the same owner
+ if (vpc.getAccountId() != networkOwner.getId()) {
+ throw new InvalidParameterValueException("Vpc " + vpc + " owner is different from the network owner "
+ + networkOwner);
+ }
+
+ //5) network domain should be the same as VPC's
+ if (!networkDomain.equalsIgnoreCase(vpc.getNetworkDomain())) {
+ throw new InvalidParameterValueException("Network domain of the new network should match network" +
+ " domain of vpc " + vpc);
+ }
+
+ //6) gateway should never be equal to the cidr subnet
+ if (NetUtils.getCidrSubNet(cidr).equalsIgnoreCase(gateway)) {
+ throw new InvalidParameterValueException("Invalid gateway specified. It should never be equal to the cidr subnet value");
+ }
+ } finally {
+ s_logger.debug("Releasing lock for " + locked);
+ _vpcDao.releaseFromLockTable(locked.getId());
}
}
-
- //4) vpc and network should belong to the same owner
- if (vpc.getAccountId() != networkOwner.getId()) {
- throw new InvalidParameterValueException("Vpc " + vpc + " owner is different from the network owner "
- + networkOwner);
- }
-
- //5) network domain should be the same as VPC's
- if (!networkDomain.equalsIgnoreCase(vpc.getNetworkDomain())) {
- throw new InvalidParameterValueException("Network domain of the new network should match network" +
- " domain of vpc " + vpc);
- }
-
- //6) gateway should never be equal to the cidr subnet
- if (NetUtils.getCidrSubNet(cidr).equalsIgnoreCase(gateway)) {
- throw new InvalidParameterValueException("Invalid gateway specified. It should never be equal to the cidr subnet value");
- }
-
- txn.commit();
- } finally {
- s_logger.debug("Releasing lock for " + locked);
- _vpcDao.releaseFromLockTable(locked.getId());
- }
+ });
}
@@ -1361,12 +1373,12 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_PRIVATE_GATEWAY_CREATE, eventDescription = "creating vpc private gateway", create=true)
- public PrivateGateway createVpcPrivateGateway(long vpcId, Long physicalNetworkId, String broadcastUri, String ipAddress,
- String gateway, String netmask, long gatewayOwnerId, Long networkOfferingId, Boolean isSourceNat, Long aclId) throws ResourceAllocationException,
+ public PrivateGateway createVpcPrivateGateway(final long vpcId, Long physicalNetworkId, final String broadcastUri, final String ipAddress,
+ final String gateway, final String netmask, final long gatewayOwnerId, final Long networkOfferingId, final Boolean isSourceNat, final Long aclId) throws ResourceAllocationException,
ConcurrentOperationException, InsufficientCapacityException {
//Validate parameters
- Vpc vpc = getActiveVpc(vpcId);
+ final Vpc vpc = getActiveVpc(vpcId);
if (vpc == null) {
InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find Enabled VPC by id specified");
ex.addProxyObject(String.valueOf(vpcId), "VPC");
@@ -1387,66 +1399,79 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
if (physNet == null) {
physNet = _entityMgr.findById(PhysicalNetwork.class,physicalNetworkId);
}
- Long dcId = physNet.getDataCenterId();
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
- s_logger.debug("Creating Private gateway for VPC " + vpc);
- //1) create private network unless it is existing and lswitch'd
- Network privateNtwk = null;
- if (BroadcastDomainType.getSchemeValue(BroadcastDomainType.fromString(broadcastUri)) == BroadcastDomainType.Lswitch) {
- String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
-
- privateNtwk = _ntwkDao.getPrivateNetwork(broadcastUri, cidr,
- gatewayOwnerId, dcId, networkOfferingId);
- s_logger.info("found and using existing network for vpc " + vpc + ": " + broadcastUri);
- }
- if (privateNtwk == null) {
- s_logger.info("creating new network for vpc " + vpc + " using broadcast uri: " + broadcastUri);
- String networkName = "vpc-" + vpc.getName() + "-privateNetwork";
- privateNtwk = _ntwkSvc.createPrivateNetwork(networkName, networkName, physicalNetworkId,
- broadcastUri, ipAddress, null, gateway, netmask, gatewayOwnerId, vpcId, isSourceNat, networkOfferingId);
- } else { // create the nic/ip as createPrivateNetwork doesn''t do that work for us now
- DataCenterVO dc = _dcDao.lockRow(physNet.getDataCenterId(), true);
-
- //add entry to private_ip_address table
- PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkId(privateNtwk.getId(), ipAddress);
- if (privateIp != null) {
- throw new InvalidParameterValueException("Private ip address " + ipAddress + " already used for private gateway" +
- " in zone " + _entityMgr.findById(DataCenter.class,dcId).getName());
- }
-
- Long mac = dc.getMacAddress();
- Long nextMac = mac + 1;
- dc.setMacAddress(nextMac);
-
- privateIp = new PrivateIpVO(ipAddress, privateNtwk.getId(), nextMac, vpcId, true);
- _privateIpDao.persist(privateIp);
-
- _dcDao.update(dc.getId(), dc);
- }
-
- long networkAclId = NetworkACL.DEFAULT_DENY;
- if (aclId != null) {
- NetworkACLVO aclVO = _networkAclDao.findById(aclId);
- if ( aclVO == null) {
- throw new InvalidParameterValueException("Invalid network acl id passed ");
- }
- if ((aclVO.getVpcId() != vpcId) && !(aclId == NetworkACL.DEFAULT_DENY || aclId == NetworkACL.DEFAULT_ALLOW)) {
- throw new InvalidParameterValueException("Private gateway and network acl are not in the same vpc");
- }
-
- networkAclId = aclId;
- }
-
- //2) create gateway entry
- VpcGatewayVO gatewayVO = new VpcGatewayVO(ipAddress, VpcGateway.Type.Private, vpcId, privateNtwk.getDataCenterId(),
- privateNtwk.getId(), broadcastUri, gateway, netmask, vpc.getAccountId(), vpc.getDomainId(), isSourceNat, networkAclId);
- _vpcGatewayDao.persist(gatewayVO);
-
- s_logger.debug("Created vpc gateway entry " + gatewayVO);
+ final Long dcId = physNet.getDataCenterId();
- txn.commit();
+ final Long physicalNetworkIdFinal = physicalNetworkId;
+ final PhysicalNetwork physNetFinal = physNet;
+ VpcGatewayVO gatewayVO = null;
+ try {
+ gatewayVO = Transaction.executeWithException(new TransactionCallbackWithException<VpcGatewayVO>() {
+ @Override
+ public VpcGatewayVO doInTransaction(TransactionStatus status) throws ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException {
+ s_logger.debug("Creating Private gateway for VPC " + vpc);
+ //1) create private network unless it is existing and lswitch'd
+ Network privateNtwk = null;
+ if (BroadcastDomainType.getSchemeValue(BroadcastDomainType.fromString(broadcastUri)) == BroadcastDomainType.Lswitch) {
+ String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
+
+ privateNtwk = _ntwkDao.getPrivateNetwork(broadcastUri, cidr,
+ gatewayOwnerId, dcId, networkOfferingId);
+ s_logger.info("found and using existing network for vpc " + vpc + ": " + broadcastUri);
+ }
+ if (privateNtwk == null) {
+ s_logger.info("creating new network for vpc " + vpc + " using broadcast uri: " + broadcastUri);
+ String networkName = "vpc-" + vpc.getName() + "-privateNetwork";
+ privateNtwk = _ntwkSvc.createPrivateNetwork(networkName, networkName, physicalNetworkIdFinal,
+ broadcastUri, ipAddress, null, gateway, netmask, gatewayOwnerId, vpcId, isSourceNat, networkOfferingId);
+ } else { // create the nic/ip as createPrivateNetwork doesn''t do that work for us now
+ DataCenterVO dc = _dcDao.lockRow(physNetFinal.getDataCenterId(), true);
+
+ //add entry to private_ip_address table
+ PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkId(privateNtwk.getId(), ipAddress);
+ if (privateIp != null) {
+ throw new InvalidParameterValueException("Private ip address " + ipAddress + " already used for private gateway" +
+ " in zone " + _entityMgr.findById(DataCenter.class,dcId).getName());
+ }
+
+ Long mac = dc.getMacAddress();
+ Long nextMac = mac + 1;
+ dc.setMacAddress(nextMac);
+
+ privateIp = new PrivateIpVO(ipAddress, privateNtwk.getId(), nextMac, vpcId, true);
+ _privateIpDao.persist(privateIp);
+
+ _dcDao.update(dc.getId(), dc);
+ }
+
+ long networkAclId = NetworkACL.DEFAULT_DENY;
+ if (aclId != null) {
+ NetworkACLVO aclVO = _networkAclDao.findById(aclId);
+ if ( aclVO == null) {
+ throw new InvalidParameterValueException("Invalid network acl id passed ");
+ }
+ if ((aclVO.getVpcId() != vpcId) && !(aclId == NetworkACL.DEFAULT_DENY || aclId == NetworkACL.DEFAULT_ALLOW)) {
+ throw new InvalidParameterValueException("Private gateway and network acl are not in the same vpc");
+ }
+
+ networkAclId = aclId;
+ }
+
+ //2) create gateway entry
+ VpcGatewayVO gatewayVO = new VpcGatewayVO(ipAddress, VpcGateway.Type.Private, vpcId, privateNtwk.getDataCenterId(),
+ privateNtwk.getId(), broadcastUri, gateway, netmask, vpc.getAccountId(), vpc.getDomainId(), isSourceNat, networkAclId);
+ _vpcGatewayDao.persist(gatewayVO);
+
+ s_logger.debug("Created vpc gateway entry " + gatewayVO);
+
+ return gatewayVO;
+ }
+ }, Exception.class);
+ } catch (Exception e) {
+ ExceptionUtil.rethrowRuntime(e);
+ ExceptionUtil.rethrow(e, InsufficientCapacityException.class);
+ ExceptionUtil.rethrow(e, ResourceAllocationException.class);
+ throw new IllegalStateException(e);
+ }
return getVpcPrivateGateway(gatewayVO.getId());
}
@@ -1496,26 +1521,28 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
@DB
public boolean deleteVpcPrivateGateway(long gatewayId) throws ConcurrentOperationException, ResourceUnavailableException {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- VpcGatewayVO gatewayVO = _vpcGatewayDao.acquireInLockTable(gatewayId);
+ final VpcGatewayVO gatewayVO = _vpcGatewayDao.acquireInLockTable(gatewayId);
if (gatewayVO == null || gatewayVO.getType() != VpcGateway.Type.Private) {
throw new ConcurrentOperationException("Unable to lock gateway " + gatewayId);
}
try {
- //don't allow to remove gateway when there are static routes associated with it
- long routeCount = _staticRouteDao.countRoutesByGateway(gatewayVO.getId());
- if (routeCount > 0) {
- throw new CloudRuntimeException("Can't delete private gateway " + gatewayVO + " as it has " + routeCount +
- " static routes applied. Remove the routes first");
- }
-
- gatewayVO.setState(VpcGateway.State.Deleting);
- _vpcGatewayDao.update(gatewayVO.getId(), gatewayVO);
- s_logger.debug("Marked gateway " + gatewayVO + " with state " + VpcGateway.State.Deleting);
-
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ //don't allow to remove gateway when there are static routes associated with it
+ long routeCount = _staticRouteDao.countRoutesByGateway(gatewayVO.getId());
+ if (routeCount > 0) {
+ throw new CloudRuntimeException("Can't delete private gateway " + gatewayVO + " as it has " + routeCount +
+ " static routes applied. Remove the routes first");
+ }
+
+ gatewayVO.setState(VpcGateway.State.Deleting);
+ _vpcGatewayDao.update(gatewayVO.getId(), gatewayVO);
+ s_logger.debug("Marked gateway " + gatewayVO + " with state " + VpcGateway.State.Deleting);
+ }
+ });
+
//1) delete the gateway on the backend
PrivateGateway gateway = getVpcPrivateGateway(gatewayId);
@@ -1539,9 +1566,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
}
@DB
- protected boolean deletePrivateGatewayFromTheDB(PrivateGateway gateway) {
+ protected boolean deletePrivateGatewayFromTheDB(final PrivateGateway gateway) {
//check if there are ips allocted in the network
- long networkId = gateway.getNetworkId();
+ final long networkId = gateway.getNetworkId();
boolean deleteNetwork = true;
List<PrivateIpVO> privateIps = _privateIpDao.listByNetworkId(networkId);
@@ -1550,27 +1577,31 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
deleteNetwork = false;
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- PrivateIpVO ip = _privateIpDao.findByIpAndVpcId(gateway.getVpcId(), gateway.getIp4Address());
- if (ip != null) {
- _privateIpDao.remove(ip.getId());
- s_logger.debug("Deleted private ip " + ip);
- }
-
- if (deleteNetwork) {
- User callerUser = _accountMgr.getActiveUser(CallContext.current().getCallingUserId());
- Account owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM);
- ReservationContext context = new ReservationContextImpl(null, null, callerUser, owner);
- _ntwkMgr.destroyNetwork(networkId, context);
- s_logger.debug("Deleted private network id=" + networkId);
- }
-
- _vpcGatewayDao.remove(gateway.getId());
- s_logger.debug("Deleted private gateway " + gateway);
+ //TODO: Clean this up, its bad. There is a DB transaction wrapping calls to NetworkElements (destroyNetwork will
+ // call network elements).
+ final boolean deleteNetworkFinal = deleteNetwork;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ PrivateIpVO ip = _privateIpDao.findByIpAndVpcId(gateway.getVpcId(), gateway.getIp4Address());
+ if (ip != null) {
+ _privateIpDao.remove(ip.getId());
+ s_logger.debug("Deleted private ip " + ip);
+ }
+
+ if (deleteNetworkFinal) {
+ User callerUser = _accountMgr.getActiveUser(CallContext.current().getCallingUserId());
+ Account owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM);
+ ReservationContext context = new ReservationContextImpl(null, null, callerUser, owner);
+ _ntwkMgr.destroyNetwork(networkId, context);
+ s_logger.debug("Deleted private network id=" + networkId);
+ }
+
+ _vpcGatewayDao.remove(gateway.getId());
+ s_logger.debug("Deleted private gateway " + gateway);
+ }
+ });
- txn.commit();
return true;
}
@@ -1729,18 +1760,20 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
}
@DB
- protected boolean revokeStaticRoutesForVpc(long vpcId, Account caller) throws ResourceUnavailableException {
+ protected boolean revokeStaticRoutesForVpc(long vpcId, final Account caller) throws ResourceUnavailableException {
//get all static routes for the vpc
- List<StaticRouteVO> routes = _staticRouteDao.listByVpcId(vpcId);
+ final List<StaticRouteVO> routes = _staticRouteDao.listByVpcId(vpcId);
s_logger.debug("Found " + routes.size() + " to revoke for the vpc " + vpcId);
if (!routes.isEmpty()) {
//mark all of them as revoke
- Transaction txn = Transaction.currentTxn();
- txn.start();
- for (StaticRouteVO route : routes) {
- markStaticRouteForRevoke(route, caller);
- }
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (StaticRouteVO route : routes) {
+ markStaticRouteForRevoke(route, caller);
+ }
+ }
+ });
return applyStaticRoutes(vpcId);
}
@@ -1750,11 +1783,11 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_STATIC_ROUTE_CREATE, eventDescription = "creating static route", create=true)
- public StaticRoute createStaticRoute(long gatewayId, String cidr) throws NetworkRuleConflictException {
+ public StaticRoute createStaticRoute(long gatewayId, final String cidr) throws NetworkRuleConflictException {
Account caller = CallContext.current().getCallingAccount();
//parameters validation
- VpcGateway gateway = _vpcGatewayDao.findById(gatewayId);
+ final VpcGateway gateway = _vpcGatewayDao.findById(gatewayId);
if (gateway == null) {
throw new InvalidParameterValueException("Invalid gateway id is given");
}
@@ -1763,7 +1796,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
throw new InvalidParameterValueException("Gateway is not in the " + VpcGateway.State.Ready + " state: " + gateway.getState());
}
- Vpc vpc = getActiveVpc(gateway.getVpcId());
+ final Vpc vpc = getActiveVpc(gateway.getVpcId());
if (vpc == null) {
throw new InvalidParameterValueException("Can't add static route to VPC that is being deleted");
}
@@ -1789,23 +1822,23 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
throw new InvalidParameterValueException("The static gateway cidr overlaps with one of the blacklisted routes of the zone the VPC belongs to");
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- StaticRouteVO newRoute = new StaticRouteVO(gateway.getId(), cidr, vpc.getId(), vpc.getAccountId(), vpc.getDomainId());
- s_logger.debug("Adding static route " + newRoute);
- newRoute = _staticRouteDao.persist(newRoute);
-
- detectRoutesConflict(newRoute);
-
- if (!_staticRouteDao.setStateToAdd(newRoute)) {
- throw new CloudRuntimeException("Unable to update the state to add for " + newRoute);
- }
- CallContext.current().setEventDetails("Static route Id: " + newRoute.getId());
+ return Transaction.executeWithException(new TransactionCallbackWithException<StaticRouteVO>() {
+ @Override
+ public StaticRouteVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+ StaticRouteVO newRoute = new StaticRouteVO(gateway.getId(), cidr, vpc.getId(), vpc.getAccountId(), vpc.getDomainId());
+ s_logger.debug("Adding static route " + newRoute);
+ newRoute = _staticRouteDao.persist(newRoute);
+
+ detectRoutesConflict(newRoute);
- txn.commit();
-
- return newRoute;
+ if (!_staticRouteDao.setStateToAdd(newRoute)) {
+ throw new CloudRuntimeException("Unable to update the state to add for " + newRoute);
+ }
+ CallContext.current().setEventDetails("Static route Id: " + newRoute.getId());
+
+ return newRoute;
+ }
+ }, NetworkRuleConflictException.class);
}
protected boolean isCidrBlacklisted(String cidr, long zoneId) {
@@ -1947,23 +1980,24 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
return;
}
- Transaction txn = null;
try {
- txn = Transaction.open(Transaction.CLOUD_DB);
-
- // Cleanup inactive VPCs
- List<VpcVO> inactiveVpcs = _vpcDao.listInactiveVpcs();
- s_logger.info("Found " + inactiveVpcs.size() + " removed VPCs to cleanup");
- for (VpcVO vpc : inactiveVpcs) {
- s_logger.debug("Cleaning up " + vpc);
- destroyVpc(vpc, _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), User.UID_SYSTEM);
- }
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws Exception {
+ // Cleanup inactive VPCs
+ List<VpcVO> inactiveVpcs = _vpcDao.listInactiveVpcs();
+ s_logger.info("Found " + inactiveVpcs.size() + " removed VPCs to cleanup");
+ for (VpcVO vpc : inactiveVpcs) {
+ s_logger.debug("Cleaning up " + vpc);
+ destroyVpc(vpc, _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM), User.UID_SYSTEM);
+ }
+
+ return null;
+ }
+ }, Exception.class);
} catch (Exception e) {
s_logger.error("Exception ", e);
} finally {
- if (txn != null) {
- txn.close();
- }
lock.unlock();
}
} catch (Exception e) {
@@ -1976,7 +2010,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
@DB
@Override
@ActionEvent(eventType = EventTypes.EVENT_NET_IP_ASSIGN, eventDescription = "associating Ip", async = true)
- public IpAddress associateIPToVpc(long ipId, long vpcId) throws ResourceAllocationException, ResourceUnavailableException,
+ public IpAddress associateIPToVpc(final long ipId, final long vpcId) throws ResourceAllocationException, ResourceUnavailableException,
InsufficientAddressCapacityException, ConcurrentOperationException {
Account caller = CallContext.current().getCallingAccount();
Account owner = null;
@@ -2005,17 +2039,20 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
s_logger.debug("Associating ip " + ipToAssoc + " to vpc " + vpc);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- IPAddressVO ip = _ipAddressDao.findById(ipId);
- //update ip address with networkId
- ip.setVpcId(vpcId);
- ip.setSourceNat(isSourceNat);
- _ipAddressDao.update(ipId, ip);
-
- //mark ip as allocated
- _ipAddrMgr.markPublicIpAsAllocated(ip);
- txn.commit();
+ final boolean isSourceNatFinal = isSourceNat;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ 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);
+ }
+ });
s_logger.debug("Successfully assigned ip " + ipToAssoc + " to vpc " + vpc);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
index 6cd164d..7912df4 100755
--- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
+++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
@@ -26,7 +26,6 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.api.command.user.vpn.ListRemoteAccessVpnsCmd;
import org.apache.cloudstack.api.command.user.vpn.ListVpnUsersCmd;
import org.apache.cloudstack.context.CallContext;
@@ -80,8 +79,12 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.net.NetUtils;
@Local(value = RemoteAccessVpnService.class)
@@ -114,13 +117,13 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
@Override
@DB
- public RemoteAccessVpn createRemoteAccessVpn(long publicIpId, String ipRange, boolean openFirewall, long networkId)
+ public RemoteAccessVpn createRemoteAccessVpn(final long publicIpId, String ipRange, final boolean openFirewall, long networkId)
throws NetworkRuleConflictException {
CallContext ctx = CallContext.current();
- Account caller = ctx.getCallingAccount();
+ final Account caller = ctx.getCallingAccount();
// make sure ip address exists
- PublicIpAddress ipAddr = _networkMgr.getPublicIpAddress(publicIpId);
+ final PublicIpAddress ipAddr = _networkMgr.getPublicIpAddress(publicIpId);
if (ipAddr == null) {
throw new InvalidParameterValueException("Unable to create remote access vpn, invalid public IP address id" + publicIpId);
}
@@ -163,7 +166,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
if (ipRange == null) {
ipRange = RemoteAccessVpnClientIpRange.valueIn(ipAddr.getAccountId());
}
- String[] range = ipRange.split("-");
+ final String[] range = ipRange.split("-");
if (range.length != 2) {
throw new InvalidParameterValueException("Invalid ip range");
}
@@ -187,19 +190,18 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
// TODO: check overlap with private and public ip ranges in datacenter
long startIp = NetUtils.ip2Long(range[0]);
- String newIpRange = NetUtils.long2Ip(++startIp) + "-" + range[1];
- String sharedSecret = PasswordGenerator.generatePresharedKey(_pskLength);
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- _rulesMgr.reservePorts(ipAddr, NetUtils.UDP_PROTO, Purpose.Vpn, openFirewall, caller, NetUtils.VPN_PORT, NetUtils.VPN_L2TP_PORT, NetUtils.VPN_NATT_PORT);
- vpnVO = new RemoteAccessVpnVO(ipAddr.getAccountId(), ipAddr.getDomainId(), ipAddr.getAssociatedWithNetworkId(),
- publicIpId, range[0], newIpRange, sharedSecret);
- RemoteAccessVpn vpn = _remoteAccessVpnDao.persist(vpnVO);
+ final String newIpRange = NetUtils.long2Ip(++startIp) + "-" + range[1];
+ final String sharedSecret = PasswordGenerator.generatePresharedKey(_pskLength);
- txn.commit();
- return vpn;
+ return Transaction.executeWithException(new TransactionCallbackWithException<RemoteAccessVpn>() {
+ @Override
+ public RemoteAccessVpn doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+ _rulesMgr.reservePorts(ipAddr, NetUtils.UDP_PROTO, Purpose.Vpn, openFirewall, caller, NetUtils.VPN_PORT, NetUtils.VPN_L2TP_PORT, NetUtils.VPN_NATT_PORT);
+ RemoteAccessVpnVO vpnVO = new RemoteAccessVpnVO(ipAddr.getAccountId(), ipAddr.getDomainId(), ipAddr.getAssociatedWithNetworkId(),
+ publicIpId, range[0], newIpRange, sharedSecret);
+ return _remoteAccessVpnDao.persist(vpnVO);
+ }
+ }, NetworkRuleConflictException.class);
}
private void validateRemoteAccessVpnConfiguration() throws ConfigurationException {
@@ -230,7 +232,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
@Override @DB
public void destroyRemoteAccessVpnForIp(long ipId, Account caller) throws ResourceUnavailableException {
- RemoteAccessVpnVO vpn = _remoteAccessVpnDao.findByPublicIpAddress(ipId);
+ final RemoteAccessVpnVO vpn = _remoteAccessVpnDao.findByPublicIpAddress(ipId);
if (vpn == null) {
s_logger.debug("there are no Remote access vpns for public ip address id=" + ipId);
return;
@@ -255,28 +257,28 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
} finally {
if (success) {
//Cleanup corresponding ports
- List<? extends FirewallRule> vpnFwRules = _rulesDao.listByIpAndPurpose(ipId, Purpose.Vpn);
- Transaction txn = Transaction.currentTxn();
+ final List<? extends FirewallRule> vpnFwRules = _rulesDao.listByIpAndPurpose(ipId, Purpose.Vpn);
boolean applyFirewall = false;
- List<FirewallRuleVO> fwRules = new ArrayList<FirewallRuleVO>();
+ final List<FirewallRuleVO> fwRules = new ArrayList<FirewallRuleVO>();
//if related firewall rule is created for the first vpn port, it would be created for the 2 other ports as well, so need to cleanup the backend
if (_rulesDao.findByRelatedId(vpnFwRules.get(0).getId()) != null) {
applyFirewall = true;
}
if (applyFirewall) {
- txn.start();
-
- for (FirewallRule vpnFwRule : vpnFwRules) {
- //don't apply on the backend yet; send all 3 rules in a banch
- _firewallMgr.revokeRelatedFirewallRule(vpnFwRule.getId(), false);
- fwRules.add(_rulesDao.findByRelatedId(vpnFwRule.getId()));
- }
-
- s_logger.debug("Marked " + fwRules.size() + " firewall rules as Revoked as a part of disable remote access vpn");
-
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (FirewallRule vpnFwRule : vpnFwRules) {
+ //don't apply on the backend yet; send all 3 rules in a banch
+ _firewallMgr.revokeRelatedFirewallRule(vpnFwRule.getId(), false);
+ fwRules.add(_rulesDao.findByRelatedId(vpnFwRule.getId()));
+ }
+
+ s_logger.debug("Marked " + fwRules.size() + " firewall rules as Revoked as a part of disable remote access vpn");
+ }
+ });
//now apply vpn rules on the backend
s_logger.debug("Reapplying firewall rules for ip id=" + ipId + " as a part of disable remote access vpn");
@@ -285,26 +287,28 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
if (success) {
try {
- txn.start();
- _remoteAccessVpnDao.remove(vpn.getId());
- // Stop billing of VPN users when VPN is removed. VPN_User_ADD events will be generated when VPN is created again
- List<VpnUserVO> vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
- for(VpnUserVO user : vpnUsers){
- // VPN_USER_REMOVE event is already generated for users in Revoke state
- if(user.getState() != VpnUser.State.Revoke){
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(),
- 0, user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
- }
- }
- if (vpnFwRules != null) {
- for (FirewallRule vpnFwRule : vpnFwRules) {
- _rulesDao.remove(vpnFwRule.getId());
- s_logger.debug("Successfully removed firewall rule with ip id=" + vpnFwRule.getSourceIpAddressId() + " and port " + vpnFwRule.getSourcePortStart() + " as a part of vpn cleanup");
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _remoteAccessVpnDao.remove(vpn.getId());
+ // Stop billing of VPN users when VPN is removed. VPN_User_ADD events will be generated when VPN is created again
+ List<VpnUserVO> vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
+ for(VpnUserVO user : vpnUsers){
+ // VPN_USER_REMOVE event is already generated for users in Revoke state
+ if(user.getState() != VpnUser.State.Revoke){
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(),
+ 0, user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
+ }
+ }
+ if (vpnFwRules != null) {
+ for (FirewallRule vpnFwRule : vpnFwRules) {
+ _rulesDao.remove(vpnFwRule.getId());
+ s_logger.debug("Successfully removed firewall rule with ip id=" + vpnFwRule.getSourceIpAddressId() + " and port " + vpnFwRule.getSourcePortStart() + " as a part of vpn cleanup");
+ }
+ }
}
- }
- txn.commit();
+ });
} catch (Exception ex) {
- txn.rollback();
s_logger.warn("Unable to release the three vpn ports from the firewall rules", ex);
}
}
@@ -314,8 +318,8 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
@Override
@DB
- public VpnUser addVpnUser(long vpnOwnerId, String username, String password) {
- Account caller = CallContext.current().getCallingAccount();
+ public VpnUser addVpnUser(final long vpnOwnerId, final String username, final String password) {
+ final Account caller = CallContext.current().getCallingAccount();
if (!username.matches("^[a-zA-Z0-9][a-zA-Z0-9@._-]{2,63}$")) {
throw new InvalidParameterValueException(
@@ -324,46 +328,54 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
if (!password.matches("^[a-zA-Z0-9][a-zA-Z0-9@#+=._-]{2,31}$")) {
throw new InvalidParameterValueException("Password has to be 3-32 characters including alphabets, numbers and the set '@#+=.-_'");
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
- Account owner = _accountDao.lockRow(vpnOwnerId, true);
- if (owner == null) {
- throw new InvalidParameterValueException("Unable to add vpn user: Another operation active");
- }
- _accountMgr.checkAccess(caller, null, true, owner);
- //don't allow duplicated user names for the same account
- VpnUserVO vpnUser = _vpnUsersDao.findByAccountAndUsername(owner.getId(), username);
- if (vpnUser != null) {
- throw new InvalidParameterValueException("VPN User with name " + username + " is already added for account " + owner);
- }
-
- long userCount = _vpnUsersDao.getVpnUserCount(owner.getId());
- if (userCount >= _userLimit) {
- throw new AccountLimitException("Cannot add more than " + _userLimit + " remote access vpn users");
- }
-
- VpnUser user = _vpnUsersDao.persist(new VpnUserVO(vpnOwnerId, owner.getDomainId(), username, password));
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0, user.getId(),
- user.getUsername(), user.getClass().getName(), user.getUuid());
- txn.commit();
- return user;
+ return Transaction.execute(new TransactionCallback<VpnUser>() {
+ @Override
+ public VpnUser doInTransaction(TransactionStatus status) {
+ Account owner = _accountDao.lockRow(vpnOwnerId, true);
+ if (owner == null) {
+ throw new InvalidParameterValueException("Unable to add vpn user: Another operation active");
+ }
+ _accountMgr.checkAccess(caller, null, true, owner);
+
+ //don't allow duplicated user names for the same account
+ VpnUserVO vpnUser = _vpnUsersDao.findByAccountAndUsername(owner.getId(), username);
+ if (vpnUser != null) {
+ throw new InvalidParameterValueException("VPN User with name " + username + " is already added for account " + owner);
+ }
+
+ long userCount = _vpnUsersDao.getVpnUserCount(owner.getId());
+ if (userCount >= _userLimit) {
+ throw new AccountLimitException("Cannot add more than " + _userLimit + " remote access vpn users");
+ }
+
+ VpnUser user = _vpnUsersDao.persist(new VpnUserVO(vpnOwnerId, owner.getDomainId(), username, password));
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0, user.getId(),
+ user.getUsername(), user.getClass().getName(), user.getUuid());
+
+ return user;
+ }
+ });
}
@DB @Override
public boolean removeVpnUser(long vpnOwnerId, String username, Account caller) {
- VpnUserVO user = _vpnUsersDao.findByAccountAndUsername(vpnOwnerId, username);
+ final VpnUserVO user = _vpnUsersDao.findByAccountAndUsername(vpnOwnerId, username);
if (user == null) {
throw new InvalidParameterValueException("Could not find vpn user " + username);
}
_accountMgr.checkAccess(caller, null, true, user);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- user.setState(State.Revoke);
- _vpnUsersDao.update(user.getId(), user);
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(), 0, user.getId(),
- user.getUsername(), user.getClass().getName(), user.getUuid());
- txn.commit();
+
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ user.setState(State.Revoke);
+ _vpnUsersDao.update(user.getId(), user);
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(), 0, user.getId(),
+ user.getUsername(), user.getClass().getName(), user.getUuid());
+ }
+ });
+
return true;
}
@@ -379,7 +391,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
public RemoteAccessVpnVO startRemoteAccessVpn(long ipAddressId, boolean openFirewall) throws ResourceUnavailableException {
Account caller = CallContext.current().getCallingAccount();
- RemoteAccessVpnVO vpn = _remoteAccessVpnDao.findByPublicIpAddress(ipAddressId);
+ final RemoteAccessVpnVO vpn = _remoteAccessVpnDao.findByPublicIpAddress(ipAddressId);
if (vpn == null) {
throw new InvalidParameterValueException("Unable to find your vpn: " + ipAddressId);
}
@@ -407,20 +419,22 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
return vpn;
} finally {
if (started) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- vpn.setState(RemoteAccessVpn.State.Running);
- _remoteAccessVpnDao.update(vpn.getId(), vpn);
-
- // Start billing of existing VPN users in ADD and Active state
- List<VpnUserVO> vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
- for(VpnUserVO user : vpnUsers){
- if(user.getState() != VpnUser.State.Revoke){
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0,
- user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ vpn.setState(RemoteAccessVpn.State.Running);
+ _remoteAccessVpnDao.update(vpn.getId(), vpn);
+
+ // Start billing of existing VPN users in ADD and Active state
+ List<VpnUserVO> vpnUsers = _vpnUsersDao.listByAccount(vpn.getAccountId());
+ for(VpnUserVO user : vpnUsers){
+ if(user.getState() != VpnUser.State.Revoke){
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_ADD, user.getAccountId(), 0,
+ user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
+ }
+ }
}
- }
- txn.commit();
+ });
}
}
}
@@ -479,7 +493,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
}
for (int i = 0; i < finals.length; i++) {
- VpnUserVO user = users.get(i);
+ final VpnUserVO user = users.get(i);
if (finals[i]) {
if (user.getState() == State.Add) {
user.setState(State.Active);
@@ -489,12 +503,14 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
}
} else {
if (user.getState() == State.Add && (user.getUsername()).equals(userName)) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _vpnUsersDao.remove(user.getId());
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(),
- 0, user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _vpnUsersDao.remove(user.getId());
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VPN_USER_REMOVE, user.getAccountId(),
+ 0, user.getId(), user.getUsername(), user.getClass().getName(), user.getUuid());
+ }
+ });
}
s_logger.warn("Failed to apply vpn for user " + user.getUsername() + ", accountId=" + user.getAccountId());
}
[09/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/NetworkServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkServiceImpl.java b/server/src/com/cloud/network/NetworkServiceImpl.java
index 61c070a..e0e90d9 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -41,7 +41,6 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
@@ -159,9 +158,15 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.exception.ExceptionUtil;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.Nic;
import com.cloud.vm.NicSecondaryIp;
@@ -635,11 +640,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
@Override
- public NicSecondaryIp allocateSecondaryGuestIP (Account ipOwner, long zoneId, Long nicId, Long networkId, String requestedIp) throws InsufficientAddressCapacityException {
+ public NicSecondaryIp allocateSecondaryGuestIP (Account ipOwner, long zoneId, final Long nicId, final Long networkId, String requestedIp) throws InsufficientAddressCapacityException {
- Long accountId = null;
- Long domainId = null;
- Long vmId = null;
String ipaddr = null;
if (networkId == null) {
@@ -649,7 +651,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
Account caller = CallContext.current().getCallingAccount();
//check whether the nic belongs to user vm.
- NicVO nicVO = _nicDao.findById(nicId);
+ final NicVO nicVO = _nicDao.findById(nicId);
if (nicVO == null) {
throw new InvalidParameterValueException("There is no nic for the " + nicId);
}
@@ -670,8 +672,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
if (network == null) {
throw new InvalidParameterValueException("Invalid network id is given");
}
- accountId = ipOwner.getAccountId();
- domainId = ipOwner.getDomainId();
+ final Long accountId = ipOwner.getAccountId();
+ final Long domainId = ipOwner.getDomainId();
// Validate network offering
NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(network.getNetworkOfferingId());
@@ -716,26 +718,29 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
return null;
}
- NicSecondaryIpVO secondaryIpVO;
if (ipaddr != null) {
// we got the ip addr so up the nics table and secodary ip
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- boolean nicSecondaryIpSet = nicVO.getSecondaryIp();
- if (!nicSecondaryIpSet) {
- nicVO.setSecondaryIp(true);
- // commit when previously set ??
- s_logger.debug("Setting nics table ...");
- _nicDao.update(nicId, nicVO);
- }
-
- s_logger.debug("Setting nic_secondary_ip table ...");
- vmId = nicVO.getInstanceId();
- secondaryIpVO = new NicSecondaryIpVO(nicId, ipaddr, vmId, accountId, domainId, networkId);
- _nicSecondaryIpDao.persist(secondaryIpVO);
- txn.commit();
- return getNicSecondaryIp(secondaryIpVO.getId());
+ final String addrFinal = ipaddr;
+ long id = Transaction.execute(new TransactionCallback<Long>() {
+ @Override
+ public Long doInTransaction(TransactionStatus status) {
+ boolean nicSecondaryIpSet = nicVO.getSecondaryIp();
+ if (!nicSecondaryIpSet) {
+ nicVO.setSecondaryIp(true);
+ // commit when previously set ??
+ s_logger.debug("Setting nics table ...");
+ _nicDao.update(nicId, nicVO);
+ }
+
+ s_logger.debug("Setting nic_secondary_ip table ...");
+ Long vmId = nicVO.getInstanceId();
+ NicSecondaryIpVO secondaryIpVO = new NicSecondaryIpVO(nicId, addrFinal, vmId, accountId, domainId, networkId);
+ _nicSecondaryIpDao.persist(secondaryIpVO);
+ return secondaryIpVO.getId();
+ }
+ });
+
+ return getNicSecondaryIp(id);
} else {
return null;
}
@@ -805,13 +810,15 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
throw new InvalidParameterValueException("Can' remove the ip " + secondaryIp + "is associate with static NAT rule public IP address id " + publicIpVO.getId());
}
} else if (dc.getNetworkType() == NetworkType.Basic || ntwkOff.getGuestType() == Network.GuestType.Shared) {
- IPAddressVO ip = _ipAddressDao.findByIpAndNetworkId(secIpVO.getNetworkId(), secIpVO.getIp4Address());
+ final IPAddressVO ip = _ipAddressDao.findByIpAndNetworkId(secIpVO.getNetworkId(), secIpVO.getIp4Address());
if (ip != null) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _ipAddrMgr.markIpAsUnavailable(ip.getId());
- _ipAddressDao.unassignIpAddress(ip.getId());
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _ipAddrMgr.markIpAsUnavailable(ip.getId());
+ _ipAddressDao.unassignIpAddress(ip.getId());
+ }
+ });
}
} else {
throw new InvalidParameterValueException("Not supported for this network now");
@@ -821,22 +828,24 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
return success;
}
- boolean removeNicSecondaryIP(NicSecondaryIpVO ipVO, boolean lastIp) {
- Transaction txn = Transaction.currentTxn();
- long nicId = ipVO.getNicId();
- NicVO nic = _nicDao.findById(nicId);
+ boolean removeNicSecondaryIP(final NicSecondaryIpVO ipVO, final boolean lastIp) {
+ final long nicId = ipVO.getNicId();
+ final NicVO nic = _nicDao.findById(nicId);
- txn.start();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ if (lastIp) {
+ nic.setSecondaryIp(false);
+ s_logger.debug("Setting nics secondary ip to false ...");
+ _nicDao.update(nicId, nic);
+ }
- if (lastIp) {
- nic.setSecondaryIp(false);
- s_logger.debug("Setting nics secondary ip to false ...");
- _nicDao.update(nicId, nic);
- }
+ s_logger.debug("Revoving nic secondary ip entry ...");
+ _nicSecondaryIpDao.remove(ipVO.getId());
+ }
+ });
- s_logger.debug("Revoving nic secondary ip entry ...");
- _nicSecondaryIpDao.remove(ipVO.getId());
- txn.commit();
return true;
}
@@ -1255,67 +1264,10 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
throw ex;
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- Long sharedDomainId = null;
- if (isDomainSpecific) {
- if (domainId != null) {
- sharedDomainId = domainId;
- } else {
- sharedDomainId = _domainMgr.getDomain(Domain.ROOT_DOMAIN).getId();
- subdomainAccess = true;
- }
- }
-
- // default owner to system if network has aclType=Domain
- if (aclType == ACLType.Domain) {
- owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM);
- }
-
- //Create guest network
- Network network = null;
- if (vpcId != null) {
- if (!_configMgr.isOfferingForVpc(ntwkOff)){
- throw new InvalidParameterValueException("Network offering can't be used for VPC networks");
- }
-
- if(aclId != null){
- NetworkACL acl = _networkACLDao.findById(aclId);
- if(acl == null){
- throw new InvalidParameterValueException("Unable to find specified NetworkACL");
- }
-
- if(aclId != NetworkACL.DEFAULT_DENY && aclId != NetworkACL.DEFAULT_ALLOW) {
- //ACL is not default DENY/ALLOW
- // ACL should be associated with a VPC
- if(!vpcId.equals(acl.getVpcId())){
- throw new InvalidParameterValueException("ACL: "+aclId+" do not belong to the VPC");
- }
- }
- }
- network = _vpcMgr.createVpcGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
- networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, aclId, caller, displayNetwork);
- } else {
- if (_configMgr.isOfferingForVpc(ntwkOff)){
- throw new InvalidParameterValueException("Network offering can be used for VPC networks only");
- }
- if (ntwkOff.getInternalLb()) {
- throw new InvalidParameterValueException("Internal Lb can be enabled on vpc networks only");
- }
-
- network = _networkMgr.createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
- networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId,
- ip6Gateway, ip6Cidr, displayNetwork, isolatedPvlan);
- }
-
- if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN && createVlan) {
- // Create vlan ip range
- _configMgr.createVlanAndPublicIpRange(pNtwk.getDataCenterId(), network.getId(), physicalNetworkId,
- false, null, startIP, endIP, gateway, netmask, vlanId, null, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
- }
-
- txn.commit();
+ Network network = commitNetwork(networkOfferingId, gateway, startIP, endIP, netmask, networkDomain, vlanId,
+ name, displayText, caller, physicalNetworkId, zoneId, domainId, isDomainSpecific, subdomainAccess,
+ vpcId, startIPv6, endIPv6, ip6Gateway, ip6Cidr, displayNetwork, aclId, isolatedPvlan, ntwkOff, pNtwk,
+ aclType, owner, cidr, createVlan);
// if the network offering has persistent set to true, implement the network
if ( ntwkOff.getIsPersistent() ) {
@@ -1344,6 +1296,87 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
return network;
}
+ private Network commitNetwork(final Long networkOfferingId, final String gateway, final String startIP, final String endIP, final String netmask,
+ final String networkDomain, final String vlanId, final String name, final String displayText, final Account caller,
+ final Long physicalNetworkId, final Long zoneId, final Long domainId, final boolean isDomainSpecific, final Boolean subdomainAccessFinal,
+ final Long vpcId, final String startIPv6, final String endIPv6, final String ip6Gateway, final String ip6Cidr, final Boolean displayNetwork,
+ final Long aclId, final String isolatedPvlan, final NetworkOfferingVO ntwkOff, final PhysicalNetwork pNtwk, final ACLType aclType,
+ final Account ownerFinal, final String cidr, final boolean createVlan) throws InsufficientCapacityException,
+ ResourceAllocationException {
+ try {
+ return Transaction.executeWithException(new TransactionCallbackWithException<Network>() {
+ @Override
+ public Network doInTransaction(TransactionStatus status) throws Exception {
+ Account owner = ownerFinal;
+ Boolean subdomainAccess = subdomainAccessFinal;
+
+ Long sharedDomainId = null;
+ if (isDomainSpecific) {
+ if (domainId != null) {
+ sharedDomainId = domainId;
+ } else {
+ sharedDomainId = _domainMgr.getDomain(Domain.ROOT_DOMAIN).getId();
+ subdomainAccess = true;
+ }
+ }
+
+ // default owner to system if network has aclType=Domain
+ if (aclType == ACLType.Domain) {
+ owner = _accountMgr.getAccount(Account.ACCOUNT_ID_SYSTEM);
+ }
+
+ //Create guest network
+ Network network = null;
+ if (vpcId != null) {
+ if (!_configMgr.isOfferingForVpc(ntwkOff)){
+ throw new InvalidParameterValueException("Network offering can't be used for VPC networks");
+ }
+
+ if(aclId != null){
+ NetworkACL acl = _networkACLDao.findById(aclId);
+ if(acl == null){
+ throw new InvalidParameterValueException("Unable to find specified NetworkACL");
+ }
+
+ if(aclId != NetworkACL.DEFAULT_DENY && aclId != NetworkACL.DEFAULT_ALLOW) {
+ //ACL is not default DENY/ALLOW
+ // ACL should be associated with a VPC
+ if(!vpcId.equals(acl.getVpcId())){
+ throw new InvalidParameterValueException("ACL: "+aclId+" do not belong to the VPC");
+ }
+ }
+ }
+ network = _vpcMgr.createVpcGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
+ networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, aclId, caller, displayNetwork);
+ } else {
+ if (_configMgr.isOfferingForVpc(ntwkOff)){
+ throw new InvalidParameterValueException("Network offering can be used for VPC networks only");
+ }
+ if (ntwkOff.getInternalLb()) {
+ throw new InvalidParameterValueException("Internal Lb can be enabled on vpc networks only");
+ }
+
+ network = _networkMgr.createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId,
+ networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId,
+ ip6Gateway, ip6Cidr, displayNetwork, isolatedPvlan);
+ }
+
+ if (caller.getType() == Account.ACCOUNT_TYPE_ADMIN && createVlan) {
+ // Create vlan ip range
+ _configMgr.createVlanAndPublicIpRange(pNtwk.getDataCenterId(), network.getId(), physicalNetworkId,
+ false, null, startIP, endIP, gateway, netmask, vlanId, null, startIPv6, endIPv6, ip6Gateway, ip6Cidr);
+ }
+ return network;
+ }
+ }, Exception.class);
+ } catch (Exception e) {
+ ExceptionUtil.rethrowRuntime(e);
+ ExceptionUtil.rethrow(e, InsufficientCapacityException.class);
+ ExceptionUtil.rethrow(e, ResourceAllocationException.class);
+ throw new IllegalStateException(e);
+ }
+ }
+
@Override
public List<? extends Network> searchForNetworks(ListNetworksCmd cmd) {
Long id = cmd.getId();
@@ -1915,13 +1948,13 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_NETWORK_UPDATE, eventDescription = "updating network", async = true)
- public Network updateGuestNetwork(long networkId, String name, String displayText, Account callerAccount,
- User callerUser, String domainSuffix, Long networkOfferingId, Boolean changeCidr, String guestVmCidr, Boolean displayNetwork) {
+ public Network updateGuestNetwork(final long networkId, String name, String displayText, Account callerAccount,
+ User callerUser, String domainSuffix, final Long networkOfferingId, Boolean changeCidr, String guestVmCidr, Boolean displayNetwork) {
boolean restartNetwork = false;
// verify input parameters
- NetworkVO network = _networksDao.findById(networkId);
+ final NetworkVO network = _networksDao.findById(networkId);
if (network == null) {
// see NetworkVO.java
InvalidParameterValueException ex = new InvalidParameterValueException("Specified network id doesn't exist in the system");
@@ -1975,7 +2008,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
boolean networkOfferingChanged = false;
- long oldNetworkOfferingId = network.getNetworkOfferingId();
+ final long oldNetworkOfferingId = network.getNetworkOfferingId();
NetworkOffering oldNtwkOff = _networkOfferingDao.findByIdIncludingRemoved(oldNetworkOfferingId);
NetworkOfferingVO networkOffering = _networkOfferingDao.findById(networkOfferingId);
if (networkOfferingId != null) {
@@ -2024,10 +2057,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
}
}
- Map<String, String> newSvcProviders = new HashMap<String, String>();
- if (networkOfferingChanged) {
- newSvcProviders = _networkMgr.finalizeServicesAndProvidersForNetwork(_entityMgr.findById(NetworkOffering.class, networkOfferingId), network.getPhysicalNetworkId());
- }
+ final Map<String, String> newSvcProviders = networkOfferingChanged ? _networkMgr.finalizeServicesAndProvidersForNetwork(_entityMgr.findById(NetworkOffering.class, networkOfferingId), network.getPhysicalNetworkId())
+ : new HashMap<String, String>();
// don't allow to modify network domain if the service is not supported
if (domainSuffix != null) {
@@ -2201,29 +2232,31 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
if (networkOfferingId != null) {
if (networkOfferingChanged) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- network.setNetworkOfferingId(networkOfferingId);
- _networksDao.update(networkId, network, newSvcProviders);
- // get all nics using this network
- // log remove usage events for old offering
- // log assign usage events for new offering
- List<NicVO> nics = _nicDao.listByNetworkId(networkId);
- for (NicVO nic : nics) {
- long vmId = nic.getInstanceId();
- VMInstanceVO vm = _vmDao.findById(vmId);
- if (vm == null) {
- s_logger.error("Vm for nic " + nic.getId() + " not found with Vm Id:" + vmId);
- continue;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ network.setNetworkOfferingId(networkOfferingId);
+ _networksDao.update(networkId, network, newSvcProviders);
+ // get all nics using this network
+ // log remove usage events for old offering
+ // log assign usage events for new offering
+ List<NicVO> nics = _nicDao.listByNetworkId(networkId);
+ for (NicVO nic : nics) {
+ long vmId = nic.getInstanceId();
+ VMInstanceVO vm = _vmDao.findById(vmId);
+ if (vm == null) {
+ s_logger.error("Vm for nic " + nic.getId() + " not found with Vm Id:" + vmId);
+ continue;
+ }
+ long isDefault = (nic.isDefaultNic()) ? 1 : 0;
+ String nicIdString = Long.toString(nic.getId());
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_REMOVE, vm.getAccountId(), vm.getDataCenterId(),
+ vm.getId(), nicIdString, oldNetworkOfferingId, null, isDefault, VirtualMachine.class.getName(), vm.getUuid());
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN, vm.getAccountId(), vm.getDataCenterId(),
+ vm.getId(), nicIdString, networkOfferingId, null, isDefault, VirtualMachine.class.getName(), vm.getUuid());
+ }
}
- long isDefault = (nic.isDefaultNic()) ? 1 : 0;
- String nicIdString = Long.toString(nic.getId());
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_REMOVE, vm.getAccountId(), vm.getDataCenterId(),
- vm.getId(), nicIdString, oldNetworkOfferingId, null, isDefault, VirtualMachine.class.getName(), vm.getUuid());
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_ASSIGN, vm.getAccountId(), vm.getDataCenterId(),
- vm.getId(), nicIdString, networkOfferingId, null, isDefault, VirtualMachine.class.getName(), vm.getUuid());
- }
- txn.commit();
+ });
} else {
network.setNetworkOfferingId(networkOfferingId);
_networksDao.update(networkId, network, _networkMgr.finalizeServicesAndProvidersForNetwork(_entityMgr.findById(NetworkOffering.class, networkOfferingId), network.getPhysicalNetworkId()));
@@ -2379,8 +2412,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_PHYSICAL_NETWORK_CREATE, eventDescription = "Creating Physical Network", create = true)
- public PhysicalNetwork createPhysicalNetwork(Long zoneId, String vnetRange, String networkSpeed, List<String>
- isolationMethods, String broadcastDomainRangeStr, Long domainId, List<String> tags, String name) {
+ public PhysicalNetwork createPhysicalNetwork(final Long zoneId, final String vnetRange, final String networkSpeed, final List<String>
+ isolationMethods, String broadcastDomainRangeStr, final Long domainId, final List<String> tags, final String name) {
// Check if zone exists
if (zoneId == null) {
@@ -2445,39 +2478,42 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
}
}
- Transaction txn = Transaction.currentTxn();
try {
- txn.start();
- // Create the new physical network in the database
- long id = _physicalNetworkDao.getNextInSequence(Long.class, "id");
- PhysicalNetworkVO pNetwork = new PhysicalNetworkVO(id, zoneId, vnetRange, networkSpeed, domainId, broadcastDomainRange, name);
- pNetwork.setTags(tags);
- pNetwork.setIsolationMethods(isolationMethods);
-
- pNetwork = _physicalNetworkDao.persist(pNetwork);
-
- // Add vnet entries for the new zone if zone type is Advanced
- if (vnetRange != null) {
- addOrRemoveVnets(vnetRange.split(","), pNetwork);
- }
-
- // add VirtualRouter as the default network service provider
- addDefaultVirtualRouterToPhysicalNetwork(pNetwork.getId());
+ final BroadcastDomainRange broadcastDomainRangeFinal = broadcastDomainRange;
+ return Transaction.execute(new TransactionCallback<PhysicalNetworkVO>() {
+ @Override
+ public PhysicalNetworkVO doInTransaction(TransactionStatus status) {
+ // Create the new physical network in the database
+ long id = _physicalNetworkDao.getNextInSequence(Long.class, "id");
+ PhysicalNetworkVO pNetwork = new PhysicalNetworkVO(id, zoneId, vnetRange, networkSpeed, domainId, broadcastDomainRangeFinal, name);
+ pNetwork.setTags(tags);
+ pNetwork.setIsolationMethods(isolationMethods);
+
+ pNetwork = _physicalNetworkDao.persist(pNetwork);
+
+ // Add vnet entries for the new zone if zone type is Advanced
+ if (vnetRange != null) {
+ addOrRemoveVnets(vnetRange.split(","), pNetwork);
+ }
- // add security group provider to the physical network
- addDefaultSecurityGroupProviderToPhysicalNetwork(pNetwork.getId());
+ // add VirtualRouter as the default network service provider
+ addDefaultVirtualRouterToPhysicalNetwork(pNetwork.getId());
- // add VPCVirtualRouter as the defualt network service provider
- addDefaultVpcVirtualRouterToPhysicalNetwork(pNetwork.getId());
+ // add security group provider to the physical network
+ addDefaultSecurityGroupProviderToPhysicalNetwork(pNetwork.getId());
- // add baremetal as the defualt network service provider
- addDefaultBaremetalProvidersToPhysicalNetwork(pNetwork.getId());
+ // add VPCVirtualRouter as the defualt network service provider
+ addDefaultVpcVirtualRouterToPhysicalNetwork(pNetwork.getId());
- //Add Internal Load Balancer element as a default network service provider
- addDefaultInternalLbProviderToPhysicalNetwork(pNetwork.getId());
+ // add baremetal as the defualt network service provider
+ addDefaultBaremetalProvidersToPhysicalNetwork(pNetwork.getId());
- txn.commit();
- return pNetwork;
+ //Add Internal Load Balancer element as a default network service provider
+ addDefaultInternalLbProviderToPhysicalNetwork(pNetwork.getId());
+
+ return pNetwork;
+ }
+ });
} catch (Exception ex) {
s_logger.warn("Exception: ", ex);
throw new CloudRuntimeException("Fail to create a physical network");
@@ -2568,7 +2604,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
}
@DB
- public void addOrRemoveVnets(String [] listOfRanges, PhysicalNetworkVO network) {
+ public void addOrRemoveVnets(String [] listOfRanges, final PhysicalNetworkVO network) {
List<String> addVnets = null;
List<String> removeVnets =null;
HashSet<String> tempVnets = new HashSet<String>();
@@ -2611,22 +2647,27 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
}
network.setVnet(comaSeperatedStingOfVnetRanges);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- if (addVnets != null) {
- s_logger.debug("Adding vnet range " + addVnets.toString()+ " for the physicalNetwork id= " + network.getId() + " and zone id=" + network.getDataCenterId()
- + " as a part of updatePhysicalNetwork call");
- //add vnet takes a list of strings to be added. each string is a vnet.
- _dcDao.addVnet(network.getDataCenterId(), network.getId(), addVnets);
- }
- if (removeVnets != null) {
- s_logger.debug("removing vnet range " + removeVnets.toString()+ " for the physicalNetwork id= " + network.getId() + " and zone id=" + network.getDataCenterId()
- + " as a part of updatePhysicalNetwork call");
- //deleteVnets takes a list of strings to be removed. each string is a vnet.
- _datacneter_vnet.deleteVnets(txn, network.getDataCenterId(), network.getId(), removeVnets);
- }
- _physicalNetworkDao.update(network.getId(), network);
- txn.commit();
+ final List<String> addVnetsFinal = addVnets;
+ final List<String> removeVnetsFinal = removeVnets;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ if (addVnetsFinal != null) {
+ s_logger.debug("Adding vnet range " + addVnetsFinal.toString()+ " for the physicalNetwork id= " + network.getId() + " and zone id=" + network.getDataCenterId()
+ + " as a part of updatePhysicalNetwork call");
+ //add vnet takes a list of strings to be added. each string is a vnet.
+ _dcDao.addVnet(network.getDataCenterId(), network.getId(), addVnetsFinal);
+ }
+ if (removeVnetsFinal != null) {
+ s_logger.debug("removing vnet range " + removeVnetsFinal.toString()+ " for the physicalNetwork id= " + network.getId() + " and zone id=" + network.getDataCenterId()
+ + " as a part of updatePhysicalNetwork call");
+ //deleteVnets takes a list of strings to be removed. each string is a vnet.
+ _datacneter_vnet.deleteVnets(TransactionLegacy.currentTxn(), network.getDataCenterId(), network.getId(), removeVnetsFinal);
+ }
+ _physicalNetworkDao.update(network.getId(), network);
+ }
+ });
+
_physicalNetworkDao.releaseFromLockTable(network.getId());
}
}
@@ -2771,7 +2812,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
@Override
@ActionEvent(eventType = EventTypes.EVENT_PHYSICAL_NETWORK_DELETE, eventDescription = "deleting physical network", async = true)
@DB
- public boolean deletePhysicalNetwork(Long physicalNetworkId) {
+ public boolean deletePhysicalNetwork(final Long physicalNetworkId) {
// verify input parameters
PhysicalNetworkVO pNetwork = _physicalNetworkDao.findById(physicalNetworkId);
@@ -2783,48 +2824,47 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
checkIfPhysicalNetworkIsDeletable(physicalNetworkId);
- Transaction txn = Transaction.currentTxn();
- txn.start();
- // delete vlans for this zone
- List<VlanVO> vlans = _vlanDao.listVlansByPhysicalNetworkId(physicalNetworkId);
- for (VlanVO vlan : vlans) {
- _vlanDao.remove(vlan.getId());
- }
-
- // Delete networks
- List<NetworkVO> networks = _networksDao.listByPhysicalNetwork(physicalNetworkId);
- if (networks != null && !networks.isEmpty()) {
- for (NetworkVO network : networks) {
- _networksDao.remove(network.getId());
- }
- }
-
- // delete vnets
- _dcDao.deleteVnet(physicalNetworkId);
-
- // delete service providers
- List<PhysicalNetworkServiceProviderVO> providers = _pNSPDao.listBy(physicalNetworkId);
-
- for(PhysicalNetworkServiceProviderVO provider : providers){
- try {
- deleteNetworkServiceProvider(provider.getId());
- }catch (ResourceUnavailableException e) {
- s_logger.warn("Unable to complete destroy of the physical network provider: " + provider.getProviderName() + ", id: "+ provider.getId(), e);
- return false;
- } catch (ConcurrentOperationException e) {
- s_logger.warn("Unable to complete destroy of the physical network provider: " + provider.getProviderName() + ", id: "+ provider.getId(), e);
- return false;
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ // delete vlans for this zone
+ List<VlanVO> vlans = _vlanDao.listVlansByPhysicalNetworkId(physicalNetworkId);
+ for (VlanVO vlan : vlans) {
+ _vlanDao.remove(vlan.getId());
+ }
+
+ // Delete networks
+ List<NetworkVO> networks = _networksDao.listByPhysicalNetwork(physicalNetworkId);
+ if (networks != null && !networks.isEmpty()) {
+ for (NetworkVO network : networks) {
+ _networksDao.remove(network.getId());
+ }
+ }
+
+ // delete vnets
+ _dcDao.deleteVnet(physicalNetworkId);
+
+ // delete service providers
+ List<PhysicalNetworkServiceProviderVO> providers = _pNSPDao.listBy(physicalNetworkId);
+
+ for(PhysicalNetworkServiceProviderVO provider : providers){
+ try {
+ deleteNetworkServiceProvider(provider.getId());
+ }catch (ResourceUnavailableException e) {
+ s_logger.warn("Unable to complete destroy of the physical network provider: " + provider.getProviderName() + ", id: "+ provider.getId(), e);
+ return false;
+ } catch (ConcurrentOperationException e) {
+ s_logger.warn("Unable to complete destroy of the physical network provider: " + provider.getProviderName() + ", id: "+ provider.getId(), e);
+ return false;
+ }
+ }
+
+ // delete traffic types
+ _pNTrafficTypeDao.deleteTrafficTypes(physicalNetworkId);
+
+ return _physicalNetworkDao.remove(physicalNetworkId);
}
- }
-
- // delete traffic types
- _pNTrafficTypeDao.deleteTrafficTypes(physicalNetworkId);
-
- boolean success = _physicalNetworkDao.remove(physicalNetworkId);
-
- txn.commit();
-
- return success;
+ });
}
@DB
@@ -2882,7 +2922,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
selectSql += " AND taken IS NOT NULL";
}
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
stmt.setLong(1, physicalNetworkId);
@@ -3045,12 +3085,9 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
accountGuestVlanMapVO.setGuestVlanRange(updatedVlanRange);
_accountGuestVlanMapDao.update(guestVlanMapId, accountGuestVlanMapVO);
} else {
- Transaction txn = Transaction.currentTxn();
- txn.start();
accountGuestVlanMapVO = new AccountGuestVlanMapVO(vlanOwner.getAccountId(), physicalNetworkId);
accountGuestVlanMapVO.setGuestVlanRange(startVlan + "-" + endVlan);
_accountGuestVlanMapDao.persist(accountGuestVlanMapVO);
- txn.commit();
}
// For every guest vlan set the corresponding account guest vlan map id
List<Integer> finaVlanTokens = getVlanFromRange(accountGuestVlanMapVO.getGuestVlanRange());
@@ -3276,9 +3313,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
services = new ArrayList<Service>(element.getCapabilities().keySet());
}
- Transaction txn = Transaction.currentTxn();
try {
- txn.start();
// Create the new physical network in the database
PhysicalNetworkServiceProviderVO nsp = new PhysicalNetworkServiceProviderVO(physicalNetworkId, providerName);
// set enabled services
@@ -3289,7 +3324,6 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
}
nsp = _pNSPDao.persist(nsp);
- txn.commit();
return nsp;
} catch (Exception ex) {
s_logger.warn("Exception: ", ex);
@@ -3537,9 +3571,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
}
}
- Transaction txn = Transaction.currentTxn();
try {
- txn.start();
// Create the new traffic type in the database
if (xenLabel == null) {
xenLabel = getDefaultXenNetworkLabel(trafficType);
@@ -3547,7 +3579,6 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
PhysicalNetworkTrafficTypeVO pNetworktrafficType = new PhysicalNetworkTrafficTypeVO(physicalNetworkId, trafficType, xenLabel, kvmLabel, vmwareLabel, simulatorLabel, vlan);
pNetworktrafficType = _pNTrafficTypeDao.persist(pNetworktrafficType);
- txn.commit();
return pNetworktrafficType;
} catch (Exception ex) {
s_logger.warn("Exception: ", ex);
@@ -3809,11 +3840,11 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
@Override @DB
- public Network createPrivateNetwork(String networkName, String displayText, long physicalNetworkId,
- String broadcastUriString, String startIp, String endIp, String gateway, String netmask, long networkOwnerId, Long vpcId, Boolean sourceNat, Long networkOfferingId)
+ public Network createPrivateNetwork(final String networkName, final String displayText, long physicalNetworkId,
+ String broadcastUriString, final String startIp, String endIp, final String gateway, String netmask, final long networkOwnerId, final Long vpcId, final Boolean sourceNat, final Long networkOfferingId)
throws ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException {
- Account owner = _accountMgr.getAccount(networkOwnerId);
+ final Account owner = _accountMgr.getAccount(networkOwnerId);
// Get system network offering
NetworkOfferingVO ntwkOff = null;
@@ -3827,7 +3858,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
}
// Validate physical network
- PhysicalNetwork pNtwk = _physicalNetworkDao.findById(physicalNetworkId);
+ final PhysicalNetwork pNtwk = _physicalNetworkDao.findById(physicalNetworkId);
if (pNtwk == null) {
InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find a physical network" +
" having the given id");
@@ -3846,7 +3877,6 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
throw new InvalidParameterValueException("Invalid format for the endIp address parameter");
}
- String cidr = null;
if (!NetUtils.isValidIp(gateway)) {
throw new InvalidParameterValueException("Invalid gateway");
}
@@ -3854,10 +3884,10 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
throw new InvalidParameterValueException("Invalid netmask");
}
- cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
+ final String cidr = NetUtils.ipAndNetMaskToCidr(gateway, netmask);
URI uri = BroadcastDomainType.fromString(broadcastUriString);
- String uriString = uri.toString();
+ final String uriString = uri.toString();
BroadcastDomainType tiep = BroadcastDomainType.getSchemeValue(uri);
// numeric vlan or vlan uri are ok for now
// TODO make a test for any supported scheme
@@ -3866,49 +3896,58 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
throw new InvalidParameterValueException("unsupported type of broadcastUri specified: " + broadcastUriString);
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- //lock datacenter as we need to get mac address seq from there
- DataCenterVO dc = _dcDao.lockRow(pNtwk.getDataCenterId(), true);
-
- //check if we need to create guest network
- Network privateNetwork = _networksDao.getPrivateNetwork(uriString, cidr,
- networkOwnerId, pNtwk.getDataCenterId(), networkOfferingId);
- if (privateNetwork == null) {
- //create Guest network
- privateNetwork = _networkMgr.createGuestNetwork(ntwkOff.getId(), networkName, displayText, gateway, cidr, uriString,
- null, owner, null, pNtwk, pNtwk.getDataCenterId(), ACLType.Account, null, vpcId, null, null, true, null);
- s_logger.debug("Created private network " + privateNetwork);
- } else {
- s_logger.debug("Private network already exists: " + privateNetwork);
- //Do not allow multiple private gateways with same Vlan within a VPC
- if(vpcId.equals(privateNetwork.getVpcId())){
- throw new InvalidParameterValueException("Private network for the vlan: " + uriString + " and cidr "+ cidr +" already exists " +
- "for Vpc "+vpcId+" in zone " + _entityMgr.findById(DataCenter.class, pNtwk.getDataCenterId()).getName());
- }
- }
-
- //add entry to private_ip_address table
- PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkIdAndVpcId(privateNetwork.getId(), startIp, vpcId);
- if (privateIp != null) {
- throw new InvalidParameterValueException("Private ip address " + startIp + " already used for private gateway" +
- " in zone " + _entityMgr.findById(DataCenter.class, pNtwk.getDataCenterId()).getName());
+ final NetworkOfferingVO ntwkOffFinal = ntwkOff;
+ try {
+ return Transaction.executeWithException(new TransactionCallbackWithException<Network>() {
+ @Override
+ public Network doInTransaction(TransactionStatus status) throws ResourceAllocationException, InsufficientCapacityException {
+ //lock datacenter as we need to get mac address seq from there
+ DataCenterVO dc = _dcDao.lockRow(pNtwk.getDataCenterId(), true);
+
+ //check if we need to create guest network
+ Network privateNetwork = _networksDao.getPrivateNetwork(uriString, cidr,
+ networkOwnerId, pNtwk.getDataCenterId(), networkOfferingId);
+ if (privateNetwork == null) {
+ //create Guest network
+ privateNetwork = _networkMgr.createGuestNetwork(ntwkOffFinal.getId(), networkName, displayText, gateway, cidr, uriString,
+ null, owner, null, pNtwk, pNtwk.getDataCenterId(), ACLType.Account, null, vpcId, null, null, true, null);
+ s_logger.debug("Created private network " + privateNetwork);
+ } else {
+ s_logger.debug("Private network already exists: " + privateNetwork);
+ //Do not allow multiple private gateways with same Vlan within a VPC
+ if(vpcId.equals(privateNetwork.getVpcId())){
+ throw new InvalidParameterValueException("Private network for the vlan: " + uriString + " and cidr "+ cidr +" already exists " +
+ "for Vpc "+vpcId+" in zone " + _entityMgr.findById(DataCenter.class, pNtwk.getDataCenterId()).getName());
+ }
+ }
+
+ //add entry to private_ip_address table
+ PrivateIpVO privateIp = _privateIpDao.findByIpAndSourceNetworkIdAndVpcId(privateNetwork.getId(), startIp, vpcId);
+ if (privateIp != null) {
+ throw new InvalidParameterValueException("Private ip address " + startIp + " already used for private gateway" +
+ " in zone " + _entityMgr.findById(DataCenter.class, pNtwk.getDataCenterId()).getName());
+ }
+
+ Long mac = dc.getMacAddress();
+ Long nextMac = mac + 1;
+ dc.setMacAddress(nextMac);
+
+ privateIp = new PrivateIpVO(startIp, privateNetwork.getId(), nextMac, vpcId, sourceNat);
+ _privateIpDao.persist(privateIp);
+
+ _dcDao.update(dc.getId(), dc);
+
+ s_logger.debug("Private network " + privateNetwork + " is created");
+
+ return privateNetwork;
+ }
+ }, Exception.class);
+ } catch (Exception e) {
+ ExceptionUtil.rethrowRuntime(e);
+ ExceptionUtil.rethrow(e, ResourceAllocationException.class);
+ ExceptionUtil.rethrow(e, InsufficientCapacityException.class);
+ throw new IllegalStateException(e);
}
-
- Long mac = dc.getMacAddress();
- Long nextMac = mac + 1;
- dc.setMacAddress(nextMac);
-
- privateIp = new PrivateIpVO(startIp, privateNetwork.getId(), nextMac, vpcId, sourceNat);
- _privateIpDao.persist(privateIp);
-
- _dcDao.update(dc.getId(), dc);
-
- txn.commit();
- s_logger.debug("Private network " + privateNetwork + " is created");
-
- return privateNetwork;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/NetworkUsageManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/NetworkUsageManagerImpl.java b/server/src/com/cloud/network/NetworkUsageManagerImpl.java
index 41c1bc2..0f2feb0 100755
--- a/server/src/com/cloud/network/NetworkUsageManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkUsageManagerImpl.java
@@ -88,6 +88,8 @@ import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -290,11 +292,11 @@ public class NetworkUsageManagerImpl extends ManagerBase implements NetworkUsage
return false;
}
- private boolean collectDirectNetworkUsage(HostVO host){
+ private boolean collectDirectNetworkUsage(final HostVO host){
s_logger.debug("Direct Network Usage stats collector is running...");
- long zoneId = host.getDataCenterId();
- DetailVO lastCollectDetail = _detailsDao.findDetail(host.getId(),"last_collection");
+ final long zoneId = host.getDataCenterId();
+ final DetailVO lastCollectDetail = _detailsDao.findDetail(host.getId(),"last_collection");
if(lastCollectDetail == null){
s_logger.warn("Last collection time not available. Skipping direct usage collection for Traffic Monitor: "+host.getId());
return false;
@@ -309,7 +311,7 @@ public class NetworkUsageManagerImpl extends ManagerBase implements NetworkUsage
// This coule be made configurable
rightNow.add(Calendar.HOUR_OF_DAY, -2);
- Date now = rightNow.getTime();
+ final Date now = rightNow.getTime();
if(lastCollection.after(now)){
s_logger.debug("Current time is less than 2 hours after last collection time : " + lastCollection.toString() + ". Skipping direct network usage collection");
@@ -361,7 +363,7 @@ public class NetworkUsageManagerImpl extends ManagerBase implements NetworkUsage
}
- List<UserStatisticsVO> collectedStats = new ArrayList<UserStatisticsVO>();
+ final List<UserStatisticsVO> collectedStats = new ArrayList<UserStatisticsVO>();
//Get usage for Ips which were assigned for the entire duration
if(fullDurationIpUsage.size() > 0){
@@ -431,28 +433,26 @@ public class NetworkUsageManagerImpl extends ManagerBase implements NetworkUsage
return false;
}
//Persist all the stats and last_collection time in a single transaction
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
- try {
- txn.start();
- for(UserStatisticsVO stat : collectedStats){
- UserStatisticsVO stats = _statsDao.lock(stat.getAccountId(), stat.getDataCenterId(), 0L, null, host.getId(), "DirectNetwork");
- if (stats == null) {
- stats = new UserStatisticsVO(stat.getAccountId(), zoneId, null, host.getId(), "DirectNetwork", 0L);
- stats.setCurrentBytesSent(stat.getCurrentBytesSent());
- stats.setCurrentBytesReceived(stat.getCurrentBytesReceived());
- _statsDao.persist(stats);
- } else {
- stats.setCurrentBytesSent(stats.getCurrentBytesSent() + stat.getCurrentBytesSent());
- stats.setCurrentBytesReceived(stats.getCurrentBytesReceived() + stat.getCurrentBytesReceived());
- _statsDao.update(stats.getId(), stats);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for(UserStatisticsVO stat : collectedStats){
+ UserStatisticsVO stats = _statsDao.lock(stat.getAccountId(), stat.getDataCenterId(), 0L, null, host.getId(), "DirectNetwork");
+ if (stats == null) {
+ stats = new UserStatisticsVO(stat.getAccountId(), zoneId, null, host.getId(), "DirectNetwork", 0L);
+ stats.setCurrentBytesSent(stat.getCurrentBytesSent());
+ stats.setCurrentBytesReceived(stat.getCurrentBytesReceived());
+ _statsDao.persist(stats);
+ } else {
+ stats.setCurrentBytesSent(stats.getCurrentBytesSent() + stat.getCurrentBytesSent());
+ stats.setCurrentBytesReceived(stats.getCurrentBytesReceived() + stat.getCurrentBytesReceived());
+ _statsDao.update(stats.getId(), stats);
+ }
}
+ lastCollectDetail.setValue(""+now.getTime());
+ _detailsDao.update(lastCollectDetail.getId(), lastCollectDetail);
}
- lastCollectDetail.setValue(""+now.getTime());
- _detailsDao.update(lastCollectDetail.getId(), lastCollectDetail);
- txn.commit();
- } finally {
- txn.close();
- }
+ });
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/PortProfileManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/PortProfileManagerImpl.java b/server/src/com/cloud/network/PortProfileManagerImpl.java
index f17ee6f..c7315979 100644
--- a/server/src/com/cloud/network/PortProfileManagerImpl.java
+++ b/server/src/com/cloud/network/PortProfileManagerImpl.java
@@ -55,18 +55,7 @@ public class PortProfileManagerImpl {
// Else, go ahead and create the port profile.
PortProfileVO portProfileObj = new PortProfileVO(portProfName, vsmId, vlanId, pType, bType);
- Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
- _portProfileDao.persist(portProfileObj);
- txn.commit();
- } catch (Exception e) {
- txn.rollback();
- throw new CloudRuntimeException(e.getMessage());
- }
-
- // Return the PortProfileVO object created.
- return portProfileObj;
+ return _portProfileDao.persist(portProfileObj);
}
@DB
@@ -95,18 +84,7 @@ public class PortProfileManagerImpl {
// Else, go ahead and create the port profile.
portProfileObj = new PortProfileVO(portProfName, vsmId, lowVlanId, highVlanId, pType, bType);
- Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
- _portProfileDao.persist(portProfileObj);
- txn.commit();
- } catch (Exception e) {
- txn.rollback();
- throw new CloudRuntimeException(e.getMessage());
- }
-
- // Return the PortProfileVO object created.
- return portProfileObj;
+ return _portProfileDao.persist(portProfileObj);
}
@DB
@@ -121,16 +99,7 @@ public class PortProfileManagerImpl {
// TODO: Should we be putting any checks here before removing
// the port profile record from the db?
- Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
- // Remove the VSM entry in CiscoNexusVSMDeviceVO's table.
- _portProfileDao.remove(portProfileId);
- txn.commit();
- } catch (Exception e) {
- s_logger.info("Caught exception when trying to delete Port Profile record.." + e.getMessage());
- throw new CloudRuntimeException("Failed to delete Port Profile");
- }
- return true;
+ // Remove the VSM entry in CiscoNexusVSMDeviceVO's table.
+ return _portProfileDao.remove(portProfileId);
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/StorageNetworkManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/StorageNetworkManagerImpl.java b/server/src/com/cloud/network/StorageNetworkManagerImpl.java
index c0cb289..73b45ab 100755
--- a/server/src/com/cloud/network/StorageNetworkManagerImpl.java
+++ b/server/src/com/cloud/network/StorageNetworkManagerImpl.java
@@ -26,7 +26,6 @@ import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
-
import org.apache.cloudstack.api.command.admin.network.CreateStorageNetworkIpRangeCmd;
import org.apache.cloudstack.api.command.admin.network.DeleteStorageNetworkIpRangeCmd;
import org.apache.cloudstack.api.command.admin.network.ListStorageNetworkIpRangeCmd;
@@ -46,8 +45,12 @@ import com.cloud.network.dao.NetworkVO;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.QueryBuilder;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.SecondaryStorageVmVO;
@@ -93,7 +96,7 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
}
}
- private void createStorageIpEntires(Transaction txn, long rangeId, String startIp, String endIp, long zoneId) throws SQLException {
+ private void createStorageIpEntires(TransactionLegacy txn, long rangeId, String startIp, String endIp, long zoneId) throws SQLException {
long startIPLong = NetUtils.ip2Long(startIp);
long endIPLong = NetUtils.ip2Long(endIp);
String insertSql = "INSERT INTO `cloud`.`op_dc_storage_network_ip_address` (range_id, ip_address, mac_address, taken) VALUES (?, ?, (select mac_address from `cloud`.`data_center` where id=?), ?)";
@@ -120,11 +123,11 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
@Override
@DB
public StorageNetworkIpRange updateIpRange(UpdateStorageNetworkIpRangeCmd cmd) {
- Integer vlan = cmd.getVlan();
- Long rangeId = cmd.getId();
+ final Integer vlan = cmd.getVlan();
+ final Long rangeId = cmd.getId();
String startIp = cmd.getStartIp();
String endIp = cmd.getEndIp();
- String netmask = cmd.getNetmask();
+ final String netmask = cmd.getNetmask();
if (netmask != null && !NetUtils.isValidNetmask(netmask)) {
throw new CloudRuntimeException("Invalid netmask:" + netmask);
@@ -147,45 +150,50 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
checkOverlapStorageIpRange(podId, startIp, endIp);
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
- try {
- range = _sNwIpRangeDao.acquireInLockTable(range.getId());
- if (range == null) {
- throw new CloudRuntimeException("Cannot acquire lock on storage ip range " + rangeId);
- }
- StorageNetworkIpRangeVO vo = _sNwIpRangeDao.createForUpdate();
- if (vlan != null) {
- vo.setVlan(vlan);
- }
- if (startIp != null) {
- vo.setStartIp(startIp);
- }
- if (endIp != null) {
- vo.setEndIp(endIp);
- }
- if (netmask != null) {
- vo.setNetmask(netmask);
- }
- _sNwIpRangeDao.update(rangeId, vo);
- } finally {
- if (range != null) {
- _sNwIpRangeDao.releaseFromLockTable(range.getId());
+ final String startIpFinal = startIp;
+ final String endIpFinal = endIp;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ StorageNetworkIpRangeVO range = null;
+ try {
+ range = _sNwIpRangeDao.acquireInLockTable(rangeId);
+ if (range == null) {
+ throw new CloudRuntimeException("Cannot acquire lock on storage ip range " + rangeId);
+ }
+ StorageNetworkIpRangeVO vo = _sNwIpRangeDao.createForUpdate();
+ if (vlan != null) {
+ vo.setVlan(vlan);
+ }
+ if (startIpFinal != null) {
+ vo.setStartIp(startIpFinal);
+ }
+ if (endIpFinal != null) {
+ vo.setEndIp(endIpFinal);
+ }
+ if (netmask != null) {
+ vo.setNetmask(netmask);
+ }
+ _sNwIpRangeDao.update(rangeId, vo);
+ } finally {
+ if (range != null) {
+ _sNwIpRangeDao.releaseFromLockTable(range.getId());
+ }
+ }
}
- }
- txn.commit();
+ });
return _sNwIpRangeDao.findById(rangeId);
}
@Override
@DB
- public StorageNetworkIpRange createIpRange(CreateStorageNetworkIpRangeCmd cmd) throws SQLException {
- Long podId = cmd.getPodId();
- String startIp = cmd.getStartIp();
+ public StorageNetworkIpRange createIpRange(final CreateStorageNetworkIpRangeCmd cmd) throws SQLException {
+ final Long podId = cmd.getPodId();
+ final String startIp = cmd.getStartIp();
String endIp = cmd.getEndIp();
- Integer vlan = cmd.getVlan();
- String netmask = cmd.getNetmask();
+ final Integer vlan = cmd.getVlan();
+ final String netmask = cmd.getNetmask();
if (endIp == null) {
endIp = startIp;
@@ -199,7 +207,7 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
if (pod == null) {
throw new CloudRuntimeException("Cannot find pod " + podId);
}
- Long zoneId = pod.getDataCenterId();
+ final Long zoneId = pod.getDataCenterId();
List<NetworkVO> nws = _networkDao.listByZoneAndTrafficType(zoneId, TrafficType.Storage);
if (nws.size() == 0) {
@@ -208,34 +216,35 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
if (nws.size() > 1) {
throw new CloudRuntimeException("Find more than one storage network in zone " + zoneId + "," + nws.size() + " found");
}
- NetworkVO nw = nws.get(0);
+ final NetworkVO nw = nws.get(0);
checkOverlapPrivateIpRange(podId, startIp, endIp);
checkOverlapStorageIpRange(podId, startIp, endIp);
- Transaction txn = Transaction.currentTxn();
StorageNetworkIpRangeVO range = null;
- txn.start();
- range = new StorageNetworkIpRangeVO(zoneId, podId, nw.getId(), startIp, endIp, vlan, netmask, cmd.getGateWay());
- _sNwIpRangeDao.persist(range);
- try {
- createStorageIpEntires(txn, range.getId(), startIp, endIp, zoneId);
- } catch (SQLException e) {
- txn.rollback();
- StringBuilder err = new StringBuilder();
- err.append("Create storage network range failed.");
- err.append("startIp=" + startIp);
- err.append("endIp=" + endIp);
- err.append("netmask=" + netmask);
- err.append("zoneId=" + zoneId);
- s_logger.debug(err.toString(), e);
- throw e;
- }
-
- txn.commit();
+ final String endIpFinal = endIp;
+ return Transaction.executeWithException(new TransactionCallbackWithException<StorageNetworkIpRangeVO>() {
+ @Override
+ public StorageNetworkIpRangeVO doInTransaction(TransactionStatus status) throws SQLException {
+ StorageNetworkIpRangeVO range = new StorageNetworkIpRangeVO(zoneId, podId, nw.getId(), startIp, endIpFinal, vlan, netmask, cmd.getGateWay());
+ _sNwIpRangeDao.persist(range);
+ try {
+ createStorageIpEntires(TransactionLegacy.currentTxn(), range.getId(), startIp, endIpFinal, zoneId);
+ } catch (SQLException e) {
+ StringBuilder err = new StringBuilder();
+ err.append("Create storage network range failed.");
+ err.append("startIp=" + startIp);
+ err.append("endIp=" + endIpFinal);
+ err.append("netmask=" + netmask);
+ err.append("zoneId=" + zoneId);
+ s_logger.debug(err.toString(), e);
+ throw e;
+ }
- return range;
+ return range;
+ }
+ }, SQLException.class);
}
private String getInUseIpAddress(long rangeId) {
@@ -251,7 +260,7 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
@Override
@DB
public void deleteIpRange(DeleteStorageNetworkIpRangeCmd cmd) {
- long rangeId = cmd.getId();
+ final long rangeId = cmd.getId();
StorageNetworkIpRangeVO range = _sNwIpRangeDao.findById(rangeId);
if (range == null) {
throw new CloudRuntimeException("Can not find storage network ip range " + rangeId);
@@ -261,26 +270,30 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
throw new CloudRuntimeException(getInUseIpAddress(rangeId));
}
- final Transaction txn = Transaction.currentTxn();
- txn.start();
- try {
- range = _sNwIpRangeDao.acquireInLockTable(rangeId);
- if (range == null) {
- String msg = "Unable to acquire lock on storage network ip range id=" + rangeId + ", delete failed";
- s_logger.warn(msg);
- throw new CloudRuntimeException(msg);
- }
- /*
- * entries in op_dc_storage_network_ip_address will be deleted automatically due to
- * fk_storage_ip_address__range_id constraint key
- */
- _sNwIpRangeDao.remove(rangeId);
- } finally {
- if (range != null) {
- _sNwIpRangeDao.releaseFromLockTable(rangeId);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ StorageNetworkIpRangeVO range = null;
+ try {
+ range = _sNwIpRangeDao.acquireInLockTable(rangeId);
+ if (range == null) {
+ String msg = "Unable to acquire lock on storage network ip range id=" + rangeId + ", delete failed";
+ s_logger.warn(msg);
+ throw new CloudRuntimeException(msg);
+ }
+ /*
+ * entries in op_dc_storage_network_ip_address will be deleted automatically due to
+ * fk_storage_ip_address__range_id constraint key
+ */
+ _sNwIpRangeDao.remove(rangeId);
+ } finally {
+ if (range != null) {
+ _sNwIpRangeDao.releaseFromLockTable(rangeId);
+ }
+ }
}
- }
- txn.commit();
+ });
+
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
index 859211b..58a90bb 100644
--- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
+++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java
@@ -95,8 +95,10 @@ import com.cloud.utils.db.GenericDao;
import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallback;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.net.NetUtils;
@Local(value = { AutoScaleService.class, AutoScaleManager.class })
@@ -428,9 +430,9 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
}
@DB
- protected AutoScalePolicyVO checkValidityAndPersist(AutoScalePolicyVO autoScalePolicyVO, List<Long> conditionIds) {
- int duration = autoScalePolicyVO.getDuration();
- int quietTime = autoScalePolicyVO.getQuietTime();
+ protected AutoScalePolicyVO checkValidityAndPersist(final AutoScalePolicyVO autoScalePolicyVOFinal, final List<Long> conditionIds) {
+ final int duration = autoScalePolicyVOFinal.getDuration();
+ final int quietTime = autoScalePolicyVOFinal.getQuietTime();
if (duration < 0) {
throw new InvalidParameterValueException("duration is an invalid value: " + duration);
@@ -440,48 +442,49 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
throw new InvalidParameterValueException("quiettime is an invalid value: " + quietTime);
}
- final Transaction txn = Transaction.currentTxn();
- txn.start();
-
- autoScalePolicyVO = _autoScalePolicyDao.persist(autoScalePolicyVO);
-
- if (conditionIds != null) {
- SearchBuilder<ConditionVO> conditionsSearch = _conditionDao.createSearchBuilder();
- conditionsSearch.and("ids", conditionsSearch.entity().getId(), Op.IN);
- conditionsSearch.done();
- SearchCriteria<ConditionVO> sc = conditionsSearch.create();
-
- sc.setParameters("ids", conditionIds.toArray(new Object[0]));
- List<ConditionVO> conditions = _conditionDao.search(sc, null);
-
- ControlledEntity[] sameOwnerEntities = conditions.toArray(new ControlledEntity[conditions.size() + 1]);
- sameOwnerEntities[sameOwnerEntities.length - 1] = autoScalePolicyVO;
- _accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, true, sameOwnerEntities);
-
- if (conditionIds.size() != conditions.size()) {
- // TODO report the condition id which could not be found
- throw new InvalidParameterValueException("Unable to find the condition specified");
- }
-
- ArrayList<Long> counterIds = new ArrayList<Long>();
- for (ConditionVO condition : conditions) {
- if (counterIds.contains(condition.getCounterid())) {
- throw new InvalidParameterValueException("atleast two conditions in the conditionids have the same counter. It is not right to apply two different conditions for the same counter");
+ return Transaction.execute(new TransactionCallback<AutoScalePolicyVO>() {
+ @Override
+ public AutoScalePolicyVO doInTransaction(TransactionStatus status) {
+ AutoScalePolicyVO autoScalePolicyVO = _autoScalePolicyDao.persist(autoScalePolicyVOFinal);
+
+ if (conditionIds != null) {
+ SearchBuilder<ConditionVO> conditionsSearch = _conditionDao.createSearchBuilder();
+ conditionsSearch.and("ids", conditionsSearch.entity().getId(), Op.IN);
+ conditionsSearch.done();
+ SearchCriteria<ConditionVO> sc = conditionsSearch.create();
+
+ sc.setParameters("ids", conditionIds.toArray(new Object[0]));
+ List<ConditionVO> conditions = _conditionDao.search(sc, null);
+
+ ControlledEntity[] sameOwnerEntities = conditions.toArray(new ControlledEntity[conditions.size() + 1]);
+ sameOwnerEntities[sameOwnerEntities.length - 1] = autoScalePolicyVO;
+ _accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, true, sameOwnerEntities);
+
+ if (conditionIds.size() != conditions.size()) {
+ // TODO report the condition id which could not be found
+ throw new InvalidParameterValueException("Unable to find the condition specified");
+ }
+
+ ArrayList<Long> counterIds = new ArrayList<Long>();
+ for (ConditionVO condition : conditions) {
+ if (counterIds.contains(condition.getCounterid())) {
+ throw new InvalidParameterValueException("atleast two conditions in the conditionids have the same counter. It is not right to apply two different conditions for the same counter");
+ }
+ counterIds.add(condition.getCounterid());
+ }
+
+ /* For update case remove the existing mappings and create fresh ones */
+ _autoScalePolicyConditionMapDao.removeByAutoScalePolicyId(autoScalePolicyVO.getId());
+
+ for (Long conditionId : conditionIds) {
+ AutoScalePolicyConditionMapVO policyConditionMapVO = new AutoScalePolicyConditionMapVO(autoScalePolicyVO.getId(), conditionId);
+ _autoScalePolicyConditionMapDao.persist(policyConditionMapVO);
+ }
}
- counterIds.add(condition.getCounterid());
- }
- /* For update case remove the existing mappings and create fresh ones */
- _autoScalePolicyConditionMapDao.removeByAutoScalePolicyId(autoScalePolicyVO.getId());
-
- for (Long conditionId : conditionIds) {
- AutoScalePolicyConditionMapVO policyConditionMapVO = new AutoScalePolicyConditionMapVO(autoScalePolicyVO.getId(), conditionId);
- _autoScalePolicyConditionMapDao.persist(policyConditionMapVO);
+ return autoScalePolicyVO;
}
- }
-
- txn.commit();
- return autoScalePolicyVO;
+ });
}
@Override
@@ -511,7 +514,7 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEPOLICY_DELETE, eventDescription = "deleting autoscale policy")
- public boolean deleteAutoScalePolicy(long id) {
+ public boolean deleteAutoScalePolicy(final long id) {
/* Check if entity is in database */
getEntityInDatabase(CallContext.current().getCallingAccount(), "AutoScale Policy", id, _autoScalePolicyDao);
@@ -519,23 +522,25 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
throw new InvalidParameterValueException("Cannot delete AutoScale Policy when it is in use by one or more AutoScale Vm Groups");
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ boolean success = true;
+ success = _autoScalePolicyDao.remove(id);
+ if (!success) {
+ s_logger.warn("Failed to remove AutoScale Policy db object");
+ return false;
+ }
+ success = _autoScalePolicyConditionMapDao.removeByAutoScalePolicyId(id);
+ if (!success) {
+ s_logger.warn("Failed to remove AutoScale Policy Condition mappings");
+ return false;
+ }
+ s_logger.info("Successfully deleted autoscale policy id : " + id);
- boolean success = true;
- success = _autoScalePolicyDao.remove(id);
- if (!success) {
- s_logger.warn("Failed to remove AutoScale Policy db object");
- return false;
- }
- success = _autoScalePolicyConditionMapDao.removeByAutoScalePolicyId(id);
- if (!success) {
- s_logger.warn("Failed to remove AutoScale Policy Condition mappings");
- return false;
- }
- txn.commit();
- s_logger.info("Successfully deleted autoscale policy id : " + id);
- return true; // successful
+ return success;
+ }
+ });
}
public void checkCallerAccess(String accountName, Long domainId)
@@ -745,7 +750,7 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_AUTOSCALEVMGROUP_DELETE, eventDescription = "deleting autoscale vm group")
- public boolean deleteAutoScaleVmGroup(long id) {
+ public boolean deleteAutoScaleVmGroup(final long id) {
AutoScaleVmGroupVO autoScaleVmGroupVO = getEntityInDatabase(CallContext.current().getCallingAccount(), "AutoScale Vm Group", id, _autoScaleVmGroupDao);
if (autoScaleVmGroupVO.getState().equals(AutoScaleVmGroup.State_New)) {
@@ -769,24 +774,27 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
}
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
- success = _autoScaleVmGroupDao.remove(id);
-
- if (!success) {
- s_logger.warn("Failed to remove AutoScale Group db object");
- return false;
- }
-
- success = _autoScaleVmGroupPolicyMapDao.removeByGroupId(id);
- if (!success) {
- s_logger.warn("Failed to remove AutoScale Group Policy mappings");
- return false;
- }
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ boolean success = _autoScaleVmGroupDao.remove(id);
+
+ if (!success) {
+ s_logger.warn("Failed to remove AutoScale Group db object");
+ return false;
+ }
+
+ success = _autoScaleVmGroupPolicyMapDao.removeByGroupId(id);
+ if (!success) {
+ s_logger.warn("Failed to remove AutoScale Group Policy mappings");
+ return false;
+ }
+
+ s_logger.info("Successfully deleted autoscale vm group id : " + id);
+ return success; // Successfull
+ }
+ });
- txn.commit();
- s_logger.info("Successfully deleted autoscale vm group id : " + id);
- return success; // Successfull
}
@Override
@@ -831,13 +839,13 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
}
@DB
- protected AutoScaleVmGroupVO checkValidityAndPersist(AutoScaleVmGroupVO vmGroup, List<Long> passedScaleUpPolicyIds, List<Long> passedScaleDownPolicyIds) {
+ protected AutoScaleVmGroupVO checkValidityAndPersist(final AutoScaleVmGroupVO vmGroup, final List<Long> passedScaleUpPolicyIds, final List<Long> passedScaleDownPolicyIds) {
int minMembers = vmGroup.getMinMembers();
int maxMembers = vmGroup.getMaxMembers();
int interval = vmGroup.getInterval();
List<Counter> counters = new ArrayList<Counter>();
List<AutoScalePolicyVO> policies = new ArrayList<AutoScalePolicyVO>();
- List<Long> policyIds = new ArrayList<Long>();
+ final List<Long> policyIds = new ArrayList<Long>();
List<Long> currentScaleUpPolicyIds = new ArrayList<Long>();
List<Long> currentScaleDownPolicyIds = new ArrayList<Long>();
if (vmGroup.getCreated() != null) {
@@ -887,20 +895,23 @@ public class AutoScaleManagerImpl<Type> extends ManagerBase implements AutoScale
sameOwnerEntities[sameOwnerEntities.length - 1] = profileVO;
_accountMgr.checkAccess(CallContext.current().getCallingAccount(), null, true, sameOwnerEntities);
- final Transaction txn = Transaction.currentTxn();
- txn.start();
- vmGroup = _autoScaleVmGroupDao.persist(vmGroup);
-
- if (passedScaleUpPolicyIds != null || passedScaleDownPolicyIds != null) {
- _autoScaleVmGroupPolicyMapDao.removeByGroupId(vmGroup.getId());
+ return Transaction.execute(new TransactionCallback<AutoScaleVmGroupVO>() {
+ @Override
+ public AutoScaleVmGroupVO doInTransaction(TransactionStatus status) {
+ AutoScaleVmGroupVO vmGroupNew = _autoScaleVmGroupDao.persist(vmGroup);
+
+ if (passedScaleUpPolicyIds != null || passedScaleDownPolicyIds != null) {
+ _autoScaleVmGroupPolicyMapDao.removeByGroupId(vmGroupNew.getId());
+
+ for (Long policyId : policyIds) {
+ _autoScaleVmGroupPolicyMapDao.persist(new AutoScaleVmGroupPolicyMapVO(vmGroupNew.getId(), policyId));
+ }
+ }
- for (Long policyId : policyIds) {
- _autoScaleVmGroupPolicyMapDao.persist(new AutoScaleVmGroupPolicyMapVO(vmGroup.getId(), policyId));
+ return vmGroupNew;
}
- }
- txn.commit();
+ });
- return vmGroup;
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
index c86476e..e0d23ad 100644
--- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
+++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
@@ -29,7 +29,6 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
-
import org.apache.cloudstack.api.command.user.firewall.ListEgressFirewallRulesCmd;
import org.apache.cloudstack.api.command.user.firewall.ListFirewallRulesCmd;
import org.apache.cloudstack.context.CallContext;
@@ -89,6 +88,9 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -181,9 +183,9 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
}
@DB
- protected FirewallRule createFirewallRule(Long ipAddrId, Account caller, String xId, Integer portStart,
- Integer portEnd, String protocol, List<String> sourceCidrList, Integer icmpCode, Integer icmpType,
- Long relatedRuleId, FirewallRule.FirewallRuleType type, Long networkId, FirewallRule.TrafficType trafficType) throws NetworkRuleConflictException {
+ protected FirewallRule createFirewallRule(final Long ipAddrId, Account caller, final String xId, final Integer portStart,
+ final Integer portEnd, final String protocol, final List<String> sourceCidrList, final Integer icmpCode, final Integer icmpType,
+ final Long relatedRuleId, final FirewallRule.FirewallRuleType type, final Long networkId, final FirewallRule.TrafficType trafficType) throws NetworkRuleConflictException {
IPAddressVO ipAddress = null;
if (ipAddrId != null){
@@ -222,25 +224,27 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
domainId = network.getDomainId();
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- FirewallRuleVO newRule = new FirewallRuleVO(xId, ipAddrId, portStart, portEnd, protocol.toLowerCase(), networkId,
- accountId, domainId, Purpose.Firewall, sourceCidrList, icmpCode, icmpType, relatedRuleId, trafficType);
- newRule.setType(type);
- newRule = _firewallDao.persist(newRule);
-
- if (type == FirewallRuleType.User)
- detectRulesConflict(newRule);
-
- if (!_firewallDao.setStateToAdd(newRule)) {
- throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
- }
- CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
-
- txn.commit();
-
- return newRule;
+ final Long accountIdFinal = accountId;
+ final Long domainIdFinal = domainId;
+ return Transaction.executeWithException(new TransactionCallbackWithException<FirewallRuleVO>() {
+ @Override
+ public FirewallRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+ FirewallRuleVO newRule = new FirewallRuleVO(xId, ipAddrId, portStart, portEnd, protocol.toLowerCase(), networkId,
+ accountIdFinal, domainIdFinal, Purpose.Firewall, sourceCidrList, icmpCode, icmpType, relatedRuleId, trafficType);
+ newRule.setType(type);
+ newRule = _firewallDao.persist(newRule);
+
+ if (type == FirewallRuleType.User)
+ detectRulesConflict(newRule);
+
+ if (!_firewallDao.setStateToAdd(newRule)) {
+ throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+ }
+ CallContext.current().setEventDetails("Rule Id: " + newRule.getId());
+
+ return newRule;
+ }
+ }, NetworkRuleConflictException.class);
}
@Override
@@ -724,33 +728,34 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
@Override
@DB
- public void revokeRule(FirewallRuleVO rule, Account caller, long userId, boolean needUsageEvent) {
+ public void revokeRule(final FirewallRuleVO rule, Account caller, long userId, final boolean needUsageEvent) {
if (caller != null) {
_accountMgr.checkAccess(caller, null, true, rule);
}
- Transaction txn = Transaction.currentTxn();
- boolean generateUsageEvent = false;
-
- txn.start();
- if (rule.getState() == State.Staged) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Found a rule that is still in stage state so just removing it: " + rule);
- }
- removeRule(rule);
- generateUsageEvent = true;
- } else if (rule.getState() == State.Add || rule.getState() == State.Active) {
- rule.setState(State.Revoke);
- _firewallDao.update(rule.getId(), rule);
- generateUsageEvent = true;
- }
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ boolean generateUsageEvent = false;
- if (generateUsageEvent && needUsageEvent) {
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_DELETE, rule.getAccountId(), 0, rule.getId(),
- null, rule.getClass().getName(), rule.getUuid());
- }
+ if (rule.getState() == State.Staged) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Found a rule that is still in stage state so just removing it: " + rule);
+ }
+ removeRule(rule);
+ generateUsageEvent = true;
+ } else if (rule.getState() == State.Add || rule.getState() == State.Active) {
+ rule.setState(State.Revoke);
+ _firewallDao.update(rule.getId(), rule);
+ generateUsageEvent = true;
+ }
- txn.commit();
+ if (generateUsageEvent && needUsageEvent) {
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_RULE_DELETE, rule.getAccountId(), 0, rule.getId(),
+ null, rule.getClass().getName(), rule.getUuid());
+ }
+ }
+ });
}
@Override
[10/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/IpAddressManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/IpAddressManagerImpl.java b/server/src/com/cloud/network/IpAddressManagerImpl.java
index 74f316b..dd30aa1 100644
--- a/server/src/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/com/cloud/network/IpAddressManagerImpl.java
@@ -29,7 +29,6 @@ import java.util.UUID;
import javax.inject.Inject;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
import org.apache.cloudstack.context.CallContext;
@@ -133,16 +132,21 @@ import com.cloud.user.dao.AccountDao;
import com.cloud.user.dao.UserDao;
import com.cloud.utils.Journal;
import com.cloud.utils.Pair;
+import com.cloud.utils.Ternary;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GlobalLock;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
import com.cloud.utils.db.JoinBuilder.JoinType;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.Ip;
import com.cloud.utils.net.NetUtils;
@@ -609,28 +613,30 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
@DB
@Override
- public boolean releasePortableIpAddress(long addrId) {
- Transaction txn = Transaction.currentTxn();
- GlobalLock portableIpLock = GlobalLock.getInternLock("PortablePublicIpRange");
+ public boolean releasePortableIpAddress(final long addrId) {
+ final GlobalLock portableIpLock = GlobalLock.getInternLock("PortablePublicIpRange");
- txn.start();
try {
- portableIpLock.lock(5);
- IPAddressVO ip = _ipAddressDao.findById(addrId);
+ return Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ portableIpLock.lock(5);
+ IPAddressVO ip = _ipAddressDao.findById(addrId);
- // unassign portable IP
- PortableIpVO portableIp = _portableIpDao.findByIpAddress(ip.getAddress().addr());
- _portableIpDao.unassignIpAddress(portableIp.getId());
+ // unassign portable IP
+ PortableIpVO portableIp = _portableIpDao.findByIpAddress(ip.getAddress().addr());
+ _portableIpDao.unassignIpAddress(portableIp.getId());
- // removed the provisioned vlan
- VlanVO vlan = _vlanDao.findById(ip.getVlanId());
- _vlanDao.remove(vlan.getId());
+ // removed the provisioned vlan
+ VlanVO vlan = _vlanDao.findById(ip.getVlanId());
+ _vlanDao.remove(vlan.getId());
- // remove the provisioned public ip address
- _ipAddressDao.remove(ip.getId());
+ // remove the provisioned public ip address
+ _ipAddressDao.remove(ip.getId());
- txn.commit();
- return true;
+ return true;
+ }
+ });
} finally {
portableIpLock.releaseRef();
}
@@ -649,135 +655,138 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
}
@DB
- public PublicIp fetchNewPublicIp(long dcId, Long podId, List<Long> vlanDbIds, Account owner, VlanType vlanUse, Long guestNetworkId, boolean sourceNat, boolean assign,
- String requestedIp, boolean isSystem, Long vpcId) throws InsufficientAddressCapacityException {
- StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in ");
- boolean fetchFromDedicatedRange = false;
- List<Long> dedicatedVlanDbIds = new ArrayList<Long>();
- List<Long> nonDedicatedVlanDbIds = new ArrayList<Long>();
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
- SearchCriteria<IPAddressVO> sc = null;
- if (podId != null) {
- sc = AssignIpAddressFromPodVlanSearch.create();
- sc.setJoinParameters("podVlanMapSB", "podId", podId);
- errorMessage.append(" pod id=" + podId);
- } else {
- sc = AssignIpAddressSearch.create();
- errorMessage.append(" zone id=" + dcId);
- }
-
- // If owner has dedicated Public IP ranges, fetch IP from the dedicated range
- // Otherwise fetch IP from the system pool
- List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(owner.getId());
- for (AccountVlanMapVO map : maps) {
- if (vlanDbIds == null || vlanDbIds.contains(map.getVlanDbId()))
- dedicatedVlanDbIds.add(map.getVlanDbId());
- }
- List<VlanVO> nonDedicatedVlans = _vlanDao.listZoneWideNonDedicatedVlans(dcId);
- for (VlanVO nonDedicatedVlan : nonDedicatedVlans) {
- if (vlanDbIds == null || vlanDbIds.contains(nonDedicatedVlan.getId()))
- nonDedicatedVlanDbIds.add(nonDedicatedVlan.getId());
- }
- if (dedicatedVlanDbIds != null && !dedicatedVlanDbIds.isEmpty()) {
- fetchFromDedicatedRange = true;
- sc.setParameters("vlanId", dedicatedVlanDbIds.toArray());
- errorMessage.append(", vlanId id=" + dedicatedVlanDbIds.toArray());
- } else if (nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
- sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
- errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
- } else {
- if (podId != null) {
- InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
- ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
- throw ex;
- }
- s_logger.warn(errorMessage.toString());
- InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
- ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
- throw ex;
- }
+ public PublicIp fetchNewPublicIp(final long dcId, final Long podId, final List<Long> vlanDbIds, final Account owner, final VlanType vlanUse, final Long guestNetworkId, final boolean sourceNat, final boolean assign,
+ final String requestedIp, final boolean isSystem, final Long vpcId) throws InsufficientAddressCapacityException {
+ IPAddressVO addr = Transaction.executeWithException(new TransactionCallbackWithException<IPAddressVO>() {
+ @Override
+ public IPAddressVO doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+ StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in ");
+ boolean fetchFromDedicatedRange = false;
+ List<Long> dedicatedVlanDbIds = new ArrayList<Long>();
+ List<Long> nonDedicatedVlanDbIds = new ArrayList<Long>();
+
+ SearchCriteria<IPAddressVO> sc = null;
+ if (podId != null) {
+ sc = AssignIpAddressFromPodVlanSearch.create();
+ sc.setJoinParameters("podVlanMapSB", "podId", podId);
+ errorMessage.append(" pod id=" + podId);
+ } else {
+ sc = AssignIpAddressSearch.create();
+ errorMessage.append(" zone id=" + dcId);
+ }
- sc.setParameters("dc", dcId);
+ // If owner has dedicated Public IP ranges, fetch IP from the dedicated range
+ // Otherwise fetch IP from the system pool
+ List<AccountVlanMapVO> maps = _accountVlanMapDao.listAccountVlanMapsByAccount(owner.getId());
+ for (AccountVlanMapVO map : maps) {
+ if (vlanDbIds == null || vlanDbIds.contains(map.getVlanDbId()))
+ dedicatedVlanDbIds.add(map.getVlanDbId());
+ }
+ List<VlanVO> nonDedicatedVlans = _vlanDao.listZoneWideNonDedicatedVlans(dcId);
+ for (VlanVO nonDedicatedVlan : nonDedicatedVlans) {
+ if (vlanDbIds == null || vlanDbIds.contains(nonDedicatedVlan.getId()))
+ nonDedicatedVlanDbIds.add(nonDedicatedVlan.getId());
+ }
+ if (dedicatedVlanDbIds != null && !dedicatedVlanDbIds.isEmpty()) {
+ fetchFromDedicatedRange = true;
+ sc.setParameters("vlanId", dedicatedVlanDbIds.toArray());
+ errorMessage.append(", vlanId id=" + dedicatedVlanDbIds.toArray());
+ } else if (nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
+ sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
+ errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
+ } else {
+ if (podId != null) {
+ InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
+ ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
+ throw ex;
+ }
+ s_logger.warn(errorMessage.toString());
+ InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
+ ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
+ throw ex;
+ }
- DataCenter zone = _entityMgr.findById(DataCenter.class, dcId);
+ sc.setParameters("dc", dcId);
- // for direct network take ip addresses only from the vlans belonging to the network
- if (vlanUse == VlanType.DirectAttached) {
- sc.setJoinParameters("vlan", "networkId", guestNetworkId);
- errorMessage.append(", network id=" + guestNetworkId);
- }
- sc.setJoinParameters("vlan", "type", vlanUse);
+ DataCenter zone = _entityMgr.findById(DataCenter.class, dcId);
- if (requestedIp != null) {
- sc.addAnd("address", SearchCriteria.Op.EQ, requestedIp);
- errorMessage.append(": requested ip " + requestedIp + " is not available");
- }
+ // for direct network take ip addresses only from the vlans belonging to the network
+ if (vlanUse == VlanType.DirectAttached) {
+ sc.setJoinParameters("vlan", "networkId", guestNetworkId);
+ errorMessage.append(", network id=" + guestNetworkId);
+ }
+ sc.setJoinParameters("vlan", "type", vlanUse);
- Filter filter = new Filter(IPAddressVO.class, "vlanId", true, 0l, 1l);
+ if (requestedIp != null) {
+ sc.addAnd("address", SearchCriteria.Op.EQ, requestedIp);
+ errorMessage.append(": requested ip " + requestedIp + " is not available");
+ }
- List<IPAddressVO> addrs = _ipAddressDao.lockRows(sc, filter, true);
+ Filter filter = new Filter(IPAddressVO.class, "vlanId", true, 0l, 1l);
- // If all the dedicated IPs of the owner are in use fetch an IP from the system pool
- if (addrs.size() == 0 && fetchFromDedicatedRange) {
- // Verify if account is allowed to acquire IPs from the system
- boolean useSystemIps = UseSystemPublicIps.valueIn(owner.getId());
- if (useSystemIps && nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
- fetchFromDedicatedRange = false;
- sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
- errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
- addrs = _ipAddressDao.lockRows(sc, filter, true);
- }
- }
+ List<IPAddressVO> addrs = _ipAddressDao.lockRows(sc, filter, true);
- if (addrs.size() == 0) {
- if (podId != null) {
- InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
- // for now, we hardcode the table names, but we should ideally do a lookup for the tablename from the VO object.
- ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
- throw ex;
- }
- s_logger.warn(errorMessage.toString());
- InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
- ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
- throw ex;
- }
+ // If all the dedicated IPs of the owner are in use fetch an IP from the system pool
+ if (addrs.size() == 0 && fetchFromDedicatedRange) {
+ // Verify if account is allowed to acquire IPs from the system
+ boolean useSystemIps = UseSystemPublicIps.valueIn(owner.getId());
+ if (useSystemIps && nonDedicatedVlanDbIds != null && !nonDedicatedVlanDbIds.isEmpty()) {
+ fetchFromDedicatedRange = false;
+ sc.setParameters("vlanId", nonDedicatedVlanDbIds.toArray());
+ errorMessage.append(", vlanId id=" + nonDedicatedVlanDbIds.toArray());
+ addrs = _ipAddressDao.lockRows(sc, filter, true);
+ }
+ }
- assert (addrs.size() == 1) : "Return size is incorrect: " + addrs.size();
+ if (addrs.size() == 0) {
+ if (podId != null) {
+ InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", Pod.class, podId);
+ // for now, we hardcode the table names, but we should ideally do a lookup for the tablename from the VO object.
+ ex.addProxyObject(ApiDBUtils.findPodById(podId).getUuid());
+ throw ex;
+ }
+ s_logger.warn(errorMessage.toString());
+ InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Insufficient address capacity", DataCenter.class, dcId);
+ ex.addProxyObject(ApiDBUtils.findZoneById(dcId).getUuid());
+ throw ex;
+ }
- if (!fetchFromDedicatedRange) {
- // Check that the maximum number of public IPs for the given accountId will not be exceeded
- try {
- _resourceLimitMgr.checkResourceLimit(owner, ResourceType.public_ip);
- } catch (ResourceAllocationException ex) {
- s_logger.warn("Failed to allocate resource of type " + ex.getResourceType() + " for account " + owner);
- throw new AccountLimitException("Maximum number of public IP addresses for account: " + owner.getAccountName() + " has been exceeded.");
- }
- }
+ assert (addrs.size() == 1) : "Return size is incorrect: " + addrs.size();
- IPAddressVO addr = addrs.get(0);
- addr.setSourceNat(sourceNat);
- addr.setAllocatedTime(new Date());
- addr.setAllocatedInDomainId(owner.getDomainId());
- addr.setAllocatedToAccountId(owner.getId());
- addr.setSystem(isSystem);
+ if (!fetchFromDedicatedRange) {
+ // Check that the maximum number of public IPs for the given accountId will not be exceeded
+ try {
+ _resourceLimitMgr.checkResourceLimit(owner, ResourceType.public_ip);
+ } catch (ResourceAllocationException ex) {
+ s_logger.warn("Failed to allocate resource of type " + ex.getResourceType() + " for account " + owner);
+ throw new AccountLimitException("Maximum number of public IP addresses for account: " + owner.getAccountName() + " has been exceeded.");
+ }
+ }
- if (assign) {
- markPublicIpAsAllocated(addr);
- } else {
- addr.setState(IpAddress.State.Allocating);
- }
- addr.setState(assign ? IpAddress.State.Allocated : IpAddress.State.Allocating);
+ IPAddressVO addr = addrs.get(0);
+ addr.setSourceNat(sourceNat);
+ addr.setAllocatedTime(new Date());
+ addr.setAllocatedInDomainId(owner.getDomainId());
+ addr.setAllocatedToAccountId(owner.getId());
+ addr.setSystem(isSystem);
- if (vlanUse != VlanType.DirectAttached) {
- addr.setAssociatedWithNetworkId(guestNetworkId);
- addr.setVpcId(vpcId);
- }
+ if (assign) {
+ markPublicIpAsAllocated(addr);
+ } else {
+ addr.setState(IpAddress.State.Allocating);
+ }
+ addr.setState(assign ? IpAddress.State.Allocated : IpAddress.State.Allocating);
- _ipAddressDao.update(addr.getId(), addr);
+ if (vlanUse != VlanType.DirectAttached) {
+ addr.setAssociatedWithNetworkId(guestNetworkId);
+ addr.setVpcId(vpcId);
+ }
- txn.commit();
+ _ipAddressDao.update(addr.getId(), addr);
+
+ return addr;
+ }
+ }, InsufficientAddressCapacityException.class);
if (vlanUse == VlanType.VirtualNetwork) {
_firewallMgr.addSystemFirewallRules(addr, owner);
@@ -788,44 +797,43 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
@DB
@Override
- public void markPublicIpAsAllocated(IPAddressVO addr) {
+ public void markPublicIpAsAllocated(final IPAddressVO addr) {
assert (addr.getState() == IpAddress.State.Allocating || addr.getState() == IpAddress.State.Free) : "Unable to transition from state " + addr.getState() + " to " +
IpAddress.State.Allocated;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ Account owner = _accountMgr.getAccount(addr.getAllocatedToAccountId());
+
+ addr.setState(IpAddress.State.Allocated);
+ _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)) {
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN,
+ owner.getId(),
+ addr.getDataCenterId(),
+ addr.getId(),
+ addr.getAddress().toString(),
+ addr.isSourceNat(),
+ guestType,
+ addr.getSystem(),
+ addr.getClass().getName(),
+ addr.getUuid());
+ }
- Transaction txn = Transaction.currentTxn();
-
- Account owner = _accountMgr.getAccount(addr.getAllocatedToAccountId());
-
- txn.start();
- addr.setState(IpAddress.State.Allocated);
- _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)) {
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NET_IP_ASSIGN,
- owner.getId(),
- addr.getDataCenterId(),
- addr.getId(),
- addr.getAddress().toString(),
- addr.isSourceNat(),
- guestType,
- addr.getSystem(),
- addr.getClass().getName(),
- addr.getUuid());
- }
-
- if (updateIpResourceCount(addr)) {
- _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip);
+ if (updateIpResourceCount(addr)) {
+ _resourceLimitMgr.incrementResourceCount(owner.getId(), ResourceType.public_ip);
+ }
+ }
}
- }
-
- txn.commit();
+ });
}
private boolean isIpDedicated(IPAddressVO addr) {
@@ -855,35 +863,38 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
@DB
@Override
- public PublicIp assignDedicateIpAddress(Account owner, Long guestNtwkId, Long vpcId, long dcId, boolean isSourceNat) throws ConcurrentOperationException,
+ public PublicIp assignDedicateIpAddress(Account owner, final Long guestNtwkId, final Long vpcId, final long dcId, final boolean isSourceNat) throws ConcurrentOperationException,
InsufficientAddressCapacityException {
- long ownerId = owner.getId();
+ final long ownerId = owner.getId();
PublicIp ip = null;
- Transaction txn = Transaction.currentTxn();
try {
- txn.start();
-
- owner = _accountDao.acquireInLockTable(ownerId);
+ ip = Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() {
+ @Override
+ public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+ Account owner = _accountDao.acquireInLockTable(ownerId);
+
+ if (owner == null) {
+ // this ownerId comes from owner or type Account. See the class "AccountVO" and the annotations in that class
+ // to get the table name and field name that is queried to fill this ownerid.
+ ConcurrentOperationException ex = new ConcurrentOperationException("Unable to lock account");
+ throw ex;
+ }
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("lock account " + ownerId + " is acquired");
+ }
- if (owner == null) {
- // this ownerId comes from owner or type Account. See the class "AccountVO" and the annotations in that class
- // to get the table name and field name that is queried to fill this ownerid.
- ConcurrentOperationException ex = new ConcurrentOperationException("Unable to lock account");
- throw ex;
- }
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("lock account " + ownerId + " is acquired");
- }
+ PublicIp ip = fetchNewPublicIp(dcId, null, null, owner, VlanType.VirtualNetwork, guestNtwkId, isSourceNat, false, null, false, vpcId);
+ IPAddressVO publicIp = ip.ip();
- ip = fetchNewPublicIp(dcId, null, null, owner, VlanType.VirtualNetwork, guestNtwkId, isSourceNat, false, null, false, vpcId);
- IPAddressVO publicIp = ip.ip();
+ markPublicIpAsAllocated(publicIp);
+ _ipAddressDao.update(publicIp.getId(), publicIp);
- markPublicIpAsAllocated(publicIp);
- _ipAddressDao.update(publicIp.getId(), publicIp);
+ return ip;
+ }
+ }, InsufficientAddressCapacityException.class);
- txn.commit();
return ip;
} finally {
if (owner != null) {
@@ -894,7 +905,6 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
_accountDao.releaseFromLockTable(ownerId);
}
if (ip == null) {
- txn.rollback();
s_logger.error("Unable to get source nat ip address for account " + ownerId);
}
}
@@ -977,11 +987,11 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
@DB
@Override
- public IpAddress allocateIp(Account ipOwner, boolean isSystem, Account caller, long callerUserId, DataCenter zone) throws ConcurrentOperationException,
+ public IpAddress allocateIp(final Account ipOwner, final boolean isSystem, Account caller, long callerUserId, final DataCenter zone) throws ConcurrentOperationException,
ResourceAllocationException, InsufficientAddressCapacityException {
- VlanType vlanType = VlanType.VirtualNetwork;
- boolean assign = false;
+ final VlanType vlanType = VlanType.VirtualNetwork;
+ final boolean assign = false;
if (Grouping.AllocationState.Disabled == zone.getAllocationState() && !_accountMgr.isRootAdmin(caller.getType())) {
// zone is of type DataCenter. See DataCenterVO.java.
@@ -992,7 +1002,6 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
PublicIp ip = null;
- Transaction txn = Transaction.currentTxn();
Account accountToLock = null;
try {
if (s_logger.isDebugEnabled()) {
@@ -1008,21 +1017,25 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
s_logger.debug("Associate IP address lock acquired");
}
- txn.start();
+ ip = Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() {
+ @Override
+ public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+ PublicIp ip = fetchNewPublicIp(zone.getId(), null, null, ipOwner, vlanType, null, false, assign, null, isSystem, null);
- ip = fetchNewPublicIp(zone.getId(), null, null, ipOwner, vlanType, null, false, assign, null, isSystem, null);
+ if (ip == null) {
+ InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Unable to find available public IP addresses", DataCenter.class, zone.getId());
+ ex.addProxyObject(ApiDBUtils.findZoneById(zone.getId()).getUuid());
+ throw ex;
+ }
+ CallContext.current().setEventDetails("Ip Id: " + ip.getId());
+ Ip ipAddress = ip.getAddress();
- if (ip == null) {
- InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Unable to find available public IP addresses", DataCenter.class, zone.getId());
- ex.addProxyObject(ApiDBUtils.findZoneById(zone.getId()).getUuid());
- throw ex;
- }
- CallContext.current().setEventDetails("Ip Id: " + ip.getId());
- Ip ipAddress = ip.getAddress();
+ s_logger.debug("Got " + ipAddress + " to assign for account " + ipOwner.getId() + " in zone " + zone.getId());
- s_logger.debug("Got " + ipAddress + " to assign for account " + ipOwner.getId() + " in zone " + zone.getId());
+ return ip;
+ }
+ }, InsufficientAddressCapacityException.class);
- txn.commit();
} finally {
if (accountToLock != null) {
if (s_logger.isDebugEnabled()) {
@@ -1037,75 +1050,77 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
@Override
@DB
- public IpAddress allocatePortableIp(Account ipOwner, Account caller, long dcId, Long networkId, Long vpcID) throws ConcurrentOperationException, ResourceAllocationException,
+ public IpAddress allocatePortableIp(final Account ipOwner, Account caller, final long dcId, final Long networkId, final Long vpcID) throws ConcurrentOperationException, ResourceAllocationException,
InsufficientAddressCapacityException {
- Transaction txn = Transaction.currentTxn();
GlobalLock portableIpLock = GlobalLock.getInternLock("PortablePublicIpRange");
- PortableIpVO allocatedPortableIp;
IPAddressVO ipaddr;
try {
portableIpLock.lock(5);
- txn.start();
-
- List<PortableIpVO> portableIpVOs = _portableIpDao.listByRegionIdAndState(1, PortableIp.State.Free);
- if (portableIpVOs == null || portableIpVOs.isEmpty()) {
- InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Unable to find available portable IP addresses", Region.class, new Long(1));
- throw ex;
- }
-
- // allocate first portable IP to the user
- allocatedPortableIp = portableIpVOs.get(0);
- allocatedPortableIp.setAllocatedTime(new Date());
- allocatedPortableIp.setAllocatedToAccountId(ipOwner.getAccountId());
- allocatedPortableIp.setAllocatedInDomainId(ipOwner.getDomainId());
- allocatedPortableIp.setState(PortableIp.State.Allocated);
- _portableIpDao.update(allocatedPortableIp.getId(), allocatedPortableIp);
-
- // To make portable IP available as a zone level resource we need to emulate portable IP's (which are
- // provisioned at region level) as public IP provisioned in a zone. user_ip_address and vlan combo give the
- // identity of a public IP in zone. Create entry for portable ip in these tables.
-
- // provision portable IP range VLAN into the zone
- long physicalNetworkId = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(dcId, TrafficType.Public).getId();
- Network network = _networkModel.getSystemNetworkByZoneAndTrafficType(dcId, TrafficType.Public);
- String range = allocatedPortableIp.getAddress() + "-" + allocatedPortableIp.getAddress();
- VlanVO vlan = new VlanVO(VlanType.VirtualNetwork,
- allocatedPortableIp.getVlan(),
- allocatedPortableIp.getGateway(),
- allocatedPortableIp.getNetmask(),
- dcId,
- range,
- network.getId(),
- physicalNetworkId,
- null,
- null,
- null);
- vlan = _vlanDao.persist(vlan);
-
- // provision the portable IP in to user_ip_address table
- ipaddr = new IPAddressVO(new Ip(allocatedPortableIp.getAddress()), dcId, networkId, vpcID, physicalNetworkId, network.getId(), vlan.getId(), true);
- ipaddr.setState(State.Allocated);
- ipaddr.setAllocatedTime(new Date());
- ipaddr.setAllocatedInDomainId(ipOwner.getDomainId());
- ipaddr.setAllocatedToAccountId(ipOwner.getId());
- ipaddr = _ipAddressDao.persist(ipaddr);
-
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_PORTABLE_IP_ASSIGN,
- ipaddr.getId(),
- ipaddr.getDataCenterId(),
- ipaddr.getId(),
- ipaddr.getAddress().toString(),
- ipaddr.isSourceNat(),
- null,
- ipaddr.getSystem(),
- ipaddr.getClass().getName(),
- ipaddr.getUuid());
-
- txn.commit();
+ ipaddr = Transaction.executeWithException(new TransactionCallbackWithException<IPAddressVO>() {
+ @Override
+ public IPAddressVO doInTransaction(TransactionStatus status) throws Exception {
+ PortableIpVO allocatedPortableIp;
+ List<PortableIpVO> portableIpVOs = _portableIpDao.listByRegionIdAndState(1, PortableIp.State.Free);
+ if (portableIpVOs == null || portableIpVOs.isEmpty()) {
+ InsufficientAddressCapacityException ex = new InsufficientAddressCapacityException("Unable to find available portable IP addresses", Region.class, new Long(1));
+ throw ex;
+ }
+
+ // allocate first portable IP to the user
+ allocatedPortableIp = portableIpVOs.get(0);
+ allocatedPortableIp.setAllocatedTime(new Date());
+ allocatedPortableIp.setAllocatedToAccountId(ipOwner.getAccountId());
+ allocatedPortableIp.setAllocatedInDomainId(ipOwner.getDomainId());
+ allocatedPortableIp.setState(PortableIp.State.Allocated);
+ _portableIpDao.update(allocatedPortableIp.getId(), allocatedPortableIp);
+
+ // To make portable IP available as a zone level resource we need to emulate portable IP's (which are
+ // provisioned at region level) as public IP provisioned in a zone. user_ip_address and vlan combo give the
+ // identity of a public IP in zone. Create entry for portable ip in these tables.
+
+ // provision portable IP range VLAN into the zone
+ long physicalNetworkId = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(dcId, TrafficType.Public).getId();
+ Network network = _networkModel.getSystemNetworkByZoneAndTrafficType(dcId, TrafficType.Public);
+ String range = allocatedPortableIp.getAddress() + "-" + allocatedPortableIp.getAddress();
+ VlanVO vlan = new VlanVO(VlanType.VirtualNetwork,
+ allocatedPortableIp.getVlan(),
+ allocatedPortableIp.getGateway(),
+ allocatedPortableIp.getNetmask(),
+ dcId,
+ range,
+ network.getId(),
+ physicalNetworkId,
+ null,
+ null,
+ null);
+ vlan = _vlanDao.persist(vlan);
+
+ // provision the portable IP in to user_ip_address table
+ IPAddressVO ipaddr = new IPAddressVO(new Ip(allocatedPortableIp.getAddress()), dcId, networkId, vpcID, physicalNetworkId, network.getId(), vlan.getId(), true);
+ ipaddr.setState(State.Allocated);
+ ipaddr.setAllocatedTime(new Date());
+ ipaddr.setAllocatedInDomainId(ipOwner.getDomainId());
+ ipaddr.setAllocatedToAccountId(ipOwner.getId());
+ ipaddr = _ipAddressDao.persist(ipaddr);
+
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_PORTABLE_IP_ASSIGN,
+ ipaddr.getId(),
+ ipaddr.getDataCenterId(),
+ ipaddr.getId(),
+ ipaddr.getAddress().toString(),
+ ipaddr.isSourceNat(),
+ null,
+ ipaddr.getSystem(),
+ ipaddr.getClass().getName(),
+ ipaddr.getUuid());
+
+ return ipaddr;
+ }
+ }, InsufficientAddressCapacityException.class);
} finally {
portableIpLock.unlock();
}
@@ -1392,7 +1407,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
@DB
@Override
- public void transferPortableIP(long ipAddrId, long currentNetworkId, long newNetworkId) throws ResourceAllocationException, ResourceUnavailableException,
+ public void transferPortableIP(final long ipAddrId, long currentNetworkId, long newNetworkId) throws ResourceAllocationException, ResourceUnavailableException,
InsufficientAddressCapacityException, ConcurrentOperationException {
Network srcNetwork = _networksDao.findById(currentNetworkId);
@@ -1400,18 +1415,16 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
throw new InvalidParameterValueException("Invalid source network id " + currentNetworkId + " is given");
}
- Network dstNetwork = _networksDao.findById(newNetworkId);
+ final Network dstNetwork = _networksDao.findById(newNetworkId);
if (dstNetwork == null) {
throw new InvalidParameterValueException("Invalid source network id " + newNetworkId + " is given");
}
- IPAddressVO ip = _ipAddressDao.findById(ipAddrId);
+ final IPAddressVO ip = _ipAddressDao.findById(ipAddrId);
if (ip == null) {
throw new InvalidParameterValueException("Invalid portable ip address id is given");
}
- Transaction txn = Transaction.currentTxn();
-
assert (isPortableIpTransferableFromNetwork(ipAddrId, currentNetworkId));
// disassociate portable IP with current network/VPC network
@@ -1424,39 +1437,42 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
// If portable IP need to be transferred across the zones, then mark the entry corresponding to portable ip
// in user_ip_address and vlan tables so as to emulate portable IP as provisioned in destination data center
if (srcNetwork.getDataCenterId() != dstNetwork.getDataCenterId()) {
- txn.start();
-
- long physicalNetworkId = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(dstNetwork.getDataCenterId(), TrafficType.Public).getId();
- long publicNetworkId = _networkModel.getSystemNetworkByZoneAndTrafficType(dstNetwork.getDataCenterId(), TrafficType.Public).getId();
-
- ip.setDataCenterId(dstNetwork.getDataCenterId());
- ip.setPhysicalNetworkId(physicalNetworkId);
- ip.setSourceNetworkId(publicNetworkId);
- _ipAddressDao.update(ipAddrId, ip);
-
- VlanVO vlan = _vlanDao.findById(ip.getVlanId());
- vlan.setPhysicalNetworkId(physicalNetworkId);
- vlan.setNetworkId(publicNetworkId);
- vlan.setDataCenterId(dstNetwork.getDataCenterId());
- _vlanDao.update(ip.getVlanId(), vlan);
-
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ long physicalNetworkId = _networkModel.getDefaultPhysicalNetworkByZoneAndTrafficType(dstNetwork.getDataCenterId(), TrafficType.Public).getId();
+ long publicNetworkId = _networkModel.getSystemNetworkByZoneAndTrafficType(dstNetwork.getDataCenterId(), TrafficType.Public).getId();
+
+ ip.setDataCenterId(dstNetwork.getDataCenterId());
+ ip.setPhysicalNetworkId(physicalNetworkId);
+ ip.setSourceNetworkId(publicNetworkId);
+ _ipAddressDao.update(ipAddrId, ip);
+
+ VlanVO vlan = _vlanDao.findById(ip.getVlanId());
+ vlan.setPhysicalNetworkId(physicalNetworkId);
+ vlan.setNetworkId(publicNetworkId);
+ vlan.setDataCenterId(dstNetwork.getDataCenterId());
+ _vlanDao.update(ip.getVlanId(), vlan);
+ }
+ });
}
// associate portable IP with new network/VPC network
associatePortableIPToGuestNetwork(ipAddrId, newNetworkId, false);
- txn.start();
-
- if (dstNetwork.getVpcId() != null) {
- ip.setVpcId(dstNetwork.getVpcId());
- } else {
- ip.setVpcId(null);
- }
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ if (dstNetwork.getVpcId() != null) {
+ ip.setVpcId(dstNetwork.getVpcId());
+ } else {
+ ip.setVpcId(null);
+ }
- _ipAddressDao.update(ipAddrId, ip);
+ _ipAddressDao.update(ipAddrId, ip);
+ }
+ });
- txn.commit();
// trigger an action event for the transfer of portable IP across the networks, so that external entities
// monitoring for this event can initiate the route advertisement for the availability of IP from the zoe
@@ -1474,106 +1490,113 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
@Override
@DB
- public boolean associateIpAddressListToAccount(long userId, long accountId, long zoneId, Long vlanId, Network guestNetwork) throws InsufficientCapacityException,
+ public boolean associateIpAddressListToAccount(long userId, final long accountId, final long zoneId, final Long vlanId, final Network guestNetworkFinal) throws InsufficientCapacityException,
ConcurrentOperationException, ResourceUnavailableException, ResourceAllocationException {
- Account owner = _accountMgr.getActiveAccountById(accountId);
- boolean createNetwork = false;
+ final Account owner = _accountMgr.getActiveAccountById(accountId);
- if (guestNetwork != null && guestNetwork.getTrafficType() != TrafficType.Guest) {
- throw new InvalidParameterValueException("Network " + guestNetwork + " is not of a type " + TrafficType.Guest);
+ if (guestNetworkFinal != null && guestNetworkFinal.getTrafficType() != TrafficType.Guest) {
+ throw new InvalidParameterValueException("Network " + guestNetworkFinal + " is not of a type " + TrafficType.Guest);
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- if (guestNetwork == null) {
- List<? extends Network> networks = getIsolatedNetworksWithSourceNATOwnedByAccountInZone(zoneId, owner);
- if (networks.size() == 0) {
- createNetwork = true;
- } else if (networks.size() == 1) {
- guestNetwork = networks.get(0);
- } else {
- throw new InvalidParameterValueException("Error, more than 1 Guest Isolated Networks with SourceNAT "
- + "service enabled found for this account, cannot assosiate the IP range, please provide the network ID");
- }
- }
-
- // create new Virtual network (Isolated with SourceNAT) for the user if it doesn't exist
- List<NetworkOfferingVO> requiredOfferings = _networkOfferingDao.listByAvailability(Availability.Required, false);
- if (requiredOfferings.size() < 1) {
- throw new CloudRuntimeException("Unable to find network offering with availability=" + Availability.Required +
- " to automatically create the network as part of createVlanIpRange");
- }
- if (createNetwork) {
- if (requiredOfferings.get(0).getState() == NetworkOffering.State.Enabled) {
- long physicalNetworkId = _networkModel.findPhysicalNetworkId(zoneId, requiredOfferings.get(0).getTags(), requiredOfferings.get(0).getTrafficType());
- // Validate physical network
- PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
- if (physicalNetwork == null) {
- throw new InvalidParameterValueException("Unable to find physical network with id: " + physicalNetworkId + " and tag: " + requiredOfferings.get(0).getTags());
- }
+ Ternary<Boolean,List<NetworkOfferingVO>, Network> pair = Transaction.executeWithException(new TransactionCallbackWithException<Ternary<Boolean,List<NetworkOfferingVO>, Network>>() {
+ @Override
+ public Ternary<Boolean,List<NetworkOfferingVO>, Network> doInTransaction(TransactionStatus status) throws Exception {
+ boolean createNetwork = false;
+ Network guestNetwork = guestNetworkFinal;
- s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() +
- " as a part of createVlanIpRange process");
- guestNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(),
- owner.getAccountName() + "-network",
- owner.getAccountName() + "-network",
- null,
- null,
- null,
- null,
- owner,
- null,
- physicalNetwork,
- zoneId,
- ACLType.Account,
- null,
- null,
- null,
- null,
- true,
- null);
if (guestNetwork == null) {
- s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId);
- throw new CloudRuntimeException("Failed to create a Guest Isolated Networks with SourceNAT " +
- "service enabled as a part of createVlanIpRange, for the account " + accountId + "in zone " + zoneId);
+ List<? extends Network> networks = getIsolatedNetworksWithSourceNATOwnedByAccountInZone(zoneId, owner);
+ if (networks.size() == 0) {
+ createNetwork = true;
+ } else if (networks.size() == 1) {
+ guestNetwork = networks.get(0);
+ } else {
+ throw new InvalidParameterValueException("Error, more than 1 Guest Isolated Networks with SourceNAT "
+ + "service enabled found for this account, cannot assosiate the IP range, please provide the network ID");
+ }
}
- } else {
- throw new CloudRuntimeException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled);
- }
- }
-
- // Check if there is a source nat ip address for this account; if not - we have to allocate one
- boolean allocateSourceNat = false;
- List<IPAddressVO> sourceNat = _ipAddressDao.listByAssociatedNetwork(guestNetwork.getId(), true);
- if (sourceNat.isEmpty()) {
- allocateSourceNat = true;
- }
-
- // update all ips with a network id, mark them as allocated and update resourceCount/usage
- List<IPAddressVO> ips = _ipAddressDao.listByVlanId(vlanId);
- boolean isSourceNatAllocated = false;
- for (IPAddressVO addr : ips) {
- if (addr.getState() != State.Allocated) {
- if (!isSourceNatAllocated && allocateSourceNat) {
- addr.setSourceNat(true);
- isSourceNatAllocated = true;
- } else {
- addr.setSourceNat(false);
+
+ // create new Virtual network (Isolated with SourceNAT) for the user if it doesn't exist
+ List<NetworkOfferingVO> requiredOfferings = _networkOfferingDao.listByAvailability(Availability.Required, false);
+ if (requiredOfferings.size() < 1) {
+ throw new CloudRuntimeException("Unable to find network offering with availability=" + Availability.Required +
+ " to automatically create the network as part of createVlanIpRange");
}
- addr.setAssociatedWithNetworkId(guestNetwork.getId());
- addr.setVpcId(guestNetwork.getVpcId());
- addr.setAllocatedTime(new Date());
- addr.setAllocatedInDomainId(owner.getDomainId());
- addr.setAllocatedToAccountId(owner.getId());
- addr.setSystem(false);
- addr.setState(IpAddress.State.Allocating);
- markPublicIpAsAllocated(addr);
+ if (createNetwork) {
+ if (requiredOfferings.get(0).getState() == NetworkOffering.State.Enabled) {
+ long physicalNetworkId = _networkModel.findPhysicalNetworkId(zoneId, requiredOfferings.get(0).getTags(), requiredOfferings.get(0).getTrafficType());
+ // Validate physical network
+ PhysicalNetwork physicalNetwork = _physicalNetworkDao.findById(physicalNetworkId);
+ if (physicalNetwork == null) {
+ throw new InvalidParameterValueException("Unable to find physical network with id: " + physicalNetworkId + " and tag: " + requiredOfferings.get(0).getTags());
+ }
+
+ s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() +
+ " as a part of createVlanIpRange process");
+ guestNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(),
+ owner.getAccountName() + "-network",
+ owner.getAccountName() + "-network",
+ null,
+ null,
+ null,
+ null,
+ owner,
+ null,
+ physicalNetwork,
+ zoneId,
+ ACLType.Account,
+ null,
+ null,
+ null,
+ null,
+ true,
+ null);
+ if (guestNetwork == null) {
+ s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId);
+ throw new CloudRuntimeException("Failed to create a Guest Isolated Networks with SourceNAT " +
+ "service enabled as a part of createVlanIpRange, for the account " + accountId + "in zone " + zoneId);
+ }
+ } else {
+ throw new CloudRuntimeException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled);
+ }
+ }
+
+ // Check if there is a source nat ip address for this account; if not - we have to allocate one
+ boolean allocateSourceNat = false;
+ List<IPAddressVO> sourceNat = _ipAddressDao.listByAssociatedNetwork(guestNetwork.getId(), true);
+ if (sourceNat.isEmpty()) {
+ allocateSourceNat = true;
+ }
+
+ // update all ips with a network id, mark them as allocated and update resourceCount/usage
+ List<IPAddressVO> ips = _ipAddressDao.listByVlanId(vlanId);
+ boolean isSourceNatAllocated = false;
+ for (IPAddressVO addr : ips) {
+ if (addr.getState() != State.Allocated) {
+ if (!isSourceNatAllocated && allocateSourceNat) {
+ addr.setSourceNat(true);
+ isSourceNatAllocated = true;
+ } else {
+ addr.setSourceNat(false);
+ }
+ addr.setAssociatedWithNetworkId(guestNetwork.getId());
+ addr.setVpcId(guestNetwork.getVpcId());
+ addr.setAllocatedTime(new Date());
+ addr.setAllocatedInDomainId(owner.getDomainId());
+ addr.setAllocatedToAccountId(owner.getId());
+ addr.setSystem(false);
+ addr.setState(IpAddress.State.Allocating);
+ markPublicIpAsAllocated(addr);
+ }
+ }
+ return new Ternary<Boolean,List<NetworkOfferingVO>, Network>(createNetwork, requiredOfferings, guestNetwork);
}
- }
-
- txn.commit();
+ }, InsufficientCapacityException.class);
+ boolean createNetwork = pair.first();
+ List<NetworkOfferingVO> requiredOfferings = pair.second();
+ Network guestNetwork = pair.third();
+
// if the network offering has persistent set to true, implement the network
if (createNetwork && requiredOfferings.get(0).getIsPersistent()) {
DataCenter zone = _dcDao.findById(zoneId);
@@ -1602,10 +1625,8 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
@DB
@Override
- public IPAddressVO markIpAsUnavailable(long addrId) {
- Transaction txn = Transaction.currentTxn();
-
- IPAddressVO ip = _ipAddressDao.findById(addrId);
+ public IPAddressVO markIpAsUnavailable(final long addrId) {
+ final IPAddressVO ip = _ipAddressDao.findById(addrId);
if (ip.getAllocatedToAccountId() == null && ip.getAllocatedTime() == null) {
s_logger.trace("Ip address id=" + addrId + " is already released");
@@ -1613,35 +1634,36 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
}
if (ip.getState() != State.Releasing) {
- txn.start();
-
- if (updateIpResourceCount(ip)) {
- _resourceLimitMgr.decrementResourceCount(_ipAddressDao.findById(addrId).getAllocatedToAccountId(), ResourceType.public_ip);
- }
+ return Transaction.execute(new TransactionCallback<IPAddressVO>() {
+ @Override
+ public IPAddressVO doInTransaction(TransactionStatus status) {
+ if (updateIpResourceCount(ip)) {
+ _resourceLimitMgr.decrementResourceCount(_ipAddressDao.findById(addrId).getAllocatedToAccountId(), ResourceType.public_ip);
+ }
- // Save usage event
- if (ip.getAllocatedToAccountId() != null && ip.getAllocatedToAccountId() != Account.ACCOUNT_ID_SYSTEM) {
- VlanVO vlan = _vlanDao.findById(ip.getVlanId());
-
- String guestType = vlan.getVlanType().toString();
- if (!isIpDedicated(ip)) {
- String eventType = ip.isPortable() ? EventTypes.EVENT_PORTABLE_IP_RELEASE : EventTypes.EVENT_NET_IP_RELEASE;
- UsageEventUtils.publishUsageEvent(eventType,
- ip.getAllocatedToAccountId(),
- ip.getDataCenterId(),
- addrId,
- ip.getAddress().addr(),
- ip.isSourceNat(),
- guestType,
- ip.getSystem(),
- ip.getClass().getName(),
- ip.getUuid());
+ // Save usage event
+ if (ip.getAllocatedToAccountId() != null && ip.getAllocatedToAccountId() != Account.ACCOUNT_ID_SYSTEM) {
+ VlanVO vlan = _vlanDao.findById(ip.getVlanId());
+
+ String guestType = vlan.getVlanType().toString();
+ if (!isIpDedicated(ip)) {
+ String eventType = ip.isPortable() ? EventTypes.EVENT_PORTABLE_IP_RELEASE : EventTypes.EVENT_NET_IP_RELEASE;
+ UsageEventUtils.publishUsageEvent(eventType,
+ ip.getAllocatedToAccountId(),
+ ip.getDataCenterId(),
+ addrId,
+ ip.getAddress().addr(),
+ ip.isSourceNat(),
+ guestType,
+ ip.getSystem(),
+ ip.getClass().getName(),
+ ip.getUuid());
+ }
+ }
+
+ return _ipAddressDao.markAsUnavailable(addrId);
}
- }
-
- ip = _ipAddressDao.markAsUnavailable(addrId);
-
- txn.commit();
+ });
}
return ip;
@@ -1826,73 +1848,76 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
@Override
@DB
- public void allocateDirectIp(NicProfile nic, DataCenter dc, VirtualMachineProfile vm, Network network, String requestedIpv4, String requestedIpv6)
+ public void allocateDirectIp(final NicProfile nic, final DataCenter dc, final VirtualMachineProfile vm, final Network network, final String requestedIpv4, final String requestedIpv6)
throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException {
- //This method allocates direct ip for the Shared network in Advance zones
- boolean ipv4 = false;
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- if (network.getGateway() != null) {
- if (nic.getIp4Address() == null) {
- ipv4 = true;
- PublicIp ip = null;
-
- //Get ip address from the placeholder and don't allocate a new one
- if (requestedIpv4 != null && vm.getType() == VirtualMachine.Type.DomainRouter) {
- Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
- if (placeholderNic != null) {
- IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), placeholderNic.getIp4Address());
- ip = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
- s_logger.debug("Nic got an ip address " + placeholderNic.getIp4Address() + " stored in placeholder nic for the network " + network);
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+ //This method allocates direct ip for the Shared network in Advance zones
+ boolean ipv4 = false;
+
+ if (network.getGateway() != null) {
+ if (nic.getIp4Address() == null) {
+ ipv4 = true;
+ PublicIp ip = null;
+
+ //Get ip address from the placeholder and don't allocate a new one
+ if (requestedIpv4 != null && vm.getType() == VirtualMachine.Type.DomainRouter) {
+ Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
+ if (placeholderNic != null) {
+ IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), placeholderNic.getIp4Address());
+ ip = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
+ s_logger.debug("Nic got an ip address " + placeholderNic.getIp4Address() + " stored in placeholder nic for the network " + network);
+ }
+ }
+
+ if (ip == null) {
+ ip = assignPublicIpAddress(dc.getId(), null, vm.getOwner(), VlanType.DirectAttached, network.getId(), requestedIpv4, false);
+ }
+
+ nic.setIp4Address(ip.getAddress().toString());
+ nic.setGateway(ip.getGateway());
+ nic.setNetmask(ip.getNetmask());
+ nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
+ //nic.setBroadcastType(BroadcastDomainType.Vlan);
+ //nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
+ nic.setBroadcastType(network.getBroadcastDomainType());
+ nic.setBroadcastUri(network.getBroadcastUri());
+ nic.setFormat(AddressFormat.Ip4);
+ nic.setReservationId(String.valueOf(ip.getVlanTag()));
+ nic.setMacAddress(ip.getMacAddress());
}
+ nic.setDns1(dc.getDns1());
+ nic.setDns2(dc.getDns2());
}
- if (ip == null) {
- ip = assignPublicIpAddress(dc.getId(), null, vm.getOwner(), VlanType.DirectAttached, network.getId(), requestedIpv4, false);
+ //FIXME - get ipv6 address from the placeholder if it's stored there
+ if (network.getIp6Gateway() != null) {
+ if (nic.getIp6Address() == null) {
+ UserIpv6Address ip = _ipv6Mgr.assignDirectIp6Address(dc.getId(), vm.getOwner(), network.getId(), requestedIpv6);
+ Vlan vlan = _vlanDao.findById(ip.getVlanId());
+ nic.setIp6Address(ip.getAddress().toString());
+ nic.setIp6Gateway(vlan.getIp6Gateway());
+ nic.setIp6Cidr(vlan.getIp6Cidr());
+ if (ipv4) {
+ nic.setFormat(AddressFormat.DualStack);
+ } else {
+ nic.setIsolationUri(IsolationType.Vlan.toUri(vlan.getVlanTag()));
+ nic.setBroadcastType(BroadcastDomainType.Vlan);
+ nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlan.getVlanTag()));
+ nic.setFormat(AddressFormat.Ip6);
+ nic.setReservationId(String.valueOf(vlan.getVlanTag()));
+ nic.setMacAddress(ip.getMacAddress());
+ }
+ }
+ nic.setIp6Dns1(dc.getIp6Dns1());
+ nic.setIp6Dns2(dc.getIp6Dns2());
}
- nic.setIp4Address(ip.getAddress().toString());
- nic.setGateway(ip.getGateway());
- nic.setNetmask(ip.getNetmask());
- nic.setIsolationUri(IsolationType.Vlan.toUri(ip.getVlanTag()));
- //nic.setBroadcastType(BroadcastDomainType.Vlan);
- //nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(ip.getVlanTag()));
- nic.setBroadcastType(network.getBroadcastDomainType());
- nic.setBroadcastUri(network.getBroadcastUri());
- nic.setFormat(AddressFormat.Ip4);
- nic.setReservationId(String.valueOf(ip.getVlanTag()));
- nic.setMacAddress(ip.getMacAddress());
- }
- nic.setDns1(dc.getDns1());
- nic.setDns2(dc.getDns2());
- }
-
- //FIXME - get ipv6 address from the placeholder if it's stored there
- if (network.getIp6Gateway() != null) {
- if (nic.getIp6Address() == null) {
- UserIpv6Address ip = _ipv6Mgr.assignDirectIp6Address(dc.getId(), vm.getOwner(), network.getId(), requestedIpv6);
- Vlan vlan = _vlanDao.findById(ip.getVlanId());
- nic.setIp6Address(ip.getAddress().toString());
- nic.setIp6Gateway(vlan.getIp6Gateway());
- nic.setIp6Cidr(vlan.getIp6Cidr());
- if (ipv4) {
- nic.setFormat(AddressFormat.DualStack);
- } else {
- nic.setIsolationUri(IsolationType.Vlan.toUri(vlan.getVlanTag()));
- nic.setBroadcastType(BroadcastDomainType.Vlan);
- nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(vlan.getVlanTag()));
- nic.setFormat(AddressFormat.Ip6);
- nic.setReservationId(String.valueOf(vlan.getVlanTag()));
- nic.setMacAddress(ip.getMacAddress());
- }
+ return null;
}
- nic.setIp6Dns1(dc.getIp6Dns1());
- nic.setIp6Dns2(dc.getIp6Dns2());
- }
+ }, InsufficientAddressCapacityException.class);
- txn.commit();
}
@Override
[15/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
index 56d405e..35968ee 100644
--- a/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
+++ b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java
@@ -44,7 +44,6 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.framework.config.ConfigDepot;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.Configurable;
@@ -62,6 +61,9 @@ import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.ConnectionConcierge;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.events.SubscriptionMgr;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.exception.ExceptionUtil;
@@ -532,7 +534,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
return new ManagedContextRunnable() {
@Override
protected void runInContext() {
- Transaction txn = Transaction.open("ClusterHeartbeat");
+ TransactionLegacy txn = TransactionLegacy.open("ClusterHeartbeat");
try {
Profiler profiler = new Profiler();
Profiler profilerHeartbeatUpdate = new Profiler();
@@ -599,7 +601,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
invalidHeartbeatConnection();
} finally {
- txn.transitToAutoManagedConnection(Transaction.CLOUD_DB);
+ txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB);
txn.close("ClusterHeartbeat");
}
}
@@ -620,7 +622,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
private Connection getHeartbeatConnection() throws SQLException {
if(_heartbeatConnection == null) {
- Connection conn = Transaction.getStandaloneConnectionWithException();
+ Connection conn = TransactionLegacy.getStandaloneConnectionWithException();
_heartbeatConnection = new ConnectionConcierge("ClusterManagerHeartbeat", conn, false);
}
@@ -629,9 +631,9 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
private void invalidHeartbeatConnection() {
if(_heartbeatConnection != null) {
- Connection conn = Transaction.getStandaloneConnection();
+ Connection conn = TransactionLegacy.getStandaloneConnection();
if (conn != null) {
- _heartbeatConnection.reset(Transaction.getStandaloneConnection());
+ _heartbeatConnection.reset(TransactionLegacy.getStandaloneConnection());
}
}
}
@@ -942,58 +944,54 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager, C
s_logger.info("Starting cluster manager, msid : " + _msId);
}
- Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
-
- final Class<?> c = this.getClass();
- String version = c.getPackage().getImplementationVersion();
+ ManagementServerHostVO mshost = Transaction.execute(new TransactionCallback<ManagementServerHostVO>() {
+ @Override
+ public ManagementServerHostVO doInTransaction(TransactionStatus status) {
- ManagementServerHostVO mshost = _mshostDao.findByMsid(_msId);
- if (mshost == null) {
- mshost = new ManagementServerHostVO();
- mshost.setMsid(_msId);
- mshost.setRunid(getCurrentRunId());
- mshost.setName(NetUtils.getHostName());
- mshost.setVersion(version);
- mshost.setServiceIP(_clusterNodeIP);
- mshost.setServicePort(_currentServiceAdapter.getServicePort());
- mshost.setLastUpdateTime(DateUtil.currentGMTTime());
- mshost.setRemoved(null);
- mshost.setAlertCount(0);
- mshost.setState(ManagementServerHost.State.Up);
- _mshostDao.persist(mshost);
-
- if (s_logger.isInfoEnabled()) {
- s_logger.info("New instance of management server msid " + _msId + " is being started");
- }
- } else {
- if (s_logger.isInfoEnabled()) {
- s_logger.info("Management server " + _msId + " is being started");
+ final Class<?> c = this.getClass();
+ String version = c.getPackage().getImplementationVersion();
+
+ ManagementServerHostVO mshost = _mshostDao.findByMsid(_msId);
+ if (mshost == null) {
+ mshost = new ManagementServerHostVO();
+ mshost.setMsid(_msId);
+ mshost.setRunid(getCurrentRunId());
+ mshost.setName(NetUtils.getHostName());
+ mshost.setVersion(version);
+ mshost.setServiceIP(_clusterNodeIP);
+ mshost.setServicePort(_currentServiceAdapter.getServicePort());
+ mshost.setLastUpdateTime(DateUtil.currentGMTTime());
+ mshost.setRemoved(null);
+ mshost.setAlertCount(0);
+ mshost.setState(ManagementServerHost.State.Up);
+ _mshostDao.persist(mshost);
+
+ if (s_logger.isInfoEnabled()) {
+ s_logger.info("New instance of management server msid " + _msId + " is being started");
+ }
+ } else {
+ if (s_logger.isInfoEnabled()) {
+ s_logger.info("Management server " + _msId + " is being started");
+ }
+
+ _mshostDao.update(mshost.getId(), getCurrentRunId(), NetUtils.getHostName(), version, _clusterNodeIP, _currentServiceAdapter.getServicePort(), DateUtil.currentGMTTime());
}
-
- _mshostDao.update(mshost.getId(), getCurrentRunId(), NetUtils.getHostName(), version, _clusterNodeIP, _currentServiceAdapter.getServicePort(), DateUtil.currentGMTTime());
+
+ return mshost;
}
+ });
- txn.commit();
-
- _mshostId = mshost.getId();
- if (s_logger.isInfoEnabled()) {
- s_logger.info("Management server (host id : " + _mshostId + ") is being started at " + _clusterNodeIP + ":" + _currentServiceAdapter.getServicePort());
- }
-
- _mshostPeerDao.clearPeerInfo(_mshostId);
-
- // use seperate thread for heartbeat updates
- _heartbeatScheduler.scheduleAtFixedRate(getHeartbeatTask(), HeartbeatInterval.value(), HeartbeatInterval.value(), TimeUnit.MILLISECONDS);
- _notificationExecutor.submit(getNotificationTask());
+ _mshostId = mshost.getId();
+ if (s_logger.isInfoEnabled()) {
+ s_logger.info("Management server (host id : " + _mshostId + ") is being started at " + _clusterNodeIP + ":" + _currentServiceAdapter.getServicePort());
+ }
+
+ _mshostPeerDao.clearPeerInfo(_mshostId);
- } catch (Throwable e) {
- s_logger.error("Unexpected exception : ", e);
- txn.rollback();
+ // use seperate thread for heartbeat updates
+ _heartbeatScheduler.scheduleAtFixedRate(getHeartbeatTask(), HeartbeatInterval.value(), HeartbeatInterval.value(), TimeUnit.MILLISECONDS);
+ _notificationExecutor.submit(getNotificationTask());
- throw new CloudRuntimeException("Unable to initialize cluster info into database");
- }
if (s_logger.isInfoEnabled()) {
s_logger.info("Cluster manager was started successfully");
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
index 879c4ce..246bfe6 100644
--- a/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
+++ b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Local(value={ManagementServerHostDao.class})
@@ -52,7 +52,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
@Override
public void invalidateRunSession(long id, long runid) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement("update mshost set runid=0, state='Down' where id=? and runid=?");
@@ -81,7 +81,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
@Override
@DB
public void update(long id, long runid, String name, String version, String serviceIP, int servicePort, Date lastUpdate) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
txn.start();
@@ -106,7 +106,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
@Override
@DB
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
@@ -127,7 +127,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
@Override
@DB
public void update(long id, long runid, Date lastUpdate) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
txn.start();
@@ -167,7 +167,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
@Override
@DB
public int increaseAlertCount(long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
int changedRows = 0;
try {
@@ -209,7 +209,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
@Override
public void update(long id, long runId, State state, Date lastUpdate) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement("update mshost set state=?, last_update=? where id=? and runid=?");
@@ -241,7 +241,7 @@ public class ManagementServerHostDaoImpl extends GenericDaoBase<ManagementServer
public List<Long> listOrphanMsids() {
List<Long> orphanList = new ArrayList<Long>();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
index 8ef2e82..f51076c 100644
--- a/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
+++ b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Local(value={ManagementServerHostPeerDao.class})
public class ManagementServerHostPeerDaoImpl extends GenericDaoBase<ManagementServerHostPeerVO, Long> implements ManagementServerHostPeerDao {
@@ -68,7 +68,7 @@ public class ManagementServerHostPeerDaoImpl extends GenericDaoBase<ManagementSe
@Override
@DB
public void updatePeerInfo(long ownerMshost, long peerMshost, long peerRunid, ManagementServerHost.State peerState) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/config/src/org/apache/cloudstack/framework/config/dao/ConfigurationDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/config/src/org/apache/cloudstack/framework/config/dao/ConfigurationDaoImpl.java b/framework/config/src/org/apache/cloudstack/framework/config/dao/ConfigurationDaoImpl.java
index e402988..1f649d4 100644
--- a/framework/config/src/org/apache/cloudstack/framework/config/dao/ConfigurationDaoImpl.java
+++ b/framework/config/src/org/apache/cloudstack/framework/config/dao/ConfigurationDaoImpl.java
@@ -34,7 +34,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -132,7 +132,7 @@ public class ConfigurationDaoImpl extends GenericDaoBase<ConfigurationVO, String
@Override
@Deprecated
public boolean update(String name, String value) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareStatement(UPDATE_CONFIGURATION_SQL);
stmt.setString(1, value);
@@ -147,7 +147,7 @@ public class ConfigurationDaoImpl extends GenericDaoBase<ConfigurationVO, String
@Override
public boolean update(String name, String category, String value) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
value = ("Hidden".equals(category) || "Secure".equals(category)) ? DBEncryptionUtil.encrypt(value) : value;
PreparedStatement stmt = txn.prepareStatement(UPDATE_CONFIGURATION_SQL);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java b/framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java
index 9b13eb8..b7246a9 100755
--- a/framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java
+++ b/framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java
@@ -39,6 +39,7 @@ import org.jasypt.properties.EncryptableProperties;
import com.cloud.utils.PropertiesUtil;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
import org.apache.commons.configuration.ConfigurationException;
@@ -227,7 +228,7 @@ public class EncryptionSecretKeyChanger {
initEncryptor(newEncryptor, newDBKey);
System.out.println("Initialised Encryptors");
- Transaction txn = Transaction.open("Migrate");
+ TransactionLegacy txn = TransactionLegacy.open("Migrate");
txn.start();
try {
Connection conn;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/ConnectionConcierge.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/ConnectionConcierge.java b/framework/db/src/com/cloud/utils/db/ConnectionConcierge.java
index c3c24f9..acb9cc6 100644
--- a/framework/db/src/com/cloud/utils/db/ConnectionConcierge.java
+++ b/framework/db/src/com/cloud/utils/db/ConnectionConcierge.java
@@ -178,7 +178,7 @@ public class ConnectionConcierge {
return "Not Found";
}
- Connection conn = Transaction.getStandaloneConnection();
+ Connection conn = TransactionLegacy.getStandaloneConnection();
if (conn == null) {
return "Unable to get anotehr db connection";
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/DbUtil.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/DbUtil.java b/framework/db/src/com/cloud/utils/db/DbUtil.java
index da0efbb..2570093 100755
--- a/framework/db/src/com/cloud/utils/db/DbUtil.java
+++ b/framework/db/src/com/cloud/utils/db/DbUtil.java
@@ -56,7 +56,7 @@ public class DbUtil {
assert(false);
}
- Connection connection = Transaction.getStandaloneConnection();
+ Connection connection = TransactionLegacy.getStandaloneConnection();
if(connection != null) {
try {
connection.setAutoCommit(true);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/GenericDaoBase.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/GenericDaoBase.java b/framework/db/src/com/cloud/utils/db/GenericDaoBase.java
index 574974e..ba5200e 100755
--- a/framework/db/src/com/cloud/utils/db/GenericDaoBase.java
+++ b/framework/db/src/com/cloud/utils/db/GenericDaoBase.java
@@ -380,7 +380,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
List<Object> groupByValues = addGroupBy(str, sc);
addFilter(str, filter);
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
if (lock != null) {
assert (txn.dbTxnStarted() == true) : "As nice as I can here now....how do you lock when there's no DB transaction? Review your db 101 course from college.";
str.append(lock ? FOR_UPDATE_CLAUSE : SHARE_MODE_CLAUSE);
@@ -452,7 +452,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
final String sql = str.toString();
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql);
@@ -770,7 +770,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
}
SearchCriteria<T> sc = createSearchCriteria();
sc.addAnd(_idAttributes.get(_table)[0], SearchCriteria.Op.EQ, id);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
try {
@@ -791,7 +791,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
public int update(UpdateBuilder ub, final SearchCriteria<?> sc, Integer rows) {
StringBuilder sql = null;
PreparedStatement pstmt = null;
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
final String searchClause = sc.getWhereClause();
@@ -971,7 +971,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
if (lock != null) {
sql.append(lock ? FOR_UPDATE_CLAUSE : SHARE_MODE_CLAUSE);
}
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql.toString());
@@ -994,7 +994,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
@Override
public T acquireInLockTable(final ID id, int seconds) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
T t = null;
boolean locked = false;
try {
@@ -1014,7 +1014,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
@Override
public boolean releaseFromLockTable(final ID id) {
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
return txn.release(_table + id);
}
@@ -1025,13 +1025,13 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
@Override
public boolean lockInLockTable(final String id, int seconds) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
return txn.lock(_table + id, seconds);
}
@Override
public boolean unlockFromLockTable(final String id) {
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
return txn.release(_table + id);
}
@@ -1076,7 +1076,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
}
protected List<T> executeList(final String sql, final Object... params) {
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
final List<T> result = new ArrayList<T>();
try {
@@ -1118,7 +1118,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
@Override
public boolean expunge(final ID id) {
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = null;
try {
@@ -1158,7 +1158,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
final String sql = str.toString();
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql);
@@ -1296,7 +1296,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
}
ID id = null;
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = null;
try {
@@ -1359,7 +1359,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
}
protected void insertElementCollection(T entity, Attribute idAttribute, ID id, Map<Attribute, Object> ecAttributes) throws SQLException {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
for (Map.Entry<Attribute, Object> entry : ecAttributes.entrySet()) {
Attribute attr = entry.getKey();
@@ -1591,7 +1591,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
protected void loadCollection(T entity, Attribute attr) {
EcInfo ec = (EcInfo)attr.attache;
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
ResultSet rs = null;
PreparedStatement pstmt = null;
try {
@@ -1675,7 +1675,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
}
final StringBuilder sql = new StringBuilder("DELETE FROM ");
sql.append(_table).append(" WHERE ").append(_removed.first()).append(" IS NOT NULL");
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
txn.start();
@@ -1708,7 +1708,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
return expunge(id);
}
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
@@ -1817,7 +1817,7 @@ public abstract class GenericDaoBase<T, ID extends Serializable> extends Compone
// we have to disable group by in getting count, since count for groupBy clause will be different.
//List<Object> groupByValues = addGroupBy(str, sc);
- final Transaction txn = Transaction.currentTxn();
+ final TransactionLegacy txn = TransactionLegacy.currentTxn();
final String sql = str.toString();
PreparedStatement pstmt = null;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/Merovingian2.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/Merovingian2.java b/framework/db/src/com/cloud/utils/db/Merovingian2.java
index 0e0e8f2..8544aab 100644
--- a/framework/db/src/com/cloud/utils/db/Merovingian2.java
+++ b/framework/db/src/com/cloud/utils/db/Merovingian2.java
@@ -65,7 +65,7 @@ public class Merovingian2 extends StandardMBean implements MerovingianMBean {
_msId = msId;
Connection conn = null;
try {
- conn = Transaction.getStandaloneConnectionWithException();
+ conn = TransactionLegacy.getStandaloneConnectionWithException();
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
conn.setAutoCommit(true);
_concierge = new ConnectionConcierge("LockMaster", conn, true);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/SequenceFetcher.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/SequenceFetcher.java b/framework/db/src/com/cloud/utils/db/SequenceFetcher.java
index 8823552..bb45847 100644
--- a/framework/db/src/com/cloud/utils/db/SequenceFetcher.java
+++ b/framework/db/src/com/cloud/utils/db/SequenceFetcher.java
@@ -98,7 +98,7 @@ public class SequenceFetcher {
sql.append(_tg.valueColumnName()).append(" FROM ").append(_tg.table());
sql.append(" WHERE ").append(_tg.pkColumnName()).append(" = ? FOR UPDATE");
- Transaction txn = Transaction.open("Sequence");
+ TransactionLegacy txn = TransactionLegacy.open("Sequence");
PreparedStatement selectStmt = txn.prepareStatement(sql.toString());
if (_key == null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/Transaction.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/Transaction.java b/framework/db/src/com/cloud/utils/db/Transaction.java
index 8c2f199..0ca1cc7 100755
--- a/framework/db/src/com/cloud/utils/db/Transaction.java
+++ b/framework/db/src/com/cloud/utils/db/Transaction.java
@@ -16,1158 +16,50 @@
// under the License.
package com.cloud.utils.db;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Savepoint;
-import java.sql.Statement;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Properties;
import java.util.concurrent.atomic.AtomicLong;
-import javax.sql.DataSource;
+import com.cloud.utils.exception.ExceptionUtil;
-import org.apache.commons.dbcp.ConnectionFactory;
-import org.apache.commons.dbcp.DriverManagerConnectionFactory;
-import org.apache.commons.dbcp.PoolableConnectionFactory;
-import org.apache.commons.dbcp.PoolingDataSource;
-import org.apache.commons.pool.KeyedObjectPoolFactory;
-import org.apache.commons.pool.impl.GenericObjectPool;
-import org.apache.commons.pool.impl.StackKeyedObjectPoolFactory;
-import org.apache.log4j.Logger;
-import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
-import org.jasypt.properties.EncryptableProperties;
-
-import com.cloud.utils.Pair;
-import com.cloud.utils.PropertiesUtil;
-import com.cloud.utils.crypt.EncryptionSecretKeyChecker;
-import com.cloud.utils.exception.CloudRuntimeException;
-import com.cloud.utils.mgmt.JmxUtil;
-
-/**
- * Transaction abstracts away the Connection object in JDBC. It allows the
- * following things that the Connection object does not.
- *
- * 1. Transaction can be started at an entry point and whether the DB
- * actions should be auto-commit or not determined at that point.
- * 2. DB Connection is allocated only when it is needed.
- * 3. Code does not need to know if a transaction has been started or not.
- * It just starts/ends a transaction and we resolve it correctly with
- * the previous actions.
- *
- * Note that this class is not synchronous but it doesn't need to be because
- * it is stored with TLS and is one per thread. Use appropriately.
- */
public class Transaction {
- private static final Logger s_logger = Logger.getLogger(Transaction.class.getName() + "." + "Transaction");
- private static final Logger s_stmtLogger = Logger.getLogger(Transaction.class.getName() + "." + "Statement");
- private static final Logger s_lockLogger = Logger.getLogger(Transaction.class.getName() + "." + "Lock");
- private static final Logger s_connLogger = Logger.getLogger(Transaction.class.getName() + "." + "Connection");
-
- private static final ThreadLocal<Transaction> tls = new ThreadLocal<Transaction>();
- private static final String START_TXN = "start_txn";
- private static final String CURRENT_TXN = "current_txn";
- private static final String CREATE_TXN = "create_txn";
- private static final String CREATE_CONN = "create_conn";
- private static final String STATEMENT = "statement";
- private static final String ATTACHMENT = "attachment";
+ private final static AtomicLong counter = new AtomicLong(0);
+ private final static TransactionStatus STATUS = new TransactionStatus() {
+ };
- public static final short CLOUD_DB = 0;
- public static final short USAGE_DB = 1;
- public static final short AWSAPI_DB = 2;
- public static final short SIMULATOR_DB = 3;
- public static final short CONNECTED_DB = -1;
-
- private static AtomicLong s_id = new AtomicLong();
- private static final TransactionMBeanImpl s_mbean = new TransactionMBeanImpl();
- static {
+ public static <T> T execute(TransactionCallback<T> callback) {
+ String name = "tx-" + counter.incrementAndGet();
+ TransactionLegacy txn = TransactionLegacy.open(name);
try {
- JmxUtil.registerMBean("Transaction", "Transaction", s_mbean);
- } catch (Exception e) {
- s_logger.error("Unable to register mbean for transaction", e);
- }
-
- /* FIXME: We need a better solution for this
- * Initialize encryption if we need it for db.properties
- */
- EncryptionSecretKeyChecker enc = new EncryptionSecretKeyChecker();
- enc.check();
- }
-
- private final LinkedList<StackElement> _stack;
- private long _id;
-
- private final LinkedList<Pair<String, Long>> _lockTimes = new LinkedList<Pair<String, Long>>();
-
- private String _name;
- private Connection _conn;
- private boolean _txn;
- private short _dbId;
- private long _txnTime;
- private Statement _stmt;
- private String _creator;
-
- private Transaction _prev = null;
-
- public static Transaction currentTxn() {
- Transaction txn = tls.get();
- assert txn != null : "No Transaction on stack. Did you mark the method with @DB?";
-
- assert checkAnnotation(3, txn) : "Did you even read the guide to use Transaction...IOW...other people's code? Try method can't be private. What about @DB? hmmm... could that be it? " + txn;
- return txn;
- }
-
- public static Transaction open(final short databaseId) {
- String name = buildName();
- if (name == null) {
- name = CURRENT_TXN;
- }
- return open(name, databaseId, true);
- }
-
- //
- // Usage of this transaction setup should be limited, it will always open a new transaction context regardless of whether or not there is other
- // transaction context in the stack. It is used in special use cases that we want to control DB connection explicitly and in the mean time utilize
- // the existing DAO features
- //
- public void transitToUserManagedConnection(Connection conn) {
- assert(_conn == null /*&& _stack.size() <= 1*/) : "Can't change to a user managed connection unless the stack is empty and the db connection is null, you may have forgotten to invoke transitToAutoManagedConnection to close out the DB connection: " + toString();
- _conn = conn;
- _dbId = CONNECTED_DB;
- }
-
- public void transitToAutoManagedConnection(short dbId) {
- // assert(_stack.size() <= 1) : "Can't change to auto managed connection unless your stack is empty";
- _dbId = dbId;
- _conn = null;
- }
-
- public static Transaction open(final String name) {
- return open(name, CLOUD_DB, false);
- }
-
- public static Transaction open(final String name, final short databaseId, final boolean forceDbChange) {
- Transaction txn = tls.get();
- boolean isNew = false;
- if (txn == null) {
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Creating the transaction: " + name);
- }
- txn = new Transaction(name, false, databaseId);
- tls.set(txn);
- isNew = true;
- } else if (forceDbChange) {
- final short currentDbId = txn.getDatabaseId();
- if (currentDbId != databaseId) {
- // we need to end the current transaction and switch databases
- txn.close(txn.getName());
-
- txn = new Transaction(name, false, databaseId);
- tls.set(txn);
- isNew = true;
- }
- }
-
- txn.takeOver(name, false);
- if (isNew) {
- s_mbean.addTransaction(txn);
- }
- return txn;
- }
-
- protected StackElement peekInStack(Object obj) {
- final Iterator<StackElement> it = _stack.iterator();
- while (it.hasNext()) {
- StackElement next = it.next();
- if (next.type == obj) {
- return next;
- }
- }
- return null;
- }
-
- public void registerLock(String sql) {
- if (_txn && s_lockLogger.isDebugEnabled()) {
- Pair<String, Long> time = new Pair<String, Long>(sql, System.currentTimeMillis());
- _lockTimes.add(time);
+ txn.start();
+ T result = callback.doInTransaction(STATUS);
+ txn.commit();
+ return result;
+ } finally {
+ txn.close();
}
}
- public boolean dbTxnStarted() {
- return _txn;
- }
-
- public static Connection getStandaloneConnectionWithException() throws SQLException {
- Connection conn = s_ds.getConnection();
- if (s_connLogger.isTraceEnabled()) {
- s_connLogger.trace("Retrieving a standalone connection: dbconn" + System.identityHashCode(conn));
- }
- return conn;
- }
-
- public static Connection getStandaloneConnection() {
- try {
- return getStandaloneConnectionWithException();
- } catch (SQLException e) {
- s_logger.error("Unexpected exception: ", e);
- return null;
- }
- }
-
- public static Connection getStandaloneUsageConnection() {
- try {
- Connection conn = s_usageDS.getConnection();
- if (s_connLogger.isTraceEnabled()) {
- s_connLogger.trace("Retrieving a standalone connection for usage: dbconn" + System.identityHashCode(conn));
- }
- return conn;
- } catch (SQLException e) {
- s_logger.warn("Unexpected exception: ", e);
- return null;
- }
- }
-
- public static Connection getStandaloneAwsapiConnection() {
+ public static <T,X extends Exception> T executeWithException(final TransactionCallbackWithException<T> callback, Class<X> exception) throws X {
try {
- Connection conn = s_awsapiDS.getConnection();
- if (s_connLogger.isTraceEnabled()) {
- s_connLogger.trace("Retrieving a standalone connection for usage: dbconn" + System.identityHashCode(conn));
- }
- return conn;
- } catch (SQLException e) {
- s_logger.warn("Unexpected exception: ", e);
- return null;
- }
- }
-
- public static Connection getStandaloneSimulatorConnection() {
- try {
- Connection conn = s_simulatorDS.getConnection();
- if (s_connLogger.isTraceEnabled()) {
- s_connLogger.trace("Retrieving a standalone connection for simulator: dbconn" + System.identityHashCode(conn));
- }
- return conn;
- } catch (SQLException e) {
- s_logger.warn("Unexpected exception: ", e);
- return null;
- }
- }
-
- protected void attach(TransactionAttachment value) {
- _stack.push(new StackElement(ATTACHMENT, value));
- }
-
- protected TransactionAttachment detach(String name) {
- Iterator<StackElement> it = _stack.descendingIterator();
- while (it.hasNext()) {
- StackElement element = it.next();
- if (element.type == ATTACHMENT) {
- TransactionAttachment att = (TransactionAttachment)element.ref;
- if (name.equals(att.getName())) {
- it.remove();
- return att;
- }
- }
- }
- assert false : "Are you sure you attached this: " + name;
- return null;
- }
-
- public static void attachToTxn(TransactionAttachment value) {
- Transaction txn = tls.get();
- assert txn != null && txn.peekInStack(CURRENT_TXN) != null: "Come on....how can we attach something to the transaction if you haven't started it?";
-
- txn.attach(value);
- }
-
- public static TransactionAttachment detachFromTxn(String name) {
- Transaction txn = tls.get();
- assert txn != null : "No Transaction in TLS";
- return txn.detach(name);
- }
-
- protected static boolean checkAnnotation(int stack, Transaction txn) {
- final StackTraceElement[] stacks = Thread.currentThread().getStackTrace();
- StackElement se = txn.peekInStack(CURRENT_TXN);
- if (se == null) {
- return false;
- }
-
- StringBuffer sb = new StringBuffer();
- for (; stack < stacks.length; stack++) {
- String methodName = stacks[stack].getMethodName();
- sb.append(" ").append(methodName);
- if (methodName.equals(se.ref)){
- return true;
- }
- }
-
- // relax stack structure for several places that @DB required injection is not in place
- s_logger.warn("Non-standard stack context that Transaction context is manaully placed into the calling chain. Stack chain: " + sb);
- return true;
- }
-
- protected static String buildName() {
- if (s_logger.isDebugEnabled()) {
- final StackTraceElement[] stacks = Thread.currentThread().getStackTrace();
- final StringBuilder str = new StringBuilder();
- int i = 3, j = 3;
- while (j < 15 && i < stacks.length) {
- StackTraceElement element = stacks[i];
- String filename = element.getFileName();
- String method = element.getMethodName();
- if ((filename != null && filename.equals("<generated>")) || (method != null && method.equals("invokeSuper"))) {
- i++;
- continue;
- }
-
- str.append("-").append(stacks[i].getClassName().substring(stacks[i].getClassName().lastIndexOf(".") + 1)).append(".").append(stacks[i].getMethodName()).append(":").append(stacks[i].getLineNumber());
- j++;
- i++;
- }
- return str.toString();
- }
-
- return "";
- }
-
- public Transaction(final String name, final boolean forLocking, final short databaseId) {
- _name = name;
- _conn = null;
- _stack = new LinkedList<StackElement>();
- _txn = false;
- _dbId = databaseId;
- _id = s_id.incrementAndGet();
- _creator = Thread.currentThread().getName();
- }
-
- public String getCreator() {
- return _creator;
- }
-
- public long getId() {
- return _id;
- }
-
- public String getName() {
- return _name;
- }
-
- public Short getDatabaseId() {
- return _dbId;
- }
-
- @Override
- public String toString() {
- final StringBuilder str = new StringBuilder((_name != null ? _name : ""));
- str.append(" : ");
- for (final StackElement se : _stack) {
- if (se.type == CURRENT_TXN) {
- str.append(se.ref).append(", ");
- }
- }
-
- return str.toString();
- }
-
- protected void mark(final String name) {
- _stack.push(new StackElement(CURRENT_TXN, name));
- }
-
- public boolean lock(final String name, final int timeoutSeconds) {
- Merovingian2 lockMaster = Merovingian2.getLockMaster();
- if (lockMaster == null) {
- throw new CloudRuntimeException("There's no support for locking yet");
- }
- return lockMaster.acquire(name, timeoutSeconds);
- }
-
- public boolean release(final String name) {
- Merovingian2 lockMaster = Merovingian2.getLockMaster();
- if (lockMaster == null) {
- throw new CloudRuntimeException("There's no support for locking yet");
- }
- return lockMaster.release(name);
- }
-
- public void start() {
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("txn: start requested by: " + buildName());
- }
-
- _stack.push(new StackElement(START_TXN, null));
-
- if (_txn) {
- s_logger.trace("txn: has already been started.");
- return;
- }
-
- _txn = true;
-
- _txnTime = System.currentTimeMillis();
- if (_conn != null) {
- try {
- s_logger.trace("txn: set auto commit to false");
- _conn.setAutoCommit(false);
- } catch (final SQLException e) {
- s_logger.warn("Unable to set auto commit: ", e);
- throw new CloudRuntimeException("Unable to set auto commit: ", e);
- }
- }
- }
-
- protected void closePreviousStatement() {
- if (_stmt != null) {
- try {
- if (s_stmtLogger.isTraceEnabled()) {
- s_stmtLogger.trace("Closing: " + _stmt.toString());
- }
- try {
- ResultSet rs = _stmt.getResultSet();
- if (rs != null && _stmt.getResultSetHoldability() != ResultSet.HOLD_CURSORS_OVER_COMMIT) {
- rs.close();
- }
- } catch(SQLException e) {
- s_stmtLogger.trace("Unable to close resultset");
- }
- _stmt.close();
- } catch (final SQLException e) {
- s_stmtLogger.trace("Unable to close statement: " + _stmt.toString());
- } finally {
- _stmt = null;
- }
- }
- }
-
- /**
- * Prepares an auto close statement. The statement is closed automatically if it is
- * retrieved with this method.
- *
- * @param sql sql String
- * @return PreparedStatement
- * @throws SQLException if problem with JDBC layer.
- *
- * @see java.sql.Connection
- */
- public PreparedStatement prepareAutoCloseStatement(final String sql) throws SQLException {
- PreparedStatement stmt = prepareStatement(sql);
- closePreviousStatement();
- _stmt = stmt;
- return stmt;
- }
-
- public PreparedStatement prepareStatement(final String sql) throws SQLException {
- final Connection conn = getConnection();
- final PreparedStatement pstmt = conn.prepareStatement(sql);
- if (s_stmtLogger.isTraceEnabled()) {
- s_stmtLogger.trace("Preparing: " + sql);
- }
- return pstmt;
- }
-
- /**
- * Prepares an auto close statement. The statement is closed automatically if it is
- * retrieved with this method.
- *
- * @param sql sql String
- * @param autoGeneratedKeys keys that are generated
- * @return PreparedStatement
- * @throws SQLException if problem with JDBC layer.
- *
- * @see java.sql.Connection
- */
- public PreparedStatement prepareAutoCloseStatement(final String sql, final int autoGeneratedKeys) throws SQLException {
- final Connection conn = getConnection();
- final PreparedStatement pstmt = conn.prepareStatement(sql, autoGeneratedKeys);
- if (s_stmtLogger.isTraceEnabled()) {
- s_stmtLogger.trace("Preparing: " + sql);
- }
- closePreviousStatement();
- _stmt = pstmt;
- return pstmt;
- }
-
- /**
- * Prepares an auto close statement. The statement is closed automatically if it is
- * retrieved with this method.
- *
- * @param sql sql String
- * @param columnNames names of the columns
- * @return PreparedStatement
- * @throws SQLException if problem with JDBC layer.
- *
- * @see java.sql.Connection
- */
- public PreparedStatement prepareAutoCloseStatement(final String sql, final String[] columnNames) throws SQLException {
- final Connection conn = getConnection();
- final PreparedStatement pstmt = conn.prepareStatement(sql, columnNames);
- if (s_stmtLogger.isTraceEnabled()) {
- s_stmtLogger.trace("Preparing: " + sql);
- }
- closePreviousStatement();
- _stmt = pstmt;
- return pstmt;
- }
-
- /**
- * Prepares an auto close statement. The statement is closed automatically if it is
- * retrieved with this method.
- *
- * @param sql sql String
- * @return PreparedStatement
- * @throws SQLException if problem with JDBC layer.
- *
- * @see java.sql.Connection
- */
- public PreparedStatement prepareAutoCloseStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException {
- final Connection conn = getConnection();
- final PreparedStatement pstmt = conn.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability);
- if (s_stmtLogger.isTraceEnabled()) {
- s_stmtLogger.trace("Preparing: " + sql);
- }
- closePreviousStatement();
- _stmt = pstmt;
- return pstmt;
- }
-
- /**
- * Returns the db connection.
- *
- * Note: that you can call getConnection() but beaware that
- * all prepare statements from the Connection are not garbage
- * collected!
- *
- * @return DB Connection but make sure you understand that
- * you are responsible for closing the PreparedStatement.
- * @throws SQLException
- */
- public Connection getConnection() throws SQLException {
- if (_conn == null) {
- switch (_dbId) {
- case CLOUD_DB:
- if(s_ds != null) {
- _conn = s_ds.getConnection();
- } else {
- s_logger.warn("A static-initialized variable becomes null, process is dying?");
- throw new CloudRuntimeException("Database is not initialized, process is dying?");
- }
- break;
- case USAGE_DB:
- if(s_usageDS != null) {
- _conn = s_usageDS.getConnection();
- } else {
- s_logger.warn("A static-initialized variable becomes null, process is dying?");
- throw new CloudRuntimeException("Database is not initialized, process is dying?");
- }
- break;
- case AWSAPI_DB:
- if(s_awsapiDS != null) {
- _conn = s_awsapiDS.getConnection();
- } else {
- s_logger.warn("A static-initialized variable becomes null, process is dying?");
- throw new CloudRuntimeException("Database is not initialized, process is dying?");
- }
- break;
-
- case SIMULATOR_DB:
- if(s_simulatorDS != null) {
- _conn = s_simulatorDS.getConnection();
- } else {
- s_logger.warn("A static-initialized variable becomes null, process is dying?");
- throw new CloudRuntimeException("Database is not initialized, process is dying?");
- }
- break;
- default:
-
- throw new CloudRuntimeException("No database selected for the transaction");
- }
- _conn.setAutoCommit(!_txn);
-
- //
- // MySQL default transaction isolation level is REPEATABLE READ,
- // to reduce chances of DB deadlock, we will use READ COMMITED isolation level instead
- // see http://dev.mysql.com/doc/refman/5.0/en/innodb-deadlocks.html
- //
- _stack.push(new StackElement(CREATE_CONN, null));
- if (s_connLogger.isTraceEnabled()) {
- s_connLogger.trace("Creating a DB connection with " + (_txn ? " txn: " : " no txn: ") + " for " + _dbId + ": dbconn" + System.identityHashCode(_conn) + ". Stack: " + buildName());
- }
- } else {
- s_logger.trace("conn: Using existing DB connection");
- }
-
- return _conn;
- }
-
- protected boolean takeOver(final String name, final boolean create) {
- if (_stack.size() != 0) {
- if (!create) {
- // If it is not a create transaction, then let's just use the current one.
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Using current transaction: " + toString());
- }
- mark(name);
- return false;
- }
-
- final StackElement se = _stack.getFirst();
- if (se.type == CREATE_TXN) {
- // This create is called inside of another create. Which is ok?
- // We will let that create be responsible for cleaning up.
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Create using current transaction: " + toString());
- }
- mark(name);
- return false;
- }
-
- s_logger.warn("Encountered a transaction that has leaked. Cleaning up. " + toString());
- cleanup();
- }
-
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Took over the transaction: " + name);
- }
- _stack.push(new StackElement(create ? CREATE_TXN : CURRENT_TXN, name));
- _name = name;
- return true;
- }
-
- public void cleanup() {
- closePreviousStatement();
-
- removeUpTo(null, null);
- if (_txn) {
- rollbackTransaction();
- }
- _txn = false;
- _name = null;
-
- closeConnection();
-
- _stack.clear();
- Merovingian2 lockMaster = Merovingian2.getLockMaster();
- if (lockMaster != null) {
- lockMaster.cleanupThread();
- }
- }
-
- public void close() {
- removeUpTo(CURRENT_TXN, null);
-
- if (_stack.size() == 0) {
- s_logger.trace("Transaction is done");
- cleanup();
- }
- }
-
- /**
- * close() is used by endTxn to close the connection. This method only
- * closes the connection if the name is the same as what's stored.
- *
- * @param name
- * @return true if this close actually closes the connection. false if not.
- */
- public boolean close(final String name) {
- if (_name == null) { // Already cleaned up.
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Already cleaned up." + buildName());
- }
- return true;
- }
-
- if (!_name.equals(name)) {
- close();
- return false;
- }
-
- if (s_logger.isDebugEnabled() && _stack.size() > 2) {
- s_logger.debug("Transaction is not closed properly: " + toString() + ". Called by " + buildName());
- }
-
- cleanup();
-
- s_logger.trace("All done");
- return true;
- }
-
- protected boolean hasTxnInStack() {
- return peekInStack(START_TXN) != null;
- }
-
- protected void clearLockTimes() {
- if (s_lockLogger.isDebugEnabled()) {
- for (Pair<String, Long> time : _lockTimes) {
- s_lockLogger.trace("SQL " + time.first() + " took " + (System.currentTimeMillis() - time.second()));
- }
- _lockTimes.clear();
- }
- }
-
- public boolean commit() {
- if (!_txn) {
- s_logger.warn("txn: Commit called when it is not a transaction: " + buildName());
- return false;
- }
-
- Iterator<StackElement> it = _stack.iterator();
- while (it.hasNext()) {
- StackElement st = it.next();
- if (st.type == START_TXN) {
- it.remove();
- break;
- }
- }
-
- if (hasTxnInStack()) {
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("txn: Not committing because transaction started elsewhere: " + buildName() + " / " + toString());
- }
- return false;
- }
-
- _txn = false;
- try {
- if (_conn != null) {
- _conn.commit();
- s_logger.trace("txn: DB Changes committed. Time = " + (System.currentTimeMillis() - _txnTime));
- clearLockTimes();
- closeConnection();
- }
- return true;
- } catch (final SQLException e) {
- rollbackTransaction();
- throw new CloudRuntimeException("Unable to commit or close the connection. ", e);
- }
- }
-
- protected void closeConnection() {
- closePreviousStatement();
-
- if (_conn == null) {
- return;
- }
-
- if (_txn) {
- s_connLogger.trace("txn: Not closing DB connection because we're still in a transaction.");
- return;
- }
-
- try {
- // we should only close db connection when it is not user managed
- if (this._dbId != CONNECTED_DB) {
- if (s_connLogger.isTraceEnabled()) {
- s_connLogger.trace("Closing DB connection: dbconn" + System.identityHashCode(_conn));
- }
- _conn.close();
- _conn = null;
- }
-
- } catch (final SQLException e) {
- s_logger.warn("Unable to close connection", e);
- }
- }
-
- protected void removeUpTo(String type, Object ref) {
- boolean rollback = false;
- Iterator<StackElement> it = _stack.iterator();
- while (it.hasNext()) {
- StackElement item = it.next();
-
- it.remove();
-
- try {
- if (item.type == type && (ref == null || item.ref == ref)) {
- break;
- }
-
- if (item.type == CURRENT_TXN) {
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Releasing the current txn: " + (item.ref != null ? item.ref : ""));
- }
- } else if (item.type == CREATE_CONN) {
- closeConnection();
- } else if (item.type == START_TXN) {
- if (item.ref == null) {
- rollback = true;
- } else {
- try {
- _conn.rollback((Savepoint)ref);
- rollback = false;
- } catch (final SQLException e) {
- s_logger.warn("Unable to rollback Txn.", e);
- }
- }
- } else if (item.type == STATEMENT) {
+ return execute(new TransactionCallback<T>() {
+ @Override
+ public T doInTransaction(TransactionStatus status) {
try {
- if (s_stmtLogger.isTraceEnabled()) {
- s_stmtLogger.trace("Closing: " + ref.toString());
- }
- Statement stmt = (Statement)ref;
- try {
- ResultSet rs = stmt.getResultSet();
- if (rs != null) {
- rs.close();
- }
- } catch(SQLException e) {
- s_stmtLogger.trace("Unable to close resultset");
- }
- stmt.close();
- } catch (final SQLException e) {
- s_stmtLogger.trace("Unable to close statement: " + item);
- }
- } else if (item.type == ATTACHMENT) {
- TransactionAttachment att = (TransactionAttachment)item.ref;
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Cleaning up " + att.getName());
+ return callback.doInTransaction(status);
+ } catch (Exception e) {
+ ExceptionUtil.rethrowRuntime(e);
+ throw new TransactionWrappedExeception(e);
}
- att.cleanup();
- }
- } catch(Exception e) {
- s_logger.error("Unable to clean up " + item, e);
- }
- }
-
- if (rollback) {
- rollback();
- }
- }
-
- protected void rollbackTransaction() {
- closePreviousStatement();
- if (!_txn) {
- if (s_logger.isTraceEnabled()) {
- s_logger.trace("Rollback called for " + _name + " when there's no transaction: " + buildName());
- }
- return;
- }
- assert (!hasTxnInStack()) : "Who's rolling back transaction when there's still txn in stack?";
- _txn = false;
- try {
- if (_conn != null) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Rolling back the transaction: Time = " + (System.currentTimeMillis() - _txnTime) + " Name = " + _name + "; called by " + buildName());
- }
- _conn.rollback();
- }
- clearLockTimes();
- closeConnection();
- } catch(final SQLException e) {
- s_logger.warn("Unable to rollback", e);
- }
- }
-
- protected void rollbackSavepoint(Savepoint sp) {
- try {
- if (_conn != null) {
- _conn.rollback(sp);
- }
- } catch (SQLException e) {
- s_logger.warn("Unable to rollback to savepoint " + sp);
- }
-
- if (!hasTxnInStack()) {
- _txn = false;
- closeConnection();
- }
- }
-
- public void rollback() {
- Iterator<StackElement> it = _stack.iterator();
- while (it.hasNext()) {
- StackElement st = it.next();
- if (st.type == START_TXN) {
- if (st.ref == null) {
- it.remove();
- } else {
- rollback((Savepoint)st.ref);
- return;
}
- }
- }
-
- rollbackTransaction();
- }
-
- public Savepoint setSavepoint() throws SQLException {
- _txn = true;
- StackElement st = new StackElement(START_TXN, null);
- _stack.push(st);
- final Connection conn = getConnection();
- final Savepoint sp = conn.setSavepoint();
- st.ref = sp;
-
- return sp;
- }
-
- public Savepoint setSavepoint(final String name) throws SQLException {
- _txn = true;
- StackElement st = new StackElement(START_TXN, null);
- _stack.push(st);
- final Connection conn = getConnection();
- final Savepoint sp = conn.setSavepoint(name);
- st.ref = sp;
-
- return sp;
- }
-
- public void releaseSavepoint(final Savepoint sp) throws SQLException {
- removeTxn(sp);
- if (_conn != null) {
- _conn.releaseSavepoint(sp);
- }
-
- if (!hasTxnInStack()) {
- _txn = false;
- closeConnection();
- }
- }
-
- protected boolean hasSavepointInStack(Savepoint sp) {
- Iterator<StackElement> it = _stack.iterator();
- while (it.hasNext()) {
- StackElement se = it.next();
- if (se.type == START_TXN && se.ref == sp) {
- return true;
- }
- }
- return false;
- }
-
- protected void removeTxn(Savepoint sp) {
- assert hasSavepointInStack(sp) : "Removing a save point that's not in the stack";
-
- if (!hasSavepointInStack(sp)) {
- return;
- }
-
- Iterator<StackElement> it = _stack.iterator();
- while (it.hasNext()) {
- StackElement se = it.next();
- if (se.type == START_TXN) {
- it.remove();
- if (se.ref == sp) {
- return;
- }
- }
- }
- }
-
- public void rollback(final Savepoint sp) {
- removeTxn(sp);
-
- rollbackSavepoint(sp);
- }
-
- public Connection getCurrentConnection() {
- return _conn;
- }
-
- public List<StackElement> getStack() {
- return _stack;
- }
-
- protected Transaction() {
- _name = null;
- _conn = null;
- _stack = null;
- _txn = false;
- _dbId = -1;
- }
-
- @Override
- protected void finalize() throws Throwable {
- if (!(_conn == null && (_stack == null || _stack.size() == 0))) {
- assert (false) : "Oh Alex oh alex...something is wrong with how we're doing this";
- s_logger.error("Something went wrong that a transaction is orphaned before db connection is closed");
- cleanup();
+ });
+ } catch (TransactionWrappedExeception e) {
+ ExceptionUtil.rethrowRuntime(e.getWrapped());
+ ExceptionUtil.rethrow(e.getWrapped(), exception);
+ throw e;
}
}
-
- protected class StackElement {
- public String type;
- public Object ref;
-
- public StackElement (String type, Object ref) {
- this.type = type;
- this.ref = ref;
- }
-
- @Override
- public String toString() {
- return type + "-" + ref;
- }
- }
-
- private static DataSource s_ds;
- private static DataSource s_usageDS;
- private static DataSource s_awsapiDS;
- private static DataSource s_simulatorDS;
-
- static {
- // Initialize with assumed db.properties file
- initDataSource("db.properties");
- }
-
- public static void initDataSource(String propsFileName) {
- try {
- File dbPropsFile = PropertiesUtil.findConfigFile(propsFileName);
- final Properties dbProps;
- if (EncryptionSecretKeyChecker.useEncryption()) {
- StandardPBEStringEncryptor encryptor = EncryptionSecretKeyChecker.getEncryptor();
- dbProps = new EncryptableProperties(encryptor);
- } else {
- dbProps = new Properties();
- }
- try {
- dbProps.load(new FileInputStream(dbPropsFile));
- } catch (IOException e) {
- s_logger.fatal("Unable to load db properties file, pl. check the classpath and file path configuration", e);
- return;
- } catch (NullPointerException e) {
- s_logger.fatal("Unable to locate db properties file within classpath or absolute path: " + propsFileName);
- return;
- }
-
- // FIXME: If params are missing...default them????
- final int cloudMaxActive = Integer.parseInt(dbProps.getProperty("db.cloud.maxActive"));
- final int cloudMaxIdle = Integer.parseInt(dbProps.getProperty("db.cloud.maxIdle"));
- final long cloudMaxWait = Long.parseLong(dbProps.getProperty("db.cloud.maxWait"));
- final String cloudUsername = dbProps.getProperty("db.cloud.username");
- final String cloudPassword = dbProps.getProperty("db.cloud.password");
- final String cloudHost = dbProps.getProperty("db.cloud.host");
- final int cloudPort = Integer.parseInt(dbProps.getProperty("db.cloud.port"));
- final String cloudDbName = dbProps.getProperty("db.cloud.name");
- final boolean cloudAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.cloud.autoReconnect"));
- final String cloudValidationQuery = dbProps.getProperty("db.cloud.validationQuery");
- final String cloudIsolationLevel = dbProps.getProperty("db.cloud.isolation.level");
-
- int isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
- if (cloudIsolationLevel == null) {
- isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
- } else if (cloudIsolationLevel.equalsIgnoreCase("readcommitted")) {
- isolationLevel = Connection.TRANSACTION_READ_COMMITTED;
- } else if (cloudIsolationLevel.equalsIgnoreCase("repeatableread")) {
- isolationLevel = Connection.TRANSACTION_REPEATABLE_READ;
- } else if (cloudIsolationLevel.equalsIgnoreCase("serializable")) {
- isolationLevel = Connection.TRANSACTION_SERIALIZABLE;
- } else if (cloudIsolationLevel.equalsIgnoreCase("readuncommitted")) {
- isolationLevel = Connection.TRANSACTION_READ_UNCOMMITTED;
- } else {
- s_logger.warn("Unknown isolation level " + cloudIsolationLevel + ". Using read uncommitted");
- }
-
- final boolean cloudTestOnBorrow = Boolean.parseBoolean(dbProps.getProperty("db.cloud.testOnBorrow"));
- final boolean cloudTestWhileIdle = Boolean.parseBoolean(dbProps.getProperty("db.cloud.testWhileIdle"));
- final long cloudTimeBtwEvictionRunsMillis = Long.parseLong(dbProps.getProperty("db.cloud.timeBetweenEvictionRunsMillis"));
- final long cloudMinEvcitableIdleTimeMillis = Long.parseLong(dbProps.getProperty("db.cloud.minEvictableIdleTimeMillis"));
- final boolean cloudPoolPreparedStatements = Boolean.parseBoolean(dbProps.getProperty("db.cloud.poolPreparedStatements"));
- final String url = dbProps.getProperty("db.cloud.url.params");
-
- final boolean useSSL = Boolean.parseBoolean(dbProps.getProperty("db.cloud.useSSL"));
- if (useSSL) {
- System.setProperty("javax.net.ssl.keyStore", dbProps.getProperty("db.cloud.keyStore"));
- System.setProperty("javax.net.ssl.keyStorePassword", dbProps.getProperty("db.cloud.keyStorePassword"));
- System.setProperty("javax.net.ssl.trustStore", dbProps.getProperty("db.cloud.trustStore"));
- System.setProperty("javax.net.ssl.trustStorePassword", dbProps.getProperty("db.cloud.trustStorePassword"));
- }
-
- final GenericObjectPool cloudConnectionPool = new GenericObjectPool(null, cloudMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
- cloudMaxWait, cloudMaxIdle, cloudTestOnBorrow, false, cloudTimeBtwEvictionRunsMillis, 1, cloudMinEvcitableIdleTimeMillis, cloudTestWhileIdle);
-
- final ConnectionFactory cloudConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + cloudHost + ":" + cloudPort + "/" + cloudDbName +
- "?autoReconnect=" + cloudAutoReconnect + (url != null ? "&" + url : "") + (useSSL ? "&useSSL=true" : ""), cloudUsername, cloudPassword);
-
- final KeyedObjectPoolFactory poolableObjFactory = (cloudPoolPreparedStatements ? new StackKeyedObjectPoolFactory() : null);
-
- final PoolableConnectionFactory cloudPoolableConnectionFactory = new PoolableConnectionFactory(cloudConnectionFactory, cloudConnectionPool, poolableObjFactory,
- cloudValidationQuery, false, false, isolationLevel);
-
- // Default Data Source for CloudStack
- s_ds = new PoolingDataSource(cloudPoolableConnectionFactory.getPool());
-
- // Configure the usage db
- final int usageMaxActive = Integer.parseInt(dbProps.getProperty("db.usage.maxActive"));
- final int usageMaxIdle = Integer.parseInt(dbProps.getProperty("db.usage.maxIdle"));
- final long usageMaxWait = Long.parseLong(dbProps.getProperty("db.usage.maxWait"));
- final String usageUsername = dbProps.getProperty("db.usage.username");
- final String usagePassword = dbProps.getProperty("db.usage.password");
- final String usageHost = dbProps.getProperty("db.usage.host");
- final int usagePort = Integer.parseInt(dbProps.getProperty("db.usage.port"));
- final String usageDbName = dbProps.getProperty("db.usage.name");
- final boolean usageAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.usage.autoReconnect"));
- final String usageUrl = dbProps.getProperty("db.usage.url.params");
-
- final GenericObjectPool usageConnectionPool = new GenericObjectPool(null, usageMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
- usageMaxWait, usageMaxIdle);
-
- final ConnectionFactory usageConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + usageHost + ":" + usagePort + "/" + usageDbName +
- "?autoReconnect=" + usageAutoReconnect + (usageUrl != null ? "&" + usageUrl : ""), usageUsername, usagePassword);
-
- final PoolableConnectionFactory usagePoolableConnectionFactory = new PoolableConnectionFactory(usageConnectionFactory, usageConnectionPool,
- new StackKeyedObjectPoolFactory(), null, false, false);
-
- // Data Source for usage server
- s_usageDS = new PoolingDataSource(usagePoolableConnectionFactory.getPool());
-
- // Configure awsapi db
- final String awsapiDbName = dbProps.getProperty("db.awsapi.name");
- final GenericObjectPool awsapiConnectionPool = new GenericObjectPool(null, usageMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
- usageMaxWait, usageMaxIdle);
- final ConnectionFactory awsapiConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + cloudHost + ":" + cloudPort + "/" + awsapiDbName +
- "?autoReconnect=" + usageAutoReconnect, cloudUsername, cloudPassword);
- final PoolableConnectionFactory awsapiPoolableConnectionFactory = new PoolableConnectionFactory(awsapiConnectionFactory, awsapiConnectionPool,
- new StackKeyedObjectPoolFactory(), null, false, false);
-
- // Data Source for awsapi
- s_awsapiDS = new PoolingDataSource(awsapiPoolableConnectionFactory.getPool());
-
- try {
- // Configure the simulator db
- final int simulatorMaxActive = Integer.parseInt(dbProps.getProperty("db.simulator.maxActive"));
- final int simulatorMaxIdle = Integer.parseInt(dbProps.getProperty("db.simulator.maxIdle"));
- final long simulatorMaxWait = Long.parseLong(dbProps.getProperty("db.simulator.maxWait"));
- final String simulatorUsername = dbProps.getProperty("db.simulator.username");
- final String simulatorPassword = dbProps.getProperty("db.simulator.password");
- final String simulatorHost = dbProps.getProperty("db.simulator.host");
- final int simulatorPort = Integer.parseInt(dbProps.getProperty("db.simulator.port"));
- final String simulatorDbName = dbProps.getProperty("db.simulator.name");
- final boolean simulatorAutoReconnect = Boolean.parseBoolean(dbProps.getProperty("db.simulator.autoReconnect"));
-
- final GenericObjectPool simulatorConnectionPool = new GenericObjectPool(null, simulatorMaxActive, GenericObjectPool.DEFAULT_WHEN_EXHAUSTED_ACTION,
- simulatorMaxWait, simulatorMaxIdle);
-
- final ConnectionFactory simulatorConnectionFactory = new DriverManagerConnectionFactory("jdbc:mysql://" + simulatorHost + ":" + simulatorPort + "/" + simulatorDbName +
- "?autoReconnect=" + simulatorAutoReconnect, simulatorUsername, simulatorPassword);
-
- final PoolableConnectionFactory simulatorPoolableConnectionFactory = new PoolableConnectionFactory(simulatorConnectionFactory, simulatorConnectionPool,
- new StackKeyedObjectPoolFactory(), null, false, false);
- s_simulatorDS = new PoolingDataSource(simulatorPoolableConnectionFactory.getPool());
- } catch (Exception e) {
- s_logger.debug("Simulator DB properties are not available. Not initializing simulator DS");
- }
- } catch (final Exception e) {
- s_ds = getDefaultDataSource("cloud");
- s_usageDS = getDefaultDataSource("cloud_usage");
- s_simulatorDS = getDefaultDataSource("cloud_simulator");
- s_logger.warn("Unable to load db configuration, using defaults with 5 connections. Falling back on assumed datasource on localhost:3306 using username:password=cloud:cloud. Please check your configuration", e);
- }
- }
-
- private static DataSource getDefaultDataSource(final String database) {
- final GenericObjectPool connectionPool = new GenericObjectPool(null, 5);
- final ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
- "jdbc:mysql://localhost:3306/" + database, "cloud", "cloud");
- final PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(
- connectionFactory, connectionPool, null, null, false, true);
- return new PoolingDataSource(
- /* connectionPool */poolableConnectionFactory.getPool());
+
+ public static Object startTransaction() {
+ return null;
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionCallback.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionCallback.java b/framework/db/src/com/cloud/utils/db/TransactionCallback.java
new file mode 100644
index 0000000..2f68a93
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionCallback.java
@@ -0,0 +1,7 @@
+package com.cloud.utils.db;
+
+public interface TransactionCallback<T> {
+
+ public T doInTransaction(TransactionStatus status);
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java b/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java
new file mode 100644
index 0000000..7341b4d
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java
@@ -0,0 +1,13 @@
+package com.cloud.utils.db;
+
+public abstract class TransactionCallbackNoReturn implements TransactionCallback<Object> {
+
+ @Override
+ public Object doInTransaction(TransactionStatus status) {
+ doInTransaction(status);
+ return null;
+ }
+
+ public abstract void doInTransactionWithoutResult(TransactionStatus status);
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java b/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java
new file mode 100644
index 0000000..cbf3fbd
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java
@@ -0,0 +1,7 @@
+package com.cloud.utils.db;
+
+public interface TransactionCallbackWithException<T> {
+
+ public T doInTransaction(TransactionStatus status) throws Exception;
+
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java b/framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java
index 40fcbbf..d60ab7b 100644
--- a/framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java
+++ b/framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java
@@ -46,19 +46,19 @@ public class TransactionContextBuilder implements ComponentMethodInterceptor {
@Override
public Object interceptStart(Method method, Object target) {
- return Transaction.open(method.getName());
+ return TransactionLegacy.open(method.getName());
}
@Override
public void interceptComplete(Method method, Object target, Object objReturnedInInterceptStart) {
- Transaction txn = (Transaction)objReturnedInInterceptStart;
+ TransactionLegacy txn = (TransactionLegacy)objReturnedInInterceptStart;
if(txn != null)
txn.close();
}
@Override
public void interceptException(Method method, Object target, Object objReturnedInInterceptStart) {
- Transaction txn = (Transaction)objReturnedInInterceptStart;
+ TransactionLegacy txn = (TransactionLegacy)objReturnedInInterceptStart;
if(txn != null)
txn.close();
}
[16/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java
index 2b79664..59e61e9 100755
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java
@@ -48,7 +48,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -237,7 +237,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
@DB
public HypervisorType getHypervisorType(long volumeId) {
/* lookup from cluster of pool */
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = null;
try {
@@ -458,7 +458,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
@Override
public List<Long> listPoolIdsByVolumeCount(long dcId, Long podId, Long clusterId, long accountId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
try {
@@ -484,7 +484,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
@Override
public List<Long> listZoneWidePoolIdsByVolumeCount(long dcId, long accountId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
try {
@@ -519,7 +519,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
@Override
@DB
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
VolumeVO entry = findById(id);
if (entry != null) {
@@ -533,7 +533,7 @@ public class VolumeDaoImpl extends GenericDaoBase<VolumeVO, Long> implements Vol
@Override
public ScopeType getVolumeStoragePoolScope(long volumeId) {
// finding the storage scope where the volume is present
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
index 40af999..54158f5 100644
--- a/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/storage/dao/VolumeDetailsDaoImpl.java
@@ -27,7 +27,7 @@ import org.springframework.stereotype.Component;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value=VolumeDetailsDao.class)
@@ -98,7 +98,7 @@ public class VolumeDetailsDaoImpl extends GenericDaoBase<VolumeDetailVO, Long> i
@Override
public void persist(long volumeId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<VolumeDetailVO> sc = VolumeSearch.create();
sc.setParameters("volumeId", volumeId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/upgrade/DatabaseCreator.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/DatabaseCreator.java b/engine/schema/src/com/cloud/upgrade/DatabaseCreator.java
index c97085b..8260aa1 100755
--- a/engine/schema/src/com/cloud/upgrade/DatabaseCreator.java
+++ b/engine/schema/src/com/cloud/upgrade/DatabaseCreator.java
@@ -30,11 +30,11 @@ import java.util.Properties;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.cloud.utils.PropertiesUtil;
-
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.component.SystemIntegrityChecker;
import com.cloud.utils.db.ScriptRunner;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
// Creates the CloudStack Database by using the 4.0 schema and apply
// upgrade steps to it.
@@ -172,7 +172,7 @@ public class DatabaseCreator {
}
try {
- Transaction.initDataSource(dbPropsFile);
+ TransactionLegacy.initDataSource(dbPropsFile);
} catch (NullPointerException e) {
}
initDB(dbPropsFile, rootPassword, databases, dryRun);
@@ -187,7 +187,7 @@ public class DatabaseCreator {
}
System.out.println("========> Processing SQL file at " + sqlScript.getAbsolutePath());
- Connection conn = Transaction.getStandaloneConnection();
+ Connection conn = TransactionLegacy.getStandaloneConnection();
try {
FileReader reader = null;
try {
@@ -207,7 +207,7 @@ public class DatabaseCreator {
}
}
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
// Process db upgrade classes
for (String upgradeClass: upgradeClasses) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/upgrade/DatabaseIntegrityChecker.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/DatabaseIntegrityChecker.java b/engine/schema/src/com/cloud/upgrade/DatabaseIntegrityChecker.java
index 50eb47b..b6e45ec 100755
--- a/engine/schema/src/com/cloud/upgrade/DatabaseIntegrityChecker.java
+++ b/engine/schema/src/com/cloud/upgrade/DatabaseIntegrityChecker.java
@@ -29,12 +29,11 @@ import org.springframework.stereotype.Component;
import com.cloud.maint.Version;
import com.cloud.upgrade.dao.VersionDao;
-
import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.component.ComponentLifecycle;
import com.cloud.utils.component.SystemIntegrityChecker;
import com.cloud.utils.db.GlobalLock;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -72,7 +71,7 @@ public class DatabaseIntegrityChecker extends AdapterBase implements SystemInteg
}
private Boolean checkDuplicateHostWithTheSameLocalStorage() {
- Transaction txn = Transaction.open("Integrity");
+ TransactionLegacy txn = TransactionLegacy.open("Integrity");
txn.start();
try {
Connection conn;
@@ -167,7 +166,7 @@ public class DatabaseIntegrityChecker extends AdapterBase implements SystemInteg
}
private boolean checkMissedPremiumUpgradeFor228() {
- Transaction txn = Transaction.open("Integrity");
+ TransactionLegacy txn = TransactionLegacy.open("Integrity");
txn.start();
try {
String dbVersion = _dao.getCurrentVersion();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java b/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java
index 85e36a5..2eec648 100755
--- a/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java
+++ b/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java
@@ -73,7 +73,7 @@ import com.cloud.upgrade.dao.VersionVO.Step;
import com.cloud.utils.component.SystemIntegrityChecker;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.ScriptRunner;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Local(value = {SystemIntegrityChecker.class})
@@ -269,7 +269,7 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker {
s_logger.debug("Running upgrade " + upgrade.getClass().getSimpleName() + " to upgrade from " + upgrade.getUpgradableVersionRange()[0] + "-"
+ upgrade.getUpgradableVersionRange()[1]
+ " to " + upgrade.getUpgradedVersion());
- Transaction txn = Transaction.open("Upgrade");
+ TransactionLegacy txn = TransactionLegacy.open("Upgrade");
txn.start();
try {
Connection conn;
@@ -339,7 +339,7 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker {
VersionVO version = _dao.findByVersion(upgradedVersion, Step.Upgrade);
s_logger.debug("Upgrading to version " + upgradedVersion + "...");
- Transaction txn = Transaction.open("Cleanup");
+ TransactionLegacy txn = TransactionLegacy.open("Cleanup");
try {
if (version != null) {
for (DbUpgrade upgrade : versionUpgrades) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java
index 6631050..d5cd489 100644
--- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java
+++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java
@@ -29,7 +29,7 @@ import com.cloud.utils.PropertiesUtil;
import com.cloud.utils.crypt.EncryptionSecretKeyChecker;
import org.apache.log4j.Logger;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.script.Script;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java b/engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java
index 8c92765..12c99b2 100644
--- a/engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java
+++ b/engine/schema/src/com/cloud/upgrade/dao/VersionDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -79,7 +79,7 @@ public class VersionDaoImpl extends GenericDaoBase<VersionVO, Long> implements V
try {
s_logger.debug("Checking to see if the database is at a version before it was the version table is created");
- conn = Transaction.getStandaloneConnection();
+ conn = TransactionLegacy.getStandaloneConnection();
PreparedStatement pstmt = conn.prepareStatement("SHOW TABLES LIKE 'version'");
ResultSet rs = pstmt.executeQuery();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
index ce6d9e4..e1e843e 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageDaoImpl.java
@@ -38,7 +38,7 @@ import com.cloud.utils.DateUtil;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -74,7 +74,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public void deleteRecordsForAccount(Long accountId) {
String sql = ((accountId == null) ? DELETE_ALL : DELETE_ALL_BY_ACCOUNTID);
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -99,7 +99,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public void saveAccounts(List<AccountVO> accounts) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
String sql = INSERT_ACCOUNT;
@@ -133,7 +133,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public void updateAccounts(List<AccountVO> accounts) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
String sql = UPDATE_ACCOUNT;
@@ -163,7 +163,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public void saveUserStats(List<UserStatisticsVO> userStats) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
String sql = INSERT_USER_STATS;
@@ -204,7 +204,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public void updateUserStats(List<UserStatisticsVO> userStats) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
String sql = UPDATE_USER_STATS;
@@ -231,7 +231,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public Long getLastAccountId() {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = GET_LAST_ACCOUNT;
try {
@@ -248,7 +248,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public Long getLastUserStatsId() {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = GET_LAST_USER_STATS;
try {
@@ -265,7 +265,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public List<Long> listPublicTemplatesByAccount(long accountId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = GET_PUBLIC_TEMPLATES_BY_ACCOUNTID;
List<Long> templateList = new ArrayList<Long>();
@@ -284,7 +284,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public Long getLastVmDiskStatsId() {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = GET_LAST_VM_DISK_STATS;
try {
@@ -301,7 +301,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public void updateVmDiskStats(List<VmDiskStatisticsVO> vmDiskStats) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
String sql = UPDATE_VM_DISK_STATS;
@@ -335,7 +335,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public void saveVmDiskStats(List<VmDiskStatisticsVO> vmDiskStats) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
String sql = INSERT_VM_DISK_STATS;
@@ -381,7 +381,7 @@ public class UsageDaoImpl extends GenericDaoBase<UsageVO, Long> implements Usage
@Override
public void saveUsageRecords(List<UsageVO> usageRecords) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
String sql = INSERT_USGAE_RECORDS;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java
index 9af4a26..0014553 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageIPAddressDaoImpl.java
@@ -32,7 +32,7 @@ import com.cloud.usage.UsageIPAddressVO;
import com.cloud.user.Account;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UsageIPAddressDao.class})
@@ -56,7 +56,7 @@ public class UsageIPAddressDaoImpl extends GenericDaoBase<UsageIPAddressVO, Long
public UsageIPAddressDaoImpl() {}
public void update(UsageIPAddressVO usage) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -92,7 +92,7 @@ public class UsageIPAddressDaoImpl extends GenericDaoBase<UsageIPAddressVO, Long
sql = GET_ALL_USAGE_RECORDS;
}
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java
index 783300f..5bedfb9 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageJobDaoImpl.java
@@ -30,7 +30,7 @@ import com.cloud.usage.UsageJobVO;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -42,7 +42,7 @@ public class UsageJobDaoImpl extends GenericDaoBase<UsageJobVO, Long> implements
@Override
public long getLastJobSuccessDateMillis() {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
String sql = GET_LAST_JOB_SUCCESS_DATE_MILLIS;
try {
@@ -61,7 +61,7 @@ public class UsageJobDaoImpl extends GenericDaoBase<UsageJobVO, Long> implements
@Override
public void updateJobSuccess(Long jobId, long startMillis, long endMillis, long execTime, boolean success) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
try {
txn.start();
@@ -115,7 +115,7 @@ public class UsageJobDaoImpl extends GenericDaoBase<UsageJobVO, Long> implements
@Override
public UsageJobVO isOwner(String hostname, int pid) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
try {
if ((hostname == null) || (pid <= 0)) {
return null;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java
index fa63223..70b1764 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageLoadBalancerPolicyDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
import com.cloud.usage.UsageLoadBalancerPolicyVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UsageLoadBalancerPolicyDao.class})
@@ -56,7 +56,7 @@ public class UsageLoadBalancerPolicyDaoImpl extends GenericDaoBase<UsageLoadBala
public UsageLoadBalancerPolicyDaoImpl() {}
public void removeBy(long accountId, long lbId) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -75,7 +75,7 @@ public class UsageLoadBalancerPolicyDaoImpl extends GenericDaoBase<UsageLoadBala
}
public void update(UsageLoadBalancerPolicyVO usage) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -119,7 +119,7 @@ public class UsageLoadBalancerPolicyDaoImpl extends GenericDaoBase<UsageLoadBala
sql += " LIMIT " + startIndex + ",500";
}
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java
index af8083a..59ba1c4 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageNetworkDaoImpl.java
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Component;
import com.cloud.usage.UsageNetworkVO;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -50,7 +50,7 @@ public class UsageNetworkDaoImpl extends GenericDaoBase<UsageNetworkVO, Long> im
@Override
public Map<String, UsageNetworkVO> getRecentNetworkStats() {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
String sql = SELECT_LATEST_STATS;
PreparedStatement pstmt = null;
try {
@@ -85,7 +85,7 @@ public class UsageNetworkDaoImpl extends GenericDaoBase<UsageNetworkVO, Long> im
@Override
public void deleteOldStats(long maxEventTime) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
String sql = DELETE_OLD_STATS;
PreparedStatement pstmt = null;
try {
@@ -102,7 +102,7 @@ public class UsageNetworkDaoImpl extends GenericDaoBase<UsageNetworkVO, Long> im
@Override
public void saveUsageNetworks (List<UsageNetworkVO> usageNetworks) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
String sql = INSERT_USAGE_NETWORK;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
index 4ed7c27..6fb03e7 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageNetworkOfferingDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
import com.cloud.usage.UsageNetworkOfferingVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UsageNetworkOfferingDao.class})
@@ -55,7 +55,7 @@ public class UsageNetworkOfferingDaoImpl extends GenericDaoBase<UsageNetworkOffe
public UsageNetworkOfferingDaoImpl() {}
public void update(UsageNetworkOfferingVO usage) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -100,7 +100,7 @@ public class UsageNetworkOfferingDaoImpl extends GenericDaoBase<UsageNetworkOffe
sql += " LIMIT " + startIndex + ",500";
}
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java
index 2afc50a..0f2ac0d 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsagePortForwardingRuleDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
import com.cloud.usage.UsagePortForwardingRuleVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UsagePortForwardingRuleDao.class})
@@ -56,7 +56,7 @@ public class UsagePortForwardingRuleDaoImpl extends GenericDaoBase<UsagePortForw
public UsagePortForwardingRuleDaoImpl() {}
public void removeBy(long accountId, long pfId) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -75,7 +75,7 @@ public class UsagePortForwardingRuleDaoImpl extends GenericDaoBase<UsagePortForw
}
public void update(UsagePortForwardingRuleVO usage) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -119,7 +119,7 @@ public class UsagePortForwardingRuleDaoImpl extends GenericDaoBase<UsagePortForw
sql += " LIMIT " + startIndex + ",500";
}
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java
index 7564bf0..78ee857 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageSecurityGroupDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
import com.cloud.usage.UsageSecurityGroupVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UsageSecurityGroupDao.class})
@@ -55,7 +55,7 @@ public class UsageSecurityGroupDaoImpl extends GenericDaoBase<UsageSecurityGroup
public UsageSecurityGroupDaoImpl() {}
public void update(UsageSecurityGroupVO usage) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -100,7 +100,7 @@ public class UsageSecurityGroupDaoImpl extends GenericDaoBase<UsageSecurityGroup
sql += " LIMIT " + startIndex + ",500";
}
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java
index 8f18adc..f9ee2e6 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UsageStorageDao.class})
@@ -93,7 +93,7 @@ public class UsageStorageDaoImpl extends GenericDaoBase<UsageStorageVO, Long> im
}
public void removeBy(long accountId, long volId, int storage_type) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -113,7 +113,7 @@ public class UsageStorageDaoImpl extends GenericDaoBase<UsageStorageVO, Long> im
}
public void update(UsageStorageVO usage) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -158,7 +158,7 @@ public class UsageStorageDaoImpl extends GenericDaoBase<UsageStorageVO, Long> im
sql += " LIMIT " + startIndex + ",500";
}
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java
index fc82754..ef31390 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageVMInstanceDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
import com.cloud.usage.UsageVMInstanceVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UsageVMInstanceDao.class})
@@ -51,7 +51,7 @@ public class UsageVMInstanceDaoImpl extends GenericDaoBase<UsageVMInstanceVO, Lo
public UsageVMInstanceDaoImpl() {}
public void update(UsageVMInstanceVO instance) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -71,7 +71,7 @@ public class UsageVMInstanceDaoImpl extends GenericDaoBase<UsageVMInstanceVO, Lo
}
public void delete(UsageVMInstanceVO instance) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -91,7 +91,7 @@ public class UsageVMInstanceDaoImpl extends GenericDaoBase<UsageVMInstanceVO, Lo
}
public List<UsageVMInstanceVO> getUsageRecords(long accountId, Date startDate, Date endDate) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
List<UsageVMInstanceVO> usageInstances = new ArrayList<UsageVMInstanceVO>();
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotDaoImpl.java
index 9f98bbf..b9f5f8c 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotDaoImpl.java
@@ -20,7 +20,7 @@ package com.cloud.usage.dao;
import com.cloud.usage.UsageVMSnapshotVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@@ -51,7 +51,7 @@ public class UsageVMSnapshotDaoImpl extends GenericDaoBase<UsageVMSnapshotVO, Lo
"ORDER BY created desc limit 1";
public void update(UsageVMSnapshotVO usage) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -76,7 +76,7 @@ public class UsageVMSnapshotDaoImpl extends GenericDaoBase<UsageVMSnapshotVO, Lo
List<UsageVMSnapshotVO> usageRecords = new ArrayList<UsageVMSnapshotVO>();
String sql = GET_USAGE_RECORDS_BY_ACCOUNT;
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
@@ -130,7 +130,7 @@ public class UsageVMSnapshotDaoImpl extends GenericDaoBase<UsageVMSnapshotVO, Lo
List<UsageVMSnapshotVO> usageRecords = new ArrayList<UsageVMSnapshotVO>();
String sql = PREVIOUS_QUERY;
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
int i = 1;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java
index d6bf13b..d8d1455 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageVPNUserDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
import com.cloud.usage.UsageVPNUserVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UsageVPNUserDao.class})
@@ -55,7 +55,7 @@ public class UsageVPNUserDaoImpl extends GenericDaoBase<UsageVPNUserVO, Long> im
public UsageVPNUserDaoImpl() {}
public void update(UsageVPNUserVO usage) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -99,7 +99,7 @@ public class UsageVPNUserDaoImpl extends GenericDaoBase<UsageVPNUserVO, Long> im
sql += " LIMIT " + startIndex + ",500";
}
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageVmDiskDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVmDiskDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVmDiskDaoImpl.java
index 8436c59..d2cb673 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageVmDiskDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageVmDiskDaoImpl.java
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Component;
import com.cloud.usage.UsageVmDiskVO;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -51,7 +51,7 @@ public class UsageVmDiskDaoImpl extends GenericDaoBase<UsageVmDiskVO, Long> impl
@Override
public Map<String, UsageVmDiskVO> getRecentVmDiskStats() {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
String sql = SELECT_LATEST_STATS;
PreparedStatement pstmt = null;
try {
@@ -89,7 +89,7 @@ public class UsageVmDiskDaoImpl extends GenericDaoBase<UsageVmDiskVO, Long> impl
@Override
public void deleteOldStats(long maxEventTime) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
String sql = DELETE_OLD_STATS;
PreparedStatement pstmt = null;
try {
@@ -106,7 +106,7 @@ public class UsageVmDiskDaoImpl extends GenericDaoBase<UsageVmDiskVO, Long> impl
@Override
public void saveUsageVmDisks(List<UsageVmDiskVO> usageVmDisks) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
String sql = INSERT_USAGE_VM_DISK;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java
index 039d8f4..8bf95b6 100644
--- a/engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java
+++ b/engine/schema/src/com/cloud/usage/dao/UsageVolumeDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
import com.cloud.usage.UsageVolumeVO;
import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UsageVolumeDao.class})
@@ -56,7 +56,7 @@ public class UsageVolumeDaoImpl extends GenericDaoBase<UsageVolumeVO, Long> impl
public UsageVolumeDaoImpl() {}
public void removeBy(long accountId, long volId) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -75,7 +75,7 @@ public class UsageVolumeDaoImpl extends GenericDaoBase<UsageVolumeVO, Long> impl
}
public void update(UsageVolumeVO usage) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
txn.start();
@@ -119,7 +119,7 @@ public class UsageVolumeDaoImpl extends GenericDaoBase<UsageVolumeVO, Long> impl
sql += " LIMIT " + startIndex + ",500";
}
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
PreparedStatement pstmt = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java b/engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java
index 30bbe73..9bdaff6 100755
--- a/engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/user/AccountDetailsDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Local(value = {AccountDetailsDao.class})
public class AccountDetailsDaoImpl extends GenericDaoBase<AccountDetailVO, Long> implements AccountDetailsDao, ScopedConfigStorage {
@@ -57,7 +57,7 @@ public class AccountDetailsDaoImpl extends GenericDaoBase<AccountDetailVO, Long>
@Override
public void persist(long accountId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<AccountDetailVO> sc = accountSearch.create();
sc.setParameters("accountId", accountId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java b/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java
index 41f1f73..91226e7 100755
--- a/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java
+++ b/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java
@@ -39,7 +39,7 @@ import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={AccountDao.class})
@@ -124,7 +124,7 @@ public class AccountDaoImpl extends GenericDaoBase<AccountVO, Long> implements A
@Override
public Pair<User, Account> findUserAccountByApiKey(String apiKey) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
Pair<User, Account> userAcctPair = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java b/engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java
index 4a1a51c..ae21dfe 100644
--- a/engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java
+++ b/engine/schema/src/com/cloud/user/dao/UserStatisticsDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UserStatisticsDao.class})
@@ -100,7 +100,7 @@ public class UserStatisticsDaoImpl extends GenericDaoBase<UserStatisticsVO, Long
List<UserStatisticsVO> userStats = new ArrayList<UserStatisticsVO>();
if (minRemovedDate == null) return userStats;
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
String sql = ACTIVE_AND_RECENTLY_DELETED_SEARCH + " LIMIT " + startIndex + "," + limit;
PreparedStatement pstmt = null;
@@ -120,7 +120,7 @@ public class UserStatisticsDaoImpl extends GenericDaoBase<UserStatisticsVO, Long
public List<UserStatisticsVO> listUpdatedStats() {
List<UserStatisticsVO> userStats = new ArrayList<UserStatisticsVO>();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement pstmt = null;
pstmt = txn.prepareAutoCloseStatement(UPDATED_STATS_SEARCH);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/user/dao/VmDiskStatisticsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/user/dao/VmDiskStatisticsDaoImpl.java b/engine/schema/src/com/cloud/user/dao/VmDiskStatisticsDaoImpl.java
index 02f3406..2a3d132 100644
--- a/engine/schema/src/com/cloud/user/dao/VmDiskStatisticsDaoImpl.java
+++ b/engine/schema/src/com/cloud/user/dao/VmDiskStatisticsDaoImpl.java
@@ -33,7 +33,7 @@ import com.cloud.utils.DateUtil;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={VmDiskStatisticsDao.class})
@@ -97,7 +97,7 @@ public class VmDiskStatisticsDaoImpl extends GenericDaoBase<VmDiskStatisticsVO,
List<VmDiskStatisticsVO> vmDiskStats = new ArrayList<VmDiskStatisticsVO>();
if (minRemovedDate == null) return vmDiskStats;
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
String sql = ACTIVE_AND_RECENTLY_DELETED_SEARCH + " LIMIT " + startIndex + "," + limit;
PreparedStatement pstmt = null;
@@ -117,7 +117,7 @@ public class VmDiskStatisticsDaoImpl extends GenericDaoBase<VmDiskStatisticsVO,
public List<VmDiskStatisticsVO> listUpdatedStats() {
List<VmDiskStatisticsVO> vmDiskStats = new ArrayList<VmDiskStatisticsVO>();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement pstmt = null;
pstmt = txn.prepareAutoCloseStatement(UPDATED_VM_NETWORK_STATS_SEARCH);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java
index 9af371e..4238f6a 100644
--- a/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/ConsoleProxyDaoImpl.java
@@ -34,7 +34,7 @@ import com.cloud.utils.db.Attribute;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.vm.ConsoleProxyVO;
import com.cloud.vm.VirtualMachine.State;
@@ -162,7 +162,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
@Override
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
ConsoleProxyVO proxy = createForUpdate();
proxy.setPublicIpAddress(null);
@@ -227,7 +227,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
public List<Pair<Long, Integer>> getProxyLoadMatrix() {
ArrayList<Pair<Long, Integer>> l = new ArrayList<Pair<Long, Integer>>();
- Transaction txn = Transaction.currentTxn();;
+ TransactionLegacy txn = TransactionLegacy.currentTxn();;
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(PROXY_ASSIGNMENT_MATRIX);
@@ -245,7 +245,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
public List<Pair<Long, Integer>> getDatacenterStoragePoolHostInfo(long dcId, boolean countAllPoolTypes) {
ArrayList<Pair<Long, Integer>> l = new ArrayList<Pair<Long, Integer>>();
- Transaction txn = Transaction.currentTxn();;
+ TransactionLegacy txn = TransactionLegacy.currentTxn();;
PreparedStatement pstmt = null;
try {
if(countAllPoolTypes) {
@@ -267,7 +267,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
@Override
public int getProxyStaticLoad(long proxyVmId) {
- Transaction txn = Transaction.currentTxn();;
+ TransactionLegacy txn = TransactionLegacy.currentTxn();;
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(GET_PROXY_LOAD);
@@ -285,7 +285,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
@Override
public int getProxyActiveLoad(long proxyVmId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(GET_PROXY_ACTIVE_LOAD);
@@ -304,7 +304,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
private List<ConsoleProxyLoadInfo> getDatacenterLoadMatrix(String sql) {
ArrayList<ConsoleProxyLoadInfo> l = new ArrayList<ConsoleProxyLoadInfo>();
- Transaction txn = Transaction.currentTxn();;
+ TransactionLegacy txn = TransactionLegacy.currentTxn();;
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql);
@@ -325,7 +325,7 @@ public class ConsoleProxyDaoImpl extends GenericDaoBase<ConsoleProxyVO, Long> im
@Override
public List<Long> getRunningProxyListByMsid(long msid) {
List<Long> l = new ArrayList<Long>();
- Transaction txn = Transaction.currentTxn();;
+ TransactionLegacy txn = TransactionLegacy.currentTxn();;
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
index 65b9d3b..7676e2d 100755
--- a/engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/DomainRouterDaoImpl.java
@@ -47,7 +47,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.VirtualMachine;
@@ -143,7 +143,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase<DomainRouterVO, Long> im
@Override
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
DomainRouterVO router = createForUpdate();
router.setPublicIpAddress(null);
@@ -307,7 +307,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase<DomainRouterVO, Long> im
@Override
@DB
public DomainRouterVO persist(DomainRouterVO router, List<Network> guestNetworks) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
// 1) create network
@@ -330,7 +330,7 @@ public class DomainRouterDaoImpl extends GenericDaoBase<DomainRouterVO, Long> im
if (_routerNetworkDao.findByRouterAndNetwork(router.getId(), guestNetwork.getId()) == null) {
NetworkOffering off = _offDao.findById(guestNetwork.getNetworkOfferingId());
if (!(off.getName().equalsIgnoreCase(NetworkOffering.SystemPrivateGatewayNetworkOffering))) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
//1) add router to network
RouterNetworkVO routerNtwkMap = new RouterNetworkVO(router.getId(), guestNetwork.getId(), guestNetwork.getGuestType());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
index 67bc0b5..033acca 100644
--- a/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/NicDetailDaoImpl.java
@@ -19,7 +19,7 @@ package com.cloud.vm.dao;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.vm.NicDetailVO;
import org.springframework.stereotype.Component;
@@ -75,7 +75,7 @@ public class NicDetailDaoImpl extends GenericDaoBase<NicDetailVO, Long> implemen
@Override
public void persist(long nicId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<NicDetailVO> sc = NicSearch.create();
sc.setParameters("nicId", nicId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java
index f802a90..2fcc3e7 100644
--- a/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/SecondaryStorageVmDaoImpl.java
@@ -31,7 +31,7 @@ import com.cloud.utils.db.Attribute;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.vm.SecondaryStorageVm;
import com.cloud.vm.SecondaryStorageVmVO;
@@ -105,7 +105,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase<SecondaryStorageVm
@Override
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SecondaryStorageVmVO proxy = createForUpdate();
proxy.setPublicIpAddress(null);
@@ -167,7 +167,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase<SecondaryStorageVm
@Override
public List<Long> getRunningSecStorageVmListByMsid(SecondaryStorageVm.Role role, long msid) {
List<Long> l = new ArrayList<Long>();
- Transaction txn = Transaction.currentTxn();;
+ TransactionLegacy txn = TransactionLegacy.currentTxn();;
PreparedStatement pstmt = null;
try {
String sql;
@@ -237,7 +237,7 @@ public class SecondaryStorageVmDaoImpl extends GenericDaoBase<SecondaryStorageVm
public List<Long> listRunningSecStorageOrderByLoad(SecondaryStorageVm.Role role, long zoneId) {
List<Long> l = new ArrayList<Long>();
- Transaction txn = Transaction.currentTxn();;
+ TransactionLegacy txn = TransactionLegacy.currentTxn();;
PreparedStatement pstmt = null;
try {
String sql;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
index 8afce09..9cef0ae 100755
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java
@@ -46,7 +46,7 @@ import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.NicVO;
import com.cloud.vm.UserVmVO;
@@ -350,7 +350,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
@Override
public List<Long> listPodIdsHavingVmsforAccount(long zoneId, long accountId){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
@@ -374,7 +374,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
@Override
public Hashtable<Long, UserVmData> listVmDetails(Hashtable<Long, UserVmData> userVmDataHash){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
@@ -575,7 +575,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
@Override
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
_tagsDao.removeByIdAndType(id, TaggedResourceType.UserVm);
boolean result = super.remove(id);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
index ce8dbd8..77f1418 100644
--- a/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/UserVmDetailsDaoImpl.java
@@ -28,7 +28,7 @@ import org.springframework.stereotype.Component;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.vm.UserVmDetailVO;
@Component
@@ -93,7 +93,7 @@ public class UserVmDetailsDaoImpl extends GenericDaoBase<UserVmDetailVO, Long> i
@Override
public void persist(long vmId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<UserVmDetailVO> sc = VmSearch.create();
sc.setParameters("vmId", vmId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
index cf8e0a8..301944b 100644
--- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@ -48,7 +48,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.NicVO;
@@ -484,7 +484,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
@Override
public Pair<List<Long>, Map<Long, Double>> listClusterIdsInZoneByVmCount(long zoneId, long accountId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
Map<Long, Double> clusterVmCountMap = new HashMap<Long, Double>();
@@ -513,7 +513,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
@Override
public Pair<List<Long>, Map<Long, Double>> listClusterIdsInPodByVmCount(long podId, long accountId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
Map<Long, Double> clusterVmCountMap = new HashMap<Long, Double>();
@@ -543,7 +543,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
@Override
public Pair<List<Long>, Map<Long, Double>> listPodIdsInZoneByVmCount(long dataCenterId, long accountId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
Map<Long, Double> podVmCountMap = new HashMap<Long, Double>();
@@ -569,7 +569,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
@Override
public List<Long> listHostIdsByVmCount(long dcId, Long podId, Long clusterId, long accountId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
List<Long> result = new ArrayList<Long>();
try {
@@ -654,7 +654,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
@Override
@DB
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
VMInstanceVO vm = findById(id);
if (vm != null && vm.getType() == Type.User) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java b/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java
index ad8f4f0..c2d48d4 100644
--- a/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/affinity/dao/AffinityGroupVMMapDaoImpl.java
@@ -32,7 +32,7 @@ import com.cloud.utils.db.JoinBuilder.JoinType;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Local(value = { AffinityGroupVMMapDao.class })
public class AffinityGroupVMMapDaoImpl extends GenericDaoBase<AffinityGroupVMMapVO, Long> implements
@@ -160,7 +160,7 @@ public class AffinityGroupVMMapDaoImpl extends GenericDaoBase<AffinityGroupVMMap
@Override
public void updateMap(Long vmId, List<Long> affinityGroupIds) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<AffinityGroupVMMapVO> sc = createSearchCriteria();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMComputeTagDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMComputeTagDaoImpl.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMComputeTagDaoImpl.java
index 6f70b35..54a557b 100644
--- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMComputeTagDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMComputeTagDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = { VMComputeTagDao.class })
@@ -52,7 +52,7 @@ public class VMComputeTagDaoImpl extends GenericDaoBase<VMComputeTagVO, Long> im
@Override
public void persist(long vmId, List<String> computeTags) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<VMComputeTagVO> sc = VmIdSearch.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java
index 3082d21..fa2ce81 100644
--- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMEntityDaoImpl.java
@@ -37,7 +37,7 @@ import com.cloud.network.dao.NetworkVO;
import com.cloud.utils.Pair;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.vm.NicProfile;
@@ -78,7 +78,7 @@ public class VMEntityDaoImpl extends GenericDaoBase<VMEntityVO, Long> implements
@Override
@DB
public VMEntityVO persist(VMEntityVO vm) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
VMEntityVO dbVO = super.persist(vm);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMNetworkMapDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMNetworkMapDaoImpl.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMNetworkMapDaoImpl.java
index 0f2c4cc..f86e788 100644
--- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMNetworkMapDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMNetworkMapDaoImpl.java
@@ -28,7 +28,7 @@ import com.cloud.network.dao.NetworkDao;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = { VMNetworkMapDao.class })
@@ -52,7 +52,7 @@ public class VMNetworkMapDaoImpl extends GenericDaoBase<VMNetworkMapVO, Long> im
@Override
public void persist(long vmId, List<Long> networks) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<VMNetworkMapVO> sc = VmIdSearch.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java
index 73b4dd2..31ed5b8 100644
--- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMReservationDaoImpl.java
@@ -35,7 +35,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = { VMReservationDao.class })
@@ -80,7 +80,7 @@ public class VMReservationDaoImpl extends GenericDaoBase<VMReservationVO, Long>
@Override
@DB
public VMReservationVO persist(VMReservationVO reservation) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
VMReservationVO dbVO = super.persist(reservation);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMRootDiskTagDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMRootDiskTagDaoImpl.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMRootDiskTagDaoImpl.java
index be194bb..cd06b20 100644
--- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMRootDiskTagDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/dao/VMRootDiskTagDaoImpl.java
@@ -31,7 +31,7 @@ import org.springframework.stereotype.Component;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = { VMRootDiskTagDao.class })
@@ -52,7 +52,7 @@ public class VMRootDiskTagDaoImpl extends GenericDaoBase<VMRootDiskTagVO, Long>
@Override
public void persist(long vmId, List<String> rootDiskTags) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<VMRootDiskTagVO> sc = VmIdSearch.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
index 9e2bb36..8ed84ef 100644
--- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
+++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java
@@ -40,7 +40,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Local(value = { PrimaryDataStoreDao.class })
@@ -226,7 +226,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
@Override
@DB
public StoragePoolVO persist(StoragePoolVO pool, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
pool = super.persist(pool);
if (details != null) {
@@ -254,7 +254,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
}
sql.delete(sql.length() - 4, sql.length());
sql.append(DetailsSqlSuffix);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql.toString());
@@ -331,7 +331,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
}
sql.delete(sql.length() - 4, sql.length());
sql.append(ZoneWideDetailsSqlSuffix);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql.toString());
@@ -357,7 +357,7 @@ public class PrimaryDataStoreDaoImpl extends GenericDaoBase<StoragePoolVO, Long>
StringBuilder sql = new StringBuilder(FindPoolTagDetails);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
try {
pstmt = txn.prepareAutoCloseStatement(sql.toString());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
index e7c6627..196b08b 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java
@@ -47,6 +47,7 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.QueryBuilder;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -110,7 +111,7 @@ public class DefaultEndPointSelector implements EndPointSelector {
PreparedStatement pstmt = null;
ResultSet rs = null;
HostVO host = null;
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
pstmt = txn.prepareStatement(sql);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java
index ad52042..3c766cf 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Component;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = ImageStoreDetailsDao.class)
@@ -46,7 +46,7 @@ public class ImageStoreDetailsDaoImpl extends GenericDaoBase<ImageStoreDetailVO,
@Override
public void update(long storeId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
SearchCriteria<ImageStoreDetailVO> sc = storeSearch.create();
sc.setParameters("store", storeId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
index d828085..48416a2 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java
@@ -40,7 +40,7 @@ import com.cloud.storage.DataStoreRole;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.UpdateBuilder;
@@ -164,7 +164,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
SearchCriteria<SnapshotDataStoreVO> sc = storeSearch.create();
sc.setParameters("store_id", id);
sc.setParameters("store_role", role);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
remove(sc);
txn.commit();
@@ -182,7 +182,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase<SnapshotDataStoreVO
@Override
@DB
public SnapshotDataStoreVO findParent(DataStoreRole role, Long storeId, Long volumeId) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
index 5f47de8..4509e23 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java
@@ -43,7 +43,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
@Component
@@ -202,7 +202,7 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
public void deletePrimaryRecordsForStore(long id) {
SearchCriteria<TemplateDataStoreVO> sc = storeSearch.create();
sc.setParameters("store_id", id);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
remove(sc);
txn.commit();
@@ -212,7 +212,7 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase<TemplateDataStoreVO
public void deletePrimaryRecordsForTemplate(long templateId) {
SearchCriteria<TemplateDataStoreVO> sc = templateSearch.create();
sc.setParameters("template_id", templateId);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
expunge(sc);
txn.commit();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
index 04f8b70..2bacd03 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/VolumeDataStoreDaoImpl.java
@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.UpdateBuilder;
@@ -143,7 +143,7 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase<VolumeDataStoreVO, Lo
public void deletePrimaryRecordsForStore(long id) {
SearchCriteria<VolumeDataStoreVO> sc = storeSearch.create();
sc.setParameters("store_id", id);
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
remove(sc);
txn.commit();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
index 4ea4cee..90ad17a 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java
@@ -43,7 +43,7 @@ import com.cloud.storage.StorageManager;
import com.cloud.storage.StoragePoolHostVO;
import com.cloud.storage.StoragePoolStatus;
import com.cloud.storage.dao.StoragePoolHostDao;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.exception.CloudRuntimeException;
@Component
@@ -181,7 +181,7 @@ public class PrimaryDataStoreHelper {
public boolean deletePrimaryDataStore(DataStore store) {
List<StoragePoolHostVO> hostPoolRecords = this.storagePoolHostDao.listByPoolId(store.getId());
StoragePoolVO poolVO = this.dataStoreDao.findById(store.getId());
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
for (StoragePoolHostVO host : hostPoolRecords) {
storagePoolHostDao.deleteStoragePoolHostDetails(host.getHostId(), host.getPoolId());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
index 9d17434..be741da 100644
--- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
+++ b/engine/storage/src/org/apache/cloudstack/storage/volume/db/PrimaryDataStoreDetailsDaoImpl.java
@@ -27,7 +27,7 @@ import org.springframework.stereotype.Component;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
public class PrimaryDataStoreDetailsDaoImpl extends GenericDaoBase<PrimaryDataStoreDetailVO, Long> implements
@@ -45,7 +45,7 @@ public class PrimaryDataStoreDetailsDaoImpl extends GenericDaoBase<PrimaryDataSt
@Override
public void update(long poolId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
SearchCriteria<PrimaryDataStoreDetailVO> sc = PoolSearch.create();
sc.setParameters("pool", poolId);
[11/20] New Transaction API
Posted by da...@apache.org.
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();
[19/20] git commit: updated refs/heads/txn-refactor to 7364d55
Posted by da...@apache.org.
New Transaction API
Introduction of a new Transaction API that is more consistent with the style
of Spring's transaction managment. The existing Transaction class was renamed
to TransactionLegacy. All of the non-DAO code in the management server has been
updated to use the new Transaction API.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/f62e28c1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/f62e28c1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/f62e28c1
Branch: refs/heads/txn-refactor
Commit: f62e28c1ec125263613d32856b11ef50b815e573
Parents: 81f1a0b
Author: Darren Shepherd <da...@gmail.com>
Authored: Wed Oct 16 09:21:00 2013 -0700
Committer: Darren Shepherd <da...@gmail.com>
Committed: Wed Oct 16 09:21:00 2013 -0700
----------------------------------------------------------------------
.../exception/ConcurrentOperationException.java | 3 +-
.../bridge/persist/dao/BucketPolicyDaoImpl.java | 6 +-
.../persist/dao/CloudStackAccountDaoImpl.java | 3 +-
.../dao/CloudStackConfigurationDaoImpl.java | 3 +-
.../dao/CloudStackSvcOfferingDaoImpl.java | 5 +-
.../persist/dao/CloudStackUserDaoImpl.java | 3 +-
.../cloud/bridge/persist/dao/MHostDaoImpl.java | 5 +-
.../bridge/persist/dao/MHostMountDaoImpl.java | 3 +-
.../persist/dao/MultiPartPartsDaoImpl.java | 9 +-
.../persist/dao/MultiPartUploadsDaoImpl.java | 15 +-
.../bridge/persist/dao/MultipartLoadDao.java | 9 +-
.../persist/dao/MultipartMetaDaoImpl.java | 3 +-
.../bridge/persist/dao/OfferingDaoImpl.java | 11 +-
.../cloud/bridge/persist/dao/SAclDaoImpl.java | 7 +-
.../bridge/persist/dao/SBucketDaoImpl.java | 5 +-
.../cloud/bridge/persist/dao/SHostDaoImpl.java | 5 +-
.../cloud/bridge/persist/dao/SMetaDaoImpl.java | 5 +-
.../bridge/persist/dao/SObjectDaoImpl.java | 7 +-
.../bridge/persist/dao/SObjectItemDaoImpl.java | 5 +-
.../persist/dao/UserCredentialsDaoImpl.java | 5 +-
.../cloud/bridge/service/EC2RestServlet.java | 13 +-
.../com/cloud/bridge/service/S3RestServlet.java | 5 +-
.../service/controller/s3/S3BucketAction.java | 3 +-
.../service/controller/s3/ServiceProvider.java | 7 +-
.../cloud/bridge/service/core/s3/S3Engine.java | 23 +-
.../cloud/agent/manager/AgentManagerImpl.java | 5 +-
.../manager/ClusteredAgentManagerImpl.java | 5 +-
.../com/cloud/vm/VirtualMachineManagerImpl.java | 121 +-
.../entity/api/db/dao/DcDetailsDaoImpl.java | 4 +-
.../entity/api/db/dao/EngineClusterDaoImpl.java | 6 +-
.../api/db/dao/EngineDataCenterDaoImpl.java | 6 +-
.../entity/api/db/dao/EngineHostDaoImpl.java | 14 +-
.../entity/api/db/dao/EngineHostPodDaoImpl.java | 6 +-
.../entity/api/db/dao/HostDetailsDaoImpl.java | 4 +-
.../entity/api/db/dao/HostTagsDaoImpl.java | 4 +-
.../orchestration/NetworkOrchestrator.java | 918 +++++++-------
.../orchestration/VolumeOrchestrator.java | 88 +-
.../src/com/cloud/alert/dao/AlertDaoImpl.java | 4 +-
.../com/cloud/capacity/dao/CapacityDaoImpl.java | 26 +-
.../configuration/dao/ResourceCountDaoImpl.java | 4 +-
.../src/com/cloud/dc/ClusterDetailsDaoImpl.java | 6 +-
.../src/com/cloud/dc/dao/ClusterDaoImpl.java | 6 +-
.../com/cloud/dc/dao/ClusterVSMMapDaoImpl.java | 4 +-
.../src/com/cloud/dc/dao/DataCenterDaoImpl.java | 6 +-
.../dc/dao/DataCenterIpAddressDaoImpl.java | 8 +-
.../DataCenterLinkLocalIpAddressDaoImpl.java | 6 +-
.../src/com/cloud/dc/dao/DataCenterVnetDao.java | 3 +-
.../com/cloud/dc/dao/DataCenterVnetDaoImpl.java | 8 +-
.../src/com/cloud/dc/dao/DcDetailsDaoImpl.java | 4 +-
.../src/com/cloud/dc/dao/HostPodDaoImpl.java | 6 +-
.../src/com/cloud/dc/dao/PodVlanDaoImpl.java | 8 +-
.../dc/dao/StorageNetworkIpAddressDaoImpl.java | 6 +-
.../src/com/cloud/dc/dao/VlanDaoImpl.java | 4 +-
.../src/com/cloud/domain/dao/DomainDaoImpl.java | 6 +-
.../src/com/cloud/event/dao/EventDaoImpl.java | 4 +-
.../com/cloud/event/dao/UsageEventDaoImpl.java | 10 +-
.../src/com/cloud/host/dao/HostDaoImpl.java | 14 +-
.../com/cloud/host/dao/HostDetailsDaoImpl.java | 4 +-
.../src/com/cloud/host/dao/HostTagsDaoImpl.java | 4 +-
.../src/com/cloud/keystore/KeystoreDaoImpl.java | 4 +-
.../network/dao/FirewallRulesCidrsDaoImpl.java | 4 +-
.../cloud/network/dao/FirewallRulesDaoImpl.java | 6 +-
.../com/cloud/network/dao/IPAddressDaoImpl.java | 6 +-
.../com/cloud/network/dao/NetworkDaoImpl.java | 10 +-
.../cloud/network/dao/PortProfileDaoImpl.java | 4 +-
.../security/dao/SecurityGroupDaoImpl.java | 6 +-
.../security/dao/SecurityGroupWorkDaoImpl.java | 8 +-
.../security/dao/VmRulesetLogDaoImpl.java | 8 +-
.../cloud/network/vpc/dao/PrivateIpDaoImpl.java | 4 +-
.../network/vpc/dao/StaticRouteDaoImpl.java | 4 +-
.../com/cloud/network/vpc/dao/VpcDaoImpl.java | 8 +-
.../network/vpc/dao/VpcOfferingDaoImpl.java | 4 +-
.../offerings/dao/NetworkOfferingDaoImpl.java | 6 +-
.../com/cloud/projects/dao/ProjectDaoImpl.java | 4 +-
.../dao/ServiceOfferingDetailsDaoImpl.java | 4 +-
.../storage/dao/LaunchPermissionDaoImpl.java | 6 +-
.../com/cloud/storage/dao/SnapshotDaoImpl.java | 14 +-
.../storage/dao/StoragePoolDetailsDaoImpl.java | 4 +-
.../storage/dao/StoragePoolHostDaoImpl.java | 10 +-
.../storage/dao/StoragePoolWorkDaoImpl.java | 4 +-
.../cloud/storage/dao/VMTemplateDaoImpl.java | 14 +-
.../storage/dao/VMTemplateDetailsDaoImpl.java | 4 +-
.../storage/dao/VMTemplateHostDaoImpl.java | 8 +-
.../storage/dao/VMTemplatePoolDaoImpl.java | 8 +-
.../storage/dao/VMTemplateZoneDaoImpl.java | 4 +-
.../com/cloud/storage/dao/VolumeDaoImpl.java | 12 +-
.../cloud/storage/dao/VolumeDetailsDaoImpl.java | 4 +-
.../src/com/cloud/upgrade/DatabaseCreator.java | 8 +-
.../cloud/upgrade/DatabaseIntegrityChecker.java | 7 +-
.../cloud/upgrade/DatabaseUpgradeChecker.java | 6 +-
.../com/cloud/upgrade/dao/Upgrade307to410.java | 2 +-
.../com/cloud/upgrade/dao/VersionDaoImpl.java | 4 +-
.../src/com/cloud/usage/dao/UsageDaoImpl.java | 26 +-
.../cloud/usage/dao/UsageIPAddressDaoImpl.java | 6 +-
.../com/cloud/usage/dao/UsageJobDaoImpl.java | 8 +-
.../dao/UsageLoadBalancerPolicyDaoImpl.java | 8 +-
.../cloud/usage/dao/UsageNetworkDaoImpl.java | 8 +-
.../usage/dao/UsageNetworkOfferingDaoImpl.java | 6 +-
.../dao/UsagePortForwardingRuleDaoImpl.java | 8 +-
.../usage/dao/UsageSecurityGroupDaoImpl.java | 6 +-
.../cloud/usage/dao/UsageStorageDaoImpl.java | 8 +-
.../cloud/usage/dao/UsageVMInstanceDaoImpl.java | 8 +-
.../cloud/usage/dao/UsageVMSnapshotDaoImpl.java | 8 +-
.../cloud/usage/dao/UsageVPNUserDaoImpl.java | 6 +-
.../com/cloud/usage/dao/UsageVmDiskDaoImpl.java | 8 +-
.../com/cloud/usage/dao/UsageVolumeDaoImpl.java | 8 +-
.../com/cloud/user/AccountDetailsDaoImpl.java | 4 +-
.../src/com/cloud/user/dao/AccountDaoImpl.java | 4 +-
.../cloud/user/dao/UserStatisticsDaoImpl.java | 6 +-
.../cloud/user/dao/VmDiskStatisticsDaoImpl.java | 6 +-
.../com/cloud/vm/dao/ConsoleProxyDaoImpl.java | 16 +-
.../com/cloud/vm/dao/DomainRouterDaoImpl.java | 8 +-
.../src/com/cloud/vm/dao/NicDetailDaoImpl.java | 4 +-
.../cloud/vm/dao/SecondaryStorageVmDaoImpl.java | 8 +-
.../src/com/cloud/vm/dao/UserVmDaoImpl.java | 8 +-
.../com/cloud/vm/dao/UserVmDetailsDaoImpl.java | 4 +-
.../src/com/cloud/vm/dao/VMInstanceDaoImpl.java | 12 +-
.../affinity/dao/AffinityGroupVMMapDaoImpl.java | 4 +-
.../entity/api/db/dao/VMComputeTagDaoImpl.java | 4 +-
.../entity/api/db/dao/VMEntityDaoImpl.java | 4 +-
.../entity/api/db/dao/VMNetworkMapDaoImpl.java | 4 +-
.../entity/api/db/dao/VMReservationDaoImpl.java | 4 +-
.../entity/api/db/dao/VMRootDiskTagDaoImpl.java | 4 +-
.../datastore/db/PrimaryDataStoreDaoImpl.java | 10 +-
.../endpoint/DefaultEndPointSelector.java | 3 +-
.../image/db/ImageStoreDetailsDaoImpl.java | 4 +-
.../image/db/SnapshotDataStoreDaoImpl.java | 6 +-
.../image/db/TemplateDataStoreDaoImpl.java | 6 +-
.../image/db/VolumeDataStoreDaoImpl.java | 4 +-
.../datastore/PrimaryDataStoreHelper.java | 4 +-
.../db/PrimaryDataStoreDetailsDaoImpl.java | 4 +-
.../com/cloud/cluster/ClusterManagerImpl.java | 102 +-
.../dao/ManagementServerHostDaoImpl.java | 16 +-
.../dao/ManagementServerHostPeerDaoImpl.java | 4 +-
.../config/dao/ConfigurationDaoImpl.java | 6 +-
.../utils/crypt/EncryptionSecretKeyChanger.java | 3 +-
.../com/cloud/utils/db/ConnectionConcierge.java | 2 +-
framework/db/src/com/cloud/utils/db/DbUtil.java | 2 +-
.../src/com/cloud/utils/db/GenericDaoBase.java | 36 +-
.../db/src/com/cloud/utils/db/Merovingian2.java | 2 +-
.../src/com/cloud/utils/db/SequenceFetcher.java | 2 +-
.../db/src/com/cloud/utils/db/Transaction.java | 1166 +----------------
.../com/cloud/utils/db/TransactionCallback.java | 7 +
.../utils/db/TransactionCallbackNoReturn.java | 13 +
.../db/TransactionCallbackWithException.java | 7 +
.../utils/db/TransactionContextBuilder.java | 6 +-
.../com/cloud/utils/db/TransactionLegacy.java | 1174 ++++++++++++++++++
.../cloud/utils/db/TransactionMBeanImpl.java | 18 +-
.../com/cloud/utils/db/TransactionStatus.java | 7 +
.../utils/db/TransactionWrappedExeception.java | 36 +
.../db/test/com/cloud/utils/db/DbTestDao.java | 4 +-
.../db/test/com/cloud/utils/db/DbTestUtils.java | 4 +-
.../com/cloud/utils/db/TransactionTest.java | 26 +-
.../framework/jobs/dao/AsyncJobDaoImpl.java | 4 +-
.../jobs/dao/AsyncJobJoinMapDaoImpl.java | 10 +-
.../framework/jobs/dao/SyncQueueDaoImpl.java | 4 +-
.../jobs/dao/SyncQueueItemDaoImpl.java | 4 +-
.../jobs/impl/AsyncJobManagerImpl.java | 286 ++---
.../jobs/impl/SyncQueueManagerImpl.java | 271 ++--
.../affinity/ExplicitDedicationProcessor.java | 32 +-
.../dedicated/DedicatedResourceManagerImpl.java | 273 ++--
.../BareMetalPingServiceImpl.java | 3 -
.../networkservice/BaremetaNetworkGuru.java | 21 +-
.../networkservice/BaremetalDhcpElement.java | 4 -
.../BaremetalDhcpManagerImpl.java | 4 -
.../BaremetalKickStartServiceImpl.java | 7 +-
.../networkservice/BaremetalPxeElement.java | 4 -
.../com/cloud/ucs/manager/UcsManagerImpl.java | 3 -
.../lb/ElasticLoadBalancerManagerImpl.java | 32 +-
.../cloudstack/storage/test/AopTestAdvice.java | 4 +-
server/src/com/cloud/api/ApiServer.java | 65 +-
.../com/cloud/capacity/CapacityManagerImpl.java | 321 ++---
.../configuration/ConfigurationManagerImpl.java | 880 ++++++-------
.../consoleproxy/ConsoleProxyManagerImpl.java | 34 +-
.../cloud/dc/dao/DedicatedResourceDaoImpl.java | 3 +-
.../deploy/DeploymentPlanningManagerImpl.java | 157 +--
.../ha/HighAvailabilityManagerExtImpl.java | 7 +-
.../cloud/ha/dao/HighAvailabilityDaoImpl.java | 3 +-
.../metadata/ResourceMetaDataManagerImpl.java | 86 +-
.../network/ExternalDeviceUsageManagerImpl.java | 155 +--
.../ExternalFirewallDeviceManagerImpl.java | 46 +-
.../ExternalLoadBalancerDeviceManagerImpl.java | 171 ++-
.../com/cloud/network/IpAddressManagerImpl.java | 967 ++++++++-------
.../com/cloud/network/NetworkServiceImpl.java | 605 ++++-----
.../cloud/network/NetworkUsageManagerImpl.java | 50 +-
.../cloud/network/PortProfileManagerImpl.java | 39 +-
.../network/StorageNetworkManagerImpl.java | 169 +--
.../cloud/network/as/AutoScaleManagerImpl.java | 191 +--
.../network/firewall/FirewallManagerImpl.java | 93 +-
.../cloud/network/guru/DirectNetworkGuru.java | 122 +-
.../network/guru/DirectPodBasedNetworkGuru.java | 116 +-
.../cloud/network/guru/GuestNetworkGuru.java | 17 +-
.../cloud/network/guru/PublicNetworkGuru.java | 20 +-
.../lb/LoadBalancingRulesManagerImpl.java | 395 +++---
.../VirtualNetworkApplianceManagerImpl.java | 347 +++---
.../cloud/network/rules/RulesManagerImpl.java | 228 ++--
.../security/SecurityGroupManagerImpl.java | 526 ++++----
.../network/vpc/NetworkACLManagerImpl.java | 40 +-
.../com/cloud/network/vpc/VpcManagerImpl.java | 635 +++++-----
.../network/vpn/RemoteAccessVpnManagerImpl.java | 224 ++--
.../com/cloud/projects/ProjectManagerImpl.java | 367 +++---
.../com/cloud/resource/ResourceManagerImpl.java | 297 +++--
.../resourcelimit/ResourceLimitManagerImpl.java | 336 ++---
.../cloud/server/ConfigurationServerImpl.java | 554 +++++----
.../com/cloud/server/ManagementServerImpl.java | 101 +-
server/src/com/cloud/server/StatsCollector.java | 247 ++--
.../com/cloud/servlet/CloudStartupServlet.java | 3 +-
.../com/cloud/servlet/ConsoleProxyServlet.java | 3 +-
.../com/cloud/storage/StorageManagerImpl.java | 62 +-
.../com/cloud/storage/VolumeApiServiceImpl.java | 144 ++-
.../cloud/tags/TaggedResourceManagerImpl.java | 110 +-
.../com/cloud/template/TemplateManagerImpl.java | 100 +-
server/src/com/cloud/test/DatabaseConfig.java | 68 +-
server/src/com/cloud/test/IPRangeConfig.java | 15 +-
server/src/com/cloud/test/PodZoneConfig.java | 7 +-
.../src/com/cloud/usage/UsageServiceImpl.java | 10 +-
.../src/com/cloud/user/AccountManagerImpl.java | 190 +--
.../src/com/cloud/user/DomainManagerImpl.java | 70 +-
.../cloud/uuididentity/dao/IdentityDaoImpl.java | 13 +-
server/src/com/cloud/vm/UserVmManagerImpl.java | 681 +++++-----
.../vm/snapshot/VMSnapshotManagerImpl.java | 46 +-
.../affinity/AffinityGroupServiceImpl.java | 107 +-
.../lb/ApplicationLoadBalancerManagerImpl.java | 51 +-
.../GlobalLoadBalancingRulesServiceImpl.java | 219 ++--
.../configuration/ConfigurationManagerTest.java | 20 +-
.../cloud/network/CreatePrivateNetworkTest.java | 6 +-
.../network/DedicateGuestVlanRangesTest.java | 18 +-
.../network/UpdatePhysicalNetworkTest.java | 5 +-
...GlobalLoadBalancingRulesServiceImplTest.java | 28 +-
usage/src/com/cloud/usage/UsageManagerImpl.java | 16 +-
.../src/com/cloud/usage/UsageSanityChecker.java | 4 +-
.../cloud/utils/exception/ExceptionUtil.java | 12 +
232 files changed, 8415 insertions(+), 7792 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/api/src/com/cloud/exception/ConcurrentOperationException.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/exception/ConcurrentOperationException.java b/api/src/com/cloud/exception/ConcurrentOperationException.java
index cfe6ba3..018dba5 100644
--- a/api/src/com/cloud/exception/ConcurrentOperationException.java
+++ b/api/src/com/cloud/exception/ConcurrentOperationException.java
@@ -17,8 +17,9 @@
package com.cloud.exception;
import com.cloud.utils.SerialVersionUID;
+import com.cloud.utils.exception.CloudRuntimeException;
-public class ConcurrentOperationException extends CloudException {
+public class ConcurrentOperationException extends CloudRuntimeException {
private static final long serialVersionUID = SerialVersionUID.ConcurrentOperationException;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/BucketPolicyDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/BucketPolicyDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/BucketPolicyDaoImpl.java
index dd354a3..00486cb 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/BucketPolicyDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/BucketPolicyDaoImpl.java
@@ -26,7 +26,7 @@ import com.cloud.bridge.model.BucketPolicyVO;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={BucketPolicyDao.class})
@@ -42,7 +42,7 @@ public class BucketPolicyDaoImpl extends GenericDaoBase<BucketPolicyVO, Long> im
public BucketPolicyVO getByName( String bucketName ) {
SearchBuilder <BucketPolicyVO> searchByBucket = createSearchBuilder();
searchByBucket.and("BucketName", searchByBucket.entity().getBucketName(), SearchCriteria.Op.EQ);
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<BucketPolicyVO> sc = searchByBucket.create();
@@ -59,7 +59,7 @@ public class BucketPolicyDaoImpl extends GenericDaoBase<BucketPolicyVO, Long> im
public void deletePolicy( String bucketName ) {
SearchBuilder <BucketPolicyVO> deleteByBucket = createSearchBuilder();
deleteByBucket.and("BucketName", deleteByBucket.entity().getBucketName(), SearchCriteria.Op.EQ);
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<BucketPolicyVO> sc = deleteByBucket.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/CloudStackAccountDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackAccountDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackAccountDaoImpl.java
index 8fbc7c8..75a693e 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackAccountDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackAccountDaoImpl.java
@@ -25,6 +25,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={CloudStackAccountDao.class})
@@ -34,7 +35,7 @@ public class CloudStackAccountDaoImpl extends GenericDaoBase<CloudStackAccountVO
public String getDefaultZoneId(String accountId) {
SearchBuilder<CloudStackAccountVO> SearchByUUID = createSearchBuilder();
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
txn.start();
SearchByUUID.and("uuid", SearchByUUID.entity().getUuid(),
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/CloudStackConfigurationDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackConfigurationDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackConfigurationDaoImpl.java
index bc77ea1..644dcdc 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackConfigurationDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackConfigurationDaoImpl.java
@@ -27,6 +27,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={CloudStackConfigurationDao.class})
@@ -42,7 +43,7 @@ public class CloudStackConfigurationDaoImpl extends GenericDaoBase<CloudStackCon
@DB
public String getConfigValue(String name) {
NameSearch.and("name", NameSearch.entity().getName(), SearchCriteria.Op.EQ);
- Transaction txn = Transaction.open("cloud", Transaction.CLOUD_DB, true);
+ TransactionLegacy txn = TransactionLegacy.open("cloud", TransactionLegacy.CLOUD_DB, true);
try {
txn.start();
SearchCriteria<CloudStackConfigurationVO> sc = NameSearch.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/CloudStackSvcOfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackSvcOfferingDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackSvcOfferingDaoImpl.java
index 8021eb6..cb8d129 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackSvcOfferingDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackSvcOfferingDaoImpl.java
@@ -29,6 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={CloudStackSvcOfferingDao.class})
@@ -42,7 +43,7 @@ public class CloudStackSvcOfferingDaoImpl extends GenericDaoBase<CloudStackServi
SearchBuilder <CloudStackServiceOfferingVO> searchByName = createSearchBuilder();
searchByName.and("name", searchByName.entity().getName(), SearchCriteria.Op.EQ);
searchByName.done();
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
txn.start();
SearchCriteria<CloudStackServiceOfferingVO> sc = searchByName.create();
@@ -61,7 +62,7 @@ public class CloudStackSvcOfferingDaoImpl extends GenericDaoBase<CloudStackServi
SearchBuilder <CloudStackServiceOfferingVO> searchByID = createSearchBuilder();
searchByID.and("uuid", searchByID.entity().getUuid(), SearchCriteria.Op.EQ);
searchByID.done();
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
txn.start();
SearchCriteria<CloudStackServiceOfferingVO> sc = searchByID.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/CloudStackUserDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackUserDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackUserDaoImpl.java
index f7e1da6..7fe1dab 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/CloudStackUserDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/CloudStackUserDaoImpl.java
@@ -26,6 +26,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.crypt.DBEncryptionUtil;
@Component
@@ -43,7 +44,7 @@ public class CloudStackUserDaoImpl extends GenericDaoBase<CloudStackUserVO, Stri
SearchBuilder <CloudStackUserVO> searchByAccessKey = createSearchBuilder();
searchByAccessKey.and("apiKey", searchByAccessKey.entity().getApiKey(), SearchCriteria.Op.EQ);
searchByAccessKey.done();
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
txn.start();
SearchCriteria<CloudStackUserVO> sc = searchByAccessKey.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MHostDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/MHostDaoImpl.java
index 2223254..b52fcaf 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MHostDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MHostDaoImpl.java
@@ -25,6 +25,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={MHostDao.class})
@@ -38,7 +39,7 @@ public class MHostDaoImpl extends GenericDaoBase<MHostVO, Long> implements MHost
@Override
public MHostVO getByHostKey(String hostKey) {
NameSearch.and("MHostKey", NameSearch.entity().getHostKey(), SearchCriteria.Op.EQ);
- Transaction txn = Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.open("cloudbridge", TransactionLegacy.AWSAPI_DB, true);
try {
txn.start();
SearchCriteria<MHostVO> sc = NameSearch.create();
@@ -52,7 +53,7 @@ public class MHostDaoImpl extends GenericDaoBase<MHostVO, Long> implements MHost
@Override
public void updateHeartBeat(MHostVO mhost) {
- Transaction txn = Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.open("cloudbridge", TransactionLegacy.AWSAPI_DB, true);
try {
txn.start();
update(mhost.getId(), mhost);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MHostMountDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MHostMountDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/MHostMountDaoImpl.java
index 8b99f48..8a7153a 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MHostMountDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MHostMountDaoImpl.java
@@ -25,6 +25,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={MHostMountDao.class})
@@ -37,7 +38,7 @@ public class MHostMountDaoImpl extends GenericDaoBase<MHostMountVO, Long> implem
public MHostMountVO getHostMount(long mHostId, long sHostId) {
SearchByMHostID.and("MHostID", SearchByMHostID.entity().getmHostID(), SearchCriteria.Op.EQ);
SearchByMHostID.and("SHostID", SearchByMHostID.entity().getsHostID(), SearchCriteria.Op.EQ);
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<MHostMountVO> sc = SearchByMHostID.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MultiPartPartsDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MultiPartPartsDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/MultiPartPartsDaoImpl.java
index 6f31495..f1472e6 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MultiPartPartsDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MultiPartPartsDaoImpl.java
@@ -28,6 +28,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={MultiPartPartsDao.class})
@@ -42,7 +43,7 @@ public class MultiPartPartsDaoImpl extends GenericDaoBase<MultiPartPartsVO, Long
ByUploadID.and("partNumber", ByUploadID.entity().getPartNumber(), SearchCriteria.Op.LT);
Filter filter = new Filter(MultiPartPartsVO.class, "partNumber", Boolean.TRUE, null, null);
- Transaction txn = Transaction.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
try {
txn.start();
SearchCriteria<MultiPartPartsVO> sc = ByUploadID.create();
@@ -61,7 +62,7 @@ public class MultiPartPartsDaoImpl extends GenericDaoBase<MultiPartPartsVO, Long
SearchBuilder<MultiPartPartsVO> byUploadID = createSearchBuilder();
byUploadID.and("UploadID", byUploadID.entity().getUploadid(), SearchCriteria.Op.EQ);
byUploadID.and("partNumber", byUploadID.entity().getPartNumber(), SearchCriteria.Op.GT);
- Transaction txn = Transaction.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
try {
txn.start();
SearchCriteria<MultiPartPartsVO> sc = byUploadID.create();
@@ -82,7 +83,7 @@ public class MultiPartPartsDaoImpl extends GenericDaoBase<MultiPartPartsVO, Long
SearchBuilder<MultiPartPartsVO> byUploadID = createSearchBuilder();
byUploadID.and("UploadID", byUploadID.entity().getUploadid(), SearchCriteria.Op.EQ);
byUploadID.and("partNumber", byUploadID.entity().getPartNumber(), SearchCriteria.Op.EQ);
- Transaction txn = Transaction.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
try {
txn.start();
SearchCriteria<MultiPartPartsVO> sc = byUploadID.create();
@@ -102,7 +103,7 @@ public class MultiPartPartsDaoImpl extends GenericDaoBase<MultiPartPartsVO, Long
SearchBuilder<MultiPartPartsVO> byUploadID = createSearchBuilder();
byUploadID.and("UploadID", byUploadID.entity().getUploadid(), SearchCriteria.Op.EQ);
byUploadID.and("partNumber", byUploadID.entity().getPartNumber(), SearchCriteria.Op.EQ);
- Transaction txn = Transaction.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
try {
txn.start();
SearchCriteria<MultiPartPartsVO> sc = byUploadID.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MultiPartUploadsDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MultiPartUploadsDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/MultiPartUploadsDaoImpl.java
index 0f76e80..41133a0 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MultiPartUploadsDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MultiPartUploadsDaoImpl.java
@@ -33,6 +33,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={MultiPartUploadsDao.class})
@@ -42,9 +43,9 @@ public class MultiPartUploadsDaoImpl extends GenericDaoBase<MultiPartUploadsVO,
public OrderedPair<String,String> multipartExits( int uploadId ) {
MultiPartUploadsVO uploadvo = null;
- Transaction txn = null;
+ TransactionLegacy txn = null;
try {
- txn = Transaction.open(Transaction.AWSAPI_DB);
+ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
uploadvo = findById(new Long(uploadId));
if (null != uploadvo)
return new OrderedPair<String,String>(uploadvo.getAccessKey(), uploadvo.getNameKey());
@@ -58,9 +59,9 @@ public class MultiPartUploadsDaoImpl extends GenericDaoBase<MultiPartUploadsVO,
@Override
public void deleteUpload(int uploadId) {
- Transaction txn = null;
+ TransactionLegacy txn = null;
try {
- txn = Transaction.open(Transaction.AWSAPI_DB);
+ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
remove(new Long(uploadId));
txn.commit();
}finally {
@@ -70,10 +71,10 @@ public class MultiPartUploadsDaoImpl extends GenericDaoBase<MultiPartUploadsVO,
@Override
public String getAtrributeValue(String attribute, int uploadid) {
- Transaction txn = null;
+ TransactionLegacy txn = null;
MultiPartUploadsVO uploadvo = null;
try {
- txn = Transaction.open(Transaction.AWSAPI_DB);
+ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
uploadvo = findById(new Long(uploadid));
if (null != uploadvo) {
if ( attribute.equalsIgnoreCase("AccessKey") )
@@ -105,7 +106,7 @@ public class MultiPartUploadsDaoImpl extends GenericDaoBase<MultiPartUploadsVO,
Filter filter = new Filter(MultiPartUploadsVO.class, "nameKey", Boolean.TRUE, null, null);
filter.addOrderBy(MultiPartUploadsVO.class, "createTime", Boolean.TRUE);
- Transaction txn = Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.open("cloudbridge", TransactionLegacy.AWSAPI_DB, true);
try {
txn.start();
SearchCriteria<MultiPartUploadsVO> sc = byBucket.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MultipartLoadDao.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MultipartLoadDao.java b/awsapi/src/com/cloud/bridge/persist/dao/MultipartLoadDao.java
index c1a69dc..4e6ff3d 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MultipartLoadDao.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MultipartLoadDao.java
@@ -34,6 +34,7 @@ import com.cloud.bridge.service.core.s3.S3MultipartPart;
import com.cloud.bridge.service.core.s3.S3MultipartUpload;
import com.cloud.bridge.util.OrderedPair;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
public class MultipartLoadDao {
public static final Logger logger = Logger.getLogger(MultipartLoadDao.class);
@@ -94,9 +95,9 @@ public class MultipartLoadDao {
*/
public int initiateUpload( String accessKey, String bucketName, String key, String cannedAccess, S3MetaDataEntry[] meta ) {
int uploadId = -1;
- Transaction txn = null;
+ TransactionLegacy txn = null;
try {
- txn = Transaction.open(Transaction.AWSAPI_DB);
+ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
Date tod = new Date();
MultiPartUploadsVO uploadVO = new MultiPartUploadsVO(accessKey,
bucketName, key, cannedAccess, tod);
@@ -315,9 +316,9 @@ public class MultipartLoadDao {
private void saveMultipartMeta( int uploadId, S3MetaDataEntry[] meta ) {
if (null == meta) return;
- Transaction txn = null;
+ TransactionLegacy txn = null;
try {
- txn = Transaction.open(Transaction.AWSAPI_DB);
+ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
for( int i=0; i < meta.length; i++ )
{
S3MetaDataEntry entry = meta[i];
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/MultipartMetaDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/MultipartMetaDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/MultipartMetaDaoImpl.java
index 7ab9359..fec0a2c 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/MultipartMetaDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/MultipartMetaDaoImpl.java
@@ -27,6 +27,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={MultipartMetaDao.class})
@@ -37,7 +38,7 @@ public class MultipartMetaDaoImpl extends GenericDaoBase<MultipartMetaVO, Long>
SearchBuilder <MultipartMetaVO> searchByUID = createSearchBuilder();
searchByUID.and("UploadID", searchByUID.entity().getUploadID(), SearchCriteria.Op.EQ);
searchByUID.done();
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<MultipartMetaVO> sc = searchByUID.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/OfferingDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/OfferingDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/OfferingDaoImpl.java
index ea7d264..963f108 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/OfferingDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/OfferingDaoImpl.java
@@ -29,6 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={OfferingDao.class})
@@ -39,7 +40,7 @@ public class OfferingDaoImpl extends GenericDaoBase<OfferingBundleVO, Long> impl
@Override
public int getOfferingCount() {
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
return listAll().size();
@@ -56,7 +57,7 @@ public class OfferingDaoImpl extends GenericDaoBase<OfferingBundleVO, Long> impl
SearchBuilder <OfferingBundleVO> searchByAmazon = createSearchBuilder();
searchByAmazon.and("AmazonEC2Offering", searchByAmazon.entity().getAmazonOffering() , SearchCriteria.Op.EQ);
searchByAmazon.done();
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<OfferingBundleVO> sc = searchByAmazon.create();
@@ -74,7 +75,7 @@ public class OfferingDaoImpl extends GenericDaoBase<OfferingBundleVO, Long> impl
SearchBuilder <OfferingBundleVO> searchByAmazon = createSearchBuilder();
searchByAmazon.and("CloudStackOffering", searchByAmazon.entity().getAmazonOffering() , SearchCriteria.Op.EQ);
searchByAmazon.done();
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<OfferingBundleVO> sc = searchByAmazon.create();
@@ -93,7 +94,7 @@ public class OfferingDaoImpl extends GenericDaoBase<OfferingBundleVO, Long> impl
searchByAmazon.and("CloudStackOffering", searchByAmazon.entity().getAmazonOffering() , SearchCriteria.Op.EQ);
searchByAmazon.and("AmazonEC2Offering", searchByAmazon.entity().getCloudstackOffering() , SearchCriteria.Op.EQ);
searchByAmazon.done();
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
OfferingBundleVO offering = null;
try {
txn.start();
@@ -122,7 +123,7 @@ public class OfferingDaoImpl extends GenericDaoBase<OfferingBundleVO, Long> impl
SearchBuilder <OfferingBundleVO> searchByAmazon = createSearchBuilder();
searchByAmazon.and("AmazonEC2Offering", searchByAmazon.entity().getAmazonOffering() , SearchCriteria.Op.EQ);
searchByAmazon.done();
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<OfferingBundleVO> sc = searchByAmazon.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SAclDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SAclDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SAclDaoImpl.java
index d88660e..d4b4c90 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SAclDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SAclDaoImpl.java
@@ -32,6 +32,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={SAclDao.class})
@@ -46,7 +47,7 @@ public class SAclDaoImpl extends GenericDaoBase<SAclVO, Long> implements SAclDao
SearchByTarget.and("TargetID", SearchByTarget.entity().getTargetId(), SearchCriteria.Op.EQ);
SearchByTarget.done();
Filter filter = new Filter(SAclVO.class, "grantOrder", Boolean.TRUE, null, null);
- Transaction txn = Transaction.open( Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open( TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<SAclVO> sc = SearchByTarget.create();
@@ -66,7 +67,7 @@ public class SAclDaoImpl extends GenericDaoBase<SAclVO, Long> implements SAclDao
SearchByAcl.and("TargetID", SearchByAcl.entity().getTargetId(), SearchCriteria.Op.EQ);
SearchByAcl.and("GranteeCanonicalID", SearchByAcl.entity().getGranteeCanonicalId(), SearchCriteria.Op.EQ);
Filter filter = new Filter(SAclVO.class, "grantOrder", Boolean.TRUE, null, null);
- Transaction txn = Transaction.open( Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open( TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<SAclVO> sc = SearchByAcl.create();
@@ -85,7 +86,7 @@ public class SAclDaoImpl extends GenericDaoBase<SAclVO, Long> implements SAclDao
SearchByTarget.and("Target", SearchByTarget.entity().getTarget(), SearchCriteria.Op.EQ);
SearchByTarget.and("TargetID", SearchByTarget.entity().getTargetId(), SearchCriteria.Op.EQ);
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<SAclVO> sc = SearchByTarget.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SBucketDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SBucketDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SBucketDaoImpl.java
index 817c682..552281d 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SBucketDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SBucketDaoImpl.java
@@ -29,6 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={SBucketDao.class})
@@ -42,7 +43,7 @@ public class SBucketDaoImpl extends GenericDaoBase<SBucketVO, Long> implements S
SearchBuilder<SBucketVO> SearchByName = createSearchBuilder();
SearchByName.and("Name", SearchByName.entity().getName(), SearchCriteria.Op.EQ);
//Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
- Transaction txn = Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.open("cloudbridge", TransactionLegacy.AWSAPI_DB, true);
try {
txn.start();
SearchCriteria<SBucketVO> sc = SearchByName.create();
@@ -59,7 +60,7 @@ public class SBucketDaoImpl extends GenericDaoBase<SBucketVO, Long> implements S
SearchBuilder<SBucketVO> ByCanonicalID = createSearchBuilder();
ByCanonicalID.and("OwnerCanonicalID", ByCanonicalID.entity().getOwnerCanonicalId(), SearchCriteria.Op.EQ);
Filter filter = new Filter(SBucketVO.class, "createTime", Boolean.TRUE, null, null);
- Transaction txn = Transaction.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
try {
txn.start();
SearchCriteria<SBucketVO> sc = ByCanonicalID.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SHostDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SHostDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SHostDaoImpl.java
index 9b6b535..5d2e9b9 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SHostDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SHostDaoImpl.java
@@ -25,6 +25,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={SHostDao.class})
@@ -36,7 +37,7 @@ public class SHostDaoImpl extends GenericDaoBase<SHostVO, Long> implements SHost
SearchBuilder <SHostVO> HostSearch = createSearchBuilder();
HostSearch.and("Host", HostSearch.entity().getHost(), SearchCriteria.Op.EQ);
HostSearch.done();
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<SHostVO> sc = HostSearch.create();
@@ -55,7 +56,7 @@ public class SHostDaoImpl extends GenericDaoBase<SHostVO, Long> implements SHost
LocalStorageHostSearch.and("MHostID", LocalStorageHostSearch.entity().getMhostid(), SearchCriteria.Op.EQ);
LocalStorageHostSearch.and("ExportRoot", LocalStorageHostSearch.entity().getExportRoot(), SearchCriteria.Op.EQ);
LocalStorageHostSearch.done();
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
txn.start();
SearchCriteria<SHostVO> sc = LocalStorageHostSearch.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SMetaDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SMetaDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SMetaDaoImpl.java
index 8fdc949..95355b9 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SMetaDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SMetaDaoImpl.java
@@ -28,6 +28,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={SMetaDao.class})
@@ -41,7 +42,7 @@ public class SMetaDaoImpl extends GenericDaoBase<SMetaVO, Long> implements SMeta
SearchByTarget.and("Target", SearchByTarget.entity().getTarget(), SearchCriteria.Op.EQ);
SearchByTarget.and("TargetID", SearchByTarget.entity().getTargetId(), SearchCriteria.Op.EQ);
SearchByTarget.done();
- Transaction txn = Transaction.open( Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open( TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<SMetaVO> sc = SearchByTarget.create();
@@ -71,7 +72,7 @@ public class SMetaDaoImpl extends GenericDaoBase<SMetaVO, Long> implements SMeta
SearchBuilder <SMetaVO> SearchByTarget = createSearchBuilder();
SearchByTarget.and("Target", SearchByTarget.entity().getTarget(), SearchCriteria.Op.EQ);
SearchByTarget.and("TargetID", SearchByTarget.entity().getTargetId(), SearchCriteria.Op.EQ);
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<SMetaVO> sc = SearchByTarget.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SObjectDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SObjectDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SObjectDaoImpl.java
index 6d23757..e6370fe 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SObjectDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SObjectDaoImpl.java
@@ -33,6 +33,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={SObjectDao.class})
@@ -47,7 +48,7 @@ public class SObjectDaoImpl extends GenericDaoBase<SObjectVO, Long> implements S
SearchBuilder<SObjectVO> SearchByName = createSearchBuilder();
SearchByName.and("SBucketID", SearchByName.entity().getBucketID() , SearchCriteria.Op.EQ);
SearchByName.and("NameKey", SearchByName.entity().getNameKey() , SearchCriteria.Op.EQ);
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<SObjectVO> sc = SearchByName.create();
@@ -76,7 +77,7 @@ public class SObjectDaoImpl extends GenericDaoBase<SObjectVO, Long> implements S
SearchByBucket.and("SBucketID", SearchByBucket.entity().getBucketID(), SearchCriteria.Op.EQ);
SearchByBucket.and("DeletionMark", SearchByBucket.entity().getDeletionMark(), SearchCriteria.Op.NULL);
- Transaction txn = Transaction.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
try {
txn.start();
SearchCriteria<SObjectVO> sc = SearchByBucket.create();
@@ -100,7 +101,7 @@ public class SObjectDaoImpl extends GenericDaoBase<SObjectVO, Long> implements S
List<SObjectVO> objects = new ArrayList<SObjectVO>();
getAllBuckets.and("SBucketID", getAllBuckets.entity().getBucketID(), SearchCriteria.Op.EQ);
- Transaction txn = Transaction.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.currentTxn(); // Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
try {
txn.start();
SearchCriteria<SObjectVO> sc = getAllBuckets.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/SObjectItemDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/SObjectItemDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/SObjectItemDaoImpl.java
index 57140c4..294b32d 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/SObjectItemDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/SObjectItemDaoImpl.java
@@ -27,6 +27,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={SObjectItemDao.class})
@@ -39,7 +40,7 @@ public class SObjectItemDaoImpl extends GenericDaoBase<SObjectItemVO, Long> impl
@Override
public SObjectItemVO getByObjectIdNullVersion(long id) {
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
SearchBuilder <SObjectItemVO> SearchByID = createSearchBuilder();
SearchByID.and("ID", SearchByID.entity().getId(), SearchCriteria.Op.EQ);
@@ -56,7 +57,7 @@ public class SObjectItemDaoImpl extends GenericDaoBase<SObjectItemVO, Long> impl
@Override
public List<SObjectItemVO> getItems(long sobjectID) {
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
SearchBuilder<SObjectItemVO> SearchBySobjectID = createSearchBuilder();
SearchBySobjectID.and("SObjectID", SearchBySobjectID.entity().getId(), SearchCriteria.Op.EQ);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/persist/dao/UserCredentialsDaoImpl.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/persist/dao/UserCredentialsDaoImpl.java b/awsapi/src/com/cloud/bridge/persist/dao/UserCredentialsDaoImpl.java
index c45886f..b60a717 100644
--- a/awsapi/src/com/cloud/bridge/persist/dao/UserCredentialsDaoImpl.java
+++ b/awsapi/src/com/cloud/bridge/persist/dao/UserCredentialsDaoImpl.java
@@ -29,6 +29,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={UserCredentialsDao.class})
@@ -41,7 +42,7 @@ public class UserCredentialsDaoImpl extends GenericDaoBase<UserCredentialsVO, Lo
@Override
public UserCredentialsVO getByAccessKey( String cloudAccessKey ) {
SearchBuilder<UserCredentialsVO> SearchByAccessKey = createSearchBuilder();
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchByAccessKey.and("AccessKey", SearchByAccessKey.entity()
@@ -60,7 +61,7 @@ public class UserCredentialsDaoImpl extends GenericDaoBase<UserCredentialsVO, Lo
public UserCredentialsVO getByCertUniqueId( String certId ) {
SearchBuilder<UserCredentialsVO> SearchByCertID = createSearchBuilder();
SearchByCertID.and("CertUniqueId", SearchByCertID.entity().getCertUniqueId(), SearchCriteria.Op.EQ);
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
SearchCriteria<UserCredentialsVO> sc = SearchByCertID.create();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java b/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java
index 50ac26f..1ef04a4 100644
--- a/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java
+++ b/awsapi/src/com/cloud/bridge/service/EC2RestServlet.java
@@ -161,6 +161,7 @@ import com.cloud.bridge.util.ConfigurationHelper;
import com.cloud.bridge.util.EC2RestAuth;
import com.cloud.stack.models.CloudStackAccount;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component("EC2RestServlet")
public class EC2RestServlet extends HttpServlet {
@@ -377,7 +378,7 @@ public class EC2RestServlet extends HttpServlet {
private void setUserKeys( HttpServletRequest request, HttpServletResponse response ) {
String[] accessKey = null;
String[] secretKey = null;
- Transaction txn = null;
+ TransactionLegacy txn = null;
try {
// -> all these parameters are required
accessKey = request.getParameterValues( "accesskey" );
@@ -398,7 +399,7 @@ public class EC2RestServlet extends HttpServlet {
return;
}
try {
- txn = Transaction.open(Transaction.AWSAPI_DB);
+ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
txn.start();
// -> use the keys to see if the account actually exists
ServiceProvider.getInstance().getEC2Engine().validateAccount( accessKey[0], secretKey[0] );
@@ -434,7 +435,7 @@ public class EC2RestServlet extends HttpServlet {
*/
private void setCertificate( HttpServletRequest request, HttpServletResponse response )
throws Exception {
- Transaction txn = null;
+ TransactionLegacy txn = null;
try {
// [A] Pull the cert and cloud AccessKey from the request
String[] certificate = request.getParameterValues( "cert" );
@@ -470,7 +471,7 @@ public class EC2RestServlet extends HttpServlet {
// [C] Associate the cert's uniqueId with the Cloud API keys
String uniqueId = AuthenticationUtils.X509CertUniqueId( userCert );
logger.debug( "SetCertificate, uniqueId: " + uniqueId );
- txn = Transaction.open(Transaction.AWSAPI_DB);
+ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
txn.start();
UserCredentialsVO user = ucDao.getByAccessKey(accessKey[0]);
user.setCertUniqueId(uniqueId);
@@ -505,7 +506,7 @@ public class EC2RestServlet extends HttpServlet {
*/
private void deleteCertificate( HttpServletRequest request, HttpServletResponse response )
throws Exception {
- Transaction txn = null;
+ TransactionLegacy txn = null;
try {
String [] accessKey = request.getParameterValues( "AWSAccessKeyId" );
if ( null == accessKey || 0 == accessKey.length ) {
@@ -527,7 +528,7 @@ public class EC2RestServlet extends HttpServlet {
/* UserCredentialsDao credentialDao = new UserCredentialsDao();
credentialDao.setCertificateId( accessKey[0], null );
- */ txn = Transaction.open(Transaction.AWSAPI_DB);
+ */ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
UserCredentialsVO user = ucDao.getByAccessKey(accessKey[0]);
user.setCertUniqueId(null);
ucDao.update(user.getId(), user);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/service/S3RestServlet.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/service/S3RestServlet.java b/awsapi/src/com/cloud/bridge/service/S3RestServlet.java
index 7e69fd6..192e1a2 100644
--- a/awsapi/src/com/cloud/bridge/service/S3RestServlet.java
+++ b/awsapi/src/com/cloud/bridge/service/S3RestServlet.java
@@ -67,6 +67,7 @@ import com.cloud.bridge.util.RestAuth;
import com.cloud.bridge.util.S3SoapAuth;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
public class S3RestServlet extends HttpServlet {
private static final long serialVersionUID = -6168996266762804877L;
public static final String ENABLE_S3_API="enable.s3.api";
@@ -139,7 +140,7 @@ public class S3RestServlet extends HttpServlet {
*/
private void processRequest( HttpServletRequest request, HttpServletResponse response, String method )
{
- Transaction txn = Transaction.open("cloudbridge", Transaction.AWSAPI_DB, true);
+ TransactionLegacy txn = TransactionLegacy.open("cloudbridge", TransactionLegacy.AWSAPI_DB, true);
try {
logRequest(request);
@@ -274,7 +275,7 @@ public class S3RestServlet extends HttpServlet {
// -> use the keys to see if the account actually exists
//ServiceProvider.getInstance().getEC2Engine().validateAccount( accessKey[0], secretKey[0] );
//UserCredentialsDaoImpl credentialDao = new UserCredentialsDao();
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
txn.start();
UserCredentialsVO user = new UserCredentialsVO(accessKey[0], secretKey[0]);
user = ucDao.persist(user);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/service/controller/s3/S3BucketAction.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/service/controller/s3/S3BucketAction.java b/awsapi/src/com/cloud/bridge/service/controller/s3/S3BucketAction.java
index c98de34..4d7c41a 100644
--- a/awsapi/src/com/cloud/bridge/service/controller/s3/S3BucketAction.java
+++ b/awsapi/src/com/cloud/bridge/service/controller/s3/S3BucketAction.java
@@ -94,6 +94,7 @@ import com.cloud.bridge.util.XSerializer;
import com.cloud.bridge.util.XSerializerXmlAdapter;
import com.cloud.bridge.util.XmlHelper;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
public class S3BucketAction implements ServletAction {
@@ -371,7 +372,7 @@ public class S3BucketAction implements ServletAction {
response.setStatus(403);
return;
}
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
// [B] Place the policy into the database over writting an existing policy
try {
// -> first make sure that the policy is valid by parsing it
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/service/controller/s3/ServiceProvider.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/service/controller/s3/ServiceProvider.java b/awsapi/src/com/cloud/bridge/service/controller/s3/ServiceProvider.java
index 2623efe..0854741 100644
--- a/awsapi/src/com/cloud/bridge/service/controller/s3/ServiceProvider.java
+++ b/awsapi/src/com/cloud/bridge/service/controller/s3/ServiceProvider.java
@@ -62,6 +62,7 @@ import com.cloud.bridge.util.OrderedPair;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
public class ServiceProvider extends ManagerBase {
@@ -90,7 +91,7 @@ public class ServiceProvider extends ManagerBase {
protected ServiceProvider() throws IOException {
// register service implementation object
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
txn.close();
}
@@ -183,7 +184,7 @@ public class ServiceProvider extends ManagerBase {
public UserInfo getUserInfo(String accessKey) {
UserInfo info = new UserInfo();
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
try {
txn.start();
UserCredentialsVO cloudKeys = ucDao.getByAccessKey( accessKey );
@@ -253,7 +254,7 @@ public class ServiceProvider extends ManagerBase {
multipartDir = properties.getProperty("storage.multipartDir");
- Transaction txn1 = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn1 = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
timer.schedule(getHeartbeatTask(), HEARTBEAT_INTERVAL, HEARTBEAT_INTERVAL);
txn1.close();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/awsapi/src/com/cloud/bridge/service/core/s3/S3Engine.java
----------------------------------------------------------------------
diff --git a/awsapi/src/com/cloud/bridge/service/core/s3/S3Engine.java b/awsapi/src/com/cloud/bridge/service/core/s3/S3Engine.java
index 7beb012..05e87d7 100644
--- a/awsapi/src/com/cloud/bridge/service/core/s3/S3Engine.java
+++ b/awsapi/src/com/cloud/bridge/service/core/s3/S3Engine.java
@@ -86,6 +86,7 @@ import com.cloud.bridge.util.StringHelper;
import com.cloud.bridge.util.Triple;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
/**
* The CRUD control actions to be invoked from S3BucketAction or S3ObjectAction.
@@ -195,7 +196,7 @@ public class S3Engine {
String cannedAccessPolicy = request.getCannedAccess();
String bucketName = request.getBucketName();
response.setBucketName( bucketName );
- Transaction txn= null;
+ TransactionLegacy txn= null;
verifyBucketName( bucketName, false );
S3PolicyContext context = new S3PolicyContext( PolicyActions.CreateBucket, bucketName );
@@ -205,7 +206,7 @@ public class S3Engine {
OrderedPair<SHostVO, String> shost_storagelocation_pair = null;
boolean success = false;
try {
- txn = Transaction.open(Transaction.AWSAPI_DB);
+ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
if (bucketDao.getByName(request.getBucketName()) != null)
throw new ObjectAlreadyExistsException("Bucket already exists");
@@ -257,10 +258,10 @@ public class S3Engine {
String bucketName = request.getBucketName();
SBucketVO sbucket = bucketDao.getByName(bucketName);
- Transaction txn = null;
+ TransactionLegacy txn = null;
if ( sbucket != null )
{
- txn = Transaction.open(Transaction.AWSAPI_DB);
+ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
txn.start();
S3PolicyContext context = new S3PolicyContext( PolicyActions.DeleteBucket, bucketName );
switch( verifyPolicy( context ))
@@ -699,7 +700,7 @@ public class S3Engine {
if (null != version)
httpResp.addHeader("x-amz-version-id", version);
httpResp.flushBuffer();
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
// [C] Re-assemble the object from its uploaded file parts
try {
// explicit transaction control to avoid holding transaction during
@@ -752,11 +753,11 @@ public class S3Engine {
S3BucketAdapter bucketAdapter = getStorageHostBucketAdapter(host_storagelocation_pair.getFirst());
String itemFileName = object_objectitem_pair.getSecond().getStoredPath();
InputStream is = null;
- Transaction txn = null;
+ TransactionLegacy txn = null;
try {
// explicit transaction control to avoid holding transaction during file-copy process
- txn = Transaction.open(Transaction.AWSAPI_DB);
+ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
txn.start();
is = request.getDataInputStream();
String md5Checksum = bucketAdapter.saveObject(is, host_storagelocation_pair.getSecond(), bucket.getName(), itemFileName);
@@ -813,11 +814,11 @@ public class S3Engine {
S3BucketAdapter bucketAdapter = getStorageHostBucketAdapter(host_storagelocation_pair.getFirst());
String itemFileName = object_objectitem_pair.getSecond().getStoredPath();
InputStream is = null;
- Transaction txn = null;
+ TransactionLegacy txn = null;
try {
// explicit transaction control to avoid holding transaction during file-copy process
- txn = Transaction.open(Transaction.AWSAPI_DB);
+ txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
txn.start();
is = request.getInputStream();
@@ -1505,7 +1506,7 @@ public class S3Engine {
context.setEvalParam( ConditionKeys.Acl, cannedAccessPolicy);
verifyAccess( context, "SBucket", bucket.getId(), SAcl.PERMISSION_WRITE ); // TODO - check this validates plain POSTs
- Transaction txn = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
txn.start();
// [B] If versioning is off them we over write a null object item
@@ -1554,7 +1555,7 @@ public class S3Engine {
}
else
{
- Transaction txn1 = Transaction.open(Transaction.AWSAPI_DB);
+ TransactionLegacy txn1 = TransactionLegacy.open(TransactionLegacy.AWSAPI_DB);
txn1.start();
// -> there is no object nor an object item
object = new SObjectVO();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
index 6804dc1..3e684cc 100755
--- a/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
@@ -97,6 +97,7 @@ import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.db.QueryBuilder;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -355,7 +356,7 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl
@DB
protected boolean noDbTxn() {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
return !txn.dbTxnStarted();
}
@@ -1252,7 +1253,7 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl
@Override
protected void doTask(final Task task) throws Exception {
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
final Type type = task.getType();
if (type == Task.Type.DATA) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
index 07fa73c..204a28e 100755
--- a/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java
@@ -43,6 +43,8 @@ import javax.naming.ConfigurationException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLEngine;
+import net.sf.ehcache.transaction.local.TransactionListener;
+
import org.apache.cloudstack.framework.config.ConfigDepot;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
@@ -85,6 +87,7 @@ import com.cloud.serializer.GsonHelper;
import com.cloud.utils.DateUtil;
import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.QueryBuilder;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -591,7 +594,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust
@Override
protected void doTask(final Task task) throws Exception {
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
if (task.getType() != Task.Type.DATA) {
super.doTask(task);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
index 8bf419f..51310da 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -36,7 +36,6 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -165,6 +164,10 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.db.EntityManager;
import com.cloud.utils.db.GlobalLock;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.exception.ExecutionException;
import com.cloud.utils.fsm.NoTransitionException;
@@ -311,12 +314,12 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
@DB
- public void allocate(String vmInstanceName, VirtualMachineTemplate template, ServiceOffering serviceOffering, Pair<? extends DiskOffering, Long> rootDiskOffering,
- LinkedHashMap<? extends DiskOffering, Long> dataDiskOfferings, LinkedHashMap<? extends Network, ? extends NicProfile> auxiliaryNetworks, DeploymentPlan plan,
+ public void allocate(String vmInstanceName, final VirtualMachineTemplate template, ServiceOffering serviceOffering, final Pair<? extends DiskOffering, Long> rootDiskOffering,
+ LinkedHashMap<? extends DiskOffering, Long> dataDiskOfferings, final LinkedHashMap<? extends Network, ? extends NicProfile> auxiliaryNetworks, DeploymentPlan plan,
HypervisorType hyperType) throws InsufficientCapacityException {
VMInstanceVO vm = _vmDao.findVMByInstanceName(vmInstanceName);
- Account owner = _entityMgr.findById(Account.class, vm.getAccountId());
+ final Account owner = _entityMgr.findById(Account.class, vm.getAccountId());
if (s_logger.isDebugEnabled()) {
s_logger.debug("Allocating entries for VM: " + vm);
@@ -327,46 +330,48 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
vm.setPodId(plan.getPodId());
}
assert (plan.getClusterId() == null && plan.getPoolId() == null) : "We currently don't support cluster and pool preset yet";
- vm = _vmDao.persist(vm);
-
- VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, serviceOffering, null, null);
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Allocating nics for " + vm);
- }
-
- try {
- _networkMgr.allocate(vmProfile, auxiliaryNetworks);
- } catch (ConcurrentOperationException e) {
- throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e);
- }
+ final VMInstanceVO vmFinal = _vmDao.persist(vm);
+ final LinkedHashMap<? extends DiskOffering, Long> dataDiskOfferingsFinal = dataDiskOfferings == null ?
+ new LinkedHashMap<DiskOffering, Long>() : dataDiskOfferings;
- if (dataDiskOfferings == null) {
- dataDiskOfferings = new LinkedHashMap<DiskOffering, Long>(0);
- }
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Allocating disks for " + vm);
- }
+ final VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmFinal, template, serviceOffering, null, null);
- if (template.getFormat() == ImageFormat.ISO) {
- volumeMgr.allocateRawVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vm, template, owner);
- } else if (template.getFormat() == ImageFormat.BAREMETAL) {
- // Do nothing
- } else {
- volumeMgr.allocateTemplatedVolume(Type.ROOT, "ROOT-" + vm.getId(), rootDiskOffering.first(), template, vm, owner);
- }
-
- for (Map.Entry<? extends DiskOffering, Long> offering : dataDiskOfferings.entrySet()) {
- volumeMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vm.getId(), offering.getKey(), offering.getValue(), vm, template, owner);
- }
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Allocating nics for " + vmFinal);
+ }
+
+ try {
+ _networkMgr.allocate(vmProfile, auxiliaryNetworks);
+ } catch (ConcurrentOperationException e) {
+ throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e);
+ }
+
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Allocating disks for " + vmFinal);
+ }
+
+ if (template.getFormat() == ImageFormat.ISO) {
+ volumeMgr.allocateRawVolume(Type.ROOT, "ROOT-" + vmFinal.getId(), rootDiskOffering.first(), rootDiskOffering.second(), vmFinal, template, owner);
+ } else if (template.getFormat() == ImageFormat.BAREMETAL) {
+ // Do nothing
+ } else {
+ volumeMgr.allocateTemplatedVolume(Type.ROOT, "ROOT-" + vmFinal.getId(), rootDiskOffering.first(), template, vmFinal, owner);
+ }
+
+ for (Map.Entry<? extends DiskOffering, Long> offering : dataDiskOfferingsFinal.entrySet()) {
+ volumeMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vmFinal.getId(), offering.getKey(), offering.getValue(), vmFinal, template, owner);
+ }
+
+ return null;
+ }
+ }, InsufficientCapacityException.class);
- txn.commit();
if (s_logger.isDebugEnabled()) {
- s_logger.debug("Allocation completed for VM: " + vm);
+ s_logger.debug("Allocation completed for VM: " + vmFinal);
}
}
@@ -551,37 +556,41 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
@DB
- protected Ternary<VMInstanceVO, ReservationContext, ItWorkVO> changeToStartState(VirtualMachineGuru vmGuru, VMInstanceVO vm, User caller, Account account)
+ protected Ternary<VMInstanceVO, ReservationContext, ItWorkVO> changeToStartState(VirtualMachineGuru vmGuru, final VMInstanceVO vm, final User caller, final Account account)
throws ConcurrentOperationException {
long vmId = vm.getId();
ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Starting, vm.getType(), vm.getId());
int retry = VmOpLockStateRetry.value();
while (retry-- != 0) {
- Transaction txn = Transaction.currentTxn();
- Ternary<VMInstanceVO, ReservationContext, ItWorkVO> result = null;
- txn.start();
try {
- Journal journal = new Journal.LogJournal("Creating " + vm, s_logger);
- work = _workDao.persist(work);
- ReservationContextImpl context = new ReservationContextImpl(work.getId(), journal, caller, account);
+ final ItWorkVO workFinal = work;
+ Ternary<VMInstanceVO, ReservationContext, ItWorkVO> result =
+ Transaction.executeWithException(new TransactionCallbackWithException<Ternary<VMInstanceVO, ReservationContext, ItWorkVO>>() {
+ @Override
+ public Ternary<VMInstanceVO, ReservationContext, ItWorkVO> doInTransaction(TransactionStatus status) throws NoTransitionException {
+ Journal journal = new Journal.LogJournal("Creating " + vm, s_logger);
+ ItWorkVO work = _workDao.persist(workFinal);
+ ReservationContextImpl context = new ReservationContextImpl(work.getId(), journal, caller, account);
+
+ if (stateTransitTo(vm, Event.StartRequested, null, work.getId())) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Successfully transitioned to start state for " + vm + " reservation id = " + work.getId());
+ }
+ return new Ternary<VMInstanceVO, ReservationContext, ItWorkVO>(vm, context, work);
+ }
- if (stateTransitTo(vm, Event.StartRequested, null, work.getId())) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Successfully transitioned to start state for " + vm + " reservation id = " + work.getId());
+ return new Ternary<VMInstanceVO, ReservationContext, ItWorkVO>(null, null, work);
}
- result = new Ternary<VMInstanceVO, ReservationContext, ItWorkVO>(vm, context, work);
- txn.commit();
+ }, NoTransitionException.class);
+
+ work = result.third();
+ if (result.first() != null)
return result;
- }
} catch (NoTransitionException e) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Unable to transition into Starting state due to " + e.getMessage());
}
- } finally {
- if (result == null) {
- txn.rollback();
- }
}
VMInstanceVO instance = _vmDao.findById(vmId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java
index 2ace8a0..4338548 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Component;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component(value="EngineDcDetailsDao")
@Local(value=DcDetailsDao.class)
@@ -83,7 +83,7 @@ public class DcDetailsDaoImpl extends GenericDaoBase<DcDetailVO, Long> implement
@Override
public void persist(long dcId, Map<String, String> details) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
SearchCriteria<DcDetailVO> sc = DcSearch.create();
sc.setParameters("dcId", dcId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java
index e7eea6c..4251baf 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java
@@ -45,7 +45,7 @@ import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.utils.exception.CloudRuntimeException;
@@ -162,7 +162,7 @@ public class EngineClusterDaoImpl extends GenericDaoBase<EngineClusterVO, Long>
@Override
public Map<Long, List<Long>> getPodClusterIdMap(List<Long> clusterIds){
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
Map<Long, List<Long>> result = new HashMap<Long, List<Long>>();
@@ -243,7 +243,7 @@ public class EngineClusterDaoImpl extends GenericDaoBase<EngineClusterVO, Long>
@Override
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
EngineClusterVO cluster = createForUpdate();
cluster.setName(null);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java
index 5d8ef8d..de71053 100644
--- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java
@@ -40,7 +40,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.SequenceFetcher;
-import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.db.UpdateBuilder;
import com.cloud.utils.net.NetUtils;
@@ -216,7 +216,7 @@ public class EngineDataCenterDaoImpl extends GenericDaoBase<EngineDataCenterVO,
@Override @DB
public boolean update(Long zoneId, EngineDataCenterVO zone) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
boolean persisted = super.update(zoneId, zone);
if (!persisted) {
@@ -281,7 +281,7 @@ public class EngineDataCenterDaoImpl extends GenericDaoBase<EngineDataCenterVO,
@Override
public boolean remove(Long id) {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
txn.start();
EngineDataCenterVO zone = createForUpdate();
zone.setName(null);
[03/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
index 079f90c..8bdb8ee 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -139,6 +139,8 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.EntityManager;
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.fsm.NoTransitionException;
import com.cloud.utils.fsm.StateMachine2;
@@ -403,34 +405,34 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
}
@DB
- protected VolumeVO persistVolume(Account owner, Long zoneId, String volumeName, String url, String format) {
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- VolumeVO volume = new VolumeVO(volumeName, zoneId, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
- volume.setPoolId(null);
- volume.setDataCenterId(zoneId);
- volume.setPodId(null);
- volume.setAccountId(owner.getAccountId());
- volume.setDomainId(owner.getDomainId());
- long diskOfferingId = _diskOfferingDao.findByUniqueName("Cloud.com-Custom").getId();
- volume.setDiskOfferingId(diskOfferingId);
- // volume.setSize(size);
- volume.setInstanceId(null);
- volume.setUpdated(new Date());
- volume.setDomainId((owner == null) ? Domain.ROOT_DOMAIN : owner.getDomainId());
- volume.setFormat(ImageFormat.valueOf(format));
- volume = _volsDao.persist(volume);
- CallContext.current().setEventDetails("Volume Id: " + volume.getId());
-
- // Increment resource count during allocation; if actual creation fails,
- // decrement it
- _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
- _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.secondary_storage, UriUtils.getRemoteSize(url));
-
- txn.commit();
- return volume;
+ protected VolumeVO persistVolume(final Account owner, final Long zoneId, final String volumeName, final String url, final String format) {
+ return Transaction.execute(new TransactionCallback<VolumeVO>() {
+ @Override
+ public VolumeVO doInTransaction(TransactionStatus status) {
+ VolumeVO volume = new VolumeVO(volumeName, zoneId, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
+ volume.setPoolId(null);
+ volume.setDataCenterId(zoneId);
+ volume.setPodId(null);
+ volume.setAccountId(owner.getAccountId());
+ volume.setDomainId(owner.getDomainId());
+ long diskOfferingId = _diskOfferingDao.findByUniqueName("Cloud.com-Custom").getId();
+ volume.setDiskOfferingId(diskOfferingId);
+ // volume.setSize(size);
+ volume.setInstanceId(null);
+ volume.setUpdated(new Date());
+ volume.setDomainId((owner == null) ? Domain.ROOT_DOMAIN : owner.getDomainId());
+ volume.setFormat(ImageFormat.valueOf(format));
+ volume = _volsDao.persist(volume);
+ CallContext.current().setEventDetails("Volume Id: " + volume.getId());
+
+ // Increment resource count during allocation; if actual creation fails,
+ // decrement it
+ _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
+ _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.secondary_storage, UriUtils.getRemoteSize(url));
+
+ return volume;
+ }
+ });
}
/*
@@ -599,49 +601,57 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
userSpecifiedName = getRandomVolumeName();
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
- volume.setPoolId(null);
- volume.setDataCenterId(zoneId);
- volume.setPodId(null);
- volume.setAccountId(ownerId);
- volume.setDomainId(((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId()));
- volume.setDiskOfferingId(diskOfferingId);
- volume.setSize(size);
- volume.setMinIops(minIops);
- volume.setMaxIops(maxIops);
- volume.setInstanceId(null);
- volume.setUpdated(new Date());
- volume.setDomainId((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId());
- volume.setDisplayVolume(displayVolumeEnabled);
- if (parentVolume != null) {
- volume.setTemplateId(parentVolume.getTemplateId());
- volume.setFormat(parentVolume.getFormat());
- } else {
- volume.setTemplateId(null);
- }
-
- volume = _volsDao.persist(volume);
- if (cmd.getSnapshotId() == null) {
- // for volume created from snapshot, create usage event after volume creation
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), diskOfferingId,
- null, size, Volume.class.getName(), volume.getUuid());
- }
-
- CallContext.current().setEventDetails("Volume Id: " + volume.getId());
-
- // Increment resource count during allocation; if actual creation fails,
- // decrement it
- _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
- _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, new Long(volume.getSize()));
-
- txn.commit();
+ VolumeVO volume = commitVolume(cmd, caller, ownerId, displayVolumeEnabled, zoneId, diskOfferingId, size,
+ minIops, maxIops, parentVolume, userSpecifiedName);
return volume;
}
+ private VolumeVO commitVolume(final CreateVolumeCmd cmd, final Account caller, final long ownerId, final Boolean displayVolumeEnabled,
+ final Long zoneId, final Long diskOfferingId, final Long size, final Long minIops, final Long maxIops, final VolumeVO parentVolume,
+ final String userSpecifiedName) {
+ return Transaction.execute(new TransactionCallback<VolumeVO>() {
+ @Override
+ public VolumeVO doInTransaction(TransactionStatus status) {
+ VolumeVO volume = new VolumeVO(userSpecifiedName, -1, -1, -1, -1, new Long(-1), null, null, 0, Volume.Type.DATADISK);
+ volume.setPoolId(null);
+ volume.setDataCenterId(zoneId);
+ volume.setPodId(null);
+ volume.setAccountId(ownerId);
+ volume.setDomainId(((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId()));
+ volume.setDiskOfferingId(diskOfferingId);
+ volume.setSize(size);
+ volume.setMinIops(minIops);
+ volume.setMaxIops(maxIops);
+ volume.setInstanceId(null);
+ volume.setUpdated(new Date());
+ volume.setDomainId((caller == null) ? Domain.ROOT_DOMAIN : caller.getDomainId());
+ volume.setDisplayVolume(displayVolumeEnabled);
+ if (parentVolume != null) {
+ volume.setTemplateId(parentVolume.getTemplateId());
+ volume.setFormat(parentVolume.getFormat());
+ } else {
+ volume.setTemplateId(null);
+ }
+
+ volume = _volsDao.persist(volume);
+ if (cmd.getSnapshotId() == null) {
+ // for volume created from snapshot, create usage event after volume creation
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), diskOfferingId,
+ null, size, Volume.class.getName(), volume.getUuid());
+ }
+
+ CallContext.current().setEventDetails("Volume Id: " + volume.getId());
+
+ // Increment resource count during allocation; if actual creation fails,
+ // decrement it
+ _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.volume);
+ _resourceLimitMgr.incrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, new Long(volume.getSize()));
+ return volume;
+ }
+ });
+ }
+
public boolean validateVolumeSizeRange(long size) {
if (size < 0 || (size > 0 && size < (1024 * 1024 * 1024))) {
throw new InvalidParameterValueException("Please specify a size of at least 1 Gb.");
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
index 79aba63..9269dce 100644
--- a/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
+++ b/server/src/com/cloud/tags/TaggedResourceManagerImpl.java
@@ -66,6 +66,8 @@ import com.cloud.utils.db.GenericDao;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
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.uuididentity.dao.IdentityDao;
import com.cloud.vm.dao.NicDao;
@@ -254,55 +256,55 @@ public class TaggedResourceManagerImpl extends ManagerBase implements TaggedReso
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_TAGS_CREATE, eventDescription = "creating resource tags")
- public List<ResourceTag> createTags(List<String> resourceIds, TaggedResourceType resourceType,
- Map<String, String> tags, String customer) {
- Account caller = CallContext.current().getCallingAccount();
-
- List<ResourceTag> resourceTags = new ArrayList<ResourceTag>(tags.size());
+ public List<ResourceTag> createTags(final List<String> resourceIds, final TaggedResourceType resourceType,
+ final Map<String, String> tags, final String customer) {
+ final Account caller = CallContext.current().getCallingAccount();
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ final List<ResourceTag> resourceTags = new ArrayList<ResourceTag>(tags.size());
- for (String key : tags.keySet()) {
- for (String resourceId : resourceIds) {
- Long id = getResourceId(resourceId, resourceType);
- String resourceUuid = getUuid(resourceId, resourceType);
-
- //check if object exists
- if (_daoMap.get(resourceType).findById(id) == null) {
- throw new InvalidParameterValueException("Unable to find resource by id " + resourceId +
- " and type " + resourceType);
- }
-
- Pair<Long, Long> accountDomainPair = getAccountDomain(id, resourceType);
- Long domainId = accountDomainPair.second();
- Long accountId = accountDomainPair.first();
- if (accountId != null) {
- _accountMgr.checkAccess(caller, null, false, _accountMgr.getAccount(accountId));
- } else if (domainId != null && caller.getType() != Account.ACCOUNT_TYPE_NORMAL) {
- //check permissions;
- _accountMgr.checkAccess(caller, _domainMgr.getDomain(domainId));
- } else {
- throw new PermissionDeniedException("Account " + caller + " doesn't have permissions to create tags" +
- " for resource " + key);
- }
-
- String value = tags.get(key);
-
- if (value == null || value.isEmpty()) {
- throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty");
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (String key : tags.keySet()) {
+ for (String resourceId : resourceIds) {
+ Long id = getResourceId(resourceId, resourceType);
+ String resourceUuid = getUuid(resourceId, resourceType);
+
+ //check if object exists
+ if (_daoMap.get(resourceType).findById(id) == null) {
+ throw new InvalidParameterValueException("Unable to find resource by id " + resourceId +
+ " and type " + resourceType);
+ }
+
+ Pair<Long, Long> accountDomainPair = getAccountDomain(id, resourceType);
+ Long domainId = accountDomainPair.second();
+ Long accountId = accountDomainPair.first();
+ if (accountId != null) {
+ _accountMgr.checkAccess(caller, null, false, _accountMgr.getAccount(accountId));
+ } else if (domainId != null && caller.getType() != Account.ACCOUNT_TYPE_NORMAL) {
+ //check permissions;
+ _accountMgr.checkAccess(caller, _domainMgr.getDomain(domainId));
+ } else {
+ throw new PermissionDeniedException("Account " + caller + " doesn't have permissions to create tags" +
+ " for resource " + key);
+ }
+
+ String value = tags.get(key);
+
+ if (value == null || value.isEmpty()) {
+ throw new InvalidParameterValueException("Value for the key " + key + " is either null or empty");
+ }
+
+ ResourceTagVO resourceTag = new ResourceTagVO(key, value, accountDomainPair.first(),
+ accountDomainPair.second(),
+ id, resourceType, customer, resourceUuid);
+ resourceTag = _resourceTagDao.persist(resourceTag);
+ resourceTags.add(resourceTag);
+ }
}
-
- ResourceTagVO resourceTag = new ResourceTagVO(key, value, accountDomainPair.first(),
- accountDomainPair.second(),
- id, resourceType, customer, resourceUuid);
- resourceTag = _resourceTagDao.persist(resourceTag);
- resourceTags.add(resourceTag);
}
- }
-
- txn.commit();
-
+ });
+
return resourceTags;
}
@@ -354,7 +356,7 @@ public class TaggedResourceManagerImpl extends ManagerBase implements TaggedReso
sc.setParameters("resourceType", resourceType);
List<? extends ResourceTag> resourceTags = _resourceTagDao.search(sc, null);;
- List<ResourceTag> tagsToRemove = new ArrayList<ResourceTag>();
+ final List<ResourceTag> tagsToRemove = new ArrayList<ResourceTag>();
// Finalize which tags should be removed
for (ResourceTag resourceTag : resourceTags) {
@@ -390,13 +392,15 @@ public class TaggedResourceManagerImpl extends ManagerBase implements TaggedReso
}
//Remove the tags
- Transaction txn = Transaction.currentTxn();
- txn.start();
- for (ResourceTag tagToRemove : tagsToRemove) {
- _resourceTagDao.remove(tagToRemove.getId());
- s_logger.debug("Removed the tag " + tagToRemove);
- }
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (ResourceTag tagToRemove : tagsToRemove) {
+ _resourceTagDao.remove(tagToRemove.getId());
+ s_logger.debug("Removed the tag " + tagToRemove);
+ }
+ }
+ });
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/template/TemplateManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index c1ce892..fb1bb27 100755
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -31,7 +31,6 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.acl.SecurityChecker.AccessType;
import org.apache.cloudstack.api.BaseListTemplateOrIsoPermissionsCmd;
import org.apache.cloudstack.api.BaseUpdateTemplateOrIsoCmd;
@@ -177,6 +176,9 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.UserVmManager;
import com.cloud.vm.UserVmVO;
@@ -1163,11 +1165,9 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
@DB
@Override
public boolean updateTemplateOrIsoPermissions(BaseUpdateTemplateOrIsoPermissionsCmd cmd) {
- Transaction txn = Transaction.currentTxn();
-
// Input validation
- Long id = cmd.getId();
- Account caller = CallContext.current().getCallingAccount();
+ final Long id = cmd.getId();
+ final Account caller = CallContext.current().getCallingAccount();
List<String> accountNames = cmd.getAccountNames();
List<Long> projectIds = cmd.getProjectIds();
Boolean isFeatured = cmd.isFeatured();
@@ -1284,28 +1284,31 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
//Derive the domain id from the template owner as updateTemplatePermissions is not cross domain operation
Account owner = _accountMgr.getAccount(ownerId);
- Domain domain = _domainDao.findById(owner.getDomainId());
+ final Domain domain = _domainDao.findById(owner.getDomainId());
if ("add".equalsIgnoreCase(operation)) {
- txn.start();
- for (String accountName : accountNames) {
- Account permittedAccount = _accountDao.findActiveAccount(accountName, domain.getId());
- if (permittedAccount != null) {
- if (permittedAccount.getId() == caller.getId()) {
- continue; // don't grant permission to the template
- // owner, they implicitly have permission
- }
- LaunchPermissionVO existingPermission = _launchPermissionDao.findByTemplateAndAccount(id, permittedAccount.getId());
- if (existingPermission == null) {
- LaunchPermissionVO launchPermission = new LaunchPermissionVO(id, permittedAccount.getId());
- _launchPermissionDao.persist(launchPermission);
+ final List<String> accountNamesFinal = accountNames;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (String accountName : accountNamesFinal) {
+ Account permittedAccount = _accountDao.findActiveAccount(accountName, domain.getId());
+ if (permittedAccount != null) {
+ if (permittedAccount.getId() == caller.getId()) {
+ continue; // don't grant permission to the template
+ // owner, they implicitly have permission
+ }
+ LaunchPermissionVO existingPermission = _launchPermissionDao.findByTemplateAndAccount(id, permittedAccount.getId());
+ if (existingPermission == null) {
+ LaunchPermissionVO launchPermission = new LaunchPermissionVO(id, permittedAccount.getId());
+ _launchPermissionDao.persist(launchPermission);
+ }
+ } else {
+ throw new InvalidParameterValueException("Unable to grant a launch permission to account " + accountName + " in domain id=" + domain.getUuid()
+ + ", account not found. " + "No permissions updated, please verify the account names and retry.");
+ }
}
- } else {
- txn.rollback();
- throw new InvalidParameterValueException("Unable to grant a launch permission to account " + accountName + " in domain id=" + domain.getUuid()
- + ", account not found. " + "No permissions updated, please verify the account names and retry.");
}
- }
- txn.commit();
+ });
} else if ("remove".equalsIgnoreCase(operation)) {
List<Long> accountIds = new ArrayList<Long>();
for (String accountName : accountNames) {
@@ -1335,11 +1338,11 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
if (userId == null) {
userId = User.UID_SYSTEM;
}
- long templateId = command.getEntityId();
+ final long templateId = command.getEntityId();
Long volumeId = command.getVolumeId();
Long snapshotId = command.getSnapshotId();
VMTemplateVO privateTemplate = null;
- Long accountId = null;
+ final Long accountId = null;
SnapshotVO snapshot = null;
VolumeVO volume = null;
@@ -1428,26 +1431,31 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager,
zoneId, accountId, volumeId);
}*/
if (privateTemplate == null) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- // template_store_ref entries should have been removed using our
- // DataObject.processEvent command in case of failure, but clean
- // it up here to avoid
- // some leftovers which will cause removing template from
- // vm_template table fail.
- _tmplStoreDao.deletePrimaryRecordsForTemplate(templateId);
- // Remove the template_zone_ref record
- _tmpltZoneDao.deletePrimaryRecordsForTemplate(templateId);
- // Remove the template record
- _tmpltDao.expunge(templateId);
-
- // decrement resource count
- if (accountId != null) {
- _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.template);
- _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.secondary_storage, new Long(volume != null ? volume.getSize()
- : snapshot.getSize()));
- }
- txn.commit();
+ final VolumeVO volumeFinal = volume;
+ final SnapshotVO snapshotFinal = snapshot;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ // template_store_ref entries should have been removed using our
+ // DataObject.processEvent command in case of failure, but clean
+ // it up here to avoid
+ // some leftovers which will cause removing template from
+ // vm_template table fail.
+ _tmplStoreDao.deletePrimaryRecordsForTemplate(templateId);
+ // Remove the template_zone_ref record
+ _tmpltZoneDao.deletePrimaryRecordsForTemplate(templateId);
+ // Remove the template record
+ _tmpltDao.expunge(templateId);
+
+ // decrement resource count
+ if (accountId != null) {
+ _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.template);
+ _resourceLimitMgr.decrementResourceCount(accountId, ResourceType.secondary_storage, new Long(volumeFinal != null ? volumeFinal.getSize()
+ : snapshotFinal.getSize()));
+ }
+ }
+ });
+
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/test/DatabaseConfig.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/test/DatabaseConfig.java b/server/src/com/cloud/test/DatabaseConfig.java
index 38a1abf..6f76a3a 100755
--- a/server/src/com/cloud/test/DatabaseConfig.java
+++ b/server/src/com/cloud/test/DatabaseConfig.java
@@ -57,6 +57,10 @@ import com.cloud.utils.PropertiesUtil;
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionLegacy;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.net.NfsUtils;
public class DatabaseConfig {
@@ -407,34 +411,34 @@ public class DatabaseConfig {
@DB
protected void doConfig() {
- Transaction txn = Transaction.currentTxn();
try {
-
- File configFile = new File(_configFileName);
+ final File configFile = new File(_configFileName);
SAXParserFactory spfactory = SAXParserFactory.newInstance();
- SAXParser saxParser = spfactory.newSAXParser();
- DbConfigXMLHandler handler = new DbConfigXMLHandler();
+ final SAXParser saxParser = spfactory.newSAXParser();
+ final DbConfigXMLHandler handler = new DbConfigXMLHandler();
handler.setParent(this);
- txn.start();
-
- // Save user configured values for all fields
- saxParser.parse(configFile, handler);
-
- // Save default values for configuration fields
- saveVMTemplate();
- saveRootDomain();
- saveDefaultConfiguations();
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws Exception {
+ // Save user configured values for all fields
+ saxParser.parse(configFile, handler);
+
+ // Save default values for configuration fields
+ saveVMTemplate();
+ saveRootDomain();
+ saveDefaultConfiguations();
+
+ return null;
+ }
+ }, Exception.class);
- txn.commit();
// Check pod CIDRs against each other, and against the guest ip network/netmask
pzc.checkAllPodCidrSubnets();
-
} catch (Exception ex) {
System.out.print("ERROR IS"+ex);
s_logger.error("error", ex);
- txn.rollback();
}
}
@@ -486,7 +490,7 @@ public class DatabaseConfig {
String insertSql1 = "INSERT INTO `host` (`id`, `name`, `status` , `type` , `private_ip_address`, `private_netmask` ,`private_mac_address` , `storage_ip_address` ,`storage_netmask`, `storage_mac_address`, `data_center_id`, `version`, `dom0_memory`, `last_ping`, `resource`, `guid`, `hypervisor_type`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
String insertSqlHostDetails = "INSERT INTO `host_details` (`id`, `host_id`, `name`, `value`) VALUES(?,?,?,?)";
String insertSql2 = "INSERT INTO `op_host` (`id`, `sequence`) VALUES(?, ?)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
stmt.setLong(1, 0);
@@ -563,7 +567,7 @@ public class DatabaseConfig {
String hypervisor = _currentObjectParams.get("hypervisorType");
String insertSql1 = "INSERT INTO `cluster` (`id`, `name`, `data_center_id` , `pod_id`, `hypervisor_type` , `cluster_type`, `allocation_state`) VALUES (?,?,?,?,?,?,?)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
stmt.setLong(1, id);
@@ -599,7 +603,7 @@ public class DatabaseConfig {
String insertSql1 = "INSERT INTO `storage_pool` (`id`, `name`, `uuid` , `pool_type` , `port`, `data_center_id` ,`available_bytes` , `capacity_bytes` ,`host_address`, `path`, `created`, `pod_id`,`status` , `cluster_id`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
// String insertSql2 = "INSERT INTO `netfs_storage_pool` VALUES (?,?,?)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
stmt.setLong(1, id);
@@ -704,7 +708,7 @@ public class DatabaseConfig {
"`firewall_service_provided`, `source_nat_service_provided`, `load_balance_service_provided`, `static_nat_service_provided`," +
"`port_forwarding_service_provided`, `user_data_service_provided`, `security_group_service_provided`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
stmt.setLong(1, id);
@@ -742,7 +746,7 @@ public class DatabaseConfig {
String insertSql1 = "INSERT INTO `virtual_router_providers` (`id`, `nsp_id`, `uuid` , `type` , `enabled`) " +
"VALUES (?,?,?,?,?)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql1);
stmt.setLong(1, id);
@@ -1030,7 +1034,7 @@ public class DatabaseConfig {
String insertNWRateSql = "UPDATE `cloud`.`service_offering` SET `nw_rate` = ?";
String insertMCRateSql = "UPDATE `cloud`.`service_offering` SET `mc_rate` = ?";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt;
@@ -1109,7 +1113,7 @@ public class DatabaseConfig {
protected void saveUser() {
// insert system account
String insertSql = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (1, 'system', '1', '1')";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
stmt.executeUpdate();
@@ -1120,7 +1124,7 @@ public class DatabaseConfig {
// insert system user
insertSql = "INSERT INTO `cloud`.`user` (id, username, password, account_id, firstname, lastname, created)" +
" VALUES (1, 'system', RAND(), 1, 'system', 'cloud', now())";
- txn = Transaction.currentTxn();
+ txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
stmt.executeUpdate();
@@ -1159,7 +1163,7 @@ public class DatabaseConfig {
// create an account for the admin user first
insertSql = "INSERT INTO `cloud`.`account` (id, account_name, type, domain_id) VALUES (" + id + ", '" + username + "', '1', '1')";
- txn = Transaction.currentTxn();
+ txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
stmt.executeUpdate();
@@ -1171,7 +1175,7 @@ public class DatabaseConfig {
insertSql = "INSERT INTO `cloud`.`user` (id, username, password, account_id, firstname, lastname, email, created) " +
"VALUES (" + id + ",'" + username + "','" + sb.toString() + "', 2, '" + firstname + "','" + lastname + "','" + email + "',now())";
- txn = Transaction.currentTxn();
+ txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
stmt.executeUpdate();
@@ -1227,7 +1231,7 @@ public class DatabaseConfig {
String selectSql = "SELECT name FROM cloud.configuration WHERE name = '" + name + "'";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
ResultSet result = stmt.executeQuery();
@@ -1270,7 +1274,7 @@ public class DatabaseConfig {
@DB
protected void saveRootDomain() {
String insertSql = "insert into `cloud`.`domain` (id, name, parent, owner, path, level) values (1, 'ROOT', NULL, 2, '/', 0)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertSql);
stmt.executeUpdate();
@@ -1377,7 +1381,7 @@ public class DatabaseConfig {
}
public static String getDatabaseValueString(String selectSql, String name, String errorMsg) {
- Transaction txn = Transaction.open("getDatabaseValueString");
+ TransactionLegacy txn = TransactionLegacy.open("getDatabaseValueString");
PreparedStatement stmt = null;
try {
@@ -1399,7 +1403,7 @@ public class DatabaseConfig {
}
public static long getDatabaseValueLong(String selectSql, String name, String errorMsg) {
- Transaction txn = Transaction.open("getDatabaseValueLong");
+ TransactionLegacy txn = TransactionLegacy.open("getDatabaseValueLong");
PreparedStatement stmt = null;
try {
@@ -1420,7 +1424,7 @@ public class DatabaseConfig {
}
public static void saveSQL(String sql, String errorMsg) {
- Transaction txn = Transaction.open("saveSQL");
+ TransactionLegacy txn = TransactionLegacy.open("saveSQL");
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(sql);
stmt.executeUpdate();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/test/IPRangeConfig.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/test/IPRangeConfig.java b/server/src/com/cloud/test/IPRangeConfig.java
index 4b884f8..23ca1bb 100755
--- a/server/src/com/cloud/test/IPRangeConfig.java
+++ b/server/src/com/cloud/test/IPRangeConfig.java
@@ -29,6 +29,7 @@ import java.util.Vector;
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.net.NetUtils;
@@ -303,7 +304,7 @@ public class IPRangeConfig {
endIPLong = NetUtils.ip2Long(endIP);
}
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
Vector<String> problemIPs = null;
if (type.equals("public")) {
problemIPs = deletePublicIPRange(txn, startIPLong, endIPLong, vlanDbId);
@@ -314,7 +315,7 @@ public class IPRangeConfig {
return problemIPs;
}
- private Vector<String> deletePublicIPRange(Transaction txn, long startIP, long endIP, long vlanDbId) {
+ private Vector<String> deletePublicIPRange(TransactionLegacy txn, long startIP, long endIP, long vlanDbId) {
String deleteSql = "DELETE FROM `cloud`.`user_ip_address` WHERE public_ip_address = ? AND vlan_id = ?";
String isPublicIPAllocatedSelectSql = "SELECT * FROM `cloud`.`user_ip_address` WHERE public_ip_address = ? AND vlan_id = ?";
@@ -349,7 +350,7 @@ public class IPRangeConfig {
return problemIPs;
}
- private Vector<String> deletePrivateIPRange(Transaction txn, long startIP, long endIP, long podId, long zoneId) {
+ private Vector<String> deletePrivateIPRange(TransactionLegacy txn, long startIP, long endIP, long podId, long zoneId) {
String deleteSql = "DELETE FROM `cloud`.`op_dc_ip_address_alloc` WHERE ip_address = ? AND pod_id = ? AND data_center_id = ?";
String isPrivateIPAllocatedSelectSql = "SELECT * FROM `cloud`.`op_dc_ip_address_alloc` WHERE ip_address = ? AND data_center_id = ? AND pod_id = ?";
@@ -429,7 +430,7 @@ public class IPRangeConfig {
endIPLong = NetUtils.ip2Long(endIP);
}
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
List<String> problemIPs = null;
if (type.equals("public")) {
@@ -447,7 +448,7 @@ public class IPRangeConfig {
return problemIPs;
}
- public Vector<String> savePublicIPRange(Transaction txn, long startIP, long endIP, long zoneId, long vlanDbId, Long sourceNetworkId, long physicalNetworkId) {
+ public Vector<String> savePublicIPRange(TransactionLegacy txn, long startIP, long endIP, long zoneId, long vlanDbId, Long sourceNetworkId, long physicalNetworkId) {
String insertSql = "INSERT INTO `cloud`.`user_ip_address` (public_ip_address, data_center_id, vlan_db_id, mac_address, source_network_id, physical_network_id, uuid) VALUES (?, ?, ?, (select mac_address from `cloud`.`data_center` where id=?), ?, ?, ?)";
String updateSql = "UPDATE `cloud`.`data_center` set mac_address = mac_address+1 where id=?";
Vector<String> problemIPs = new Vector<String>();
@@ -485,7 +486,7 @@ public class IPRangeConfig {
return problemIPs;
}
- public List<String> savePrivateIPRange(Transaction txn, long startIP, long endIP, long podId, long zoneId) {
+ public List<String> savePrivateIPRange(TransactionLegacy txn, long startIP, long endIP, long podId, long zoneId) {
String insertSql = "INSERT INTO `cloud`.`op_dc_ip_address_alloc` (ip_address, data_center_id, pod_id, mac_address) VALUES (?, ?, ?, (select mac_address from `cloud`.`data_center` where id=?))";
String updateSql = "UPDATE `cloud`.`data_center` set mac_address = mac_address+1 where id=?";
Vector<String> problemIPs = new Vector<String>();
@@ -519,7 +520,7 @@ public class IPRangeConfig {
return problemIPs;
}
- private Vector<String> saveLinkLocalPrivateIPRange(Transaction txn, long startIP, long endIP, long podId, long zoneId) {
+ private Vector<String> saveLinkLocalPrivateIPRange(TransactionLegacy txn, long startIP, long endIP, long podId, long zoneId) {
String insertSql = "INSERT INTO `cloud`.`op_dc_link_local_ip_address_alloc` (ip_address, data_center_id, pod_id) VALUES (?, ?, ?)";
Vector<String> problemIPs = new Vector<String>();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/test/PodZoneConfig.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/test/PodZoneConfig.java b/server/src/com/cloud/test/PodZoneConfig.java
index 59f8b6c..628c746 100644
--- a/server/src/com/cloud/test/PodZoneConfig.java
+++ b/server/src/com/cloud/test/PodZoneConfig.java
@@ -28,6 +28,7 @@ import com.cloud.network.Networks.TrafficType;
import com.cloud.utils.component.ComponentContext;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
import com.cloud.utils.net.NetUtils;
public class PodZoneConfig {
@@ -148,7 +149,7 @@ public class PodZoneConfig {
HashMap<Long, Vector<Object>> currentPodCidrSubnets = new HashMap<Long, Vector<Object>>();
String selectSql = "SELECT id, cidr_address, cidr_size FROM host_pod_ref WHERE data_center_id=" + dcId;
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
ResultSet rs = stmt.executeQuery();
@@ -363,7 +364,7 @@ public class PodZoneConfig {
String insertVnet = "INSERT INTO `cloud`.`op_dc_vnet_alloc` (vnet, data_center_id, physical_network_id) VALUES ( ?, ?, ?)";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(insertVnet);
for (int i = begin; i <= end; i++) {
@@ -483,7 +484,7 @@ public class PodZoneConfig {
Vector<Long> allZoneIDs = new Vector<Long>();
String selectSql = "SELECT id FROM data_center";
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
try {
PreparedStatement stmt = txn.prepareAutoCloseStatement(selectSql);
ResultSet rs = stmt.executeQuery();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/usage/UsageServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/usage/UsageServiceImpl.java b/server/src/com/cloud/usage/UsageServiceImpl.java
index 2ffb01d..e54a5b2 100755
--- a/server/src/com/cloud/usage/UsageServiceImpl.java
+++ b/server/src/com/cloud/usage/UsageServiceImpl.java
@@ -34,7 +34,6 @@ import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.usage.UsageService;
import org.apache.cloudstack.usage.UsageTypes;
-
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@@ -54,6 +53,7 @@ import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.db.Filter;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value = { UsageService.class })
@@ -86,7 +86,7 @@ public class UsageServiceImpl extends ManagerBase implements UsageService, Manag
@Override
public boolean generateUsageRecords(GenerateUsageRecordsCmd cmd) {
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
try {
UsageJobVO immediateJob = _usageJobDao.getNextImmediateJob();
if (immediateJob == null) {
@@ -104,7 +104,7 @@ public class UsageServiceImpl extends ManagerBase implements UsageService, Manag
txn.close();
// switch back to VMOPS_DB
- Transaction swap = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy swap = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
swap.close();
}
return true;
@@ -199,14 +199,14 @@ public class UsageServiceImpl extends ManagerBase implements UsageService, Manag
}
List<UsageVO> usageRecords = null;
- Transaction txn = Transaction.open(Transaction.USAGE_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB);
try {
usageRecords = _usageDao.searchAllRecords(sc, usageFilter);
} finally {
txn.close();
// switch back to VMOPS_DB
- Transaction swap = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy swap = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
swap.close();
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/user/AccountManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/AccountManagerImpl.java b/server/src/com/cloud/user/AccountManagerImpl.java
index ae93548..c8007af 100755
--- a/server/src/com/cloud/user/AccountManagerImpl.java
+++ b/server/src/com/cloud/user/AccountManagerImpl.java
@@ -136,6 +136,9 @@ import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.InstanceGroupVO;
@@ -480,22 +483,23 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
}
@DB
- public void updateLoginAttempts(Long id, int attempts, boolean toDisable) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
+ public void updateLoginAttempts(final Long id, final int attempts, final boolean toDisable) {
try {
- UserAccountVO user = null;
- user = _userAccountDao.lockRow(id, true);
- user.setLoginAttempts(attempts);
- if(toDisable) {
- user.setState(State.disabled.toString());
- }
- _userAccountDao.update(id, user);
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ UserAccountVO user = null;
+ user = _userAccountDao.lockRow(id, true);
+ user.setLoginAttempts(attempts);
+ if(toDisable) {
+ user.setState(State.disabled.toString());
+ }
+ _userAccountDao.update(id, user);
+ }
+ });
} catch (Exception e) {
s_logger.error("Failed to update login attempts for user with id " + id );
}
- txn.close();
}
private boolean doSetUserStatus(long userId, State state) {
@@ -859,8 +863,8 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
@ActionEvent(eventType = EventTypes.EVENT_ACCOUNT_CREATE, eventDescription = "creating Account"),
@ActionEvent(eventType = EventTypes.EVENT_USER_CREATE, eventDescription = "creating User")
})
- public UserAccount createUserAccount(String userName, String password, String firstName, String lastName, String email, String timezone, String accountName, short accountType,
- Long domainId, String networkDomain, Map<String, String> details, String accountUUID, String userUUID) {
+ public UserAccount createUserAccount(final String userName, final String password, final String firstName, final String lastName, final String email, final String timezone, String accountName, final short accountType,
+ Long domainId, final String networkDomain, final Map<String, String> details, String accountUUID, final String userUUID) {
if (accountName == null) {
accountName = userName;
@@ -902,31 +906,40 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
}
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- // create account
- if(accountUUID == null){
- accountUUID = UUID.randomUUID().toString();
- }
- AccountVO account = createAccount(accountName, accountType, domainId, networkDomain, details, accountUUID);
- long accountId = account.getId();
-
- // create the first user for the account
- UserVO user = createUser(accountId, userName, password, firstName, lastName, email, timezone, userUUID);
+ final String accountNameFinal = accountName;
+ final Long domainIdFinal = domainId;
+ final String accountUUIDFinal = accountUUID;
+ Pair<Long, Account> pair = Transaction.execute(new TransactionCallback<Pair<Long, Account>>() {
+ @Override
+ public Pair<Long, Account> doInTransaction(TransactionStatus status) {
+ // create account
+ String accountUUID = accountUUIDFinal;
+ if(accountUUID == null){
+ accountUUID = UUID.randomUUID().toString();
+ }
+ AccountVO account = createAccount(accountNameFinal, accountType, domainIdFinal, networkDomain, details, accountUUID);
+ long accountId = account.getId();
+
+ // create the first user for the account
+ UserVO user = createUser(accountId, userName, password, firstName, lastName, email, timezone, userUUID);
+
+ if (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
+ // set registration token
+ byte[] bytes = (domainIdFinal + accountNameFinal + userName + System.currentTimeMillis()).getBytes();
+ String registrationToken = UUID.nameUUIDFromBytes(bytes).toString();
+ user.setRegistrationToken(registrationToken);
+ }
+ return new Pair<Long, Account>(user.getId(), account);
+ }
+ });
- if (accountType == Account.ACCOUNT_TYPE_RESOURCE_DOMAIN_ADMIN) {
- // set registration token
- byte[] bytes = (domainId + accountName + userName + System.currentTimeMillis()).getBytes();
- String registrationToken = UUID.nameUUIDFromBytes(bytes).toString();
- user.setRegistrationToken(registrationToken);
- }
- txn.commit();
+ long userId = pair.first();
+ Account account = pair.second();
CallContext.current().putContextParameter(Account.class, account.getUuid());
//check success
- return _userAccountDao.findById(user.getId());
+ return _userAccountDao.findById(userId);
}
@Override
@@ -1132,12 +1145,12 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
@Override
@DB
@ActionEvent(eventType = EventTypes.EVENT_USER_ENABLE, eventDescription = "enabling User")
- public UserAccount enableUser(long userId) {
+ public UserAccount enableUser(final long userId) {
Account caller = CallContext.current().getCallingAccount();
// Check if user exists in the system
- User user = _userDao.findById(userId);
+ final User user = _userDao.findById(userId);
if (user == null || user.getRemoved() != null) {
throw new InvalidParameterValueException("Unable to find active user by id " + userId);
}
@@ -1155,15 +1168,18 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
checkAccess(caller, null, true, account);
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- boolean success = doSetUserStatus(userId, State.enabled);
-
- // make sure the account is enabled too
- success = success && enableAccount(user.getAccountId());
+ boolean success = Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ boolean success = doSetUserStatus(userId, State.enabled);
+
+ // make sure the account is enabled too
+ success = success && enableAccount(user.getAccountId());
+
+ return success;
+ }
+ });
- txn.commit();
if (success) {
// whenever the user is successfully enabled, reset the login attempts to zero
@@ -1390,7 +1406,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
String accountName = cmd.getAccountName();
String newAccountName = cmd.getNewName();
String networkDomain = cmd.getNetworkDomain();
- Map<String, String> details = cmd.getDetails();
+ final Map<String, String> details = cmd.getDetails();
boolean success = false;
Account account = null;
@@ -1434,7 +1450,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
}
}
- AccountVO acctForUpdate = _accountDao.findById(account.getId());
+ final AccountVO acctForUpdate = _accountDao.findById(account.getId());
acctForUpdate.setAccountName(newAccountName);
if (networkDomain != null) {
@@ -1445,16 +1461,19 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
}
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- success = _accountDao.update(account.getId(), acctForUpdate);
+ final Account accountFinal = account;
+ success = Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ boolean success = _accountDao.update(accountFinal.getId(), acctForUpdate);
- if (details != null && success) {
- _accountDetailsDao.update(account.getId(), details);
- }
+ if (details != null && success) {
+ _accountDetailsDao.update(accountFinal.getId(), details);
+ }
- txn.commit();
+ return success;
+ }
+ });
if (success) {
CallContext.current().putContextParameter(Account.class, account.getUuid());
@@ -1706,7 +1725,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
@Override
@DB
- public AccountVO createAccount(String accountName, short accountType, Long domainId, String networkDomain, Map<String, String> details, String uuid) {
+ public AccountVO createAccount(final String accountName, final short accountType, final Long domainId, final String networkDomain, final Map<String, String> details, final String uuid) {
// Validate domain
Domain domain = _domainMgr.getDomain(domainId);
if (domain == null) {
@@ -1747,29 +1766,30 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
}
// Create the account
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- AccountVO account = _accountDao.persist(new AccountVO(accountName, domainId, networkDomain, accountType, uuid));
-
- if (account == null) {
- throw new CloudRuntimeException("Failed to create account name " + accountName + " in domain id=" + domainId);
- }
-
- Long accountId = account.getId();
-
- if (details != null) {
- _accountDetailsDao.persist(accountId, details);
- }
-
- // Create resource count records for the account
- _resourceCountDao.createResourceCounts(accountId, ResourceLimit.ResourceOwnerType.Account);
-
- // Create default security group
- _networkGroupMgr.createDefaultSecurityGroup(accountId);
- txn.commit();
+ return Transaction.execute(new TransactionCallback<AccountVO>() {
+ @Override
+ public AccountVO doInTransaction(TransactionStatus status) {
+ AccountVO account = _accountDao.persist(new AccountVO(accountName, domainId, networkDomain, accountType, uuid));
+
+ if (account == null) {
+ throw new CloudRuntimeException("Failed to create account name " + accountName + " in domain id=" + domainId);
+ }
+
+ Long accountId = account.getId();
+
+ if (details != null) {
+ _accountDetailsDao.persist(accountId, details);
+ }
+
+ // Create resource count records for the account
+ _resourceCountDao.createResourceCounts(accountId, ResourceLimit.ResourceOwnerType.Account);
+
+ // Create default security group
+ _networkGroupMgr.createDefaultSecurityGroup(accountId);
- return account;
+ return account;
+ }
+ });
}
protected UserVO createUser(long accountId, String userName, String password, String firstName, String lastName, String email, String timezone, String userUUID) {
@@ -2006,7 +2026,7 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
@Override @DB
@ActionEvent(eventType = EventTypes.EVENT_REGISTER_FOR_SECRET_API_KEY, eventDescription = "register for the developer API keys")
public String[] createApiKeyAndSecretKey(RegisterCmd cmd) {
- Long userId = cmd.getId();
+ final Long userId = cmd.getId();
User user = getUserIncludingRemoved(userId);
if (user == null) {
@@ -2019,12 +2039,14 @@ public class AccountManagerImpl extends ManagerBase implements AccountManager, M
}
// generate both an api key and a secret key, update the user table with the keys, return the keys to the user
- String[] keys = new String[2];
- Transaction txn = Transaction.currentTxn();
- txn.start();
- keys[0] = createUserApiKey(userId);
- keys[1] = createUserSecretKey(userId);
- txn.commit();
+ final String[] keys = new String[2];
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ keys[0] = createUserApiKey(userId);
+ keys[1] = createUserSecretKey(userId);
+ }
+ });
return keys;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/user/DomainManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/user/DomainManagerImpl.java b/server/src/com/cloud/user/DomainManagerImpl.java
index b885c48..2942148 100644
--- a/server/src/com/cloud/user/DomainManagerImpl.java
+++ b/server/src/com/cloud/user/DomainManagerImpl.java
@@ -26,7 +26,6 @@ import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
-
import org.apache.cloudstack.api.command.admin.domain.ListDomainChildrenCmd;
import org.apache.cloudstack.api.command.admin.domain.ListDomainsCmd;
import org.apache.cloudstack.api.command.admin.domain.UpdateDomainCmd;
@@ -65,6 +64,9 @@ import com.cloud.utils.db.Filter;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.ReservationContext;
@@ -158,7 +160,7 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
@Override
@DB
- public Domain createDomain(String name, Long parentId, Long ownerId, String networkDomain, String domainUUID) {
+ public Domain createDomain(final String name, final Long parentId, final Long ownerId, final String networkDomain, String domainUUID) {
// Verify network domain
if (networkDomain != null) {
if (!NetUtils.verifyDomainName(networkDomain)) {
@@ -181,11 +183,16 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
domainUUID = UUID.randomUUID().toString();
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
- DomainVO domain = _domainDao.create(new DomainVO(name, ownerId, parentId, networkDomain, domainUUID));
- _resourceCountDao.createResourceCounts(domain.getId(), ResourceLimit.ResourceOwnerType.Domain);
- txn.commit();
+ final String domainUUIDFinal = domainUUID;
+ DomainVO domain = Transaction.execute(new TransactionCallback<DomainVO>() {
+ @Override
+ public DomainVO doInTransaction(TransactionStatus status) {
+ DomainVO domain = _domainDao.create(new DomainVO(name, ownerId, parentId, networkDomain, domainUUIDFinal));
+ _resourceCountDao.createResourceCounts(domain.getId(), ResourceLimit.ResourceOwnerType.Domain);
+ return domain;
+ }
+ });
+
CallContext.current().putContextParameter(Domain.class, domain.getUuid());
return domain;
}
@@ -544,12 +551,12 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
@ActionEvent(eventType = EventTypes.EVENT_DOMAIN_UPDATE, eventDescription = "updating Domain")
@DB
public DomainVO updateDomain(UpdateDomainCmd cmd) {
- Long domainId = cmd.getId();
- String domainName = cmd.getDomainName();
- String networkDomain = cmd.getNetworkDomain();
+ final Long domainId = cmd.getId();
+ final String domainName = cmd.getDomainName();
+ final String networkDomain = cmd.getNetworkDomain();
// check if domain exists in the system
- DomainVO domain = _domainDao.findById(domainId);
+ final DomainVO domain = _domainDao.findById(domainId);
if (domain == null) {
InvalidParameterValueException ex = new InvalidParameterValueException("Unable to find domain with specified domain id");
ex.addProxyObject(domainId.toString(), "domainId");
@@ -587,27 +594,28 @@ public class DomainManagerImpl extends ManagerBase implements DomainManager, Dom
}
}
- Transaction txn = Transaction.currentTxn();
-
- txn.start();
-
- if (domainName != null) {
- String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
- updateDomainChildren(domain, updatedDomainPath);
- domain.setName(domainName);
- domain.setPath(updatedDomainPath);
- }
-
- if (networkDomain != null) {
- if (networkDomain.isEmpty()) {
- domain.setNetworkDomain(null);
- } else {
- domain.setNetworkDomain(networkDomain);
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ if (domainName != null) {
+ String updatedDomainPath = getUpdatedDomainPath(domain.getPath(), domainName);
+ updateDomainChildren(domain, updatedDomainPath);
+ domain.setName(domainName);
+ domain.setPath(updatedDomainPath);
+ }
+
+ if (networkDomain != null) {
+ if (networkDomain.isEmpty()) {
+ domain.setNetworkDomain(null);
+ } else {
+ domain.setNetworkDomain(networkDomain);
+ }
+ }
+ _domainDao.update(domainId, domain);
+ CallContext.current().putContextParameter(Domain.class, domain.getUuid());
}
- }
- _domainDao.update(domainId, domain);
- CallContext.current().putContextParameter(Domain.class, domain.getUuid());
- txn.commit();
+ });
+
return _domainDao.findById(domainId);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java b/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
index 18b7d8b..7e14c69 100644
--- a/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
+++ b/server/src/com/cloud/uuididentity/dao/IdentityDaoImpl.java
@@ -33,6 +33,7 @@ import com.cloud.utils.Pair;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionLegacy;
@Component
@Local(value={IdentityDao.class})
@@ -48,7 +49,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
assert(identityString != null);
PreparedStatement pstmt = null;
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
try {
try {
@@ -100,7 +101,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
assert(tableName != null);
PreparedStatement pstmt = null;
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
Long domainId = null;
Long accountId = null;
@@ -146,7 +147,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
assert(identityString != null);
PreparedStatement pstmt = null;
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
try {
pstmt = txn.prepareAutoCloseStatement(
@@ -187,7 +188,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
assert(tableName != null);
List<Long> l = getNullUuidRecords(tableName);
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
try {
txn.start();
@@ -209,7 +210,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
List<Long> l = new ArrayList<Long>();
PreparedStatement pstmt = null;
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
+ TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.CLOUD_DB);
try {
try {
pstmt = txn.prepareAutoCloseStatement(
@@ -231,7 +232,7 @@ public class IdentityDaoImpl extends GenericDaoBase<IdentityVO, Long> implements
@DB
void setInitialUuid(String tableName, long id) throws SQLException {
- Transaction txn = Transaction.currentTxn();
+ TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmtUpdate = null;
pstmtUpdate = txn.prepareAutoCloseStatement(
[08/20] New Transaction API
Posted by da...@apache.org.
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/guru/DirectNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
index 55da113..65bc699 100755
--- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
@@ -22,7 +22,6 @@ import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import com.cloud.dc.DataCenter;
@@ -33,6 +32,7 @@ import com.cloud.deploy.DeployDestination;
import com.cloud.deploy.DeploymentPlan;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientAddressCapacityException;
+import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.InsufficientVirtualNetworkCapcityException;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.network.IpAddressManager;
@@ -56,6 +56,10 @@ import com.cloud.user.Account;
import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
+import com.cloud.utils.exception.ExceptionUtil;
import com.cloud.vm.Nic;
import com.cloud.vm.Nic.ReservationStrategy;
import com.cloud.vm.NicProfile;
@@ -228,22 +232,32 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
}
@DB
- protected void allocateDirectIp(NicProfile nic, Network network, VirtualMachineProfile vm, DataCenter dc, String requestedIp4Addr, String requestedIp6Addr)
+ protected void allocateDirectIp(final NicProfile nic, final Network network, final VirtualMachineProfile vm, final DataCenter dc, final String requestedIp4Addr, final String requestedIp6Addr)
throws InsufficientVirtualNetworkCapcityException,
InsufficientAddressCapacityException {
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _ipAddrMgr.allocateDirectIp(nic, dc, vm, network, requestedIp4Addr, requestedIp6Addr);
- //save the placeholder nic if the vm is the Virtual router
- if (vm.getType() == VirtualMachine.Type.DomainRouter) {
- Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
- if (placeholderNic == null) {
- s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " and ipv6 address " + nic.getIp6Address() + " for the network " + network);
- _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), nic.getIp6Address(), VirtualMachine.Type.DomainRouter);
- }
+
+ try {
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
+ _ipAddrMgr.allocateDirectIp(nic, dc, vm, network, requestedIp4Addr, requestedIp6Addr);
+ //save the placeholder nic if the vm is the Virtual router
+ if (vm.getType() == VirtualMachine.Type.DomainRouter) {
+ Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
+ if (placeholderNic == null) {
+ s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " and ipv6 address " + nic.getIp6Address() + " for the network " + network);
+ _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), nic.getIp6Address(), VirtualMachine.Type.DomainRouter);
+ }
+ }
+
+ return null;
+ }
+ }, InsufficientCapacityException.class);
+ } catch (InsufficientCapacityException e) {
+ ExceptionUtil.rethrow(e, InsufficientVirtualNetworkCapcityException.class);
+ ExceptionUtil.rethrow(e, InsufficientAddressCapacityException.class);
+ throw new IllegalStateException(e);
}
- txn.commit();
}
@Override
@@ -257,37 +271,37 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
}
@Override @DB
- public void deallocate(Network network, NicProfile nic, VirtualMachineProfile vm) {
+ public void deallocate(final Network network, final NicProfile nic, VirtualMachineProfile vm) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Deallocate network: networkId: " + nic.getNetworkId() + ", ip: " + nic.getIp4Address());
}
if (nic.getIp4Address() != null) {
- IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
+ final IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
if (ip != null) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- // if the ip address a part of placeholder, don't release it
- Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
- if (placeholderNic != null && placeholderNic.getIp4Address().equalsIgnoreCase(ip.getAddress().addr())) {
- s_logger.debug("Not releasing direct ip " + ip.getId() +" yet as its ip is saved in the placeholder");
- } else {
- _ipAddrMgr.markIpAsUnavailable(ip.getId());
- _ipAddressDao.unassignIpAddress(ip.getId());
- }
-
- //unassign nic secondary ip address
- s_logger.debug("remove nic " + nic.getId() + " secondary ip ");
- List<String> nicSecIps = null;
- nicSecIps = _nicSecondaryIpDao.getSecondaryIpAddressesForNic(nic.getId());
- for (String secIp: nicSecIps) {
- IPAddressVO pubIp = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), secIp);
- _ipAddrMgr.markIpAsUnavailable(pubIp.getId());
- _ipAddressDao.unassignIpAddress(pubIp.getId());
- }
-
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ // if the ip address a part of placeholder, don't release it
+ Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, null);
+ if (placeholderNic != null && placeholderNic.getIp4Address().equalsIgnoreCase(ip.getAddress().addr())) {
+ s_logger.debug("Not releasing direct ip " + ip.getId() +" yet as its ip is saved in the placeholder");
+ } else {
+ _ipAddrMgr.markIpAsUnavailable(ip.getId());
+ _ipAddressDao.unassignIpAddress(ip.getId());
+ }
+
+ //unassign nic secondary ip address
+ s_logger.debug("remove nic " + nic.getId() + " secondary ip ");
+ List<String> nicSecIps = null;
+ nicSecIps = _nicSecondaryIpDao.getSecondaryIpAddressesForNic(nic.getId());
+ for (String secIp: nicSecIps) {
+ IPAddressVO pubIp = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), secIp);
+ _ipAddrMgr.markIpAsUnavailable(pubIp.getId());
+ _ipAddressDao.unassignIpAddress(pubIp.getId());
+ }
+ }
+ });
}
}
@@ -305,21 +319,23 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
@DB
public boolean trash(Network network, NetworkOffering offering) {
//Have to remove all placeholder nics
- List<NicVO> nics = _nicDao.listPlaceholderNicsByNetworkId(network.getId());
- Transaction txn = Transaction.currentTxn();
- txn.start();
- for (Nic nic : nics) {
- if (nic.getIp4Address() != null) {
- s_logger.debug("Releasing ip " + nic.getIp4Address() + " of placeholder nic " + nic);
- IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
- _ipAddrMgr.markIpAsUnavailable(ip.getId());
- _ipAddressDao.unassignIpAddress(ip.getId());
- s_logger.debug("Removing placeholder nic " + nic);
- _nicDao.remove(nic.getId());
+ final List<NicVO> nics = _nicDao.listPlaceholderNicsByNetworkId(network.getId());
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (Nic nic : nics) {
+ if (nic.getIp4Address() != null) {
+ s_logger.debug("Releasing ip " + nic.getIp4Address() + " of placeholder nic " + nic);
+ IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
+ _ipAddrMgr.markIpAsUnavailable(ip.getId());
+ _ipAddressDao.unassignIpAddress(ip.getId());
+ s_logger.debug("Removing placeholder nic " + nic);
+ _nicDao.remove(nic.getId());
+ }
+ }
}
- }
-
- txn.commit();
+ });
+
return true;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
index 31bc021..691135f 100755
--- a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
@@ -23,7 +23,6 @@ import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import com.cloud.configuration.ZoneConfig;
@@ -53,6 +52,10 @@ import com.cloud.offering.NetworkOffering;
import com.cloud.offerings.dao.NetworkOfferingDao;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.Nic;
import com.cloud.vm.Nic.ReservationStrategy;
@@ -133,18 +136,18 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru {
getNewIp = true;
} else {
// we need to get a new ip address if we try to deploy a vm in a different pod
- IPAddressVO ipVO = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), oldIp);
+ final IPAddressVO ipVO = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), oldIp);
if (ipVO != null) {
PodVlanMapVO mapVO = _podVlanDao.listPodVlanMapsByVlan(ipVO.getVlanId());
if (mapVO.getPodId() != dest.getPod().getId()) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- //release the old ip here
- _ipAddrMgr.markIpAsUnavailable(ipVO.getId());
- _ipAddressDao.unassignIpAddress(ipVO.getId());
-
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ //release the old ip here
+ _ipAddrMgr.markIpAsUnavailable(ipVO.getId());
+ _ipAddressDao.unassignIpAddress(ipVO.getId());
+ }
+ });
nic.setIp4Address(null);
getNewIp = true;
@@ -163,54 +166,57 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru {
}
@DB
- protected void getIp(NicProfile nic, Pod pod, VirtualMachineProfile vm, Network network) throws InsufficientVirtualNetworkCapcityException,
+ protected void getIp(final NicProfile nic, final Pod pod, final VirtualMachineProfile vm, final Network network) throws InsufficientVirtualNetworkCapcityException,
InsufficientAddressCapacityException, ConcurrentOperationException {
- DataCenter dc = _dcDao.findById(pod.getDataCenterId());
+ final DataCenter dc = _dcDao.findById(pod.getDataCenterId());
if (nic.getIp4Address() == null) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- PublicIp ip = null;
- List<PodVlanMapVO> podRefs = _podVlanDao.listPodVlanMapsByPod(pod.getId());
- String podRangeGateway = null;
- if (!podRefs.isEmpty()) {
- podRangeGateway = _vlanDao.findById(podRefs.get(0).getVlanDbId()).getVlanGateway();
- }
- //Get ip address from the placeholder and don't allocate a new one
- if (vm.getType() == VirtualMachine.Type.DomainRouter) {
- Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, pod.getId());
- if (placeholderNic != null) {
- IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), placeholderNic.getIp4Address());
- ip = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
- s_logger.debug("Nic got an ip address " + placeholderNic.getIp4Address() + " stored in placeholder nic for the network " + network + " and gateway " + podRangeGateway);
+ Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+ @Override
+ public Object doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+ PublicIp ip = null;
+ List<PodVlanMapVO> podRefs = _podVlanDao.listPodVlanMapsByPod(pod.getId());
+ String podRangeGateway = null;
+ if (!podRefs.isEmpty()) {
+ podRangeGateway = _vlanDao.findById(podRefs.get(0).getVlanDbId()).getVlanGateway();
+ }
+ //Get ip address from the placeholder and don't allocate a new one
+ if (vm.getType() == VirtualMachine.Type.DomainRouter) {
+ Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, pod.getId());
+ if (placeholderNic != null) {
+ IPAddressVO userIp = _ipAddressDao.findByIpAndSourceNetworkId(network.getId(), placeholderNic.getIp4Address());
+ ip = PublicIp.createFromAddrAndVlan(userIp, _vlanDao.findById(userIp.getVlanId()));
+ s_logger.debug("Nic got an ip address " + placeholderNic.getIp4Address() + " stored in placeholder nic for the network " + network + " and gateway " + podRangeGateway);
+ }
+ }
+
+ if (ip == null) {
+ ip = _ipAddrMgr.assignPublicIpAddress(dc.getId(), pod.getId(), vm.getOwner(), VlanType.DirectAttached, network.getId(), null, false);
+ }
+
+ nic.setIp4Address(ip.getAddress().toString());
+ nic.setFormat(AddressFormat.Ip4);
+ nic.setGateway(ip.getGateway());
+ nic.setNetmask(ip.getNetmask());
+ if (ip.getVlanTag() != null && ip.getVlanTag().equalsIgnoreCase(Vlan.UNTAGGED)) {
+ nic.setIsolationUri(IsolationType.Ec2.toUri(Vlan.UNTAGGED));
+ nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(Vlan.UNTAGGED));
+ nic.setBroadcastType(BroadcastDomainType.Native);
+ }
+ nic.setReservationId(String.valueOf(ip.getVlanTag()));
+ nic.setMacAddress(ip.getMacAddress());
+
+ //save the placeholder nic if the vm is the Virtual router
+ if (vm.getType() == VirtualMachine.Type.DomainRouter) {
+ Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, pod.getId());
+ if (placeholderNic == null) {
+ s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " for the network " + network);
+ _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), null, VirtualMachine.Type.DomainRouter);
+ }
+ }
+
+ return null;
}
- }
-
- if (ip == null) {
- ip = _ipAddrMgr.assignPublicIpAddress(dc.getId(), pod.getId(), vm.getOwner(), VlanType.DirectAttached, network.getId(), null, false);
- }
-
- nic.setIp4Address(ip.getAddress().toString());
- nic.setFormat(AddressFormat.Ip4);
- nic.setGateway(ip.getGateway());
- nic.setNetmask(ip.getNetmask());
- if (ip.getVlanTag() != null && ip.getVlanTag().equalsIgnoreCase(Vlan.UNTAGGED)) {
- nic.setIsolationUri(IsolationType.Ec2.toUri(Vlan.UNTAGGED));
- nic.setBroadcastUri(BroadcastDomainType.Vlan.toUri(Vlan.UNTAGGED));
- nic.setBroadcastType(BroadcastDomainType.Native);
- }
- nic.setReservationId(String.valueOf(ip.getVlanTag()));
- nic.setMacAddress(ip.getMacAddress());
-
- //save the placeholder nic if the vm is the Virtual router
- if (vm.getType() == VirtualMachine.Type.DomainRouter) {
- Nic placeholderNic = _networkModel.getPlaceholderNicForRouter(network, pod.getId());
- if (placeholderNic == null) {
- s_logger.debug("Saving placeholder nic with ip4 address " + nic.getIp4Address() + " for the network " + network);
- _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), null, VirtualMachine.Type.DomainRouter);
- }
- }
- txn.commit();
+ }, InsufficientAddressCapacityException.class);
}
nic.setDns1(dc.getDns1());
nic.setDns2(dc.getDns2());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/guru/GuestNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/GuestNetworkGuru.java b/server/src/com/cloud/network/guru/GuestNetworkGuru.java
index 20b0ce5..85728c2 100755
--- a/server/src/com/cloud/network/guru/GuestNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/GuestNetworkGuru.java
@@ -24,7 +24,6 @@ import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.apache.cloudstack.framework.config.ConfigKey;
@@ -70,6 +69,8 @@ import com.cloud.utils.Pair;
import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.db.DB;
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.net.NetUtils;
import com.cloud.vm.Nic.ReservationStrategy;
@@ -223,13 +224,15 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur
s_logger.debug("Deallocate network: networkId: " + nic.getNetworkId() + ", ip: " + nic.getIp4Address());
}
- IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
+ final IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
if (ip != null) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _ipAddrMgr.markIpAsUnavailable(ip.getId());
- _ipAddressDao.unassignIpAddress(ip.getId());
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _ipAddrMgr.markIpAsUnavailable(ip.getId());
+ _ipAddressDao.unassignIpAddress(ip.getId());
+ }
+ });
}
nic.deallocate();
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/guru/PublicNetworkGuru.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/guru/PublicNetworkGuru.java b/server/src/com/cloud/network/guru/PublicNetworkGuru.java
index f82e22e..6fed1a6 100755
--- a/server/src/com/cloud/network/guru/PublicNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/PublicNetworkGuru.java
@@ -20,7 +20,6 @@ import javax.ejb.Local;
import javax.inject.Inject;
import org.apache.log4j.Logger;
-
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import com.cloud.dc.DataCenter;
@@ -50,6 +49,8 @@ import com.cloud.user.Account;
import com.cloud.utils.component.AdapterBase;
import com.cloud.utils.db.DB;
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.vm.Nic.ReservationStrategy;
import com.cloud.vm.NicProfile;
@@ -192,16 +193,15 @@ public class PublicNetworkGuru extends AdapterBase implements NetworkGuru {
s_logger.debug("public network deallocate network: networkId: " + nic.getNetworkId() + ", ip: " + nic.getIp4Address());
}
- IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
+ final IPAddressVO ip = _ipAddressDao.findByIpAndSourceNetworkId(nic.getNetworkId(), nic.getIp4Address());
if (ip != null && nic.getReservationStrategy() != ReservationStrategy.Managed) {
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- _ipAddrMgr.markIpAsUnavailable(ip.getId());
- _ipAddressDao.unassignIpAddress(ip.getId());
-
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _ipAddrMgr.markIpAsUnavailable(ip.getId());
+ _ipAddressDao.unassignIpAddress(ip.getId());
+ }
+ });
}
nic.deallocate();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
index c685ee3..60bb40b 100755
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -152,6 +152,10 @@ import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.utils.db.TransactionCallback;
+import com.cloud.utils.db.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.Ip;
import com.cloud.utils.net.NetUtils;
@@ -379,11 +383,11 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
@Override
@DB
- public boolean configureLbAutoScaleVmGroup(long vmGroupid, String currentState) throws ResourceUnavailableException {
- AutoScaleVmGroupVO vmGroup = _autoScaleVmGroupDao.findById(vmGroupid);
+ public boolean configureLbAutoScaleVmGroup(final long vmGroupid, String currentState) throws ResourceUnavailableException {
+ final AutoScaleVmGroupVO vmGroup = _autoScaleVmGroupDao.findById(vmGroupid);
boolean success = false;
- LoadBalancerVO loadBalancer = _lbDao.findById(vmGroup.getLoadBalancerId());
+ final LoadBalancerVO loadBalancer = _lbDao.findById(vmGroup.getLoadBalancerId());
FirewallRule.State backupState = loadBalancer.getState();
@@ -416,14 +420,17 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
if (success) {
if (vmGroup.getState().equals(AutoScaleVmGroup.State_New)) {
- Transaction.currentTxn().start();
- loadBalancer.setState(FirewallRule.State.Active);
- s_logger.debug("LB rule " + loadBalancer.getId() + " state is set to Active");
- _lbDao.persist(loadBalancer);
- vmGroup.setState(AutoScaleVmGroup.State_Enabled);
- _autoScaleVmGroupDao.persist(vmGroup);
- s_logger.debug("LB Auto Scale Vm Group with Id: " + vmGroupid + " is set to Enabled state.");
- Transaction.currentTxn().commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ loadBalancer.setState(FirewallRule.State.Active);
+ s_logger.debug("LB rule " + loadBalancer.getId() + " state is set to Active");
+ _lbDao.persist(loadBalancer);
+ vmGroup.setState(AutoScaleVmGroup.State_Enabled);
+ _autoScaleVmGroupDao.persist(vmGroup);
+ s_logger.debug("LB Auto Scale Vm Group with Id: " + vmGroupid + " is set to Enabled state.");
+ }
+ });
}
s_logger.info("Successfully configured LB Autoscale Vm Group with Id: " + vmGroupid);
}
@@ -813,7 +820,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
throw new InvalidParameterException("Invalid Load balancer : " + healthCheckPolicy.getLoadBalancerId()
+ " for HealthCheck policy id: " + healthCheckPolicyId);
}
- long loadBalancerId = loadBalancer.getId();
+ final long loadBalancerId = loadBalancer.getId();
FirewallRule.State backupState = loadBalancer.getState();
_accountMgr.checkAccess(caller.getCallingAccount(), null, true, loadBalancer);
@@ -830,17 +837,19 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
+ ", healthCheckpolicyID " + healthCheckPolicyId);
// removing the state of services set by the monitor.
- List<LoadBalancerVMMapVO> maps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
+ final List<LoadBalancerVMMapVO> maps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
if (maps != null) {
- Transaction txn = Transaction.currentTxn();
- txn.start();
- s_logger.debug("Resetting health state policy for services in loadbalancing rule id : "
- + loadBalancerId);
- for (LoadBalancerVMMapVO map : maps) {
- map.setState(null);
- _lb2VmMapDao.persist(map);
- }
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ s_logger.debug("Resetting health state policy for services in loadbalancing rule id : "
+ + loadBalancerId);
+ for (LoadBalancerVMMapVO map : maps) {
+ map.setState(null);
+ _lb2VmMapDao.persist(map);
+ }
+ }
+ });
}
try {
@@ -957,7 +966,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
CallContext ctx = CallContext.current();
Account caller = ctx.getCallingAccount();
- LoadBalancerVO loadBalancer = _lbDao.findById(loadBalancerId);
+ final LoadBalancerVO loadBalancer = _lbDao.findById(loadBalancerId);
if (loadBalancer == null) {
throw new InvalidParameterValueException("Failed to assign to load balancer " + loadBalancerId
+ ", the load balancer was not found.");
@@ -969,7 +978,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
mappedInstanceIds.add(Long.valueOf(mappedInstance.getInstanceId()));
}
- List<UserVm> vmsToAdd = new ArrayList<UserVm>();
+ final List<UserVm> vmsToAdd = new ArrayList<UserVm>();
if (instanceIds == null || instanceIds.isEmpty()) {
s_logger.warn("List of vms to assign to the lb, is empty");
@@ -1022,13 +1031,16 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
vmsToAdd.add(vm);
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
- for (UserVm vm : vmsToAdd) {
- LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vm.getId(), false);
- map = _lb2VmMapDao.persist(map);
- }
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (UserVm vm : vmsToAdd) {
+ LoadBalancerVMMapVO map = new LoadBalancerVMMapVO(loadBalancer.getId(), vm.getId(), false);
+ map = _lb2VmMapDao.persist(map);
+ }
+ }
+ });
+
if (_autoScaleVmGroupDao.isAutoScaleLoadBalancer(loadBalancerId)) {
// For autoscaled loadbalancer, the rules need not be applied,
// meaning the call need not reach the resource layer.
@@ -1044,13 +1056,15 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
success = true;
} catch (ResourceUnavailableException e) {
if (isRollBackAllowedForProvider(loadBalancer)) {
- List<Long> vmInstanceIds = new ArrayList<Long>();
- txn = Transaction.currentTxn();
- txn.start();
- for (UserVm vm : vmsToAdd) {
- vmInstanceIds.add(vm.getId());
- }
- txn.commit();
+ final List<Long> vmInstanceIds = new ArrayList<Long>();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (UserVm vm : vmsToAdd) {
+ vmInstanceIds.add(vm.getId());
+ }
+ }
+ });
if (!vmInstanceIds.isEmpty()) {
_lb2VmMapDao.remove(loadBalancer.getId(), vmInstanceIds, null);
s_logger.debug("LB Rollback rule id: " + loadBalancer.getId() + " while attaching VM: "
@@ -1203,49 +1217,52 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
}
@DB
- public boolean deleteLoadBalancerRule(long loadBalancerId, boolean apply, Account caller, long callerUserId,
+ public boolean deleteLoadBalancerRule(final long loadBalancerId, boolean apply, Account caller, long callerUserId,
boolean rollBack) {
- LoadBalancerVO lb = _lbDao.findById(loadBalancerId);
- Transaction txn = Transaction.currentTxn();
- boolean generateUsageEvent = false;
- boolean success = true;
+ final LoadBalancerVO lb = _lbDao.findById(loadBalancerId);
FirewallRule.State backupState = lb.getState();
- txn.start();
- if (lb.getState() == FirewallRule.State.Staged) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Found a rule that is still in stage state so just removing it: " + lb);
- }
- generateUsageEvent = true;
- } else if (lb.getState() == FirewallRule.State.Add || lb.getState() == FirewallRule.State.Active) {
- lb.setState(FirewallRule.State.Revoke);
- _lbDao.persist(lb);
- generateUsageEvent = true;
- }
- List<LoadBalancerVMMapVO> backupMaps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
- List<LoadBalancerVMMapVO> maps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
- if (maps != null) {
- for (LoadBalancerVMMapVO map : maps) {
- map.setRevoke(true);
- _lb2VmMapDao.persist(map);
- s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId "
- + map.getInstanceId());
+ List<LoadBalancerVMMapVO> backupMaps = Transaction.execute(new TransactionCallback<List<LoadBalancerVMMapVO>>() {
+ @Override
+ public List<LoadBalancerVMMapVO> doInTransaction(TransactionStatus status) {
+ boolean generateUsageEvent = false;
+
+ if (lb.getState() == FirewallRule.State.Staged) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Found a rule that is still in stage state so just removing it: " + lb);
+ }
+ generateUsageEvent = true;
+ } else if (lb.getState() == FirewallRule.State.Add || lb.getState() == FirewallRule.State.Active) {
+ lb.setState(FirewallRule.State.Revoke);
+ _lbDao.persist(lb);
+ generateUsageEvent = true;
+ }
+ List<LoadBalancerVMMapVO> backupMaps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
+ List<LoadBalancerVMMapVO> maps = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId);
+ if (maps != null) {
+ for (LoadBalancerVMMapVO map : maps) {
+ map.setRevoke(true);
+ _lb2VmMapDao.persist(map);
+ s_logger.debug("Set load balancer rule for revoke: rule id " + loadBalancerId + ", vmId "
+ + map.getInstanceId());
+ }
+ }
+
+ List<LBHealthCheckPolicyVO> hcPolicies = _lb2healthcheckDao.listByLoadBalancerId(loadBalancerId);
+ for (LBHealthCheckPolicyVO lbHealthCheck : hcPolicies) {
+ lbHealthCheck.setRevoke(true);
+ _lb2healthcheckDao.persist(lbHealthCheck);
+ }
+
+ if (generateUsageEvent) {
+ // Generate usage event right after all rules were marked for revoke
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_DELETE, lb.getAccountId(), 0, lb.getId(),
+ null, LoadBalancingRule.class.getName(), lb.getUuid());
+ }
+
+ return backupMaps;
}
- }
-
- List<LBHealthCheckPolicyVO> hcPolicies = _lb2healthcheckDao.listByLoadBalancerId(loadBalancerId);
- for (LBHealthCheckPolicyVO lbHealthCheck : hcPolicies) {
- lbHealthCheck.setRevoke(true);
- _lb2healthcheckDao.persist(lbHealthCheck);
- }
-
- if (generateUsageEvent) {
- // Generate usage event right after all rules were marked for revoke
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_DELETE, lb.getAccountId(), 0, lb.getId(),
- null, LoadBalancingRule.class.getName(), lb.getUuid());
- }
-
- txn.commit();
+ });
// gather external network usage stats for this lb rule
NetworkVO network = _networkDao.findById(lb.getNetworkId());
@@ -1283,7 +1300,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
if (relatedRule != null) {
s_logger.warn("Unable to remove firewall rule id=" + lb.getId() + " as it has related firewall rule id="
+ relatedRule.getId() + "; leaving it in Revoke state");
- success = false;
+ return false;
} else {
_firewallMgr.removeRule(lb);
}
@@ -1293,11 +1310,9 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
// Bug CS-15411 opened to document this
// _elbMgr.handleDeleteLoadBalancerRule(lb, callerUserId, caller);
- if (success) {
- s_logger.debug("Load balancer with id " + lb.getId() + " is removed successfully");
- }
-
- return success;
+ s_logger.debug("Load balancer with id " + lb.getId() + " is removed successfully");
+
+ return true;
}
@Override
@@ -1392,8 +1407,8 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
@DB
@Override
- public LoadBalancer createPublicLoadBalancer(String xId, String name, String description,
- int srcPort, int destPort, long sourceIpId, String protocol, String algorithm, boolean openFirewall, CallContext caller)
+ public LoadBalancer createPublicLoadBalancer(final String xId, final String name, final String description,
+ final int srcPort, final int destPort, final long sourceIpId, final String protocol, final String algorithm, final boolean openFirewall, final CallContext caller)
throws NetworkRuleConflictException {
if (!NetUtils.isValidPort(destPort)) {
@@ -1404,7 +1419,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
throw new InvalidParameterValueException("Invalid algorithm: " + algorithm);
}
- IPAddressVO ipAddr = _ipAddressDao.findById(sourceIpId);
+ final IPAddressVO ipAddr = _ipAddressDao.findById(sourceIpId);
// make sure ip address exists
if (ipAddr == null || !ipAddr.readyToUse()) {
InvalidParameterValueException ex = new InvalidParameterValueException(
@@ -1426,7 +1441,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
_accountMgr.checkAccess(caller.getCallingAccount(), null, true, ipAddr);
- Long networkId = ipAddr.getAssociatedWithNetworkId();
+ final Long networkId = ipAddr.getAssociatedWithNetworkId();
if (networkId == null) {
InvalidParameterValueException ex = new InvalidParameterValueException(
"Unable to create load balancer rule ; specified sourceip id is not associated with any network");
@@ -1440,61 +1455,60 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
_firewallMgr.validateFirewallRule(caller.getCallingAccount(), ipAddr, srcPort, srcPort, protocol,
Purpose.LoadBalancing, FirewallRuleType.User, networkId, null);
- LoadBalancerVO newRule = new LoadBalancerVO(xId, name, description,
- sourceIpId, srcPort, destPort, algorithm,
- networkId, ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId());
- // verify rule is supported by Lb provider of the network
- Ip sourceIp = getSourceIp(newRule);
- LoadBalancingRule loadBalancing = new LoadBalancingRule(newRule, new ArrayList<LbDestination>(),
- new ArrayList<LbStickinessPolicy>(), new ArrayList<LbHealthCheckPolicy>(), sourceIp);
- if (!validateLbRule(loadBalancing)) {
- throw new InvalidParameterValueException("LB service provider cannot support this rule");
- }
+ return Transaction.executeWithException(new TransactionCallbackWithException<LoadBalancerVO>() {
+ @Override
+ public LoadBalancerVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+ LoadBalancerVO newRule = new LoadBalancerVO(xId, name, description,
+ sourceIpId, srcPort, destPort, algorithm,
+ networkId, ipAddr.getAllocatedToAccountId(), ipAddr.getAllocatedInDomainId());
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- newRule = _lbDao.persist(newRule);
-
- //create rule for all CIDRs
- if (openFirewall) {
- _firewallMgr.createRuleForAllCidrs(sourceIpId, caller.getCallingAccount(), srcPort,
- srcPort, protocol, null, null, newRule.getId(), networkId);
- }
-
- boolean success = true;
+ // verify rule is supported by Lb provider of the network
+ Ip sourceIp = getSourceIp(newRule);
+ LoadBalancingRule loadBalancing = new LoadBalancingRule(newRule, new ArrayList<LbDestination>(),
+ new ArrayList<LbStickinessPolicy>(), new ArrayList<LbHealthCheckPolicy>(), sourceIp);
+ if (!validateLbRule(loadBalancing)) {
+ throw new InvalidParameterValueException("LB service provider cannot support this rule");
+ }
- try {
- _firewallMgr.detectRulesConflict(newRule);
- if (!_firewallDao.setStateToAdd(newRule)) {
- throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
- }
- s_logger.debug("Load balancer " + newRule.getId() + " for Ip address id=" + sourceIpId + ", public port "
- + srcPort + ", private port " + destPort + " is added successfully.");
- CallContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
- UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_CREATE, ipAddr.getAllocatedToAccountId(),
- ipAddr.getDataCenterId(), newRule.getId(), null, LoadBalancingRule.class.getName(),
- newRule.getUuid());
- txn.commit();
-
- return newRule;
- } catch (Exception e) {
- success = false;
- if (e instanceof NetworkRuleConflictException) {
- throw (NetworkRuleConflictException) e;
+ newRule = _lbDao.persist(newRule);
+
+ //create rule for all CIDRs
+ if (openFirewall) {
+ _firewallMgr.createRuleForAllCidrs(sourceIpId, caller.getCallingAccount(), srcPort,
+ srcPort, protocol, null, null, newRule.getId(), networkId);
+ }
+
+ boolean success = true;
+
+ try {
+ _firewallMgr.detectRulesConflict(newRule);
+ if (!_firewallDao.setStateToAdd(newRule)) {
+ throw new CloudRuntimeException("Unable to update the state to add for " + newRule);
+ }
+ s_logger.debug("Load balancer " + newRule.getId() + " for Ip address id=" + sourceIpId + ", public port "
+ + srcPort + ", private port " + destPort + " is added successfully.");
+ CallContext.current().setEventDetails("Load balancer Id: " + newRule.getId());
+ UsageEventUtils.publishUsageEvent(EventTypes.EVENT_LOAD_BALANCER_CREATE, ipAddr.getAllocatedToAccountId(),
+ ipAddr.getDataCenterId(), newRule.getId(), null, LoadBalancingRule.class.getName(),
+ newRule.getUuid());
+
+ return newRule;
+ } catch (Exception e) {
+ success = false;
+ if (e instanceof NetworkRuleConflictException) {
+ throw (NetworkRuleConflictException) e;
+ }
+ throw new CloudRuntimeException("Unable to add rule for ip address id=" + newRule.getSourceIpAddressId(), e);
+ } finally {
+ if (!success && newRule != null) {
+ _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
+ removeLBRule(newRule);
+ }
+ }
}
- throw new CloudRuntimeException("Unable to add rule for ip address id=" + newRule.getSourceIpAddressId(), e);
- } finally {
- if (!success && newRule != null) {
+ }, NetworkRuleConflictException.class);
- txn.start();
- _firewallMgr.revokeRelatedFirewallRule(newRule.getId(), false);
- removeLBRule(newRule);
-
- txn.commit();
- }
- }
}
@Override
@@ -1583,7 +1597,6 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
@DB
protected boolean applyLoadBalancerRules(List<LoadBalancerVO> lbs, boolean updateRulesInDB)
throws ResourceUnavailableException {
- Transaction txn = Transaction.currentTxn();
List<LoadBalancingRule> rules = new ArrayList<LoadBalancingRule>();
for (LoadBalancerVO lb : lbs) {
rules.add(getLoadBalancerRuleToApply(lb));
@@ -1595,57 +1608,63 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
}
if (updateRulesInDB) {
- for (LoadBalancerVO lb : lbs) {
- boolean checkForReleaseElasticIp = false;
- txn.start();
- if (lb.getState() == FirewallRule.State.Revoke) {
- removeLBRule(lb);
- s_logger.debug("LB " + lb.getId() + " is successfully removed");
- checkForReleaseElasticIp = true;
- } else if (lb.getState() == FirewallRule.State.Add) {
- lb.setState(FirewallRule.State.Active);
- s_logger.debug("LB rule " + lb.getId() + " state is set to Active");
- _lbDao.persist(lb);
- }
-
- // remove LB-Vm mappings that were state to revoke
- List<LoadBalancerVMMapVO> lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lb.getId(), true);
- List<Long> instanceIds = new ArrayList<Long>();
-
- for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) {
- instanceIds.add(lbVmMap.getInstanceId());
- }
-
- if (!instanceIds.isEmpty()) {
- _lb2VmMapDao.remove(lb.getId(), instanceIds, null);
- s_logger.debug("Load balancer rule id " + lb.getId() + " is removed for vms " + instanceIds);
- }
-
- if (_lb2VmMapDao.listByLoadBalancerId(lb.getId()).isEmpty()) {
- lb.setState(FirewallRule.State.Add);
- _lbDao.persist(lb);
- s_logger.debug("LB rule " + lb.getId()
- + " state is set to Add as there are no more active LB-VM mappings");
- }
-
- // remove LB-Stickiness policy mapping that were state to revoke
- List<LBStickinessPolicyVO> stickinesspolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(
- lb.getId(), true);
- if (!stickinesspolicies.isEmpty()) {
- _lb2stickinesspoliciesDao.remove(lb.getId(), true);
- s_logger.debug("Load balancer rule id " + lb.getId() + " is removed stickiness policies");
- }
-
- // remove LB-HealthCheck policy mapping that were state to
- // revoke
- List<LBHealthCheckPolicyVO> healthCheckpolicies = _lb2healthcheckDao.listByLoadBalancerId(lb.getId(),
- true);
- if (!healthCheckpolicies.isEmpty()) {
- _lb2healthcheckDao.remove(lb.getId(), true);
- s_logger.debug("Load balancer rule id " + lb.getId() + " is removed health check monitors policies");
- }
+ for (final LoadBalancerVO lb : lbs) {
+ boolean checkForReleaseElasticIp = Transaction.execute(new TransactionCallback<Boolean>() {
+ @Override
+ public Boolean doInTransaction(TransactionStatus status) {
+ boolean checkForReleaseElasticIp = false;
+
+ if (lb.getState() == FirewallRule.State.Revoke) {
+ removeLBRule(lb);
+ s_logger.debug("LB " + lb.getId() + " is successfully removed");
+ checkForReleaseElasticIp = true;
+ } else if (lb.getState() == FirewallRule.State.Add) {
+ lb.setState(FirewallRule.State.Active);
+ s_logger.debug("LB rule " + lb.getId() + " state is set to Active");
+ _lbDao.persist(lb);
+ }
+
+ // remove LB-Vm mappings that were state to revoke
+ List<LoadBalancerVMMapVO> lbVmMaps = _lb2VmMapDao.listByLoadBalancerId(lb.getId(), true);
+ List<Long> instanceIds = new ArrayList<Long>();
+
+ for (LoadBalancerVMMapVO lbVmMap : lbVmMaps) {
+ instanceIds.add(lbVmMap.getInstanceId());
+ }
+
+ if (!instanceIds.isEmpty()) {
+ _lb2VmMapDao.remove(lb.getId(), instanceIds, null);
+ s_logger.debug("Load balancer rule id " + lb.getId() + " is removed for vms " + instanceIds);
+ }
+
+ if (_lb2VmMapDao.listByLoadBalancerId(lb.getId()).isEmpty()) {
+ lb.setState(FirewallRule.State.Add);
+ _lbDao.persist(lb);
+ s_logger.debug("LB rule " + lb.getId()
+ + " state is set to Add as there are no more active LB-VM mappings");
+ }
+
+ // remove LB-Stickiness policy mapping that were state to revoke
+ List<LBStickinessPolicyVO> stickinesspolicies = _lb2stickinesspoliciesDao.listByLoadBalancerId(
+ lb.getId(), true);
+ if (!stickinesspolicies.isEmpty()) {
+ _lb2stickinesspoliciesDao.remove(lb.getId(), true);
+ s_logger.debug("Load balancer rule id " + lb.getId() + " is removed stickiness policies");
+ }
+
+ // remove LB-HealthCheck policy mapping that were state to
+ // revoke
+ List<LBHealthCheckPolicyVO> healthCheckpolicies = _lb2healthcheckDao.listByLoadBalancerId(lb.getId(),
+ true);
+ if (!healthCheckpolicies.isEmpty()) {
+ _lb2healthcheckDao.remove(lb.getId(), true);
+ s_logger.debug("Load balancer rule id " + lb.getId() + " is removed health check monitors policies");
+ }
+
+ return checkForReleaseElasticIp;
+ }
+ });
- txn.commit();
if (checkForReleaseElasticIp && lb.getSourceIpAddressId() != null) {
boolean success = true;
long count = _firewallDao.countRulesByIpId(lb.getSourceIpAddressId());
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/f62e28c1/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
index 5ea7560..56e0e5d 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -230,6 +230,8 @@ import com.cloud.utils.db.JoinBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
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.net.Ip;
import com.cloud.utils.net.MacAddress;
@@ -578,34 +580,30 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
@DB
public void processStopOrRebootAnswer(final DomainRouterVO router, Answer answer) {
- final Transaction txn = Transaction.currentTxn();
- try {
- txn.start();
- //FIXME!!! - UserStats command should grab bytesSent/Received for all guest interfaces of the VR
- List<Long> routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId());
- for (Long guestNtwkId : routerGuestNtwkIds) {
- final UserStatisticsVO userStats = _userStatsDao.lock(router.getAccountId(), router.getDataCenterId(),
- guestNtwkId, null, router.getId(), router.getType().toString());
- if (userStats != null) {
- final long currentBytesRcvd = userStats.getCurrentBytesReceived();
- userStats.setCurrentBytesReceived(0);
- userStats.setNetBytesReceived(userStats.getNetBytesReceived() + currentBytesRcvd);
-
- final long currentBytesSent = userStats.getCurrentBytesSent();
- userStats.setCurrentBytesSent(0);
- userStats.setNetBytesSent(userStats.getNetBytesSent() + currentBytesSent);
- _userStatsDao.update(userStats.getId(), userStats);
- s_logger.debug("Successfully updated user statistics as a part of domR " + router + " reboot/stop");
- } else {
- s_logger.warn("User stats were not created for account " + router.getAccountId() + " and dc " + router.getDataCenterId());
- }
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ //FIXME!!! - UserStats command should grab bytesSent/Received for all guest interfaces of the VR
+ List<Long> routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId());
+ for (Long guestNtwkId : routerGuestNtwkIds) {
+ final UserStatisticsVO userStats = _userStatsDao.lock(router.getAccountId(), router.getDataCenterId(),
+ guestNtwkId, null, router.getId(), router.getType().toString());
+ if (userStats != null) {
+ final long currentBytesRcvd = userStats.getCurrentBytesReceived();
+ userStats.setCurrentBytesReceived(0);
+ userStats.setNetBytesReceived(userStats.getNetBytesReceived() + currentBytesRcvd);
+
+ final long currentBytesSent = userStats.getCurrentBytesSent();
+ userStats.setCurrentBytesSent(0);
+ userStats.setNetBytesSent(userStats.getNetBytesSent() + currentBytesSent);
+ _userStatsDao.update(userStats.getId(), userStats);
+ s_logger.debug("Successfully updated user statistics as a part of domR " + router + " reboot/stop");
+ } else {
+ s_logger.warn("User stats were not created for account " + router.getAccountId() + " and dc " + router.getDataCenterId());
+ }
+ }
}
-
- txn.commit();
- } catch (final Exception e) {
- txn.rollback();
- throw new CloudRuntimeException("Problem updating stats after reboot/stop ", e);
- }
+ });
}
@Override @ActionEvent(eventType = EventTypes.EVENT_ROUTER_REBOOT, eventDescription = "rebooting router Vm", async = true)
@@ -862,21 +860,21 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
final List<DomainRouterVO> routers = _routerDao.listByStateAndNetworkType(State.Running, GuestType.Isolated, mgmtSrvrId);
s_logger.debug("Found " + routers.size() + " running routers. ");
- for (DomainRouterVO router : routers) {
+ for (final DomainRouterVO router : routers) {
String privateIP = router.getPrivateIpAddress();
if (privateIP != null) {
- boolean forVpc = router.getVpcId() != null;
+ final boolean forVpc = router.getVpcId() != null;
List<? extends Nic> routerNics = _nicDao.listByVmId(router.getId());
- for (Nic routerNic : routerNics) {
- Network network = _networkModel.getNetwork(routerNic.getNetworkId());
+ for (final Nic routerNic : routerNics) {
+ final Network network = _networkModel.getNetwork(routerNic.getNetworkId());
//Send network usage command for public nic in VPC VR
//Send network usage command for isolated guest nic of non VPC VR
if ((forVpc && network.getTrafficType() == TrafficType.Public) || (!forVpc && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == Network.GuestType.Isolated)) {
final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(),
forVpc, routerNic.getIp4Address());
- String routerType = router.getType().toString();
- UserStatisticsVO previousStats = _userStatsDao.findBy(router.getAccountId(),
+ final String routerType = router.getType().toString();
+ final UserStatisticsVO previousStats = _userStatsDao.findBy(router.getAccountId(),
router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
NetworkUsageAnswer answer = null;
try {
@@ -891,62 +889,63 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
s_logger.warn("Error while collecting network stats from router: " + router.getInstanceName() + " from host: " + router.getHostId() + "; details: " + answer.getDetails());
continue;
}
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
try {
if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) {
s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics");
continue;
}
- txn.start();
- UserStatisticsVO stats = _userStatsDao.lock(router.getAccountId(),
- router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
- if (stats == null) {
- s_logger.warn("unable to find stats for account: " + router.getAccountId());
- continue;
- }
-
- if (previousStats != null
- && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived())
- || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))) {
- s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " +
- "Ignoring current answer. Router: " + answer.getRouterName() + " Rcvd: " +
- answer.getBytesReceived() + "Sent: " + answer.getBytesSent());
- continue;
- }
-
- if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Received # of bytes that's less than the last one. " +
- "Assuming something went wrong and persisting it. Router: " +
- answer.getRouterName() + " Reported: " + answer.getBytesReceived()
- + " Stored: " + stats.getCurrentBytesReceived());
- }
- stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
- }
- stats.setCurrentBytesReceived(answer.getBytesReceived());
- if (stats.getCurrentBytesSent() > answer.getBytesSent()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Received # of bytes that's less than the last one. " +
- "Assuming something went wrong and persisting it. Router: " +
- answer.getRouterName() + " Reported: " + answer.getBytesSent()
- + " Stored: " + stats.getCurrentBytesSent());
+ final NetworkUsageAnswer answerFinal = answer;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ UserStatisticsVO stats = _userStatsDao.lock(router.getAccountId(),
+ router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
+ if (stats == null) {
+ s_logger.warn("unable to find stats for account: " + router.getAccountId());
+ return;
+ }
+
+ if (previousStats != null
+ && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived())
+ || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))) {
+ s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " +
+ "Ignoring current answer. Router: " + answerFinal.getRouterName() + " Rcvd: " +
+ answerFinal.getBytesReceived() + "Sent: " + answerFinal.getBytesSent());
+ return;
+ }
+
+ if (stats.getCurrentBytesReceived() > answerFinal.getBytesReceived()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Received # of bytes that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Router: " +
+ answerFinal.getRouterName() + " Reported: " + answerFinal.getBytesReceived()
+ + " Stored: " + stats.getCurrentBytesReceived());
+ }
+ stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
+ }
+ stats.setCurrentBytesReceived(answerFinal.getBytesReceived());
+ if (stats.getCurrentBytesSent() > answerFinal.getBytesSent()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Received # of bytes that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Router: " +
+ answerFinal.getRouterName() + " Reported: " + answerFinal.getBytesSent()
+ + " Stored: " + stats.getCurrentBytesSent());
+ }
+ stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
+ }
+ stats.setCurrentBytesSent(answerFinal.getBytesSent());
+ if (! _dailyOrHourly) {
+ //update agg bytes
+ stats.setAggBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
+ stats.setAggBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
+ }
+ _userStatsDao.update(stats.getId(), stats);
}
- stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
- }
- stats.setCurrentBytesSent(answer.getBytesSent());
- if (! _dailyOrHourly) {
- //update agg bytes
- stats.setAggBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
- stats.setAggBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
- }
- _userStatsDao.update(stats.getId(), stats);
- txn.commit();
+ });
+
} catch (Exception e) {
- txn.rollback();
s_logger.warn("Unable to update user statistics for account: " + router.getAccountId()
+ " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent());
- } finally {
- txn.close();
}
}
}
@@ -977,30 +976,30 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
scanLock.unlock();
return;
}
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
try {
- txn.start();
- //get all stats with delta > 0
- List<UserStatisticsVO> updatedStats = _userStatsDao.listUpdatedStats();
- Date updatedTime = new Date();
- for(UserStatisticsVO stat : updatedStats){
- //update agg bytes
- stat.setAggBytesReceived(stat.getCurrentBytesReceived() + stat.getNetBytesReceived());
- stat.setAggBytesSent(stat.getCurrentBytesSent() + stat.getNetBytesSent());
- _userStatsDao.update(stat.getId(), stat);
- //insert into op_user_stats_log
- UserStatsLogVO statsLog = new UserStatsLogVO(stat.getId(), stat.getNetBytesReceived(), stat.getNetBytesSent(), stat.getCurrentBytesReceived(),
- stat.getCurrentBytesSent(), stat.getAggBytesReceived(), stat.getAggBytesSent(), updatedTime);
- _userStatsLogDao.persist(statsLog);
- }
- s_logger.debug("Successfully updated aggregate network stats");
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ //get all stats with delta > 0
+ List<UserStatisticsVO> updatedStats = _userStatsDao.listUpdatedStats();
+ Date updatedTime = new Date();
+ for(UserStatisticsVO stat : updatedStats){
+ //update agg bytes
+ stat.setAggBytesReceived(stat.getCurrentBytesReceived() + stat.getNetBytesReceived());
+ stat.setAggBytesSent(stat.getCurrentBytesSent() + stat.getNetBytesSent());
+ _userStatsDao.update(stat.getId(), stat);
+ //insert into op_user_stats_log
+ UserStatsLogVO statsLog = new UserStatsLogVO(stat.getId(), stat.getNetBytesReceived(), stat.getNetBytesSent(), stat.getCurrentBytesReceived(),
+ stat.getCurrentBytesSent(), stat.getAggBytesReceived(), stat.getAggBytesSent(), updatedTime);
+ _userStatsLogDao.persist(statsLog);
+ }
+ s_logger.debug("Successfully updated aggregate network stats");
+ }
+ });
} catch (Exception e){
- txn.rollback();
s_logger.debug("Failed to update aggregate network stats", e);
} finally {
scanLock.unlock();
- txn.close();
}
}
} catch (Exception e){
@@ -1137,17 +1136,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
}
}
if (updated) {
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
- try {
- txn.start();
- _routerDao.update(router.getId(), router);
- txn.commit();
- } catch (Exception e) {
- txn.rollback();
- s_logger.warn("Unable to update router status for account: " + router.getAccountId());
- } finally {
- txn.close();
- }
+ _routerDao.update(router.getId(), router);
}
RedundantState currState = router.getRedundantState();
if (prevState != currState) {
@@ -2847,12 +2836,15 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
configDnsMasq(router, network, cmds);
boolean result = sendCommandsToRouter(router, cmds);
if (result == false) {
- NicIpAliasVO ipAliasVO = _nicIpAliasDao.findByInstanceIdAndNetworkId(network.getId(), router.getId());
- Transaction txn = Transaction.currentTxn();
- txn.start();
- _nicIpAliasDao.expunge(ipAliasVO.getId());
- _ipAddressDao.unassignIpAddress(routerPublicIP.getId());
- txn.commit();
+ final NicIpAliasVO ipAliasVO = _nicIpAliasDao.findByInstanceIdAndNetworkId(network.getId(), router.getId());
+ final PublicIp routerPublicIPFinal = routerPublicIP;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ _nicIpAliasDao.expunge(ipAliasVO.getId());
+ _ipAddressDao.unassignIpAddress(routerPublicIPFinal.getId());
+ }
+ });
throw new CloudRuntimeException("failed to configure ip alias on the router as a part of dhcp config");
}
}
@@ -2877,7 +2869,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
}
Commands cmds = new Commands(Command.OnError.Continue);
- List<NicIpAliasVO> revokedIpAliasVOs = _nicIpAliasDao.listByNetworkIdAndState(network.getId(), NicIpAlias.state.revoked);
+ final List<NicIpAliasVO> revokedIpAliasVOs = _nicIpAliasDao.listByNetworkIdAndState(network.getId(), NicIpAlias.state.revoked);
s_logger.debug("Found" + revokedIpAliasVOs.size() + "ip Aliases to revoke on the router as a part of dhcp configuration");
List<IpAliasTO> revokedIpAliasTOs = new ArrayList<IpAliasTO>();
for (NicIpAliasVO revokedAliasVO : revokedIpAliasVOs) {
@@ -2893,12 +2885,14 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
configDnsMasq(router, network, cmds);
boolean result = sendCommandsToRouter(router, cmds);
if (result) {
- Transaction txn= Transaction.currentTxn();
- txn.start();
- for (NicIpAliasVO revokedAliasVO : revokedIpAliasVOs) {
- _nicIpAliasDao.expunge(revokedAliasVO.getId());
- }
- txn.commit();
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ for (NicIpAliasVO revokedAliasVO : revokedIpAliasVOs) {
+ _nicIpAliasDao.expunge(revokedAliasVO.getId());
+ }
+ }
+ });
return true;
}
}
@@ -3966,7 +3960,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
public void prepareStop(VirtualMachineProfile profile){
//Collect network usage before stopping Vm
- DomainRouterVO router = _routerDao.findById(profile.getVirtualMachine().getId());
+ final DomainRouterVO router = _routerDao.findById(profile.getVirtualMachine().getId());
if(router == null){
return;
}
@@ -3974,17 +3968,17 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
String privateIP = router.getPrivateIpAddress();
if (privateIP != null) {
- boolean forVpc = router.getVpcId() != null;
+ final boolean forVpc = router.getVpcId() != null;
List<? extends Nic> routerNics = _nicDao.listByVmId(router.getId());
- for (Nic routerNic : routerNics) {
- Network network = _networkModel.getNetwork(routerNic.getNetworkId());
+ for (final Nic routerNic : routerNics) {
+ final Network network = _networkModel.getNetwork(routerNic.getNetworkId());
//Send network usage command for public nic in VPC VR
//Send network usage command for isolated guest nic of non VPC VR
if ((forVpc && network.getTrafficType() == TrafficType.Public) || (!forVpc && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == Network.GuestType.Isolated)) {
final NetworkUsageCommand usageCmd = new NetworkUsageCommand(privateIP, router.getHostName(),
forVpc, routerNic.getIp4Address());
- String routerType = router.getType().toString();
- UserStatisticsVO previousStats = _userStatsDao.findBy(router.getAccountId(),
+ final String routerType = router.getType().toString();
+ final UserStatisticsVO previousStats = _userStatsDao.findBy(router.getAccountId(),
router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
NetworkUsageAnswer answer = null;
try {
@@ -3999,62 +3993,63 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
s_logger.warn("Error while collecting network stats from router: " + router.getInstanceName() + " from host: " + router.getHostId() + "; details: " + answer.getDetails());
continue;
}
- Transaction txn = Transaction.open(Transaction.CLOUD_DB);
try {
if ((answer.getBytesReceived() == 0) && (answer.getBytesSent() == 0)) {
s_logger.debug("Recieved and Sent bytes are both 0. Not updating user_statistics");
continue;
}
- txn.start();
- UserStatisticsVO stats = _userStatsDao.lock(router.getAccountId(),
- router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
- if (stats == null) {
- s_logger.warn("unable to find stats for account: " + router.getAccountId());
- continue;
- }
-
- if (previousStats != null
- && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived())
- || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){
- s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " +
- "Ignoring current answer. Router: " + answer.getRouterName() + " Rcvd: " +
- answer.getBytesReceived() + "Sent: " + answer.getBytesSent());
- continue;
- }
-
- if (stats.getCurrentBytesReceived() > answer.getBytesReceived()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Received # of bytes that's less than the last one. " +
- "Assuming something went wrong and persisting it. Router: " +
- answer.getRouterName() + " Reported: " + answer.getBytesReceived()
- + " Stored: " + stats.getCurrentBytesReceived());
- }
- stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
- }
- stats.setCurrentBytesReceived(answer.getBytesReceived());
- if (stats.getCurrentBytesSent() > answer.getBytesSent()) {
- if (s_logger.isDebugEnabled()) {
- s_logger.debug("Received # of bytes that's less than the last one. " +
- "Assuming something went wrong and persisting it. Router: " +
- answer.getRouterName() + " Reported: " + answer.getBytesSent()
- + " Stored: " + stats.getCurrentBytesSent());
+
+ final NetworkUsageAnswer answerFinal = answer;
+ Transaction.execute(new TransactionCallbackNoReturn() {
+ @Override
+ public void doInTransactionWithoutResult(TransactionStatus status) {
+ UserStatisticsVO stats = _userStatsDao.lock(router.getAccountId(),
+ router.getDataCenterId(), network.getId(), (forVpc ? routerNic.getIp4Address() : null), router.getId(), routerType);
+ if (stats == null) {
+ s_logger.warn("unable to find stats for account: " + router.getAccountId());
+ return;
+ }
+
+ if (previousStats != null
+ && ((previousStats.getCurrentBytesReceived() != stats.getCurrentBytesReceived())
+ || (previousStats.getCurrentBytesSent() != stats.getCurrentBytesSent()))){
+ s_logger.debug("Router stats changed from the time NetworkUsageCommand was sent. " +
+ "Ignoring current answer. Router: " + answerFinal.getRouterName() + " Rcvd: " +
+ answerFinal.getBytesReceived() + "Sent: " + answerFinal.getBytesSent());
+ return;
+ }
+
+ if (stats.getCurrentBytesReceived() > answerFinal.getBytesReceived()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Received # of bytes that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Router: " +
+ answerFinal.getRouterName() + " Reported: " + answerFinal.getBytesReceived()
+ + " Stored: " + stats.getCurrentBytesReceived());
+ }
+ stats.setNetBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
+ }
+ stats.setCurrentBytesReceived(answerFinal.getBytesReceived());
+ if (stats.getCurrentBytesSent() > answerFinal.getBytesSent()) {
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug("Received # of bytes that's less than the last one. " +
+ "Assuming something went wrong and persisting it. Router: " +
+ answerFinal.getRouterName() + " Reported: " + answerFinal.getBytesSent()
+ + " Stored: " + stats.getCurrentBytesSent());
+ }
+ stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
+ }
+ stats.setCurrentBytesSent(answerFinal.getBytesSent());
+ if (! _dailyOrHourly) {
+ //update agg bytes
+ stats.setAggBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
+ stats.setAggBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
+ }
+ _userStatsDao.update(stats.getId(), stats);
}
- stats.setNetBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
- }
- stats.setCurrentBytesSent(answer.getBytesSent());
- if (! _dailyOrHourly) {
- //update agg bytes
- stats.setAggBytesSent(stats.getNetBytesSent() + stats.getCurrentBytesSent());
- stats.setAggBytesReceived(stats.getNetBytesReceived() + stats.getCurrentBytesReceived());
- }
- _userStatsDao.update(stats.getId(), stats);
- txn.commit();
+ });
} catch (Exception e) {
- txn.rollback();
s_logger.warn("Unable to update user statistics for account: " + router.getAccountId()
+ " Rx: " + answer.getBytesReceived() + "; Tx: " + answer.getBytesSent());
- } finally {
- txn.close();
}
}
}