You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ke...@apache.org on 2014/01/09 23:33:58 UTC

[10/13] git commit: updated refs/heads/master to 1e2e1ea

CLOUDSTACK-5767: Remove the logic of using underlying job related fields for volume specific logic.


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

Branch: refs/heads/master
Commit: ad6454d2bfff4b517b8dfca21b02f923ac8e9a51
Parents: 69f4983
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Jan 3 13:10:17 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Thu Jan 9 14:29:12 2014 -0800

----------------------------------------------------------------------
 .../com/cloud/vm/VirtualMachineManagerImpl.java | 134 +++++++++----------
 .../com/cloud/storage/VolumeApiServiceImpl.java |  67 ++++------
 .../vm/snapshot/VMSnapshotManagerImpl.java      |  50 +++----
 3 files changed, 109 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad6454d2/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 71952dd..9d4cb04 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -183,7 +183,7 @@ 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.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.db.TransactionCallbackWithException;
 import com.cloud.utils.db.TransactionCallbackWithExceptionNoReturn;
 import com.cloud.utils.db.TransactionLegacy;
@@ -4138,9 +4138,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 VmWorkJobVO workJob = null;
 
                 _vmDao.lockRow(vm.getId(), true);
@@ -4171,16 +4171,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
                 }
 
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmStateSyncOutcome((VmWorkJobVO)result[0],
                 VirtualMachine.PowerState.PowerOn, vm.getId(), null);
     }
 
@@ -4191,9 +4189,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 _vmDao.lockRow(vm.getId(), true);
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
@@ -4223,15 +4221,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
                 }
 
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmStateSyncOutcome((VmWorkJobVO)result[0],
                 VirtualMachine.PowerState.PowerOff, vm.getId(), null);
     }
 
@@ -4244,9 +4241,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 _vmDao.lockRow(vm.getId(), true);
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
@@ -4276,15 +4273,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
                 }
 
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVirtualMachineOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmJobVirtualMachineOutcome((VmWorkJobVO)result[0],
                 vm.getId());
     }
 
@@ -4295,10 +4291,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
-                _vmDao.lockRow(vm.getId(), true);
+            public Object[] doInTransaction(TransactionStatus status) {
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
                         VirtualMachine.Type.Instance, vm.getId(),
@@ -4326,15 +4321,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
                 }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmStateSyncOutcome((VmWorkJobVO)result[0],
                 VirtualMachine.PowerState.PowerOn, vm.getId(), vm.getPowerHostId());
     }
 
@@ -4348,9 +4342,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
 
                 _vmDao.lockRow(vm.getId(), true);
 
@@ -4381,15 +4375,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
                 }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmStateSyncOutcome((VmWorkJobVO)result[0],
                 VirtualMachine.PowerState.PowerOn, vm.getId(), destHostId);
     }
 
@@ -4402,10 +4395,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
-                _vmDao.lockRow(vm.getId(), true);
+            public Object[] doInTransaction(TransactionStatus status) {
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
                         VirtualMachine.Type.Instance, vm.getId(),
@@ -4434,15 +4426,15 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
                 }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVirtualMachineOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
+        return new VmJobVirtualMachineOutcome((VmWorkJobVO)result[0], vm.getId());
     }
 
     public Outcome<VirtualMachine> migrateVmStorageThroughJobQueue(
@@ -4454,10 +4446,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
-                _vmDao.lockRow(vm.getId(), true);
+            public Object[] doInTransaction(TransactionStatus status) {
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
                         VirtualMachine.Type.Instance, vm.getId(),
@@ -4486,15 +4477,15 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
                 }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVirtualMachineOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
+        return new VmJobVirtualMachineOutcome((VmWorkJobVO)result[0], vm.getId());
     }
 
     public Outcome<VirtualMachine> addVmToNetworkThroughJobQueue(
@@ -4504,10 +4495,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         final User user = context.getCallingUser();
         final Account account = context.getCallingAccount();
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
-                _vmDao.lockRow(vm.getId(), true);
+            public Object[] doInTransaction(TransactionStatus status) {
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
                         VirtualMachine.Type.Instance, vm.getId(),
@@ -4536,15 +4526,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
                 }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVirtualMachineOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
+        return new VmJobVirtualMachineOutcome((VmWorkJobVO)result[0], vm.getId());
     }
 
     public Outcome<VirtualMachine> removeNicFromVmThroughJobQueue(
@@ -4554,10 +4543,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         final User user = context.getCallingUser();
         final Account account = context.getCallingAccount();
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
-                _vmDao.lockRow(vm.getId(), true);
+            public Object[] doInTransaction(TransactionStatus status) {
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
                         VirtualMachine.Type.Instance, vm.getId(),
@@ -4586,15 +4574,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
                 }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVirtualMachineOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
+        return new VmJobVirtualMachineOutcome((VmWorkJobVO)result[0], vm.getId());
     }
 
     public Outcome<VirtualMachine> removeVmFromNetworkThroughJobQueue(
@@ -4604,10 +4591,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         final User user = context.getCallingUser();
         final Account account = context.getCallingAccount();
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
-                _vmDao.lockRow(vm.getId(), true);
+            public Object[] doInTransaction(TransactionStatus status) {
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
                         VirtualMachine.Type.Instance, vm.getId(),
@@ -4636,15 +4622,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
                 }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVirtualMachineOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
+        return new VmJobVirtualMachineOutcome((VmWorkJobVO)result[0], vm.getId());
     }
 
     public Outcome<VirtualMachine> reconfigureVmThroughJobQueue(
@@ -4656,10 +4641,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
-                _vmDao.lockRow(vm.getId(), true);
+            public Object[] doInTransaction(TransactionStatus status) {
 
                 List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
                         VirtualMachine.Type.Instance, vm.getId(),
@@ -4688,12 +4672,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
                     _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
                 }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        return new VmJobVirtualMachineOutcome((VmWorkJobVO)context.getContextParameter("workJob"), vm.getId());
+        final long jobId = (Long)result[1];
+        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+
+        return new VmJobVirtualMachineOutcome((VmWorkJobVO)result[0], vm.getId());
     }
 
     private Pair<JobInfo.Status, String> orchestrateStart(VmWorkStart work) throws Exception {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad6454d2/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 f453289..0200233 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -28,7 +28,6 @@ import javax.inject.Inject;
 
 import org.apache.log4j.Logger;
 
-import org.apache.cloudstack.api.BaseCmd;
 import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd;
 import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd;
 import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd;
@@ -150,7 +149,6 @@ 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;
@@ -1282,7 +1280,6 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
             }
 
             _asyncMgr.updateAsyncJobAttachment(job.getId(), "volume", volumeId);
-            _asyncMgr.updateAsyncJobStatus(job.getId(), BaseCmd.PROGRESS_INSTANCE_CREATED, Long.toString(volumeId));
         }
 
         VolumeVO newVol = _volumeDao.findById(volumeOnPrimaryStorage.getId());
@@ -1403,7 +1400,6 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
             }
 
             _asyncMgr.updateAsyncJobAttachment(job.getId(), "volume", volumeId);
-            _asyncMgr.updateAsyncJobStatus(job.getId(), BaseCmd.PROGRESS_INSTANCE_CREATED, volumeId.toString());
         }
 
         AsyncJobExecutionContext jobContext = AsyncJobExecutionContext.getCurrentExecutionContext();
@@ -2135,9 +2131,9 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
         final VMInstanceVO vm = _vmInstanceDao.findById(vmId);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 VmWorkJobVO workJob = null;
 
                 _vmInstanceDao.lockRow(vm.getId(), true);
@@ -2159,16 +2155,17 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
                 _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                AsyncJobVO jobVo = _jobMgr.getAsyncJob(workJob.getId());
+                s_logger.debug("New job " + workJob.getId() + ", result field: " + jobVo.getResult());
+
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVolumeOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmJobVolumeOutcome((VmWorkJobVO)result[0],
                 volumeId);
     }
 
@@ -2180,9 +2177,9 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
         final VMInstanceVO vm = _vmInstanceDao.findById(vmId);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 VmWorkJobVO workJob = null;
 
                 _vmInstanceDao.lockRow(vm.getId(), true);
@@ -2203,16 +2200,14 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
                 _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVolumeOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmJobVolumeOutcome((VmWorkJobVO)result[0],
                 volumeId);
     }
 
@@ -2225,9 +2220,9 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
         final VMInstanceVO vm = _vmInstanceDao.findById(vmId);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 VmWorkJobVO workJob = null;
 
                 _vmInstanceDao.lockRow(vm.getId(), true);
@@ -2249,16 +2244,14 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
                 _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVolumeOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmJobVolumeOutcome((VmWorkJobVO)result[0],
                 volumeId);
     }
 
@@ -2271,9 +2264,9 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
         final VMInstanceVO vm = _vmInstanceDao.findById(vmId);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 VmWorkJobVO workJob = null;
 
                 _vmInstanceDao.lockRow(vm.getId(), true);
@@ -2295,16 +2288,14 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
                 _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVolumeOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmJobVolumeOutcome((VmWorkJobVO)result[0],
                 volumeId);
     }
 
@@ -2317,9 +2308,9 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
         final VMInstanceVO vm = _vmInstanceDao.findById(vmId);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 VmWorkJobVO workJob = null;
 
                 _vmInstanceDao.lockRow(vm.getId(), true);
@@ -2342,16 +2333,14 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
 
                 _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobSnapshotOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmJobSnapshotOutcome((VmWorkJobVO)result[0],
                 snapshotId);
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ad6454d2/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 f7c1120..40476d0 100644
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -78,7 +78,7 @@ 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.TransactionCallbackNoReturn;
+import com.cloud.utils.db.TransactionCallback;
 import com.cloud.utils.db.TransactionStatus;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.vm.UserVmVO;
@@ -814,9 +814,9 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
 
         final VMInstanceVO vm = _vmInstanceDao.findById(vmId);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 VmWorkJobVO workJob = null;
 
                 _vmInstanceDao.lockRow(vm.getId(), true);
@@ -838,16 +838,14 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
 
                 _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVMSnapshotOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmJobVMSnapshotOutcome((VmWorkJobVO)result[0],
                 vmSnapshotId);
     }
 
@@ -859,9 +857,9 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
 
         final VMInstanceVO vm = _vmInstanceDao.findById(vmId);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 VmWorkJobVO workJob = null;
 
                 _vmInstanceDao.lockRow(vm.getId(), true);
@@ -883,16 +881,14 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
 
                 _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVMSnapshotOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmJobVMSnapshotOutcome((VmWorkJobVO)result[0],
                 vmSnapshotId);
     }
 
@@ -904,9 +900,9 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
 
         final VMInstanceVO vm = _vmInstanceDao.findById(vmId);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 VmWorkJobVO workJob = null;
 
                 _vmInstanceDao.lockRow(vm.getId(), true);
@@ -928,16 +924,14 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
 
                 _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVMSnapshotOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmJobVMSnapshotOutcome((VmWorkJobVO)result[0],
                 vmSnapshotId);
     }
 
@@ -949,9 +943,9 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
 
         final VMInstanceVO vm = _vmInstanceDao.findById(vmId);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
+        Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
             @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) {
+            public Object[] doInTransaction(TransactionStatus status) {
                 VmWorkJobVO workJob = null;
 
                 _vmInstanceDao.lockRow(vm.getId(), true);
@@ -973,16 +967,14 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
 
                 _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
 
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(workJob.getId()));
+                return new Object[] {workJob, new Long(workJob.getId())};
             }
         });
 
-        final long jobId = (Long)context.getContextParameter("jobId");
+        final long jobId = (Long)result[1];
         AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
 
-        return new VmJobVirtualMachineOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
+        return new VmJobVirtualMachineOutcome((VmWorkJobVO)result[0],
                 vmId);
     }