From ad6454d2bfff4b517b8dfca21b02f923ac8e9a51 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Fri, 3 Jan 2014 13:10:17 -0800 Subject: [PATCH] CLOUDSTACK-5767: Remove the logic of using underlying job related fields for volume specific logic. --- .../cloud/vm/VirtualMachineManagerImpl.java | 134 ++++++++---------- .../cloud/storage/VolumeApiServiceImpl.java | 67 ++++----- .../vm/snapshot/VMSnapshotManagerImpl.java | 50 +++---- 3 files changed, 109 insertions(+), 142 deletions(-) diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 71952dd723f..9d4cb04215b 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() { @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() { @Override - public void doInTransactionWithoutResult(TransactionStatus status) { + public Object[] doInTransaction(TransactionStatus status) { _vmDao.lockRow(vm.getId(), true); List 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() { @Override - public void doInTransactionWithoutResult(TransactionStatus status) { + public Object[] doInTransaction(TransactionStatus status) { _vmDao.lockRow(vm.getId(), true); List 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() { @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - _vmDao.lockRow(vm.getId(), true); + public Object[] doInTransaction(TransactionStatus status) { List 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() { @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() { @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - _vmDao.lockRow(vm.getId(), true); + public Object[] doInTransaction(TransactionStatus status) { List 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 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() { @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - _vmDao.lockRow(vm.getId(), true); + public Object[] doInTransaction(TransactionStatus status) { List 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 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() { @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - _vmDao.lockRow(vm.getId(), true); + public Object[] doInTransaction(TransactionStatus status) { List 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 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() { @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - _vmDao.lockRow(vm.getId(), true); + public Object[] doInTransaction(TransactionStatus status) { List 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 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() { @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - _vmDao.lockRow(vm.getId(), true); + public Object[] doInTransaction(TransactionStatus status) { List 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 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() { @Override - public void doInTransactionWithoutResult(TransactionStatus status) { - _vmDao.lockRow(vm.getId(), true); + public Object[] doInTransaction(TransactionStatus status) { List 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 orchestrateStart(VmWorkStart work) throws Exception { diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java index f453289b455..0200233dd5e 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() { @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() { @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() { @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() { @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() { @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); } diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java index f7c1120b57d..40476d02aa0 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() { @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() { @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() { @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() { @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); }