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/23 19:10:02 UTC

git commit: updated refs/heads/txn-refactor to edeaf98

Updated Branches:
  refs/heads/txn-refactor 323bbccd5 -> edeaf9811


Cleaner and more type safe Transaction API for checked exceptions


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/edeaf981
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/edeaf981
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/edeaf981

Branch: refs/heads/txn-refactor
Commit: edeaf98117e6c02403dfe0cbae741e4eb7e75a0c
Parents: 323bbcc
Author: Darren Shepherd <da...@gmail.com>
Authored: Wed Oct 23 10:02:43 2013 -0700
Committer: Darren Shepherd <da...@gmail.com>
Committed: Wed Oct 23 10:02:43 2013 -0700

----------------------------------------------------------------------
 .../com/cloud/vm/VirtualMachineManagerImpl.java |  13 +-
 .../orchestration/NetworkOrchestrator.java      |  18 +-
 .../db/src/com/cloud/utils/db/Transaction.java  |  30 +--
 .../utils/db/TransactionCallbackNoReturn.java   |   2 +-
 .../db/TransactionCallbackWithException.java    |   4 +-
 ...ransactionCallbackWithExceptionNoReturn.java |  32 +++
 .../utils/db/TransactionWrappedExeception.java  |  36 ----
 .../com/cloud/utils/db/TestTransaction.java     |  22 +-
 .../cloud/network/element/CiscoVnmcElement.java |  10 +-
 .../lb/ElasticLoadBalancerManagerImpl.java      |   6 +-
 .../ExternalLoadBalancerDeviceManagerImpl.java  |   6 +-
 .../com/cloud/network/IpAddressManagerImpl.java | 213 ++++++++++---------
 .../com/cloud/network/NetworkServiceImpl.java   |  10 +-
 .../network/StorageNetworkManagerImpl.java      |   4 +-
 .../network/firewall/FirewallManagerImpl.java   |   4 +-
 .../cloud/network/guru/DirectNetworkGuru.java   |   9 +-
 .../network/guru/DirectPodBasedNetworkGuru.java |  11 +-
 .../lb/LoadBalancingRulesManagerImpl.java       |   4 +-
 .../cloud/network/rules/RulesManagerImpl.java   |  17 +-
 .../security/SecurityGroupManagerImpl.java      |   4 +-
 .../com/cloud/network/vpc/VpcManagerImpl.java   |  17 +-
 .../network/vpn/RemoteAccessVpnManagerImpl.java |   4 +-
 .../com/cloud/projects/ProjectManagerImpl.java  |  10 +-
 .../resourcelimit/ResourceLimitManagerImpl.java |  11 +-
 .../cloud/server/ConfigurationServerImpl.java   |   9 +-
 server/src/com/cloud/test/DatabaseConfig.java   |   9 +-
 server/src/com/cloud/vm/UserVmManagerImpl.java  |  13 +-
 .../vm/snapshot/VMSnapshotManagerImpl.java      |   9 +-
 .../lb/ApplicationLoadBalancerManagerImpl.java  |   5 +-
 29 files changed, 264 insertions(+), 278 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 51310da..e0c4835 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -167,6 +167,7 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.exception.ExecutionException;
@@ -337,9 +338,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         final VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vmFinal, template, serviceOffering, null, null);
 
-        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+        Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() {
             @Override
-            public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
+            public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientCapacityException {
                 if (s_logger.isDebugEnabled()) {
                     s_logger.debug("Allocating nics for " + vmFinal);
                 }
@@ -365,10 +366,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                 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);
+        });
 
         if (s_logger.isDebugEnabled()) {
             s_logger.debug("Allocation completed for VM: " + vmFinal);
@@ -566,7 +565,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             try {
                 final ItWorkVO workFinal = work;
                 Ternary<VMInstanceVO, ReservationContext, ItWorkVO> result = 
-                        Transaction.executeWithException(new TransactionCallbackWithException<Ternary<VMInstanceVO, ReservationContext, ItWorkVO>>() {
+                        Transaction.execute(new TransactionCallbackWithException<Ternary<VMInstanceVO, ReservationContext, ItWorkVO>, NoTransitionException>() {
                     @Override
                     public Ternary<VMInstanceVO, ReservationContext, ItWorkVO> doInTransaction(TransactionStatus status) throws NoTransitionException {
                         Journal journal = new Journal.LogJournal("Creating " + vm, s_logger);
@@ -582,7 +581,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                         return new Ternary<VMInstanceVO, ReservationContext, ItWorkVO>(null, null, work);
                     }
-                }, NoTransitionException.class);
+                });
                 
                 work = result.third();
                 if (result.first() != null)

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 7ba9b1b..dbc0714 100755
--- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
+++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java
@@ -169,7 +169,7 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.JoinBuilder.JoinType;
 import com.cloud.utils.db.SearchBuilder;
@@ -687,9 +687,9 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
     public void allocate(final VirtualMachineProfile vm, final LinkedHashMap<? extends Network, ? extends NicProfile> networks) throws InsufficientCapacityException,
         ConcurrentOperationException {
 
-        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+        Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() {
             @Override
-            public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
+            public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientCapacityException {
                 int deviceId = 0;
         
                 boolean[] deviceIds = new boolean[networks.size()];
@@ -750,10 +750,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
                 if (nics.size() == 1) {
                     nics.get(0).setDefaultNic(true);
                 }
-                
-                return null;
             }
-        }, InsufficientCapacityException.class);
+        });
     }
 
     @DB
@@ -2470,15 +2468,13 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra
             final LinkedHashMap<Network, NicProfile> profiles = new LinkedHashMap<Network, NicProfile>();
             profiles.put(network, null);
 
-            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() {
                 @Override
-                public Object doInTransaction(TransactionStatus status) throws Exception {
+                public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientCapacityException {
                     cleanupNics(vm);
                     allocate(vm, profiles);
-
-                    return null;
                 }
-            }, InsufficientCapacityException.class);
+            });
         }
         return true;
     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 d65b87e..4b19be0 100755
--- a/framework/db/src/com/cloud/utils/db/Transaction.java
+++ b/framework/db/src/com/cloud/utils/db/Transaction.java
@@ -18,14 +18,13 @@ package com.cloud.utils.db;
 
 import java.util.concurrent.atomic.AtomicLong;
 
-import com.cloud.utils.exception.ExceptionUtil;
-
 public class Transaction {
     private final static AtomicLong counter = new AtomicLong(0);
     private final static TransactionStatus STATUS = new TransactionStatus() {
     };
 
-    public static <T> T execute(TransactionCallback<T> callback) {
+    @SuppressWarnings("deprecation")
+    public static <T,E extends Throwable> T execute(TransactionCallbackWithException<T,E> callback) throws E {
         String name = "tx-" + counter.incrementAndGet();
         short databaseId = TransactionLegacy.CLOUD_DB;
         TransactionLegacy currentTxn = TransactionLegacy.currentTxn(false);
@@ -43,24 +42,13 @@ public class Transaction {
         }
     }
 
-    public static <T,X extends Exception> T executeWithException(final TransactionCallbackWithException<T> callback, Class<X> exception) throws X {
-        try {
-            return execute(new TransactionCallback<T>() {
-                @Override
-                public T doInTransaction(TransactionStatus status) {
-                    try {
-                        return callback.doInTransaction(status);
-                    } catch (Exception e) {
-                        ExceptionUtil.rethrowRuntime(e);
-                        throw new TransactionWrappedExeception(e);
-                    }
-                }
-            });
-        } catch (TransactionWrappedExeception e) {
-            ExceptionUtil.rethrowRuntime(e.getWrapped());
-            ExceptionUtil.rethrow(e.getWrapped(), exception);
-            throw e;
-        }
+    public static <T> T execute(final TransactionCallback<T> callback) {
+        return execute(new TransactionCallbackWithException<T, RuntimeException>() {
+            @Override
+            public T doInTransaction(TransactionStatus status) throws RuntimeException {
+                return callback.doInTransaction(status);
+            }
+        });
     }
 
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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
index a2263e5..2db290a 100644
--- a/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java
+++ b/framework/db/src/com/cloud/utils/db/TransactionCallbackNoReturn.java
@@ -3,7 +3,7 @@ package com.cloud.utils.db;
 public abstract class TransactionCallbackNoReturn implements TransactionCallback<Object> {
 
 	@Override
-	public Object doInTransaction(TransactionStatus status) {
+	public final Object doInTransaction(TransactionStatus status) {
 		doInTransactionWithoutResult(status);
 		return null;
 	}

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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
index cbf3fbd..67d7826 100644
--- a/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java
+++ b/framework/db/src/com/cloud/utils/db/TransactionCallbackWithException.java
@@ -1,7 +1,7 @@
 package com.cloud.utils.db;
 
-public interface TransactionCallbackWithException<T> {
+public interface TransactionCallbackWithException<T,E extends Throwable> {
 
-	public T doInTransaction(TransactionStatus status) throws Exception;
+	public T doInTransaction(TransactionStatus status) throws E;
 	
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/framework/db/src/com/cloud/utils/db/TransactionCallbackWithExceptionNoReturn.java
----------------------------------------------------------------------
diff --git a/framework/db/src/com/cloud/utils/db/TransactionCallbackWithExceptionNoReturn.java b/framework/db/src/com/cloud/utils/db/TransactionCallbackWithExceptionNoReturn.java
new file mode 100644
index 0000000..d5bc44f
--- /dev/null
+++ b/framework/db/src/com/cloud/utils/db/TransactionCallbackWithExceptionNoReturn.java
@@ -0,0 +1,32 @@
+/*
+ * 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;
+
+public abstract class TransactionCallbackWithExceptionNoReturn<E extends Throwable> implements TransactionCallbackWithException<Boolean, E> {
+
+    @Override
+    public final Boolean doInTransaction(TransactionStatus status) throws E {
+        doInTransactionWithoutResult(status);
+        return true;
+    }
+
+    public abstract void doInTransactionWithoutResult(TransactionStatus status) throws E;
+
+}
+

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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
deleted file mode 100644
index 70d4c16..0000000
--- a/framework/db/src/com/cloud/utils/db/TransactionWrappedExeception.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * 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/edeaf981/framework/db/test/com/cloud/utils/db/TestTransaction.java
----------------------------------------------------------------------
diff --git a/framework/db/test/com/cloud/utils/db/TestTransaction.java b/framework/db/test/com/cloud/utils/db/TestTransaction.java
index ea277c7..4ee08f1 100644
--- a/framework/db/test/com/cloud/utils/db/TestTransaction.java
+++ b/framework/db/test/com/cloud/utils/db/TestTransaction.java
@@ -23,6 +23,7 @@ import static org.mockito.Mockito.*;
 
 import java.io.FileNotFoundException;
 import java.sql.Connection;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.junit.After;
 import org.junit.Before;
@@ -88,14 +89,14 @@ public class TestTransaction {
     @Test
     public void testRollbackWithException() throws Exception {
         try {
-            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            Transaction.execute(new TransactionCallbackWithException<Object,FileNotFoundException>() {
                 @Override
                 public Object doInTransaction(TransactionStatus status) throws FileNotFoundException {
                     assertEquals(TransactionLegacy.CLOUD_DB, TransactionLegacy.currentTxn().getDatabaseId().shortValue());
 
                     throw new FileNotFoundException("Panic!");
                 }
-            }, FileNotFoundException.class);
+            });
             fail();
         } catch (FileNotFoundException e) {
             assertEquals("Panic!", e.getMessage());
@@ -108,6 +109,23 @@ public class TestTransaction {
     }
     
     @Test
+    public void testWithExceptionNoReturn() throws Exception {
+        final AtomicInteger i = new AtomicInteger(0);
+        assertTrue(Transaction.execute(new TransactionCallbackWithExceptionNoReturn<FileNotFoundException>() {
+            @Override
+            public void doInTransactionWithoutResult(TransactionStatus status) throws FileNotFoundException {
+                i.incrementAndGet();
+            }
+        }));
+        
+        assertEquals(1, i.get());
+        verify(conn).setAutoCommit(false);
+        verify(conn, times(1)).commit();
+        verify(conn, times(0)).rollback();
+        verify(conn, times(1)).close();
+    }
+    
+    @Test
     public void testOtherdatabaseRollback() throws Exception {
         after();
         setup(TransactionLegacy.AWSAPI_DB);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
----------------------------------------------------------------------
diff --git a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
index 37de4de..5beb1ba 100644
--- a/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
+++ b/plugins/network-elements/cisco-vnmc/src/com/cloud/network/element/CiscoVnmcElement.java
@@ -124,7 +124,7 @@ import com.cloud.utils.component.AdapterBase;
 import com.cloud.utils.db.EntityManager;
 import com.cloud.utils.db.Transaction;
 import com.cloud.utils.db.TransactionCallback;
-import com.cloud.utils.db.TransactionCallbackWithException;
+import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.exception.ExceptionUtil;
@@ -317,9 +317,9 @@ public class CiscoVnmcElement extends AdapterBase implements SourceNatServicePro
         }
 
         try {
-            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<Exception>() {
                 @Override
-                public Object doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException, ResourceUnavailableException {
+                public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientAddressCapacityException, ResourceUnavailableException {
 
                     // ensure that there is an ASA 1000v assigned to this network
                     CiscoAsa1000vDevice assignedAsa = assignAsa1000vToNetwork(network);
@@ -419,10 +419,8 @@ public class CiscoVnmcElement extends AdapterBase implements SourceNatServicePro
                         throw new CloudRuntimeException("Failed to associate Cisco ASA 1000v (" + assignedAsa.getManagementIp() +
                                 ") with logical edge firewall in VNMC for network " + network.getName());
                     }
-
-                    return null;
                 }
-            }, Exception.class);
+            });
         } catch (CloudRuntimeException e) {
             s_logger.error("CiscoVnmcElement failed", e);
             return false;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 cf4c2f0..f2bda39 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
@@ -587,9 +587,9 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements Elast
     
     @DB
     public PublicIp allocDirectIp(final Account account, final long guestNetworkId) throws InsufficientAddressCapacityException {
-        return Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() {
+        return Transaction.execute(new TransactionCallbackWithException<PublicIp,InsufficientAddressCapacityException>() {
             @Override
-            public PublicIp doInTransaction(TransactionStatus status) throws Exception {
+            public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
                 Network frontEndNetwork = _networkModel.getNetwork(guestNetworkId);
 
                 PublicIp ip = _ipAddrMgr.assignPublicIpAddress(frontEndNetwork.getDataCenterId(), null, account, VlanType.DirectAttached, frontEndNetwork.getId(), null, true);
@@ -600,7 +600,7 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements Elast
 
                 return ip;
             }
-        }, InsufficientAddressCapacityException.class);
+        });
     }
     
     public void releaseIp(long ipId, long userId, Account caller) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 59df3e8..6ca40c0 100644
--- a/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
+++ b/server/src/com/cloud/network/ExternalLoadBalancerDeviceManagerImpl.java
@@ -422,9 +422,9 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
                         final boolean dedicatedLB = offering.getDedicatedLB(); // does network offering supports a dedicated load balancer?
 
                         try {
-                            lbDevice = Transaction.executeWithException(new TransactionCallbackWithException<ExternalLoadBalancerDeviceVO>() {
+                            lbDevice = Transaction.execute(new TransactionCallbackWithException<ExternalLoadBalancerDeviceVO,InsufficientCapacityException>() {
                                 @Override
-                                public ExternalLoadBalancerDeviceVO doInTransaction(TransactionStatus status) throws Exception {
+                                public ExternalLoadBalancerDeviceVO doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
                                     // FIXME: should the device allocation be done during network implement phase or do a
                                     // lazy allocation when first rule for the network is configured??
         
@@ -442,7 +442,7 @@ public abstract class ExternalLoadBalancerDeviceManagerImpl extends AdapterBase
                                     _externalLoadBalancerDeviceDao.update(lbDeviceId, lbDevice);
                                     return lbDevice;
                                 }
-                            }, InsufficientCapacityException.class);
+                            });
 
                             // allocated load balancer for the network, so skip retry
                             tryLbProvisioning = false;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 dd30aa1..8619ae1 100644
--- a/server/src/com/cloud/network/IpAddressManagerImpl.java
+++ b/server/src/com/cloud/network/IpAddressManagerImpl.java
@@ -146,8 +146,10 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.exception.ExceptionUtil;
 import com.cloud.utils.net.Ip;
 import com.cloud.utils.net.NetUtils;
 import com.cloud.vm.Nic;
@@ -657,7 +659,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
     @DB
     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>() {
+        IPAddressVO addr = Transaction.execute(new TransactionCallbackWithException<IPAddressVO,InsufficientAddressCapacityException>() {
             @Override
             public IPAddressVO doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
                 StringBuilder errorMessage = new StringBuilder("Unable to get ip adress in ");
@@ -786,7 +788,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
                 return addr;
             }
-        }, InsufficientAddressCapacityException.class);
+        });
 
         if (vlanUse == VlanType.VirtualNetwork) {
             _firewallMgr.addSystemFirewallRules(addr, owner);
@@ -870,7 +872,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
         PublicIp ip = null;
         try {
-            ip = Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() {
+            ip = Transaction.execute(new TransactionCallbackWithException<PublicIp,InsufficientAddressCapacityException>() {
                 @Override
                 public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
                     Account owner = _accountDao.acquireInLockTable(ownerId);
@@ -893,7 +895,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
                     return ip;
                 }
-            }, InsufficientAddressCapacityException.class);
+            });
 
             return ip;
         } finally {
@@ -1017,7 +1019,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
                 s_logger.debug("Associate IP address lock acquired");
             }
 
-            ip = Transaction.executeWithException(new TransactionCallbackWithException<PublicIp>() {
+            ip = Transaction.execute(new TransactionCallbackWithException<PublicIp,InsufficientAddressCapacityException>() {
                 @Override
                 public PublicIp doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
                     PublicIp ip = fetchNewPublicIp(zone.getId(), null, null, ipOwner, vlanType, null, false, assign, null, isSystem, null);
@@ -1034,7 +1036,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
                     return ip;
                 }
-            }, InsufficientAddressCapacityException.class);
+            });
 
         } finally {
             if (accountToLock != null) {
@@ -1059,9 +1061,9 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
         try {
             portableIpLock.lock(5);
 
-            ipaddr = Transaction.executeWithException(new TransactionCallbackWithException<IPAddressVO>() {
+            ipaddr = Transaction.execute(new TransactionCallbackWithException<IPAddressVO,InsufficientAddressCapacityException>() {
                 @Override
-                public IPAddressVO doInTransaction(TransactionStatus status) throws Exception {
+                public IPAddressVO doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
                     PortableIpVO allocatedPortableIp;
 
                     List<PortableIpVO> portableIpVOs = _portableIpDao.listByRegionIdAndState(1, PortableIp.State.Free);
@@ -1120,7 +1122,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
 
                     return ipaddr;
                 }
-            }, InsufficientAddressCapacityException.class);
+            });
         } finally {
             portableIpLock.unlock();
         }
@@ -1498,100 +1500,108 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
             throw new InvalidParameterValueException("Network " + guestNetworkFinal + " is not of a type " + TrafficType.Guest);
         }
 
-        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;
-
-                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());
-                        }
-        
-                        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);
+        Ternary<Boolean,List<NetworkOfferingVO>, Network> pair = null;
+        try {
+            pair = Transaction.execute(new TransactionCallbackWithException<Ternary<Boolean,List<NetworkOfferingVO>, Network>,Exception>() {
+                @Override
+                public Ternary<Boolean,List<NetworkOfferingVO>, Network> doInTransaction(TransactionStatus status) throws InsufficientCapacityException, ResourceAllocationException {
+                    boolean createNetwork = false;
+                    Network guestNetwork = guestNetworkFinal;
+
+                    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");
                         }
-                    } 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;
+            
+                    // 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());
+                            }
+            
+                            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 {
-                            addr.setSourceNat(false);
+                            throw new CloudRuntimeException("Required network offering id=" + requiredOfferings.get(0).getId() + " is not in " + NetworkOffering.State.Enabled);
                         }
-                        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);
                     }
+            
+                    // 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);
                 }
-                return new Ternary<Boolean,List<NetworkOfferingVO>, Network>(createNetwork, requiredOfferings, guestNetwork);
-            }
-        }, InsufficientCapacityException.class);
+            });
+        } catch (Exception e1) {
+            ExceptionUtil.rethrowRuntime(e1);
+            ExceptionUtil.rethrow(e1, InsufficientCapacityException.class);
+            ExceptionUtil.rethrow(e1, ResourceAllocationException.class);
+            throw new IllegalStateException(e1);
+        }
 
         boolean createNetwork = pair.first();
         List<NetworkOfferingVO> requiredOfferings = pair.second();
@@ -1850,9 +1860,9 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
     @DB
     public void allocateDirectIp(final NicProfile nic, final DataCenter dc, final VirtualMachineProfile vm, final Network network, final String requestedIpv4, final String requestedIpv6)
         throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException {
-        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+        Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientAddressCapacityException>() {
             @Override
-            public Object doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+            public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientAddressCapacityException {
                 //This method allocates direct ip for the Shared network in Advance zones
                 boolean ipv4 = false;
 
@@ -1913,11 +1923,8 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
                     nic.setIp6Dns1(dc.getIp6Dns1());
                     nic.setIp6Dns2(dc.getIp6Dns2());
                 }
-
-                return null;
             }
-        }, InsufficientAddressCapacityException.class);
-
+        });
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 e0e90d9..c9a14cd 100755
--- a/server/src/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/com/cloud/network/NetworkServiceImpl.java
@@ -1304,9 +1304,9 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             final Account ownerFinal, final String cidr, final boolean createVlan) throws InsufficientCapacityException,
             ResourceAllocationException {
         try {
-            return Transaction.executeWithException(new TransactionCallbackWithException<Network>() {
+            return Transaction.execute(new TransactionCallbackWithException<Network,Exception>() {
                 @Override
-                public Network doInTransaction(TransactionStatus status) throws Exception {
+                public Network doInTransaction(TransactionStatus status) throws InsufficientCapacityException, ResourceAllocationException {
                     Account owner = ownerFinal;
                     Boolean subdomainAccess = subdomainAccessFinal;
                     
@@ -1368,7 +1368,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
                     }
                     return network;
                 }
-            }, Exception.class);
+            });
         } catch (Exception e) {
             ExceptionUtil.rethrowRuntime(e);
             ExceptionUtil.rethrow(e, InsufficientCapacityException.class);
@@ -3898,7 +3898,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
 
         final NetworkOfferingVO ntwkOffFinal = ntwkOff; 
         try {
-            return Transaction.executeWithException(new TransactionCallbackWithException<Network>() {
+            return Transaction.execute(new TransactionCallbackWithException<Network,Exception>() {
                 @Override
                 public Network doInTransaction(TransactionStatus status) throws ResourceAllocationException, InsufficientCapacityException {
                     //lock datacenter as we need to get mac address seq from there
@@ -3941,7 +3941,7 @@ public class NetworkServiceImpl extends ManagerBase implements  NetworkService {
             
                     return privateNetwork;
                 }
-            }, Exception.class);
+            });
         } catch (Exception e) {
             ExceptionUtil.rethrowRuntime(e);
             ExceptionUtil.rethrow(e, ResourceAllocationException.class);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 73b45ab..4719a42 100755
--- a/server/src/com/cloud/network/StorageNetworkManagerImpl.java
+++ b/server/src/com/cloud/network/StorageNetworkManagerImpl.java
@@ -224,7 +224,7 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
         StorageNetworkIpRangeVO range = null;
 
         final String endIpFinal = endIp;
-        return Transaction.executeWithException(new TransactionCallbackWithException<StorageNetworkIpRangeVO>() {
+        return Transaction.execute(new TransactionCallbackWithException<StorageNetworkIpRangeVO,SQLException>() {
             @Override
             public StorageNetworkIpRangeVO doInTransaction(TransactionStatus status) throws SQLException {
                 StorageNetworkIpRangeVO range = new StorageNetworkIpRangeVO(zoneId, podId, nw.getId(), startIp, endIpFinal, vlan, netmask, cmd.getGateWay());
@@ -244,7 +244,7 @@ public class StorageNetworkManagerImpl extends ManagerBase implements StorageNet
 
                 return range;
             }
-        }, SQLException.class);
+        });
     }
 
     private String getInUseIpAddress(long rangeId) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 e0d23ad..01504ab 100644
--- a/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
+++ b/server/src/com/cloud/network/firewall/FirewallManagerImpl.java
@@ -226,7 +226,7 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
 
         final Long accountIdFinal = accountId;
         final Long domainIdFinal = domainId;
-        return Transaction.executeWithException(new TransactionCallbackWithException<FirewallRuleVO>() {
+        return Transaction.execute(new TransactionCallbackWithException<FirewallRuleVO,NetworkRuleConflictException>() {
             @Override
             public FirewallRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
                 FirewallRuleVO newRule = new FirewallRuleVO(xId, ipAddrId, portStart, portEnd, protocol.toLowerCase(), networkId,
@@ -244,7 +244,7 @@ public class FirewallManagerImpl extends ManagerBase implements FirewallService,
                 
                 return newRule;
             }
-        }, NetworkRuleConflictException.class);
+        });
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 65bc699..801d252 100755
--- a/server/src/com/cloud/network/guru/DirectNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectNetworkGuru.java
@@ -58,6 +58,7 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.ExceptionUtil;
 import com.cloud.vm.Nic;
@@ -237,9 +238,9 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
             InsufficientAddressCapacityException {
 
         try {
-            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientCapacityException>() {
                 @Override
-                public Object doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
+                public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException {
                     _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) {
@@ -249,10 +250,8 @@ public class DirectNetworkGuru extends AdapterBase implements NetworkGuru {
                             _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);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 691135f..053a786 100755
--- a/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
+++ b/server/src/com/cloud/network/guru/DirectPodBasedNetworkGuru.java
@@ -52,9 +52,8 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.Nic;
@@ -170,9 +169,9 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru {
             InsufficientAddressCapacityException, ConcurrentOperationException {
         final DataCenter dc = _dcDao.findById(pod.getDataCenterId());
         if (nic.getIp4Address() == null) {
-            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InsufficientAddressCapacityException>() {
                 @Override
-                public Object doInTransaction(TransactionStatus status) throws InsufficientAddressCapacityException {
+                public void doInTransactionWithoutResult(TransactionStatus status) throws InsufficientAddressCapacityException {
                     PublicIp ip = null;
                     List<PodVlanMapVO> podRefs = _podVlanDao.listPodVlanMapsByPod(pod.getId());
                     String podRangeGateway = null;
@@ -213,10 +212,8 @@ public class DirectPodBasedNetworkGuru extends DirectNetworkGuru {
                             _networkMgr.savePlaceholderNic(network, nic.getIp4Address(), null, VirtualMachine.Type.DomainRouter);
                         }
                     }
-                    
-                    return null;
                 }
-            }, InsufficientAddressCapacityException.class);
+            });
         }
         nic.setDns1(dc.getDns1());
         nic.setDns2(dc.getDns2());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 60bb40b..780a942 100755
--- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
+++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java
@@ -1456,7 +1456,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                 Purpose.LoadBalancing, FirewallRuleType.User, networkId, null);
 
 
-        return Transaction.executeWithException(new TransactionCallbackWithException<LoadBalancerVO>() {
+        return Transaction.execute(new TransactionCallbackWithException<LoadBalancerVO,NetworkRuleConflictException>() {
             @Override
             public LoadBalancerVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
                 LoadBalancerVO newRule = new LoadBalancerVO(xId, name, description,
@@ -1507,7 +1507,7 @@ public class LoadBalancingRulesManagerImpl<Type> extends ManagerBase implements
                     }
                 }
             }
-        }, NetworkRuleConflictException.class);
+        });
 
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 83f0493..d98dd29 100755
--- a/server/src/com/cloud/network/rules/RulesManagerImpl.java
+++ b/server/src/com/cloud/network/rules/RulesManagerImpl.java
@@ -79,6 +79,7 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.Ip;
@@ -312,7 +313,7 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
 
             final Ip dstIpFinal = dstIp;
             final IPAddressVO ipAddressFinal = ipAddress;
-            return Transaction.executeWithException(new TransactionCallbackWithException<PortForwardingRuleVO>() {
+            return Transaction.execute(new TransactionCallbackWithException<PortForwardingRuleVO,NetworkRuleConflictException>() {
                 @Override
                 public PortForwardingRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
                     PortForwardingRuleVO newRule = new PortForwardingRuleVO(rule.getXid(), rule.getSourceIpAddressId(),
@@ -350,7 +351,7 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
                         throw new CloudRuntimeException("Unable to add rule for the ip id=" + ipAddrId, e);
                     }
                 }
-            }, NetworkRuleConflictException.class);
+            });
 
         } finally {
             // release ip address if ipassoc was perfored
@@ -395,7 +396,7 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
 
         //String dstIp = _networkModel.getIpInNetwork(ipAddress.getAssociatedWithVmId(), networkId);
         final String dstIp = ipAddress.getVmIp();
-        return Transaction.executeWithException(new TransactionCallbackWithException<StaticNatRule>() {
+        return Transaction.execute(new TransactionCallbackWithException<StaticNatRule,NetworkRuleConflictException>() {
             @Override
             public StaticNatRule doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
 
@@ -434,7 +435,7 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
                     throw new CloudRuntimeException("Unable to add static nat rule for the ip id=" + newRule.getSourceIpAddressId(), e);
                 }
             }
-        }, NetworkRuleConflictException.class);
+        });
 
     }
 
@@ -1154,9 +1155,9 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
             final boolean openFirewall, final Account caller, final int... ports) throws NetworkRuleConflictException {
         final FirewallRuleVO[] rules = new FirewallRuleVO[ports.length];
 
-        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+        Transaction.execute(new TransactionCallbackWithExceptionNoReturn<NetworkRuleConflictException>() {
             @Override
-            public Object doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
+            public void doInTransactionWithoutResult(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);
@@ -1167,10 +1168,8 @@ public class RulesManagerImpl extends ManagerBase implements RulesManager, Rules
                                 rules[i].getId(), ip.getAssociatedWithNetworkId());
                     }
                 }
-                
-                return null;
             }
-        }, NetworkRuleConflictException.class);
+        });
 
         boolean success = false;
         try {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 85b01b3..c7b6e1e 100755
--- a/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
+++ b/server/src/com/cloud/network/security/SecurityGroupManagerImpl.java
@@ -1101,7 +1101,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
         // check permissions
         _accountMgr.checkAccess(caller, null, true, group);
 
-        return Transaction.executeWithException(new TransactionCallbackWithException<Boolean>() {
+        return Transaction.execute(new TransactionCallbackWithException<Boolean,ResourceInUseException>() {
             @Override
             public Boolean doInTransaction(TransactionStatus status) throws ResourceInUseException {
                 SecurityGroupVO group = _securityGroupDao.lockRow(groupId, true);
@@ -1127,7 +1127,7 @@ public class SecurityGroupManagerImpl extends ManagerBase implements SecurityGro
         
                 return true;
             }
-        }, ResourceInUseException.class);
+        });
 
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 8ab06b8..c072bfa 100644
--- a/server/src/com/cloud/network/vpc/VpcManagerImpl.java
+++ b/server/src/com/cloud/network/vpc/VpcManagerImpl.java
@@ -121,6 +121,7 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.SearchCriteria.Op;
 import com.cloud.utils.db.Transaction;
@@ -1405,7 +1406,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
         final PhysicalNetwork physNetFinal = physNet;
         VpcGatewayVO gatewayVO = null;
         try {
-            gatewayVO = Transaction.executeWithException(new TransactionCallbackWithException<VpcGatewayVO>() {
+            gatewayVO = Transaction.execute(new TransactionCallbackWithException<VpcGatewayVO,Exception>() {
                 @Override
                 public VpcGatewayVO doInTransaction(TransactionStatus status) throws ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException {
                     s_logger.debug("Creating Private gateway for VPC " + vpc);
@@ -1465,7 +1466,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                     
                     return gatewayVO;
                 }
-            }, Exception.class);
+            });
         } catch (Exception e) {
             ExceptionUtil.rethrowRuntime(e);
             ExceptionUtil.rethrow(e, InsufficientCapacityException.class);
@@ -1822,7 +1823,7 @@ 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");
         }
 
-        return Transaction.executeWithException(new TransactionCallbackWithException<StaticRouteVO>() {
+        return Transaction.execute(new TransactionCallbackWithException<StaticRouteVO, NetworkRuleConflictException>() {
             @Override
             public StaticRouteVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
                 StaticRouteVO newRoute = new StaticRouteVO(gateway.getId(), cidr, vpc.getId(), vpc.getAccountId(), vpc.getDomainId());
@@ -1838,7 +1839,7 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                 
                 return newRoute;
             }
-        }, NetworkRuleConflictException.class);
+        });
     }
 
     protected boolean isCidrBlacklisted(String cidr, long zoneId) {
@@ -1981,9 +1982,9 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                 }
 
                 try {
-                    Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+                    Transaction.execute(new TransactionCallbackWithExceptionNoReturn<Exception>() {
                         @Override
-                        public Object doInTransaction(TransactionStatus status) throws Exception {
+                        public void doInTransactionWithoutResult(TransactionStatus status) throws Exception {
                             // Cleanup inactive VPCs
                             List<VpcVO> inactiveVpcs = _vpcDao.listInactiveVpcs();
                             s_logger.info("Found " + inactiveVpcs.size() + " removed VPCs to cleanup");
@@ -1991,10 +1992,8 @@ public class VpcManagerImpl extends ManagerBase implements VpcManager, VpcProvis
                                 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 {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 7912df4..7cf3167 100755
--- a/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
+++ b/server/src/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
@@ -193,7 +193,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
         final String newIpRange = NetUtils.long2Ip(++startIp) + "-" + range[1];
         final String sharedSecret = PasswordGenerator.generatePresharedKey(_pskLength);
         
-        return Transaction.executeWithException(new TransactionCallbackWithException<RemoteAccessVpn>() {
+        return Transaction.execute(new TransactionCallbackWithException<RemoteAccessVpn, NetworkRuleConflictException>() {
             @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);
@@ -201,7 +201,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase implements RemoteAcc
                         publicIpId, range[0], newIpRange, sharedSecret);
                 return _remoteAccessVpnDao.persist(vpnVO);
             }
-        }, NetworkRuleConflictException.class);
+        });
     }
 
     private void validateRemoteAccessVpnConfiguration() throws ConfigurationException {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 193a49e..22e2020 100755
--- a/server/src/com/cloud/projects/ProjectManagerImpl.java
+++ b/server/src/com/cloud/projects/ProjectManagerImpl.java
@@ -84,7 +84,7 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.sun.mail.smtp.SMTPMessage;
@@ -469,9 +469,9 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
         //verify permissions
         _accountMgr.checkAccess(caller,AccessType.ModifyProject, true, _accountMgr.getAccount(project.getProjectAccountId()));
 
-        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+        Transaction.execute(new TransactionCallbackWithExceptionNoReturn<ResourceAllocationException>() {
             @Override
-            public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException {
+            public void doInTransactionWithoutResult(TransactionStatus status) throws ResourceAllocationException {
                 if (displayText != null) {
                     project.setDisplayText(displayText);
                     _projectDao.update(projectId, project);
@@ -509,10 +509,8 @@ public class ProjectManagerImpl extends ManagerBase implements ProjectManager {
                         s_logger.trace("Future owner " + newOwnerName + "is already the owner of the project id=" + projectId);
                     }
                }
-                
-                return null;
             }
-        }, ResourceAllocationException.class);
+        });
 
 
         return _projectDao.findById(projectId);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 bfe32ec..7417754 100755
--- a/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
+++ b/server/src/com/cloud/resourcelimit/ResourceLimitManagerImpl.java
@@ -91,8 +91,7 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.db.SearchCriteria.Func;
 import com.cloud.utils.db.SearchCriteria.Op;
@@ -379,9 +378,9 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
         }
 
         final Project projectFinal = project;
-        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+        Transaction.execute(new TransactionCallbackWithExceptionNoReturn<ResourceAllocationException>() {
             @Override
-            public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException {
+            public void doInTransactionWithoutResult(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();
@@ -423,10 +422,8 @@ public class ResourceLimitManagerImpl extends ManagerBase implements ResourceLim
                     }
                     domainId = domain.getParent();
                 }
-                
-                return null;
             }
-        }, ResourceAllocationException.class);
+        });
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 1761a32..f8141ee 100755
--- a/server/src/com/cloud/server/ConfigurationServerImpl.java
+++ b/server/src/com/cloud/server/ConfigurationServerImpl.java
@@ -109,6 +109,7 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
@@ -837,9 +838,9 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
         final HostPodVO pod = new HostPodVO(podName, zoneId, gateway, cidrAddress, cidrSize, ipRange);
         try {
             final String endIpFinal = endIp;
-            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<InternalErrorException>() {
                 @Override
-                public Object doInTransaction(TransactionStatus status) throws InternalErrorException {
+                public void doInTransactionWithoutResult(TransactionStatus status) throws InternalErrorException {
                     if (_podDao.persist(pod) == null) {
                         throw new InternalErrorException("Failed to create new pod. Please contact Cloud Support.");
                     }
@@ -860,10 +861,8 @@ public class ConfigurationServerImpl extends ManagerBase implements Configuratio
                     } else {
                         _zoneDao.addLinkLocalIpAddress(zoneId, pod.getId(), linkLocalIpRanges[0], linkLocalIpRanges[1]);
                     }
-                    
-                    return null;
                 }
-            }, InternalErrorException.class);
+            });
         } catch (Exception e) {
             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.");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 6f76a3a..9370218 100755
--- a/server/src/com/cloud/test/DatabaseConfig.java
+++ b/server/src/com/cloud/test/DatabaseConfig.java
@@ -59,6 +59,7 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionLegacy;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.net.NfsUtils;
@@ -419,9 +420,9 @@ public class DatabaseConfig {
             final DbConfigXMLHandler handler = new DbConfigXMLHandler();
             handler.setParent(this);
 
-            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<Exception>() {
                 @Override
-                public Object doInTransaction(TransactionStatus status) throws Exception {
+                public void doInTransactionWithoutResult(TransactionStatus status) throws Exception {
                     // Save user configured values for all fields
                     saxParser.parse(configFile, handler);
         
@@ -429,10 +430,8 @@ public class DatabaseConfig {
                     saveVMTemplate();
                     saveRootDomain();
                     saveDefaultConfiguations();
-
-                    return null;
                 }
-            }, Exception.class);
+            });
 
             // Check pod CIDRs against each other, and against the guest ip network/netmask
             pzc.checkAllPodCidrSubnets();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 5053a97..86f9855 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -243,6 +243,7 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.exception.ExecutionException;
@@ -1412,9 +1413,9 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
             s_logger.debug("Recovering vm " + vmId);
         }
 
-        Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+        Transaction.execute(new TransactionCallbackWithExceptionNoReturn<ResourceAllocationException>() {
             @Override
-            public Object doInTransaction(TransactionStatus status) throws ResourceAllocationException {
+            public void doInTransactionWithoutResult(TransactionStatus status) throws ResourceAllocationException {
         
                 Account account = _accountDao.lockRow(vm.getAccountId(), true);
         
@@ -1473,10 +1474,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
                 //Update Resource Count for the given account
                 resourceCountIncrement(account.getId(), new Long(serviceOffering.getCpu()),
                         new Long(serviceOffering.getRamSize()));
-                
-                return null;
             }
-        }, ResourceAllocationException.class);
+        });
 
 
         return _vmDao.findById(vmId);
@@ -2785,7 +2784,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
             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>() {
+        return Transaction.execute(new TransactionCallbackWithException<UserVmVO,InsufficientCapacityException>() {
             @Override
             public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCapacityException {
                 UserVmVO vm = new UserVmVO(id, instanceName, displayName,
@@ -2878,7 +2877,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir
                         new Long(offering.getRamSize()));
                 return vm;
             }
-        }, InsufficientCapacityException.class);
+        });
     }
 
     private void validateUserData(String userData, HTTPMethod httpmethod) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 18f17b8..cd064f5 100644
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -92,6 +92,7 @@ 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.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.fsm.NoTransitionException;
@@ -487,9 +488,9 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
     @DB
     protected void processAnswer(final VMSnapshotVO vmSnapshot, UserVmVO  userVm, final Answer as, Long hostId) {
         try {
-            Transaction.executeWithException(new TransactionCallbackWithException<Object>() {
+            Transaction.execute(new TransactionCallbackWithExceptionNoReturn<NoTransitionException>() {
                 @Override
-                public Object doInTransaction(TransactionStatus status) throws NoTransitionException {
+                public void doInTransactionWithoutResult(TransactionStatus status) throws NoTransitionException {
                     if (as instanceof CreateVMSnapshotAnswer) {
                         CreateVMSnapshotAnswer answer = (CreateVMSnapshotAnswer) as;
                         finalizeCreate(vmSnapshot, answer.getVolumeTOs());
@@ -503,10 +504,8 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
                         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);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/edeaf981/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 1149085..e2d33ac 100644
--- a/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
+++ b/server/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerManagerImpl.java
@@ -71,7 +71,6 @@ 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;
@@ -162,7 +161,7 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A
         boolean success = true;
         ApplicationLoadBalancerRuleVO newRule = null;
         try {
-            newRule = Transaction.executeWithException(new TransactionCallbackWithException<ApplicationLoadBalancerRuleVO>() {
+            newRule = Transaction.execute(new TransactionCallbackWithException<ApplicationLoadBalancerRuleVO,NetworkRuleConflictException>() {
                 @Override
                 public ApplicationLoadBalancerRuleVO doInTransaction(TransactionStatus status) throws NetworkRuleConflictException {
                     //1) Persist the rule
@@ -183,7 +182,7 @@ public class ApplicationLoadBalancerManagerImpl extends ManagerBase implements A
                     
                     return newRule;
                 }
-            }, NetworkRuleConflictException.class);
+            });
             
             return newRule;
         } catch (Exception e) {