Updated Branches:
  refs/heads/master 96eeceba8 -> aa72b76ae

CLOUDSTACK-669: put system vm work under new vmsync model


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

Branch: refs/heads/master
Commit: aa72b76aec3478a047fb4e6edde77a280e2f1782
Parents: 96eeceb
Author: Kelven Yang <[email protected]>
Authored: Fri Dec 6 15:36:54 2013 -0800
Committer: Kelven Yang <[email protected]>
Committed: Fri Dec 6 16:53:11 2013 -0800

----------------------------------------------------------------------
 ...spring-engine-orchestration-core-context.xml |  14 +-
 .../com/cloud/vm/VirtualMachineManagerImpl.java | 933 +++++++++----------
 .../spring-server-core-managers-context.xml     |   4 +-
 .../storage/snapshot/SnapshotSchedulerImpl.java |  10 +-
 .../src/com/cloud/vm/SystemVmLoadScanner.java   |  15 +-
 5 files changed, 497 insertions(+), 479 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aa72b76a/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
----------------------------------------------------------------------
diff --git 
a/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
 
b/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
index 880002c..0c76f00 100644
--- 
a/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
+++ 
b/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml
@@ -20,11 +20,16 @@
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        xmlns:context="http://www.springframework.org/schema/context";
        xmlns:aop="http://www.springframework.org/schema/aop";
+       xmlns:util="http://www.springframework.org/schema/util";
+       
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                       
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
-                      http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+                      http://www.springframework.org/schema/aop 
+                      
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                       http://www.springframework.org/schema/context
-                      
http://www.springframework.org/schema/context/spring-context-3.0.xsd";
+                      
http://www.springframework.org/schema/context/spring-context-3.0.xsd
+                      http://www.springframework.org/schema/util
+                      
http://www.springframework.org/schema/util/spring-util-3.0.xsd";
                       >
 
     <bean id="clusterBasedAgentLoadBalancerPlanner"
@@ -68,5 +73,10 @@
     <bean id="virtualMachineEntityImpl" 
class="org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityImpl" 
/>
     
     <bean id="virtualMachinePowerStateSyncImpl" 
class="com.cloud.vm.VirtualMachinePowerStateSyncImpl" />
+    <bean id= "vmWorkJobDispatcher" class="com.cloud.vm.VmWorkJobDispatcher">
+        <property name="name">
+            <util:constant 
static-field="com.cloud.vm.VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER"/>
+        </property>
+    </bean>
     
 </beans>

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aa72b76a/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 d0d0481..1cac898 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -4136,61 +4136,64 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
         }
         return null;
     }
-
-    public Outcome<VirtualMachine> startVmThroughJobQueue(final String vmUuid,
-        final Map<VirtualMachineProfile.Param, Object> params,
-        final DeploymentPlan planToDeploy) {
-
-        final CallContext context = CallContext.current();
+    
+    //
+    // TODO build a common pattern to reduce code duplication in following 
methods
+    // no time for this at current iteration
+    //
+    public Outcome<VirtualMachine> startVmThroughJobQueue(final String vmUuid, 
+       final Map<VirtualMachineProfile.Param, Object> params, 
+       final DeploymentPlan planToDeploy) {
+        
+       final CallContext context = CallContext.current();
         final User callingUser = context.getCallingUser();
         final Account callingAccount = context.getCallingAccount();
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) 
{
-                VmWorkJobVO workJob = null;
-
-                _vmDao.lockRow(vm.getId(), true);
-                List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(VirtualMachine.Type.Instance,
-                    vm.getId(), VmWorkStart.class.getName());
-
-                if (pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkStart.class.getName());
-
-                    workJob.setAccountId(callingAccount.getId());
-                    workJob.setUserId(callingUser.getId());
-                    workJob.setStep(VmWorkJobVO.Step.Starting);
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkStart workInfo = new 
VmWorkStart(callingUser.getId(), callingAccount.getId(), vm.getId());
-                    workInfo.setPlan(planToDeploy);
-                    workInfo.setParams(params);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-
-                // Transaction syntax sugar has a cost here
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(vm.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
-        return new 
VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
-            VirtualMachine.PowerState.PowerOn, vm.getId(), null);
+       Transaction.execute(new TransactionCallbackNoReturn () {
+               public void doInTransactionWithoutResult(TransactionStatus 
status) {
+               VmWorkJobVO workJob = null;
+               
+               _vmDao.lockRow(vm.getId(), true);
+               List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(VirtualMachine.Type.Instance, 
+                       vm.getId(), VmWorkStart.class.getName());
+               
+               if (pendingWorkJobs.size() > 0) {
+                   assert (pendingWorkJobs.size() == 1);
+                   workJob = pendingWorkJobs.get(0);
+               } else {
+                   workJob = new VmWorkJobVO(context.getContextId());
+
+                   
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                   workJob.setCmd(VmWorkStart.class.getName());
+
+                   workJob.setAccountId(callingAccount.getId());
+                   workJob.setUserId(callingUser.getId());
+                   workJob.setStep(VmWorkJobVO.Step.Starting);
+                   workJob.setVmType(vm.getType());
+                   workJob.setVmInstanceId(vm.getId());
+
+                   // save work context info (there are some duplications)
+                   VmWorkStart workInfo = new VmWorkStart(callingUser.getId(), 
callingAccount.getId(), vm.getId());
+                   workInfo.setPlan(planToDeploy);
+                   workInfo.setParams(params);
+                   workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+                   _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+               }
+               
+                   // Transaction syntax sugar has a cost here
+                   context.putContextParameter("workJob", workJob);
+                   context.putContextParameter("jobId", new 
Long(workJob.getId()));
+               }
+       });
+       
+       final long jobId = (Long)context.getContextParameter("jobId");
+       AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+       
+        return new 
VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), 
+               VirtualMachine.PowerState.PowerOn, vm.getId(), null);
     }
 
     public Outcome<VirtualMachine> stopVmThroughJobQueue(final String vmUuid, 
final boolean cleanup) {
@@ -4199,49 +4202,48 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
         final User user = context.getCallingUser();
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
-
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) 
{
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkStop.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkStop.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setStep(VmWorkJobVO.Step.Prepare);
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkStop workInfo = new VmWorkStop(user.getId(), 
account.getId(), vm.getId(), cleanup);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(vm.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
-        return new 
VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
-            VirtualMachine.PowerState.PowerOff, vm.getId(), null);
+       
+       Transaction.execute(new TransactionCallbackNoReturn () {
+               public void doInTransactionWithoutResult(TransactionStatus 
status) {
+                       _vmDao.lockRow(vm.getId(), true);
+               
+                       List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
+                               VirtualMachine.Type.Instance, vm.getId(), 
+                               VmWorkStop.class.getName());
+               
+                       VmWorkJobVO workJob = null;
+                       if (pendingWorkJobs != null && pendingWorkJobs.size() > 
0) {
+                           assert (pendingWorkJobs.size() == 1);
+                           workJob = pendingWorkJobs.get(0);
+                       } else {
+                           workJob = new VmWorkJobVO(context.getContextId());
+               
+                           
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                           workJob.setCmd(VmWorkStop.class.getName());
+               
+                           workJob.setAccountId(account.getId());
+                           workJob.setUserId(user.getId());
+                           workJob.setStep(VmWorkJobVO.Step.Prepare);
+                           workJob.setVmType(vm.getType());
+                           workJob.setVmInstanceId(vm.getId());
+               
+                           // save work context info (there are some 
duplications)
+                           VmWorkStop workInfo = new VmWorkStop(user.getId(), 
account.getId(), vm.getId(), cleanup);
+                           
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+               
+                           _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                       }
+                       
+                   context.putContextParameter("workJob", workJob);
+                   context.putContextParameter("jobId", new 
Long(workJob.getId()));
+               }
+               });
+
+       final long jobId = (Long)context.getContextParameter("jobId");
+       AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+       
+        return new 
VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), 
+               VirtualMachine.PowerState.PowerOff, vm.getId(), null);
     }
 
     public Outcome<VirtualMachine> rebootVmThroughJobQueue(final String vmUuid,
@@ -4252,49 +4254,48 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
         final User user = context.getCallingUser();
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
-
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) 
{
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkReboot.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkReboot.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setStep(VmWorkJobVO.Step.Prepare);
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkReboot workInfo = new VmWorkReboot(user.getId(), 
account.getId(), vm.getId(), params);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(vm.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
-        return new 
VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
-            vm.getId());
+       
+       Transaction.execute(new TransactionCallbackNoReturn () {
+               public void doInTransactionWithoutResult(TransactionStatus 
status) {
+                       _vmDao.lockRow(vm.getId(), true);
+               
+                       List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
+                               VirtualMachine.Type.Instance, vm.getId(), 
+                               VmWorkReboot.class.getName());
+               
+                       VmWorkJobVO workJob = null;
+                       if (pendingWorkJobs != null && pendingWorkJobs.size() > 
0) {
+                           assert (pendingWorkJobs.size() == 1);
+                           workJob = pendingWorkJobs.get(0);
+                       } else {
+                           workJob = new VmWorkJobVO(context.getContextId());
+               
+                           
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                           workJob.setCmd(VmWorkReboot.class.getName());
+               
+                           workJob.setAccountId(account.getId());
+                           workJob.setUserId(user.getId());
+                           workJob.setStep(VmWorkJobVO.Step.Prepare);
+                           workJob.setVmType(vm.getType());
+                           workJob.setVmInstanceId(vm.getId());
+               
+                           // save work context info (there are some 
duplications)
+                           VmWorkReboot workInfo = new 
VmWorkReboot(user.getId(), account.getId(), vm.getId(), params);
+                           
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+               
+                           _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                       }
+                       
+                   context.putContextParameter("workJob", workJob);
+                   context.putContextParameter("jobId", new 
Long(workJob.getId()));
+               }
+               });
+
+       final long jobId = (Long)context.getContextParameter("jobId");
+       AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+       
+        return new 
VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), 
+               vm.getId());
     }
 
     public Outcome<VirtualMachine> migrateVmThroughJobQueue(final String 
vmUuid, final long srcHostId, final DeployDestination dest) {
@@ -4304,48 +4305,47 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) 
{
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkMigrate.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkMigrate.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkMigrate workInfo = new VmWorkMigrate(user.getId(), 
account.getId(), vm.getId(), srcHostId, dest);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(vm.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
-        return new 
VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
-            VirtualMachine.PowerState.PowerOn, vm.getId(), 
vm.getPowerHostId());
+       Transaction.execute(new TransactionCallbackNoReturn () {
+               public void doInTransactionWithoutResult(TransactionStatus 
status) {
+       
+                       _vmDao.lockRow(vm.getId(), true);
+               
+                       List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
+                               VirtualMachine.Type.Instance, vm.getId(), 
+                               VmWorkMigrate.class.getName());
+               
+                       VmWorkJobVO workJob = null;
+                       if (pendingWorkJobs != null && pendingWorkJobs.size() > 
0) {
+                           assert (pendingWorkJobs.size() == 1);
+                           workJob = pendingWorkJobs.get(0);
+                       } else {
+                                   
+                           workJob = new VmWorkJobVO(context.getContextId());
+               
+                           
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                           workJob.setCmd(VmWorkMigrate.class.getName());
+               
+                           workJob.setAccountId(account.getId());
+                           workJob.setUserId(user.getId());
+                           workJob.setVmType(vm.getType());
+                           workJob.setVmInstanceId(vm.getId());
+               
+                           // save work context info (there are some 
duplications)
+                           VmWorkMigrate workInfo = new 
VmWorkMigrate(user.getId(), account.getId(), vm.getId(), srcHostId, dest);
+                           
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+               
+                           _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                       }
+                   context.putContextParameter("workJob", workJob);
+                   context.putContextParameter("jobId", new 
Long(workJob.getId()));
+               }
+       });
+       
+       final long jobId = (Long)context.getContextParameter("jobId");
+       AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+       
+        return new 
VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), 
+               VirtualMachine.PowerState.PowerOn, vm.getId(), 
vm.getPowerHostId());
     }
 
     public Outcome<VirtualMachine> migrateVmWithStorageThroughJobQueue(
@@ -4358,55 +4358,50 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) 
{
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkMigrateWithStorage.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkMigrate.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkMigrateWithStorage workInfo = new 
VmWorkMigrateWithStorage(user.getId(), account.getId(), vm.getId(),
-                        srcHostId, destHostId, volumeToPool);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(vm.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
-        return new 
VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"),
-            VirtualMachine.PowerState.PowerOn, vm.getId(), destHostId);
+       Transaction.execute(new TransactionCallbackNoReturn () {
+               public void doInTransactionWithoutResult(TransactionStatus 
status) {
+       
+                       _vmDao.lockRow(vm.getId(), true);
+               
+                       List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
+                               VirtualMachine.Type.Instance, vm.getId(), 
+                               VmWorkMigrateWithStorage.class.getName());
+               
+                       VmWorkJobVO workJob = null;
+                       if (pendingWorkJobs != null && pendingWorkJobs.size() > 
0) {
+                           assert (pendingWorkJobs.size() == 1);
+                           workJob = pendingWorkJobs.get(0);
+                       } else {
+                                   
+                           workJob = new VmWorkJobVO(context.getContextId());
+               
+                           
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                           workJob.setCmd(VmWorkMigrate.class.getName());
+               
+                           workJob.setAccountId(account.getId());
+                           workJob.setUserId(user.getId());
+                           workJob.setVmType(vm.getType());
+                           workJob.setVmInstanceId(vm.getId());
+               
+                           // save work context info (there are some 
duplications)
+                           VmWorkMigrateWithStorage workInfo = new 
VmWorkMigrateWithStorage(user.getId(), account.getId(), vm.getId(), 
+                               srcHostId, destHostId, volumeToPool);
+                           
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+               
+                           _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                       }
+                   context.putContextParameter("workJob", workJob);
+                   context.putContextParameter("jobId", new 
Long(workJob.getId()));
+               }
+       });
+       
+       final long jobId = (Long)context.getContextParameter("jobId");
+       AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+       
+        return new 
VmStateSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), 
+               VirtualMachine.PowerState.PowerOn, vm.getId(), destHostId);
     }
-
-    //
-    // TODO build a common pattern to reduce code duplication in following 
methods
-    // no time for this at current iteration
-    //
+    
     public Outcome<VirtualMachine> migrateVmForScaleThroughJobQueue(
         final String vmUuid, final long srcHostId, final DeployDestination 
dest, final Long newSvcOfferingId) {
 
@@ -4416,47 +4411,46 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) 
{
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkMigrateForScale.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkMigrate.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkMigrateForScale workInfo = new 
VmWorkMigrateForScale(user.getId(), account.getId(), vm.getId(),
-                        srcHostId, dest, newSvcOfferingId);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(vm.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+       Transaction.execute(new TransactionCallbackNoReturn () {
+               public void doInTransactionWithoutResult(TransactionStatus 
status) {
+       
+                       _vmDao.lockRow(vm.getId(), true);
+               
+                       List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
+                               VirtualMachine.Type.Instance, vm.getId(), 
+                               VmWorkMigrateForScale.class.getName());
+               
+                       VmWorkJobVO workJob = null;
+                       if (pendingWorkJobs != null && pendingWorkJobs.size() > 
0) {
+                           assert (pendingWorkJobs.size() == 1);
+                           workJob = pendingWorkJobs.get(0);
+                       } else {
+                                   
+                           workJob = new VmWorkJobVO(context.getContextId());
+               
+                           
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                           workJob.setCmd(VmWorkMigrate.class.getName());
+               
+                           workJob.setAccountId(account.getId());
+                           workJob.setUserId(user.getId());
+                           workJob.setVmType(vm.getType());
+                           workJob.setVmInstanceId(vm.getId());
+               
+                           // save work context info (there are some 
duplications)
+                           VmWorkMigrateForScale workInfo = new 
VmWorkMigrateForScale(user.getId(), account.getId(), vm.getId(), 
+                               srcHostId, dest, newSvcOfferingId);
+                           
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+               
+                           _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                       }
+                   context.putContextParameter("workJob", workJob);
+                   context.putContextParameter("jobId", new 
Long(workJob.getId()));
+               }
+       });
+       
+       final long jobId = (Long)context.getContextParameter("jobId");
+       AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+       
         return new 
VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), 
vm.getId());
     }
 
@@ -4469,47 +4463,46 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) 
{
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkStorageMigration.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkStorageMigration.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkStorageMigration workInfo = new 
VmWorkStorageMigration(user.getId(), account.getId(), vm.getId(),
-                        destPool);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(vm.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+       Transaction.execute(new TransactionCallbackNoReturn () {
+               public void doInTransactionWithoutResult(TransactionStatus 
status) {
+       
+                       _vmDao.lockRow(vm.getId(), true);
+               
+                       List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
+                               VirtualMachine.Type.Instance, vm.getId(), 
+                               VmWorkStorageMigration.class.getName());
+               
+                       VmWorkJobVO workJob = null;
+                       if (pendingWorkJobs != null && pendingWorkJobs.size() > 
0) {
+                           assert (pendingWorkJobs.size() == 1);
+                           workJob = pendingWorkJobs.get(0);
+                       } else {
+                                   
+                           workJob = new VmWorkJobVO(context.getContextId());
+               
+                           
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                           
workJob.setCmd(VmWorkStorageMigration.class.getName());
+               
+                           workJob.setAccountId(account.getId());
+                           workJob.setUserId(user.getId());
+                           workJob.setVmType(vm.getType());
+                           workJob.setVmInstanceId(vm.getId());
+               
+                           // save work context info (there are some 
duplications)
+                           VmWorkStorageMigration workInfo = new 
VmWorkStorageMigration(user.getId(), account.getId(), vm.getId(), 
+                               destPool);
+                           
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+               
+                           _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                       }
+                   context.putContextParameter("workJob", workJob);
+                   context.putContextParameter("jobId", new 
Long(workJob.getId()));
+               }
+       });
+       
+       final long jobId = (Long)context.getContextParameter("jobId");
+       AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+       
         return new 
VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), 
vm.getId());
     }
 
@@ -4520,47 +4513,46 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
         final User user = context.getCallingUser();
         final Account account = context.getCallingAccount();
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) 
{
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkAddVmToNetwork.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkAddVmToNetwork.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkAddVmToNetwork workInfo = new 
VmWorkAddVmToNetwork(user.getId(), account.getId(), vm.getId(),
-                        network, requested);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(vm.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+       Transaction.execute(new TransactionCallbackNoReturn () {
+               public void doInTransactionWithoutResult(TransactionStatus 
status) {
+       
+                       _vmDao.lockRow(vm.getId(), true);
+               
+                       List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
+                               VirtualMachine.Type.Instance, vm.getId(), 
+                               VmWorkAddVmToNetwork.class.getName());
+               
+                       VmWorkJobVO workJob = null;
+                       if (pendingWorkJobs != null && pendingWorkJobs.size() > 
0) {
+                           assert (pendingWorkJobs.size() == 1);
+                           workJob = pendingWorkJobs.get(0);
+                       } else {
+                                   
+                           workJob = new VmWorkJobVO(context.getContextId());
+               
+                           
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                           
workJob.setCmd(VmWorkAddVmToNetwork.class.getName());
+               
+                           workJob.setAccountId(account.getId());
+                           workJob.setUserId(user.getId());
+                           workJob.setVmType(vm.getType());
+                           workJob.setVmInstanceId(vm.getId());
+               
+                           // save work context info (there are some 
duplications)
+                           VmWorkAddVmToNetwork workInfo = new 
VmWorkAddVmToNetwork(user.getId(), account.getId(), vm.getId(), 
+                               network, requested);
+                           
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+               
+                           _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                       }
+                   context.putContextParameter("workJob", workJob);
+                   context.putContextParameter("jobId", new 
Long(workJob.getId()));
+               }
+       });
+       
+       final long jobId = (Long)context.getContextParameter("jobId");
+       AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+       
         return new 
VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), 
vm.getId());
     }
 
@@ -4571,47 +4563,46 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
         final User user = context.getCallingUser();
         final Account account = context.getCallingAccount();
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) 
{
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkRemoveNicFromVm.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkRemoveNicFromVm.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkRemoveNicFromVm workInfo = new 
VmWorkRemoveNicFromVm(user.getId(), account.getId(), vm.getId(),
-                        nic);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(vm.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+       Transaction.execute(new TransactionCallbackNoReturn () {
+               public void doInTransactionWithoutResult(TransactionStatus 
status) {
+       
+                       _vmDao.lockRow(vm.getId(), true);
+               
+                       List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
+                               VirtualMachine.Type.Instance, vm.getId(), 
+                               VmWorkRemoveNicFromVm.class.getName());
+               
+                       VmWorkJobVO workJob = null;
+                       if (pendingWorkJobs != null && pendingWorkJobs.size() > 
0) {
+                           assert (pendingWorkJobs.size() == 1);
+                           workJob = pendingWorkJobs.get(0);
+                       } else {
+                                   
+                           workJob = new VmWorkJobVO(context.getContextId());
+               
+                           
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                           
workJob.setCmd(VmWorkRemoveNicFromVm.class.getName());
+               
+                           workJob.setAccountId(account.getId());
+                           workJob.setUserId(user.getId());
+                           workJob.setVmType(vm.getType());
+                           workJob.setVmInstanceId(vm.getId());
+               
+                           // save work context info (there are some 
duplications)
+                           VmWorkRemoveNicFromVm workInfo = new 
VmWorkRemoveNicFromVm(user.getId(), account.getId(), vm.getId(), 
+                               nic);
+                           
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+               
+                           _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                       }
+                   context.putContextParameter("workJob", workJob);
+                   context.putContextParameter("jobId", new 
Long(workJob.getId()));
+               }
+       });
+       
+       final long jobId = (Long)context.getContextParameter("jobId");
+       AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+       
         return new 
VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), 
vm.getId());
     }
 
@@ -4622,47 +4613,46 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
         final User user = context.getCallingUser();
         final Account account = context.getCallingAccount();
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) 
{
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkRemoveVmFromNetwork.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkRemoveVmFromNetwork.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkRemoveVmFromNetwork workInfo = new 
VmWorkRemoveVmFromNetwork(user.getId(), account.getId(), vm.getId(),
-                        network, broadcastUri);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(vm.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+       Transaction.execute(new TransactionCallbackNoReturn () {
+               public void doInTransactionWithoutResult(TransactionStatus 
status) {
+       
+                       _vmDao.lockRow(vm.getId(), true);
+               
+                       List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
+                               VirtualMachine.Type.Instance, vm.getId(), 
+                               VmWorkRemoveVmFromNetwork.class.getName());
+               
+                       VmWorkJobVO workJob = null;
+                       if (pendingWorkJobs != null && pendingWorkJobs.size() > 
0) {
+                           assert (pendingWorkJobs.size() == 1);
+                           workJob = pendingWorkJobs.get(0);
+                       } else {
+                                   
+                           workJob = new VmWorkJobVO(context.getContextId());
+               
+                           
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                           
workJob.setCmd(VmWorkRemoveVmFromNetwork.class.getName());
+               
+                           workJob.setAccountId(account.getId());
+                           workJob.setUserId(user.getId());
+                           workJob.setVmType(vm.getType());
+                           workJob.setVmInstanceId(vm.getId());
+               
+                           // save work context info (there are some 
duplications)
+                           VmWorkRemoveVmFromNetwork workInfo = new 
VmWorkRemoveVmFromNetwork(user.getId(), account.getId(), vm.getId(), 
+                               network, broadcastUri);
+                           
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+               
+                           _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                       }
+                   context.putContextParameter("workJob", workJob);
+                   context.putContextParameter("jobId", new 
Long(workJob.getId()));
+               }
+       });
+       
+       final long jobId = (Long)context.getContextParameter("jobId");
+       AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+       
         return new 
VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), 
vm.getId());
     }
 
@@ -4675,47 +4665,46 @@ public class VirtualMachineManagerImpl extends 
ManagerBase implements VirtualMac
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
 
-        Transaction.execute(new TransactionCallbackNoReturn() {
-            @Override
-            public void doInTransactionWithoutResult(TransactionStatus status) 
{
-
-                _vmDao.lockRow(vm.getId(), true);
-
-                List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
-                    VirtualMachine.Type.Instance, vm.getId(),
-                    VmWorkReconfigure.class.getName());
-
-                VmWorkJobVO workJob = null;
-                if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
-                    assert (pendingWorkJobs.size() == 1);
-                    workJob = pendingWorkJobs.get(0);
-                } else {
-
-                    workJob = new VmWorkJobVO(context.getContextId());
-
-                    
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
-                    workJob.setCmd(VmWorkReconfigure.class.getName());
-
-                    workJob.setAccountId(account.getId());
-                    workJob.setUserId(user.getId());
-                    workJob.setVmType(vm.getType());
-                    workJob.setVmInstanceId(vm.getId());
-
-                    // save work context info (there are some duplications)
-                    VmWorkReconfigure workInfo = new 
VmWorkReconfigure(user.getId(), account.getId(), vm.getId(),
-                        oldServiceOffering, reconfiguringOnExistingHost);
-                    workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
-                    _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
-                }
-                context.putContextParameter("workJob", workJob);
-                context.putContextParameter("jobId", new Long(vm.getId()));
-            }
-        });
-
-        final long jobId = (Long)context.getContextParameter("jobId");
-        AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
-
+       Transaction.execute(new TransactionCallbackNoReturn () {
+               public void doInTransactionWithoutResult(TransactionStatus 
status) {
+       
+                       _vmDao.lockRow(vm.getId(), true);
+               
+                       List<VmWorkJobVO> pendingWorkJobs = 
_workJobDao.listPendingWorkJobs(
+                               VirtualMachine.Type.Instance, vm.getId(), 
+                               VmWorkReconfigure.class.getName());
+               
+                       VmWorkJobVO workJob = null;
+                       if (pendingWorkJobs != null && pendingWorkJobs.size() > 
0) {
+                           assert (pendingWorkJobs.size() == 1);
+                           workJob = pendingWorkJobs.get(0);
+                       } else {
+                                   
+                           workJob = new VmWorkJobVO(context.getContextId());
+               
+                           
workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER);
+                           workJob.setCmd(VmWorkReconfigure.class.getName());
+               
+                           workJob.setAccountId(account.getId());
+                           workJob.setUserId(user.getId());
+                           workJob.setVmType(vm.getType());
+                           workJob.setVmInstanceId(vm.getId());
+               
+                           // save work context info (there are some 
duplications)
+                           VmWorkReconfigure workInfo = new 
VmWorkReconfigure(user.getId(), account.getId(), vm.getId(), 
+                                       oldServiceOffering, 
reconfiguringOnExistingHost);
+                           
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+               
+                           _jobMgr.submitAsyncJob(workJob, 
VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId());
+                       }
+                   context.putContextParameter("workJob", workJob);
+                   context.putContextParameter("jobId", new 
Long(workJob.getId()));
+               }
+       });
+       
+       final long jobId = (Long)context.getContextParameter("jobId");
+       AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+       
         return new 
VmJobSyncOutcome((VmWorkJobVO)context.getContextParameter("workJob"), 
vm.getId());
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aa72b76a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
----------------------------------------------------------------------
diff --git 
a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
 
b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
index dcfbf3a..d373034 100644
--- 
a/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
+++ 
b/server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.xml
@@ -160,7 +160,9 @@
 
     <bean id="snapshotManagerImpl" 
class="com.cloud.storage.snapshot.SnapshotManagerImpl" />
 
-    <bean id="snapshotSchedulerImpl" 
class="com.cloud.storage.snapshot.SnapshotSchedulerImpl" />
+    <bean id="snapshotSchedulerImpl" 
class="com.cloud.storage.snapshot.SnapshotSchedulerImpl" >
+        <property name="asyncJobDispatcher" ref="ApiAsyncJobDispatcher" />
+    </bean>
     <bean id="storageNetworkManagerImpl" 
class="com.cloud.network.StorageNetworkManagerImpl" />
     <bean id="taggedResourceManagerImpl" 
class="com.cloud.tags.TaggedResourceManagerImpl" />
     <bean id="resourceMetaDataManagerImpl" 
class="com.cloud.metadata.ResourceMetaDataManagerImpl" />

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aa72b76a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java 
b/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
index 8cb76d2..78e78b6 100644
--- a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
@@ -83,7 +83,7 @@ public class SnapshotSchedulerImpl extends ManagerBase 
implements SnapshotSchedu
     protected VolumeDao _volsDao;
     @Inject
     protected ConfigurationDao _configDao;
-    @Inject
+
     protected AsyncJobDispatcher _asyncDispatcher;
 
     private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 5;  
  // 5 seconds
@@ -92,6 +92,14 @@ public class SnapshotSchedulerImpl extends ManagerBase 
implements SnapshotSchedu
     private Date _currentTimestamp;
     private TestClock _testTimerTask;
 
+    public AsyncJobDispatcher getAsyncJobDispatcher() {
+       return _asyncDispatcher;
+    }
+    
+    public void setAsyncJobDispatcher(AsyncJobDispatcher dispatcher) {
+       _asyncDispatcher = dispatcher;
+    }
+    
     private Date getNextScheduledTime(long policyId, Date currentTimestamp) {
         SnapshotPolicyVO policy = _snapshotPolicyDao.findById(policyId);
         Date nextTimestamp = null;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/aa72b76a/server/src/com/cloud/vm/SystemVmLoadScanner.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/SystemVmLoadScanner.java 
b/server/src/com/cloud/vm/SystemVmLoadScanner.java
index 3e9c953..28c900d 100644
--- a/server/src/com/cloud/vm/SystemVmLoadScanner.java
+++ b/server/src/com/cloud/vm/SystemVmLoadScanner.java
@@ -21,7 +21,8 @@ import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.log4j.Logger;
-
+import org.apache.cloudstack.context.CallContext;
+import org.apache.cloudstack.framework.jobs.AsyncJobExecutionContext;
 import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 
 import com.cloud.utils.Pair;
@@ -43,7 +44,7 @@ public class SystemVmLoadScanner<T> {
     private final SystemVmLoadScanHandler<T> _scanHandler;
     private final ScheduledExecutorService _capacityScanScheduler;
     private final GlobalLock _capacityScanLock;
-
+    
     public SystemVmLoadScanner(SystemVmLoadScanHandler<T> scanHandler) {
         _scanHandler = scanHandler;
         _capacityScanScheduler = Executors.newScheduledThreadPool(1, new 
NamedThreadFactory(scanHandler.getScanHandlerName()));
@@ -70,8 +71,16 @@ public class SystemVmLoadScanner<T> {
 
             @Override
             protected void runInContext() {
-                try {
+               try {
+                       CallContext callContext = CallContext.current();
+                       assert(callContext != null);
+                       
+                       AsyncJobExecutionContext.registerPseudoExecutionContext(
+                               callContext.getCallingAccountId(), 
callContext.getCallingUserId());
+                       
                     reallyRun();
+                    
+                    AsyncJobExecutionContext.unregister();
                 } catch (Throwable e) {
                     s_logger.warn("Unexpected exception " + e.getMessage(), e);
                 }

Reply via email to