From 6e70816169e0402591787776eb211f50bfd7af71 Mon Sep 17 00:00:00 2001 From: Kelven Yang Date: Fri, 18 Oct 2013 14:08:58 -0700 Subject: [PATCH] Merge VirtualMachineManagerImpl for sync changes --- .../com/cloud/vm/VirtualMachineManager.java | 4 +- .../cloud/vm/VirtualMachineManagerImpl.java | 69 ++++++++++++++----- .../cloud/entity/api/VMEntityManagerImpl.java | 6 +- .../lb/ElasticLoadBalancerManagerImpl.java | 2 +- .../lb/InternalLoadBalancerVMManagerImpl.java | 2 +- .../VirtualNetworkApplianceManagerImpl.java | 2 +- .../src/com/cloud/vm/UserVmManagerImpl.java | 2 +- 7 files changed, 61 insertions(+), 26 deletions(-) diff --git a/engine/api/src/com/cloud/vm/VirtualMachineManager.java b/engine/api/src/com/cloud/vm/VirtualMachineManager.java index 9c7623634b6..75198f92136 100644 --- a/engine/api/src/com/cloud/vm/VirtualMachineManager.java +++ b/engine/api/src/com/cloud/vm/VirtualMachineManager.java @@ -85,9 +85,9 @@ public interface VirtualMachineManager extends Manager { DeploymentPlan plan, HypervisorType hyperType) throws InsufficientCapacityException; - void start(String vmUuid, Map params); + void easyStart(String vmUuid, Map params); - void start(String vmUuid, Map params, DeploymentPlan planToDeploy); + void easyStart(String vmUuid, Map params, DeploymentPlan planToDeploy); void stop(String vmUuid) throws ResourceUnavailableException; diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java index 591be6c0375..26d890c808e 100755 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -35,6 +35,7 @@ import java.util.UUID; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import javax.ejb.Local; import javax.inject.Inject; @@ -53,9 +54,11 @@ import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.framework.jobs.AsyncJobManager; +import org.apache.cloudstack.framework.jobs.Outcome; import org.apache.cloudstack.framework.jobs.dao.VmWorkJobDao; import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO; import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.MessageDispatcher; import org.apache.cloudstack.framework.messagebus.MessageHandler; import org.apache.cloudstack.jobs.JobInfo; import org.apache.cloudstack.managed.context.ManagedContextRunnable; @@ -291,10 +294,17 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Inject DeploymentPlanningManager _dpMgr; - @Inject protected MessageBus _messageBus; - @Inject protected VirtualMachinePowerStateSync _syncMgr; - @Inject protected VmWorkJobDao _workJobDao; - @Inject protected AsyncJobManager _jobMgr; + @Inject + protected MessageBus _messageBus; + + @Inject + protected VirtualMachinePowerStateSync _syncMgr; + + @Inject + protected VmWorkJobDao _workJobDao; + + @Inject + protected AsyncJobManager _jobMgr; Map _vmGurus = new HashMap(); protected StateMachine2 _stateMachine; @@ -315,9 +325,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac "On destroy, force-stop takes this value ", true); static final ConfigKey ClusterDeltaSyncInterval = new ConfigKey("Advanced", Integer.class, "sync.interval", "60", "Cluster Delta sync interval in seconds", false); - - protected static final ConfigKey PingInterval = new ConfigKey("Advanced", - Long.class, "ping.interval", "60", "Ping interval in seconds", false); + + static final ConfigKey VmJobCheckInterval = new ConfigKey("Advanced", + Long.class, "vm.job.check.interval", "3000", "Interval in milliseconds to check if the job is complete", true); + static final ConfigKey VmJobTimeout = new ConfigKey("Advanced", + Long.class, "vm.job.timeout", "600000", "Time in milliseconds to wait before attempting to cancel a job", true); + static final ConfigKey PingInterval = new ConfigKey("Advanced", + Long.class, "ping.interval", "60", "Ping interval in seconds", true); ScheduledExecutorService _executor = null; @@ -493,6 +507,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Override public boolean start() { + _executor.scheduleAtFixedRate(new TransitionTask(), PingInterval.value(), PingInterval.value(), TimeUnit.SECONDS); _executor.scheduleAtFixedRate(new CleanupTask(), VmOpCleanupInterval.value(), VmOpCleanupInterval.value(), TimeUnit.SECONDS); cancelWorkItems(_nodeId); return true; @@ -512,6 +527,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac _nodeId = ManagementServerNode.getManagementServerId(); _agentMgr.registerForHostEvents(this, true, true, true); + _messageBus.subscribe(Topics.VM_POWER_STATE, MessageDispatcher.getDispatcher(this)); return true; } @@ -521,20 +537,21 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } @Override - public void start(String vmUuid, Map params) { - start(vmUuid, params, null); + public void easyStart(String vmUuid, Map params) { + easyStart(vmUuid, params, null); } @Override - public void start(String vmUuid, Map params, DeploymentPlan planToDeploy) { + public void easyStart(String vmUuid, Map params, DeploymentPlan planToDeploy) { + Outcome outcome = start(vmUuid, params, planToDeploy); try { - advanceStart(vmUuid, params, planToDeploy); - } catch (ConcurrentOperationException e) { - throw new CloudRuntimeException("Unable to start a VM due to concurrent operation", e).add(VirtualMachine.class, vmUuid); - } catch (InsufficientCapacityException e) { - throw new CloudRuntimeException("Unable to start a VM due to insufficient capacity", e).add(VirtualMachine.class, vmUuid); - } catch (ResourceUnavailableException e) { - throw new CloudRuntimeException("Unable to start a VM due to concurrent operation", e).add(VirtualMachine.class, vmUuid); + outcome.get(VmJobTimeout.value(), TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + // FIXME: What to do + } catch (java.util.concurrent.ExecutionException e) { + // FIXME: What to do + } catch (TimeoutException e) { + // FIXME: What to do } } @@ -639,6 +656,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac throw new ConcurrentOperationException("Unable to change the state of " + vm); } +/* protected boolean changeState(T vm, Event event, Long hostId, ItWorkVO work, Step step) throws NoTransitionException { // FIXME: We should do this better. Step previousStep = work.getStep(); @@ -653,7 +671,24 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } } } +*/ + + protected boolean changeState(VMInstanceVO vm, Event event, Long hostId, VmWorkJobVO work, Step step) throws NoTransitionException { + VmWorkJobVO.Step previousStep = work.getStep(); + + Transaction txn = Transaction.currentTxn(); + txn.start(); + work.setStep(step); + boolean result = stateTransitTo(vm, event, hostId); + if (!result) { + work.setStep(previousStep); + } + _workJobDao.update(work.getId(), work); + txn.commit(); + return result; + } + protected boolean areAffinityGroupsAssociated(VirtualMachineProfile vmProfile) { VirtualMachine vm = vmProfile.getVirtualMachine(); long vmGroupCount = _affinityGroupVMMapDao.countAffinityGroupsForVm(vm.getId()); diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java index e784295b1d3..55056378e8f 100755 --- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java @@ -224,7 +224,7 @@ public class VMEntityManagerImpl implements VMEntityManager { DataCenterDeployment reservedPlan = new DataCenterDeployment(vm.getDataCenterId(), vmReservation.getPodId(), vmReservation.getClusterId(), vmReservation.getHostId(), null, null); try { - _itMgr.start(vm.getUuid(), params, reservedPlan); + _itMgr.easyStart(vm.getUuid(), params, reservedPlan); } catch (Exception ex) { // Retry the deployment without using the reservation plan DataCenterDeployment plan = new DataCenterDeployment(0, null, null, null, null, null); @@ -233,11 +233,11 @@ public class VMEntityManagerImpl implements VMEntityManager { plan.setAvoids(reservedPlan.getAvoids()); } - _itMgr.start(vm.getUuid(), params, plan); + _itMgr.easyStart(vm.getUuid(), params, plan); } } else { // no reservation found. Let VirtualMachineManager retry - _itMgr.start(vm.getUuid(), params, null); + _itMgr.easyStart(vm.getUuid(), params, null); } } 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 3f8fc5c6f9d..f6e7e15d50e 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 @@ -536,7 +536,7 @@ public class ElasticLoadBalancerManagerImpl extends ManagerBase implements Elast private DomainRouterVO start(DomainRouterVO elbVm, User user, Account caller, Map params) throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { s_logger.debug("Starting ELB VM " + elbVm); - _itMgr.start(elbVm.getUuid(), params); + _itMgr.easyStart(elbVm.getUuid(), params); return _routerDao.findById(elbVm.getId()); } 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 5da6e022906..2d3b554de0b 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 @@ -808,7 +808,7 @@ public class InternalLoadBalancerVMManagerImpl extends ManagerBase implements In throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { s_logger.debug("Starting Internal LB VM " + internalLbVm); - _itMgr.start(internalLbVm.getUuid(), params, null); + _itMgr.easyStart(internalLbVm.getUuid(), params, null); if (internalLbVm.isStopPending()) { s_logger.info("Clear the stop pending flag of Internal LB VM " + internalLbVm.getHostName() + " after start router successfully!"); internalLbVm.setStopPending(false); diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 5ea75604ebe..25c7e739df2 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -2737,7 +2737,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V throws StorageUnavailableException, InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { s_logger.debug("Starting router " + router); - _itMgr.start(router.getUuid(), params, planToDeploy); + _itMgr.easyStart(router.getUuid(), params, planToDeploy); if (router.isStopPending()) { s_logger.info("Clear the stop pending flag of router " + router.getHostName() + " after start router successfully!"); router.setStopPending(false); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 6e879161276..7ff1cccdf63 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -4832,7 +4832,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir if (needRestart) { try { - _itMgr.start(vm.getUuid(), null); + _itMgr.easyStart(vm.getUuid(), null); } catch (Exception e) { s_logger.debug("Unable to start VM " + vm.getUuid(), e); CloudRuntimeException ex = new CloudRuntimeException(