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

This commit is contained in:
Kelven Yang 2013-12-06 15:36:54 -08:00
parent 96eeceba8b
commit aa72b76aec
5 changed files with 491 additions and 473 deletions

View File

@ -20,11 +20,16 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 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
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" <bean id="clusterBasedAgentLoadBalancerPlanner"
@ -68,5 +73,10 @@
<bean id="virtualMachineEntityImpl" class="org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityImpl" /> <bean id="virtualMachineEntityImpl" class="org.apache.cloudstack.engine.cloud.entity.api.VirtualMachineEntityImpl" />
<bean id="virtualMachinePowerStateSyncImpl" class="com.cloud.vm.VirtualMachinePowerStateSyncImpl" /> <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> </beans>

View File

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

View File

@ -160,7 +160,9 @@
<bean id="snapshotManagerImpl" class="com.cloud.storage.snapshot.SnapshotManagerImpl" /> <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="storageNetworkManagerImpl" class="com.cloud.network.StorageNetworkManagerImpl" />
<bean id="taggedResourceManagerImpl" class="com.cloud.tags.TaggedResourceManagerImpl" /> <bean id="taggedResourceManagerImpl" class="com.cloud.tags.TaggedResourceManagerImpl" />
<bean id="resourceMetaDataManagerImpl" class="com.cloud.metadata.ResourceMetaDataManagerImpl" /> <bean id="resourceMetaDataManagerImpl" class="com.cloud.metadata.ResourceMetaDataManagerImpl" />

View File

@ -83,7 +83,7 @@ public class SnapshotSchedulerImpl extends ManagerBase implements SnapshotSchedu
protected VolumeDao _volsDao; protected VolumeDao _volsDao;
@Inject @Inject
protected ConfigurationDao _configDao; protected ConfigurationDao _configDao;
@Inject
protected AsyncJobDispatcher _asyncDispatcher; protected AsyncJobDispatcher _asyncDispatcher;
private static final int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 5; // 5 seconds 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 Date _currentTimestamp;
private TestClock _testTimerTask; private TestClock _testTimerTask;
public AsyncJobDispatcher getAsyncJobDispatcher() {
return _asyncDispatcher;
}
public void setAsyncJobDispatcher(AsyncJobDispatcher dispatcher) {
_asyncDispatcher = dispatcher;
}
private Date getNextScheduledTime(long policyId, Date currentTimestamp) { private Date getNextScheduledTime(long policyId, Date currentTimestamp) {
SnapshotPolicyVO policy = _snapshotPolicyDao.findById(policyId); SnapshotPolicyVO policy = _snapshotPolicyDao.findById(policyId);
Date nextTimestamp = null; Date nextTimestamp = null;

View File

@ -21,7 +21,8 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger; 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 org.apache.cloudstack.managed.context.ManagedContextRunnable;
import com.cloud.utils.Pair; import com.cloud.utils.Pair;
@ -43,7 +44,7 @@ public class SystemVmLoadScanner<T> {
private final SystemVmLoadScanHandler<T> _scanHandler; private final SystemVmLoadScanHandler<T> _scanHandler;
private final ScheduledExecutorService _capacityScanScheduler; private final ScheduledExecutorService _capacityScanScheduler;
private final GlobalLock _capacityScanLock; private final GlobalLock _capacityScanLock;
public SystemVmLoadScanner(SystemVmLoadScanHandler<T> scanHandler) { public SystemVmLoadScanner(SystemVmLoadScanHandler<T> scanHandler) {
_scanHandler = scanHandler; _scanHandler = scanHandler;
_capacityScanScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory(scanHandler.getScanHandlerName())); _capacityScanScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory(scanHandler.getScanHandlerName()));
@ -70,8 +71,16 @@ public class SystemVmLoadScanner<T> {
@Override @Override
protected void runInContext() { protected void runInContext() {
try { try {
CallContext callContext = CallContext.current();
assert(callContext != null);
AsyncJobExecutionContext.registerPseudoExecutionContext(
callContext.getCallingAccountId(), callContext.getCallingUserId());
reallyRun(); reallyRun();
AsyncJobExecutionContext.unregister();
} catch (Throwable e) { } catch (Throwable e) {
s_logger.warn("Unexpected exception " + e.getMessage(), e); s_logger.warn("Unexpected exception " + e.getMessage(), e);
} }