finished up the conversion to using outcome
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/c0febea9 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/c0febea9 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/c0febea9 Branch: refs/heads/vmsync Commit: c0febea950e52acbba9035a85b8641da83416c43 Parents: 4254cb8 Author: Alex Huang <alex.hu...@gmail.com> Authored: Mon Jun 17 20:32:19 2013 -0700 Committer: Alex Huang <alex.hu...@gmail.com> Committed: Mon Jun 24 10:16:35 2013 -0700 ---------------------------------------------------------------------- .../src/com/cloud/vm/VirtualMachineManager.java | 2 +- .../com/cloud/vm/VirtualMachineManagerImpl.java | 134 ++++++++----------- .../lb/ElasticLoadBalancerManagerImpl.java | 2 +- .../lb/InternalLoadBalancerVMManagerImpl.java | 2 +- .../cloud/ha/HighAvailabilityManagerImpl.java | 14 +- .../VirtualNetworkApplianceManagerImpl.java | 2 +- .../com/cloud/server/ManagementServerImpl.java | 4 +- .../storage/StoragePoolAutomationImpl.java | 2 +- .../vm/snapshot/VMSnapshotManagerImpl.java | 2 +- .../vm/VmWorkMockVirtualMachineManagerImpl.java | 5 +- 10 files changed, 71 insertions(+), 98 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0febea9/engine/components-api/src/com/cloud/vm/VirtualMachineManager.java ---------------------------------------------------------------------- diff --git a/engine/components-api/src/com/cloud/vm/VirtualMachineManager.java b/engine/components-api/src/com/cloud/vm/VirtualMachineManager.java index e1365e2..92f05f0 100644 --- a/engine/components-api/src/com/cloud/vm/VirtualMachineManager.java +++ b/engine/components-api/src/com/cloud/vm/VirtualMachineManager.java @@ -126,7 +126,7 @@ public interface VirtualMachineManager extends Manager { */ Outcome<VirtualMachine> start(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy); - void advanceStop(String vmUuid, boolean cleanup) throws ResourceUnavailableException, OperationTimedoutException, + Outcome<VirtualMachine> stop(String vmUuid, boolean cleanup) throws ResourceUnavailableException, OperationTimedoutException, ConcurrentOperationException; void advanceExpunge(String vmUuid) throws ResourceUnavailableException, OperationTimedoutException, http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0febea9/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 141fcb4..3a308a9 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -401,7 +401,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac return; } - advanceStop(vmUuid, false); + stop(vmUuid, false); vm = _vmDao.findByUuid(vmUuid); try { @@ -995,14 +995,15 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Override public void easyStop(String vmUuid) { + Outcome<VirtualMachine> outcome = stop(vmUuid, false); try { - advanceStop(vmUuid, false); - } catch (OperationTimedoutException e) { - throw new CloudRuntimeException(e).add(VirtualMachine.class, vmUuid); - } catch (ConcurrentOperationException e) { - throw new CloudRuntimeException(e).add(VirtualMachine.class, vmUuid); - } catch (ResourceUnavailableException e) { - throw new CloudRuntimeException(e).add(VirtualMachine.class, vmUuid); + outcome.get(_jobTimeout.value(), TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + throw new CloudRuntimeException("Interrupted while stopping vm " + vmUuid, e); + } catch (java.util.concurrent.ExecutionException e) { + throw new CloudRuntimeException("Unable to stop the VM", e); + } catch (TimeoutException e) { + throw new CloudRuntimeException("Unable to stop the VM due to timeout", e); } } @@ -1094,8 +1095,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } @Override - public void advanceStop(final String vmUuid, boolean forced) throws ResourceUnavailableException, - OperationTimedoutException, ConcurrentOperationException { + @DB + public Outcome<VirtualMachine> stop(final String vmUuid, boolean forced) { CallContext cc = CallContext.current(); Account account = cc.getCallingAccount(); User user = cc.getCallingUser(); @@ -1103,73 +1104,44 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac final VMInstanceVO vm = _vmDao.findByUuid(vmUuid); VmWorkJobVO workJob = null; Transaction txn = Transaction.currentTxn(); - try { - txn.start(); - - _vmDao.lockRow(vm.getId(), true); - - List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs( - VirtualMachine.Type.Instance, vm.getId(), VmWorkJobDispatcher.Start); - - if(pendingWorkJobs != null && pendingWorkJobs.size() > 0) { - assert(pendingWorkJobs.size() == 1); - workJob = pendingWorkJobs.get(0); - } else { - workJob = new VmWorkJobVO(cc.getContextId()); - - workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER); - workJob.setCmd(VmWorkJobDispatcher.Stop); - - 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(); - workInfo.setAccountId(account.getId()); - workInfo.setUserId(user.getId()); - workInfo.setVmId(vm.getId()); - workInfo.setForceStop(forced); - workJob.setCmdInfo(VmWorkJobDispatcher.serialize(workInfo)); - - _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId()); - } - - txn.commit(); - } catch(Throwable e) { - s_logger.error("Unexpected exception", e); - txn.rollback(); - throw new ConcurrentOperationException("Unhandled exception, converted to ConcurrentOperationException"); + txn.start(); + + _vmDao.lockRow(vm.getId(), true); + + List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(VirtualMachine.Type.Instance, vm.getId(), VmWorkJobDispatcher.Start); + + if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) { + assert (pendingWorkJobs.size() == 1); + workJob = pendingWorkJobs.get(0); + } else { + workJob = new VmWorkJobVO(cc.getContextId()); + + workJob.setDispatcher(VmWorkJobDispatcher.VM_WORK_JOB_DISPATCHER); + workJob.setCmd(VmWorkJobDispatcher.Stop); + + 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(); + workInfo.setAccountId(account.getId()); + workInfo.setUserId(user.getId()); + workInfo.setVmId(vm.getId()); + workInfo.setForceStop(forced); + workJob.setCmdInfo(VmWorkJobDispatcher.serialize(workInfo)); + + _jobMgr.submitAsyncJob(workJob, VmWorkJobDispatcher.VM_WORK_QUEUE, vm.getId()); } + txn.commit(); + final long jobId = workJob.getId(); AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId); - _jobMgr.waitAndCheck( - new String[] {Topics.VM_POWER_STATE, AsyncJob.Topics.JOB_STATE}, - 3000L, 600000L, new Predicate() { - - @Override - public boolean checkCondition() { - VMInstanceVO instance = _vmDao.findById(vm.getId()); - if(instance.getPowerState() == VirtualMachine.PowerState.PowerOff) - return true; - - VmWorkJobVO workJob = _workJobDao.findById(jobId); - if(workJob.getStatus() != JobInfo.Status.IN_PROGRESS) - return true; - - return false; - } - }); - - try { - AsyncJobExecutionContext.getCurrentExecutionContext().disjoinJob(jobId); - } catch (InsufficientCapacityException e) { - throw new CloudRuntimeException("Should never ever happen on a stop. Who threw this?", e); - } + return new VmOutcome(workJob, VirtualMachine.PowerState.PowerOff, vm.getId()); } public void orchestrateStop(String vmUuid, boolean forced) throws AgentUnavailableException, @@ -1358,7 +1330,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac return true; } - advanceStop(vmUuid, _forceStop.value()); + stop(vmUuid, _forceStop.value()); vm = _vmDao.findById(vm.getId()); @@ -1907,16 +1879,18 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac if (vmInstance != null) { return true; } + Outcome<VirtualMachine> outcome = stop(vm.getUuid(), true); try { - advanceStop(vm.getUuid(), true); + outcome.get(_jobTimeout.value(), TimeUnit.MILLISECONDS); return true; - } catch (ResourceUnavailableException e) { - s_logger.debug("Unable to stop VM due to " + e.getMessage()); - } catch (ConcurrentOperationException e) { - s_logger.debug("Unable to stop VM due to " + e.getMessage()); - } catch (OperationTimedoutException e) { - s_logger.debug("Unable to stop VM due to " + e.getMessage()); + } catch (InterruptedException e) { + s_logger.warn("Unable to migrate the VM", e); + } catch (java.util.concurrent.ExecutionException e) { + s_logger.warn("Unable to migrate the VM", e); + } catch (TimeoutException e) { + s_logger.warn("Unable to migrate the VM", e); } + return false; } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0febea9/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java ---------------------------------------------------------------------- diff --git a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java index 2bb3ba3..297eea0 100644 --- a/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java +++ b/plugins/network-elements/elastic-loadbalancer/src/com/cloud/network/lb/ElasticLoadBalancerManagerImpl.java @@ -557,7 +557,7 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements private DomainRouterVO stop(DomainRouterVO elbVm, boolean forced, User user, Account caller) throws ConcurrentOperationException, ResourceUnavailableException { s_logger.debug("Stopping ELB vm " + elbVm); try { - _itMgr.advanceStop(elbVm.getUuid(), forced); + _itMgr.stop(elbVm.getUuid(), forced); return _routerDao.findById(elbVm.getId()); } catch (OperationTimedoutException e) { throw new CloudRuntimeException("Unable to stop " + elbVm, e); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0febea9/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java ---------------------------------------------------------------------- diff --git a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java index 2a91c95..b0ac526 100644 --- a/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java +++ b/plugins/network-elements/internal-loadbalancer/src/org/apache/cloudstack/network/lb/InternalLoadBalancerVMManagerImpl.java @@ -552,7 +552,7 @@ public class InternalLoadBalancerVMManagerImpl extends ManagerBase implements protected VirtualRouter stopInternalLbVm(DomainRouterVO internalLbVm, boolean forced, Account caller, long callerUserId) throws ResourceUnavailableException, ConcurrentOperationException { s_logger.debug("Stopping internal lb vm " + internalLbVm); try { - _itMgr.advanceStop(internalLbVm.getUuid(), forced); + _itMgr.stop(internalLbVm.getUuid(), forced); return _internalLbVmDao.findById(internalLbVm.getId()); } catch (OperationTimedoutException e) { throw new CloudRuntimeException("Unable to stop " + internalLbVm, e); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0febea9/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java index fb20711..da61257 100755 --- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java +++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java @@ -292,7 +292,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai if (hostId == null) { try { s_logger.debug("Found a vm that is scheduled to be restarted but has no host id: " + vm); - _itMgr.advanceStop(vm.getUuid(), true); + _itMgr.stop(vm.getUuid(), true); } catch (ResourceUnavailableException e) { assert false : "How do we hit this when force is true?"; throw new CloudRuntimeException("Caught exception even though it should be handled.", e); @@ -337,7 +337,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai } try { - _itMgr.advanceStop(vm.getUuid(), true); + _itMgr.stop(vm.getUuid(), true); } catch (ResourceUnavailableException e) { assert false : "How do we hit this when force is true?"; throw new CloudRuntimeException("Caught exception even though it should be handled.", e); @@ -485,7 +485,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai } try { - _itMgr.advanceStop(vm.getUuid(), true); + _itMgr.stop(vm.getUuid(), true); } catch (ResourceUnavailableException e) { assert false : "How do we hit this when force is true?"; throw new CloudRuntimeException("Caught exception even though it should be handled.", e); @@ -502,7 +502,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai } else { s_logger.debug("How come that HA step is Investigating and the host is removed? Calling forced Stop on Vm anyways"); try { - _itMgr.advanceStop(vm.getUuid(), true); + _itMgr.stop(vm.getUuid(), true); } catch (ResourceUnavailableException e) { assert false : "How do we hit this when force is true?"; throw new CloudRuntimeException("Caught exception even though it should be handled.", e); @@ -671,7 +671,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai s_logger.info("Stopping " + vm); try { if (work.getWorkType() == WorkType.Stop) { - _itMgr.advanceStop(vm.getUuid(), false); + _itMgr.stop(vm.getUuid(), false); s_logger.info("Successfully stopped " + vm); return null; } else if (work.getWorkType() == WorkType.CheckStop) { @@ -681,7 +681,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai + " State: " + vm.getState()); return null; } - _itMgr.advanceStop(vm.getUuid(), false); + _itMgr.stop(vm.getUuid(), false); s_logger.info("Stop for " + vm + " was successful"); return null; } else if (work.getWorkType() == WorkType.ForceStop) { @@ -691,7 +691,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai + " State: " + vm.getState()); return null; } - _itMgr.advanceStop(vm.getUuid(), true); + _itMgr.stop(vm.getUuid(), true); s_logger.info("Stop for " + vm + " was successful"); return null; } else { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0febea9/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 81eebe4..efd247b 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -2741,7 +2741,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V public DomainRouterVO stop(VirtualRouter router, boolean forced, User user, Account caller) throws ConcurrentOperationException, ResourceUnavailableException { s_logger.debug("Stopping router " + router); try { - _itMgr.advanceStop(router.getUuid(), forced); + _itMgr.stop(router.getUuid(), forced); return _routerDao.findById(router.getId()); } catch (OperationTimedoutException e) { throw new CloudRuntimeException("Unable to stop " + router, e); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0febea9/server/src/com/cloud/server/ManagementServerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 2c20bc6..362b8e0 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -2131,7 +2131,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe User caller = _userDao.findById(CallContext.current().getCallingUserId()); - _itMgr.advanceStop(systemVm.getUuid(), isForced); + _itMgr.stop(systemVm.getUuid(), isForced); return _consoleProxyDao.findById(systemVm.getId()); } @@ -3013,7 +3013,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe User caller = _userDao.findById(CallContext.current().getCallingUserId()); - _itMgr.advanceStop(systemVm.getUuid(), isForced); + _itMgr.stop(systemVm.getUuid(), isForced); return _secStorageVmDao.findById(systemVm.getId()); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0febea9/server/src/com/cloud/storage/StoragePoolAutomationImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/storage/StoragePoolAutomationImpl.java b/server/src/com/cloud/storage/StoragePoolAutomationImpl.java index e1550b8..cb085cc 100644 --- a/server/src/com/cloud/storage/StoragePoolAutomationImpl.java +++ b/server/src/com/cloud/storage/StoragePoolAutomationImpl.java @@ -234,7 +234,7 @@ public class StoragePoolAutomationImpl implements StoragePoolAutomation { } } else if (vmInstance.getType().equals(VirtualMachine.Type.DomainRouter)) { DomainRouterVO domR = _domrDao.findById(vmInstance.getId()); - vmMgr.advanceStop(domR.getUuid(), false); + vmMgr.stop(domR.getUuid(), false); work.setStoppedForMaintenance(true); _storagePoolWorkDao.update(work.getId(), work); if (restart) { http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0febea9/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java index 64adc92..fd2d06f 100644 --- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java +++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java @@ -683,7 +683,7 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana }else { if(userVm.getState() == VirtualMachine.State.Running && vmSnapshotVo.getType() == VMSnapshot.Type.Disk){ try { - _itMgr.advanceStop(userVm.getUuid(), false); + _itMgr.stop(userVm.getUuid(), false); } catch (Exception e) { s_logger.error("Stop VM " + userVm.getInstanceName() + " before reverting failed due to " + e.getMessage()); throw new CloudRuntimeException(e.getMessage()); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/c0febea9/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java ---------------------------------------------------------------------- diff --git a/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java b/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java index 0c23220..d4ded07 100644 --- a/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java +++ b/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java @@ -179,9 +179,8 @@ public class VmWorkMockVirtualMachineManagerImpl implements VirtualMachineManage } @Override - public void advanceStop(String vmUuid, boolean forced) throws ResourceUnavailableException, - OperationTimedoutException, ConcurrentOperationException { - // TODO Auto-generated method stub + public Outcome<VirtualMachine> stop(String vmUuid, boolean forced) { + return null; } @Override