You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ke...@apache.org on 2014/03/01 00:37:21 UTC
[01/33] git commit: updated refs/heads/master to 90262a8
Repository: cloudstack
Updated Branches:
refs/heads/master d5dc6aab6 -> 90262a81e
check report-missing event for VM in starting state.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/85adaf83
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/85adaf83
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/85adaf83
Branch: refs/heads/master
Commit: 85adaf83c7143eefebe7c311691b423514df382f
Parents: 13e956a
Author: Kelven Yang <ke...@gmail.com>
Authored: Tue Jan 28 11:35:06 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:57 2014 -0800
----------------------------------------------------------------------
.../src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/85adaf83/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
index 2e1a552..635603f 100644
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
@@ -84,7 +84,7 @@ public class VirtualMachinePowerStateSyncImpl implements VirtualMachinePowerStat
// for all running/stopping VMs, we provide monitoring of missing report
List<VMInstanceVO> vmsThatAreMissingReport = _instanceDao.findByHostInStates(hostId, VirtualMachine.State.Running,
- VirtualMachine.State.Stopping);
+ VirtualMachine.State.Stopping, VirtualMachine.State.Starting);
java.util.Iterator<VMInstanceVO> it = vmsThatAreMissingReport.iterator();
while (it.hasNext()) {
VMInstanceVO instance = it.next();
[23/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
let PingTestCommand support host-ping in addition to ping user VM via VR. Reviewed-By: self
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/24e64ac6
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/24e64ac6
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/24e64ac6
Branch: refs/heads/master
Commit: 24e64ac62a0e1d4011e03025a3170a3bb259cf2b
Parents: 7c7bd09
Author: Kelven Yang <ke...@gmail.com>
Authored: Thu Feb 20 16:43:34 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:59 2014 -0800
----------------------------------------------------------------------
.../vmware/resource/VmwareResource.java | 49 ++++++++++++++++----
.../cloud/hypervisor/vmware/mo/ClusterMO.java | 12 ++---
.../com/cloud/hypervisor/vmware/mo/HostMO.java | 16 +++++++
3 files changed, 60 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24e64ac6/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 9e12105..89947df 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -4097,18 +4097,47 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
if (s_logger.isInfoEnabled()) {
s_logger.info("Executing resource PingTestCommand: " + _gson.toJson(cmd));
}
+
String controlIp = cmd.getRouterIp();
- String args = " -c 1 -n -q " + cmd.getPrivateIp();
- try {
- VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
- Pair<Boolean, String> result = SshHelper.sshExecute(controlIp, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "/bin/ping" + args);
- if (result.first())
- return new Answer(cmd);
- } catch (Exception e) {
- s_logger.error(
- "Unable to execute ping command on DomR (" + controlIp + "), domR may not be ready yet. failure due to " + VmwareHelper.getExceptionMessage(e), e);
+ if (controlIp != null) {
+ String args = " -c 1 -n -q " + cmd.getPrivateIp();
+ try {
+ VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
+ Pair<Boolean, String> result = SshHelper.sshExecute(controlIp, DefaultDomRSshPort, "root", mgr.getSystemVMKeyFile(), null, "/bin/ping" + args);
+ if (result.first())
+ return new Answer(cmd);
+ } catch (Exception e) {
+ s_logger.error("Unable to execute ping command on DomR (" + controlIp + "), domR may not be ready yet. failure due to "
+ + VmwareHelper.getExceptionMessage(e), e);
+ }
+ return new Answer(cmd, false, "PingTestCommand failed");
+ } else {
+ VmwareContext context = getServiceContext();
+ VmwareHypervisorHost hyperHost = getHyperHost(context);
+
+ try {
+ HostMO hostMo = (HostMO)hyperHost;
+ ClusterMO clusterMo = new ClusterMO(context, hostMo.getHyperHostCluster());
+ VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
+
+ List<Pair<ManagedObjectReference, String>> hosts = clusterMo.getClusterHosts();
+ for (Pair<ManagedObjectReference, String> entry : hosts) {
+ HostMO hostInCluster = new HostMO(context, entry.first());
+ String hostIp = hostInCluster.getHostManagementIp(mgr.getManagementPortGroupName());
+ if (hostIp != null && hostIp.equals(cmd.getComputingHostIp())) {
+ if (hostInCluster.isHyperHostConnected())
+ return new Answer(cmd);
+ else
+ new Answer(cmd, false, "PingTestCommand failed");
+ }
+ }
+ } catch (Exception e) {
+ s_logger.error("Unable to execute ping command on host (" + cmd.getComputingHostIp() + "). failure due to "
+ + VmwareHelper.getExceptionMessage(e), e);
+ }
+
+ return new Answer(cmd, false, "PingTestCommand failed");
}
- return new Answer(cmd, false, "PingTestCommand failed");
}
protected Answer execute(CheckOnHostCommand cmd) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24e64ac6/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java
index 49ee7c4..1b72b73 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java
@@ -57,6 +57,7 @@ import com.cloud.utils.exception.CloudRuntimeException;
//
public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
private static final Logger s_logger = Logger.getLogger(ClusterMO.class);
+ private ManagedObjectReference _environmentBrowser = null;
public ClusterMO(VmwareContext context, ManagedObjectReference morCluster) {
super(context, morCluster);
@@ -124,8 +125,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
@Override
public ObjectContent[] getVmPropertiesOnHyperHost(String[] propertyPaths) throws Exception {
if (s_logger.isTraceEnabled())
- s_logger.trace("vCenter API trace - retrieveProperties() for VM properties. target MOR: " + _mor.getValue() + ", properties: " +
- new Gson().toJson(propertyPaths));
+ s_logger.trace("vCenter API trace - retrieveProperties() for VM properties. target MOR: " + _mor.getValue() + ", properties: " + new Gson().toJson(propertyPaths));
PropertySpec pSpec = new PropertySpec();
pSpec.setType("VirtualMachine");
@@ -163,8 +163,7 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
@Override
public ObjectContent[] getDatastorePropertiesOnHyperHost(String[] propertyPaths) throws Exception {
if (s_logger.isTraceEnabled())
- s_logger.trace("vCenter API trace - retrieveProperties() on Datastore properties. target MOR: " + _mor.getValue() + ", properties: " +
- new Gson().toJson(propertyPaths));
+ s_logger.trace("vCenter API trace - retrieveProperties() on Datastore properties. target MOR: " + _mor.getValue() + ", properties: " + new Gson().toJson(propertyPaths));
PropertySpec pSpec = new PropertySpec();
pSpec.setType("Datastore");
@@ -193,10 +192,9 @@ public class ClusterMO extends BaseMO implements VmwareHypervisorHost {
return properties.toArray(new ObjectContent[properties.size()]);
}
- private ObjectContent[] getHostPropertiesOnCluster(String[] propertyPaths) throws Exception {
+ public ObjectContent[] getHostPropertiesOnCluster(String[] propertyPaths) throws Exception {
if (s_logger.isTraceEnabled())
- s_logger.trace("vCenter API trace - retrieveProperties() on Host properties. target MOR: " + _mor.getValue() + ", properties: " +
- new Gson().toJson(propertyPaths));
+ s_logger.trace("vCenter API trace - retrieveProperties() on Host properties. target MOR: " + _mor.getValue() + ", properties: " + new Gson().toJson(propertyPaths));
PropertySpec pSpec = new PropertySpec();
pSpec.setType("HostSystem");
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/24e64ac6/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java
index a32992a..298f560 100755
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HostMO.java
@@ -39,6 +39,7 @@ import com.vmware.vim25.HostFirewallInfo;
import com.vmware.vim25.HostFirewallRuleset;
import com.vmware.vim25.HostHardwareSummary;
import com.vmware.vim25.HostHyperThreadScheduleInfo;
+import com.vmware.vim25.HostIpConfig;
import com.vmware.vim25.HostIpRouteEntry;
import com.vmware.vim25.HostListSummaryQuickStats;
import com.vmware.vim25.HostNetworkInfo;
@@ -1043,4 +1044,19 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
firewallMo.refreshFirewall();
}
}
+
+ public String getHostManagementIp(String managementPortGroup) throws Exception {
+ HostNetworkInfo netInfo = getHostNetworkInfo();
+
+ List<HostVirtualNic> nics = netInfo.getVnic();
+ for (HostVirtualNic nic : nics) {
+ if (nic.getPortgroup().equals(managementPortGroup)) {
+ HostIpConfig ipConfig = nic.getSpec().getIp();
+
+ return ipConfig.getIpAddress();
+ }
+ }
+
+ return null;
+ }
}
[26/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
CLOUDSTACK-6065: Fix NPE problem caused by the lack of context setup in threads from agent manager thread pool
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a8c9238d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a8c9238d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a8c9238d
Branch: refs/heads/master
Commit: a8c9238d3da6e0fffd3745ed92f99bffeae01ae8
Parents: ee2adab
Author: Kelven Yang <ke...@gmail.com>
Authored: Thu Feb 13 14:34:06 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:59 2014 -0800
----------------------------------------------------------------------
.../framework/jobs/AsyncJobExecutionContext.java | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a8c9238d/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
index 20125f4..b6c1692 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
@@ -29,6 +29,8 @@ import org.apache.cloudstack.managed.threadlocal.ManagedThreadLocal;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
import com.cloud.exception.ResourceUnavailableException;
+import com.cloud.user.Account;
+import com.cloud.user.User;
public class AsyncJobExecutionContext {
private static final Logger s_logger = Logger.getLogger(AsyncJobExecutionContext.class);
@@ -167,10 +169,15 @@ public class AsyncJobExecutionContext {
public static AsyncJobExecutionContext getCurrentExecutionContext() {
AsyncJobExecutionContext context = s_currentExectionContext.get();
if (context == null) {
- // TODO, this has security implicitions
+ // TODO, this has security implications, operations carried from API layer should always
+ // set its context, otherwise, the fall-back here will use system security context
+ //
s_logger.warn("Job is executed without a context, setup psudo job for the executing thread");
- context = registerPseudoExecutionContext(CallContext.current().getCallingAccountId(),
- CallContext.current().getCallingUserId());
+ if (CallContext.current() != null)
+ context = registerPseudoExecutionContext(CallContext.current().getCallingAccountId(),
+ CallContext.current().getCallingUserId());
+ else
+ context = registerPseudoExecutionContext(Account.ACCOUNT_ID_SYSTEM, User.UID_SYSTEM);
}
return context;
}
[08/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
CLOUDSTACK-5358: Bring back concurrency control in sync-queue management
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/441be43b
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/441be43b
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/441be43b
Branch: refs/heads/master
Commit: 441be43b8c4be79935c32d4711a10739d7a6eae9
Parents: d5dc6aa
Author: Kelven Yang <ke...@gmail.com>
Authored: Mon Jan 20 16:53:17 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:57 2014 -0800
----------------------------------------------------------------------
.../com/cloud/vm/VirtualMachineManagerImpl.java | 81 ++++++++++++--------
.../com/cloud/vm/VmWorkStorageMigration.java | 12 ++-
.../framework/jobs/dao/SyncQueueItemDao.java | 1 +
.../jobs/dao/SyncQueueItemDaoImpl.java | 35 +++++++--
.../jobs/impl/AsyncJobManagerImpl.java | 19 +----
.../jobs/impl/SyncQueueManagerImpl.java | 21 +++--
6 files changed, 93 insertions(+), 76 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/441be43b/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 d19fc38..0ef275e 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -47,6 +47,7 @@ import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager;
+import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo;
import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator;
import org.apache.cloudstack.framework.config.ConfigDepot;
import org.apache.cloudstack.framework.config.ConfigKey;
@@ -769,7 +770,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
Outcome<VirtualMachine> outcome = startVmThroughJobQueue(vmUuid, params, planToDeploy);
try {
- outcome.get();
+ VirtualMachine vm = outcome.get();
} catch (InterruptedException e) {
throw new RuntimeException("Operation is interrupted", e);
} catch (java.util.concurrent.ExecutionException e) {
@@ -1317,7 +1318,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
Outcome<VirtualMachine> outcome = stopVmThroughJobQueue(vmUuid, cleanUpEvenIfUnableToStop);
try {
- outcome.get();
+ VirtualMachine vm = outcome.get();
} catch (InterruptedException e) {
throw new RuntimeException("Operation is interrupted", e);
} catch (java.util.concurrent.ExecutionException e) {
@@ -1626,7 +1627,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
Outcome<VirtualMachine> outcome = migrateVmStorageThroughJobQueue(vmUuid, destPool);
try {
- outcome.get();
+ VirtualMachine vm = outcome.get();
} catch (InterruptedException e) {
throw new RuntimeException("Operation is interrupted", e);
} catch (java.util.concurrent.ExecutionException e) {
@@ -1718,7 +1719,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
Outcome<VirtualMachine> outcome = migrateVmThroughJobQueue(vmUuid, srcHostId, dest);
try {
- outcome.get();
+ VirtualMachine vm = outcome.get();
} catch (InterruptedException e) {
throw new RuntimeException("Operation is interrupted", e);
} catch (java.util.concurrent.ExecutionException e) {
@@ -2001,7 +2002,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
Outcome<VirtualMachine> outcome = migrateVmWithStorageThroughJobQueue(vmUuid, srcHostId, destHostId, volumeToPool);
try {
- outcome.get();
+ VirtualMachine vm = outcome.get();
} catch (InterruptedException e) {
throw new RuntimeException("Operation is interrupted", e);
} catch (java.util.concurrent.ExecutionException e) {
@@ -2014,7 +2015,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
throw (ResourceUnavailableException)jobException;
else if (jobException instanceof ConcurrentOperationException)
throw (ConcurrentOperationException)jobException;
- }
+ }
}
}
@@ -2296,7 +2297,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
Outcome<VirtualMachine> outcome = rebootVmThroughJobQueue(vmUuid, params);
try {
- outcome.get();
+ VirtualMachine vm = outcome.get();
} catch (InterruptedException e) {
throw new RuntimeException("Operation is interrupted", e);
} catch (java.util.concurrent.ExecutionException e) {
@@ -2994,10 +2995,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
return;
}
- if (s_logger.isDebugEnabled())
+ if(s_logger.isDebugEnabled())
s_logger.debug("Received startup command from hypervisor host. host id: " + agent.getId());
- if (VmJobEnabled.value()) {
+ if(VmJobEnabled.value()) {
_syncMgr.resetHostSyncState(agent.getId());
}
@@ -3589,7 +3590,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
Outcome<VirtualMachine> outcome = migrateVmForScaleThroughJobQueue(vmUuid, srcHostId, dest, oldSvcOfferingId);
try {
- outcome.get();
+ VirtualMachine vm = outcome.get();
} catch (InterruptedException e) {
throw new RuntimeException("Operation is interrupted", e);
} catch (java.util.concurrent.ExecutionException e) {
@@ -3793,7 +3794,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
public boolean unplugNic(Network network, NicTO nic, VirtualMachineTO vm, ReservationContext context, DeployDestination dest) throws ConcurrentOperationException,
- ResourceUnavailableException {
+ ResourceUnavailableException {
boolean result = true;
VMInstanceVO router = _vmDao.findById(vm.getId());
@@ -3828,7 +3829,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public VMInstanceVO reConfigureVm(String vmUuid, ServiceOffering oldServiceOffering,
boolean reconfiguringOnExistingHost)
- throws ResourceUnavailableException, InsufficientServerCapacityException, ConcurrentOperationException {
+ throws ResourceUnavailableException, InsufficientServerCapacityException, ConcurrentOperationException {
AsyncJobExecutionContext jobContext = AsyncJobExecutionContext.getCurrentExecutionContext();
if (!VmJobEnabled.value() || jobContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) {
@@ -3974,8 +3975,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
handlePowerOffReportWithNoPendingJobsOnVM(vm);
break;
- // PowerUnknown shouldn't be reported, it is a derived
- // VM power state from host state (host un-reachable)
+ // PowerUnknown shouldn't be reported, it is a derived
+ // VM power state from host state (host un-reachable)
case PowerUnknown:
default:
assert (false);
@@ -4009,7 +4010,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
// we need to alert admin or user about this risky state transition
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_SYNC, vm.getDataCenterId(), vm.getPodIdToDeployIn(),
VM_SYNC_ALERT_SUBJECT, "VM " + vm.getHostName() + "(" + vm.getInstanceName()
- + ") state is sync-ed (Starting -> Running) from out-of-context transition. VM network environment may need to be reset");
+ + ") state is sync-ed (Starting -> Running) from out-of-context transition. VM network environment may need to be reset");
break;
case Running:
@@ -4031,7 +4032,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_SYNC, vm.getDataCenterId(), vm.getPodIdToDeployIn(),
VM_SYNC_ALERT_SUBJECT, "VM " + vm.getHostName() + "(" + vm.getInstanceName() + ") state is sync-ed (" + vm.getState()
- + " -> Running) from out-of-context transition. VM network environment may need to be reset");
+ + " -> Running) from out-of-context transition. VM network environment may need to be reset");
break;
case Destroyed:
@@ -4074,7 +4075,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_SYNC, vm.getDataCenterId(), vm.getPodIdToDeployIn(),
VM_SYNC_ALERT_SUBJECT, "VM " + vm.getHostName() + "(" + vm.getInstanceName() + ") state is sync-ed (" + vm.getState()
- + " -> Stopped) from out-of-context transition.");
+ + " -> Stopped) from out-of-context transition.");
// TODO: we need to forcely release all resource allocation
break;
@@ -4101,7 +4102,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
// however, if VM is missing from the host report (it may happen in out of band changes
// or from designed behave of XS/KVM), the VM may not get a chance to run the state-sync logic
//
- // Therefor, we will scan thoses VMs on UP host based on last update timestamp, if the host is UP
+ // Therefore, we will scan thoses VMs on UP host based on last update timestamp, if the host is UP
// and a VM stalls for status update, we will consider them to be powered off
// (which is relatively safe to do so)
@@ -4134,7 +4135,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
// We now only alert administrator about this situation
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_SYNC, vm.getDataCenterId(), vm.getPodIdToDeployIn(),
VM_SYNC_ALERT_SUBJECT, "VM " + vm.getHostName() + "(" + vm.getInstanceName() + ") is stuck in " + vm.getState()
- + " state and its host is unreachable for too long");
+ + " state and its host is unreachable for too long");
}
}
@@ -4332,7 +4333,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
}
- return new Object[] {workJob, workJob.getId()};
+ return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4383,7 +4384,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
}
- return new Object[] {workJob, workJob.getId()};
+ return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4436,7 +4437,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
}
- return new Object[] {workJob, workJob.getId()};
+ return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4458,6 +4459,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
+ _vmDao.lockRow(vm.getId(), true);
+
List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
VirtualMachine.Type.Instance, vm.getId(),
VmWorkMigrate.class.getName());
@@ -4485,7 +4488,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
}
- return new Object[] {workJob, workJob.getId()};
+ return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4540,7 +4543,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
}
- return new Object[] {workJob, workJob.getId()};
+ return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4564,6 +4567,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
+ _vmDao.lockRow(vm.getId(), true);
+
List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
VirtualMachine.Type.Instance, vm.getId(),
VmWorkMigrateForScale.class.getName());
@@ -4593,7 +4598,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
}
- return new Object[] {workJob, workJob.getId()};
+ return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4616,6 +4621,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
+ _vmDao.lockRow(vm.getId(), true);
+
List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
VirtualMachine.Type.Instance, vm.getId(),
VmWorkStorageMigration.class.getName());
@@ -4639,13 +4646,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
// save work context info (there are some duplications)
VmWorkStorageMigration workInfo = new VmWorkStorageMigration(user.getId(), account.getId(), vm.getId(),
- VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, destPool);
+ VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, destPool.getId());
workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
}
- return new Object[] {workJob, workJob.getId()};
+ return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4666,6 +4673,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
+ _vmDao.lockRow(vm.getId(), true);
+
List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
VirtualMachine.Type.Instance, vm.getId(),
VmWorkAddVmToNetwork.class.getName());
@@ -4694,7 +4703,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
}
- return new Object[] {workJob, workJob.getId()};
+ return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4715,6 +4724,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
+ _vmDao.lockRow(vm.getId(), true);
+
List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
VirtualMachine.Type.Instance, vm.getId(),
VmWorkRemoveNicFromVm.class.getName());
@@ -4743,7 +4754,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
}
- return new Object[] {workJob, workJob.getId()};
+ return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4764,6 +4775,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
+ _vmDao.lockRow(vm.getId(), true);
+
List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
VirtualMachine.Type.Instance, vm.getId(),
VmWorkRemoveVmFromNetwork.class.getName());
@@ -4792,7 +4805,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
}
- return new Object[] {workJob, workJob.getId()};
+ return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4815,6 +4828,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
+ _vmDao.lockRow(vm.getId(), true);
+
List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
VirtualMachine.Type.Instance, vm.getId(),
VmWorkReconfigure.class.getName());
@@ -4843,7 +4858,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
_jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
}
- return new Object[] {workJob, workJob.getId()};
+ return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4980,7 +4995,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
s_logger.info("Unable to find vm " + work.getVmId());
}
assert (vm != null);
- orchestrateStorageMigration(vm.getUuid(), work.getDestStoragePool());
+ StoragePool pool = (PrimaryDataStoreInfo)dataStoreMgr.getPrimaryDataStore(work.getDestStoragePoolId());
+ orchestrateStorageMigration(vm.getUuid(), pool);
+
return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/441be43b/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java b/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
index 2b2f8e8..1d7d55e 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkStorageMigration.java
@@ -16,20 +16,18 @@
// under the License.
package com.cloud.vm;
-import com.cloud.storage.StoragePool;
-
public class VmWorkStorageMigration extends VmWork {
private static final long serialVersionUID = -8677979691741157474L;
- StoragePool destPool;
+ Long destPoolId;
- public VmWorkStorageMigration(long userId, long accountId, long vmId, String handlerName, StoragePool destPool) {
+ public VmWorkStorageMigration(long userId, long accountId, long vmId, String handlerName, Long destPoolId) {
super(userId, accountId, vmId, handlerName);
- this.destPool = destPool;
+ this.destPoolId = destPoolId;
}
- public StoragePool getDestStoragePool() {
- return destPool;
+ public Long getDestStoragePoolId() {
+ return destPoolId;
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/441be43b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDao.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDao.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDao.java
index f5ac7b1..7b6eed7 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDao.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDao.java
@@ -24,6 +24,7 @@ import com.cloud.utils.db.GenericDao;
public interface SyncQueueItemDao extends GenericDao<SyncQueueItemVO, Long> {
public SyncQueueItemVO getNextQueueItem(long queueId);
+ public int getActiveQueueItemCount(long queueId);
public List<SyncQueueItemVO> getNextQueueItems(int maxItems);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/441be43b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
index 7363763..41f1419 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/dao/SyncQueueItemDaoImpl.java
@@ -36,6 +36,7 @@ import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.GenericSearchBuilder;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.db.SearchCriteria.Func;
import com.cloud.utils.db.SearchCriteria.Op;
import com.cloud.utils.db.TransactionLegacy;
@@ -43,6 +44,7 @@ import com.cloud.utils.db.TransactionLegacy;
public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long> implements SyncQueueItemDao {
private static final Logger s_logger = Logger.getLogger(SyncQueueItemDaoImpl.class);
final GenericSearchBuilder<SyncQueueItemVO, Long> queueIdSearch;
+ final GenericSearchBuilder<SyncQueueItemVO, Integer> queueActiveItemSearch;
public SyncQueueItemDaoImpl() {
super();
@@ -51,6 +53,12 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long>
queueIdSearch.and("contentType", queueIdSearch.entity().getContentType(), Op.EQ);
queueIdSearch.selectFields(queueIdSearch.entity().getId());
queueIdSearch.done();
+
+ queueActiveItemSearch = createSearchBuilder(Integer.class);
+ queueActiveItemSearch.and("queueId", queueActiveItemSearch.entity().getQueueId(), Op.EQ);
+ queueActiveItemSearch.and("processNumber", queueActiveItemSearch.entity().getLastProcessNumber(), Op.NNULL);
+ queueActiveItemSearch.select(null, Func.COUNT, queueActiveItemSearch.entity().getId());
+ queueActiveItemSearch.done();
}
@Override
@@ -66,19 +74,31 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long>
Filter filter = new Filter(SyncQueueItemVO.class, "created", true, 0L, 1L);
List<SyncQueueItemVO> l = listBy(sc, filter);
- if (l != null && l.size() > 0)
+ if(l != null && l.size() > 0)
return l.get(0);
return null;
}
@Override
+ public int getActiveQueueItemCount(long queueId) {
+ SearchCriteria<Integer> sc = queueActiveItemSearch.create();
+ sc.setParameters("queueId", queueId);
+
+ List<Integer> count = customSearch(sc, null);
+ return count.get(0);
+ }
+
+ @Override
public List<SyncQueueItemVO> getNextQueueItems(int maxItems) {
List<SyncQueueItemVO> l = new ArrayList<SyncQueueItemVO>();
- String sql =
- "SELECT i.id, i.queue_id, i.content_type, i.content_id, i.created " + " FROM sync_queue AS q JOIN sync_queue_item AS i ON q.id = i.queue_id "
- + " WHERE i.queue_proc_number IS NULL " + " GROUP BY q.id " + " ORDER BY i.id " + " LIMIT 0, ?";
+ String sql = "SELECT i.id, i.queue_id, i.content_type, i.content_id, i.created " +
+ " FROM sync_queue AS q JOIN sync_queue_item AS i ON q.id = i.queue_id " +
+ " WHERE i.queue_proc_number IS NULL " +
+ " GROUP BY q.id " +
+ " ORDER BY i.id " +
+ " LIMIT 0, ?";
TransactionLegacy txn = TransactionLegacy.currentTxn();
PreparedStatement pstmt = null;
@@ -86,7 +106,7 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long>
pstmt = txn.prepareAutoCloseStatement(sql);
pstmt.setInt(1, maxItems);
ResultSet rs = pstmt.executeQuery();
- while (rs.next()) {
+ while(rs.next()) {
SyncQueueItemVO item = new SyncQueueItemVO();
item.setId(rs.getLong(1));
item.setQueueId(rs.getLong(2));
@@ -106,7 +126,8 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long>
@Override
public List<SyncQueueItemVO> getActiveQueueItems(Long msid, boolean exclusive) {
SearchBuilder<SyncQueueItemVO> sb = createSearchBuilder();
- sb.and("lastProcessMsid", sb.entity().getLastProcessMsid(), SearchCriteria.Op.EQ);
+ sb.and("lastProcessMsid", sb.entity().getLastProcessMsid(),
+ SearchCriteria.Op.EQ);
sb.done();
SearchCriteria<SyncQueueItemVO> sc = sb.create();
@@ -134,7 +155,7 @@ public class SyncQueueItemDaoImpl extends GenericDaoBase<SyncQueueItemVO, Long>
SearchCriteria<SyncQueueItemVO> sc = sbItem.create();
sc.setParameters("lastProcessTime2", new Date(cutTime.getTime() - thresholdMs));
- if (exclusive)
+ if(exclusive)
return lockRows(sc, null, true);
return listBy(sc, null);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/441be43b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index c3ac0e6..86e62dc 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -24,7 +24,6 @@ import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;
-import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
@@ -365,23 +364,7 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
}
SyncQueueVO queue = null;
-
- // to deal with temporary DB exceptions like DB deadlock/Lock-wait time out cased rollbacks
- // we retry five times until we throw an exception
- Random random = new Random();
-
- for (int i = 0; i < 5; i++) {
- queue = _queueMgr.queue(syncObjType, syncObjId, SyncQueueItem.AsyncJobContentType, job.getId(), queueSizeLimit);
- if (queue != null) {
- break;
- }
-
- try {
- Thread.sleep(1000 + random.nextInt(5000));
- } catch (InterruptedException e) {
- }
- }
-
+ queue = _queueMgr.queue(syncObjType, syncObjId, SyncQueueItem.AsyncJobContentType, job.getId(), queueSizeLimit);
if (queue == null)
throw new CloudRuntimeException("Unable to insert queue item into database, DB is full?");
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/441be43b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
index 09974a1..d8e2674 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/SyncQueueManagerImpl.java
@@ -242,18 +242,15 @@ public class SyncQueueManagerImpl extends ManagerBase implements SyncQueueManage
}
private boolean queueReadyToProcess(SyncQueueVO queueVO) {
- return true;
-
- //
- // TODO
- //
- // Need to disable concurrency disable at queue level due to the need to support
- // job wake-up dispatching task
- //
- // Concurrency control is better done at higher level and leave the job scheduling/serializing simpler
- //
-
- // return queueVO.getQueueSize() < queueVO.getQueueSizeLimit();
+ int nActiveItems = _syncQueueItemDao.getActiveQueueItemCount(queueVO.getId());
+ if (nActiveItems < queueVO.getQueueSizeLimit())
+ return true;
+
+ if (s_logger.isDebugEnabled())
+ s_logger.debug("Queue (queue id, sync type, sync id) - (" + queueVO.getId()
+ + "," + queueVO.getSyncObjType() + ", " + queueVO.getSyncObjId()
+ + ") is reaching concurrency limit " + queueVO.getQueueSizeLimit());
+ return false;
}
@Override
[10/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
Temporarily disable event-based VM state management at XS resource level. Wait to enable it when other changes in XS is ready
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/bfb7835a
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/bfb7835a
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/bfb7835a
Branch: refs/heads/master
Commit: bfb7835a212f7f0afaf84cf826ba38feb87c81a3
Parents: e6e12e3
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Feb 7 15:50:46 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../xenserver/XenServerResourceNewBase.java | 27 +++++++++++++++++++-
1 file changed, 26 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/bfb7835a/plugins/hypervisors/xen/src/org/apache/cloudstack/hypervisor/xenserver/XenServerResourceNewBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/org/apache/cloudstack/hypervisor/xenserver/XenServerResourceNewBase.java b/plugins/hypervisors/xen/src/org/apache/cloudstack/hypervisor/xenserver/XenServerResourceNewBase.java
index 1c97486..438a392 100644
--- a/plugins/hypervisors/xen/src/org/apache/cloudstack/hypervisor/xenserver/XenServerResourceNewBase.java
+++ b/plugins/hypervisors/xen/src/org/apache/cloudstack/hypervisor/xenserver/XenServerResourceNewBase.java
@@ -45,6 +45,26 @@ import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineName;
+/**
+ *
+ * XenServerResourceNewBase is an abstract base class that encapsulates how
+ * CloudStack should interact with XenServer after a special XenServer
+ * 6.2 hotfix. From here on, every Resource for future versions of
+ * XenServer should use this as the base class. This base class lessens
+ * the amount of load CloudStack places on Xapi because it doesn't use
+ * polling as a means to collect data and figure out task completion.
+ *
+ * This base class differs from CitrixResourceBase in the following ways:
+ * - VM states are detected using Event.from instead of polling. This
+ * increases the number of threads CloudStack uses but the threads
+ * are mostly idle just waiting for events from XenServer.
+ * - stats are collected through the http interface rather than Xapi plugin.
+ * This change may be promoted to CitrixResourceBase as it's also possible
+ * in previous versions of XenServer.
+ * - Asynchronous task completion is done throught Event.from rather than
+ * polling.
+ *
+ */
public class XenServerResourceNewBase extends XenServer610Resource {
private static final Logger s_logger = Logger.getLogger(XenServerResourceNewBase.class);
protected VmEventListener _listener = null;
@@ -62,7 +82,12 @@ public class XenServerResourceNewBase extends XenServer610Resource {
Host.Record masterRecord = poolr.master.getRecord(conn);
if (_host.uuid.equals(masterRecord.uuid)) {
_listener = new VmEventListener(true);
- _listener.start();
+
+ //
+ // TODO disable event listener for now. Wait until everything else is ready
+ //
+
+ // _listener.start();
} else {
_listener = new VmEventListener(false);
}
[16/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
return the correct NicProfile after job completion for VPC AddVmToNetwork command
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/58c26ee1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/58c26ee1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/58c26ee1
Branch: refs/heads/master
Commit: 58c26ee128ed0c243e47db884ee4359c19c4abf5
Parents: 18b5fb5
Author: Kelven Yang <ke...@gmail.com>
Authored: Tue Feb 4 16:34:40 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../src/com/cloud/vm/VirtualMachineManagerImpl.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/58c26ee1/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 e7e49b8..69f92c9 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -3276,8 +3276,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
throw (RuntimeException)jobException;
else if (jobException instanceof Throwable)
throw new RuntimeException("Unexpected exception", (Throwable)jobException);
- else if (jobException instanceof Long)
- return requested;
+ else if (jobException instanceof NicProfile)
+ return (NicProfile)jobException;
}
throw new RuntimeException("Unexpected job execution result");
@@ -5006,7 +5006,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
NicProfile nic = orchestrateAddVmToNetwork(vm, network,
work.getRequestedNicProfile());
- return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, _jobMgr.marshallResultObject(nic.getId()));
+ return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, _jobMgr.marshallResultObject(nic));
}
private Pair<JobInfo.Status, String> orchestrateRemoveNicFromVm(VmWorkRemoveNicFromVm work) throws Exception {
[06/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
disable XS full host sync and delta sync when new sync model is enabled
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/206a9ed5
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/206a9ed5
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/206a9ed5
Branch: refs/heads/master
Commit: 206a9ed53fbd228a9af675576f486d18887b4dc9
Parents: 90ea324
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Jan 24 16:55:54 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:57 2014 -0800
----------------------------------------------------------------------
.../com/cloud/vm/VirtualMachineManagerImpl.java | 83 +++++++++++---------
1 file changed, 44 insertions(+), 39 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/206a9ed5/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 f944d7e..1dae94d 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -2925,12 +2925,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public boolean processAnswers(long agentId, long seq, Answer[] answers) {
- for (final Answer answer : answers) {
- if (answer instanceof ClusterSyncAnswer) {
- ClusterSyncAnswer hs = (ClusterSyncAnswer)answer;
- if (!hs.isExceuted()) {
- deltaSync(hs.getNewStates());
- hs.setExecuted();
+ if (!VmJobEnabled.value()) {
+ for (final Answer answer : answers) {
+ if (answer instanceof ClusterSyncAnswer) {
+ ClusterSyncAnswer hs = (ClusterSyncAnswer)answer;
+ if (!hs.isExceuted()) {
+ deltaSync(hs.getNewStates());
+ hs.setExecuted();
+ }
}
}
}
@@ -3018,48 +3020,51 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
long agentId = agent.getId();
if (agent.getHypervisorType() == HypervisorType.XenServer) { // only for Xen
- StartupRoutingCommand startup = (StartupRoutingCommand)cmd;
- HashMap<String, Ternary<String, State, String>> allStates = startup.getClusterVMStateChanges();
- if (allStates != null) {
- fullSync(clusterId, allStates);
- }
+ if (!VmJobEnabled.value()) {
+ StartupRoutingCommand startup = (StartupRoutingCommand)cmd;
+ HashMap<String, Ternary<String, State, String>> allStates = startup.getClusterVMStateChanges();
+ if (allStates != null) {
+ fullSync(clusterId, allStates);
+ }
- // initiate the cron job
- ClusterSyncCommand syncCmd = new ClusterSyncCommand(ClusterDeltaSyncInterval.value(), clusterId);
- try {
- long seq_no = _agentMgr.send(agentId, new Commands(syncCmd), this);
- s_logger.debug("Cluster VM sync started with jobid " + seq_no);
- } catch (AgentUnavailableException e) {
- s_logger.fatal("The Cluster VM sync process failed for cluster id " + clusterId + " with ", e);
+ // initiate the cron job
+ ClusterSyncCommand syncCmd = new ClusterSyncCommand(ClusterDeltaSyncInterval.value(), clusterId);
+ try {
+ long seq_no = _agentMgr.send(agentId, new Commands(syncCmd), this);
+ s_logger.debug("Cluster VM sync started with jobid " + seq_no);
+ } catch (AgentUnavailableException e) {
+ s_logger.fatal("The Cluster VM sync process failed for cluster id " + clusterId + " with ", e);
+ }
}
} else { // for others KVM and VMWare
- StartupRoutingCommand startup = (StartupRoutingCommand)cmd;
- Commands commands = fullHostSync(agentId, startup);
+ if (!VmJobEnabled.value()) {
+ StartupRoutingCommand startup = (StartupRoutingCommand)cmd;
+ Commands commands = fullHostSync(agentId, startup);
- if (commands.size() > 0) {
- s_logger.debug("Sending clean commands to the agent");
+ if (commands.size() > 0) {
+ s_logger.debug("Sending clean commands to the agent");
- try {
- boolean error = false;
- Answer[] answers = _agentMgr.send(agentId, commands);
- for (Answer answer : answers) {
- if (!answer.getResult()) {
- s_logger.warn("Unable to stop a VM due to " + answer.getDetails());
- error = true;
+ try {
+ boolean error = false;
+ Answer[] answers = _agentMgr.send(agentId, commands);
+ for (Answer answer : answers) {
+ if (!answer.getResult()) {
+ s_logger.warn("Unable to stop a VM due to " + answer.getDetails());
+ error = true;
+ }
}
+ if (error) {
+ throw new ConnectionException(true, "Unable to stop VMs");
+ }
+ } catch (final AgentUnavailableException e) {
+ s_logger.warn("Agent is unavailable now", e);
+ throw new ConnectionException(true, "Unable to sync", e);
+ } catch (final OperationTimedoutException e) {
+ s_logger.warn("Agent is unavailable now", e);
+ throw new ConnectionException(true, "Unable to sync", e);
}
- if (error) {
- throw new ConnectionException(true, "Unable to stop VMs");
- }
- } catch (final AgentUnavailableException e) {
- s_logger.warn("Agent is unavailable now", e);
- throw new ConnectionException(true, "Unable to sync", e);
- } catch (final OperationTimedoutException e) {
- s_logger.warn("Agent is unavailable now", e);
- throw new ConnectionException(true, "Unable to sync", e);
}
}
-
}
}
[05/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
process the missing power report of a VM that exists in CloudStack but not in hypervisor
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/5d732177
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/5d732177
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/5d732177
Branch: refs/heads/master
Commit: 5d73217723571c78aaef8e3cf36f4666749737ad
Parents: fda7219
Author: Kelven Yang <ke...@gmail.com>
Authored: Thu Jan 23 17:43:28 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:57 2014 -0800
----------------------------------------------------------------------
api/src/com/cloud/vm/VirtualMachine.java | 7 ++++--
.../com/cloud/vm/VirtualMachineManagerImpl.java | 3 ++-
.../vm/VirtualMachinePowerStateSyncImpl.java | 25 ++++++++++++++++++++
3 files changed, 32 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5d732177/api/src/com/cloud/vm/VirtualMachine.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/VirtualMachine.java b/api/src/com/cloud/vm/VirtualMachine.java
index d6e70a8..2d98aa9 100755
--- a/api/src/com/cloud/vm/VirtualMachine.java
+++ b/api/src/com/cloud/vm/VirtualMachine.java
@@ -33,8 +33,11 @@ import com.cloud.utils.fsm.StateObject;
*/
public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, InternalIdentity, StateObject<VirtualMachine.State> {
- public enum PowerState {
- PowerUnknown, PowerOn, PowerOff,
+ public enum PowerState {
+ PowerUnknown,
+ PowerOn,
+ PowerOff,
+ PowerReportMissing
}
public enum State {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5d732177/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 1b0d6ca..f944d7e 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -3974,6 +3974,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
break;
case PowerOff:
+ case PowerReportMissing:
handlePowerOffReportWithNoPendingJobsOnVM(vm);
break;
@@ -4094,7 +4095,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
VM_SYNC_ALERT_SUBJECT, "VM " + vm.getHostName() + "(" + vm.getInstanceName() + ") state is sync-ed (" + vm.getState()
+ " -> Stopped) from out-of-context transition.");
- s_logger.info("VM " + vm.getInstanceName() + " is sync-ed to at Stopped state according to power-on report from hypervisor");
+ s_logger.info("VM " + vm.getInstanceName() + " is sync-ed to at Stopped state according to power-off report from hypervisor");
// TODO: we need to forcely release all resource allocation
break;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/5d732177/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
index 453890c..fd0077c 100644
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
@@ -17,6 +17,7 @@
package com.cloud.vm;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import javax.inject.Inject;
@@ -78,6 +79,30 @@ public class VirtualMachinePowerStateSyncImpl implements VirtualMachinePowerStat
} else {
if (s_logger.isDebugEnabled())
s_logger.debug("VM power state does not change, skip DB writing. vm id: " + entry.getKey());
+ }
+ }
+
+ // for all running/stopping VMs, we provide monitoring of missing report
+ List<VMInstanceVO> vmsThatAreMissingReport = _instanceDao.findByHostInStates(hostId, VirtualMachine.State.Running,
+ VirtualMachine.State.Stopping);
+ java.util.Iterator<VMInstanceVO> it = vmsThatAreMissingReport.iterator();
+ while (it.hasNext()) {
+ VMInstanceVO instance = it.next();
+ if (translatedInfo.get(instance.getId()) != null)
+ it.remove();
+ }
+
+ if (vmsThatAreMissingReport.size() > 0) {
+ for (VMInstanceVO instance : vmsThatAreMissingReport) {
+ if (_instanceDao.updatePowerState(instance.getId(), hostId, VirtualMachine.PowerState.PowerReportMissing)) {
+ if (s_logger.isDebugEnabled())
+ s_logger.debug("VM state report is updated. host: " + hostId + ", vm id: " + instance.getId() + ", power state: PowerReportMissing ");
+
+ _messageBus.publish(null, VirtualMachineManager.Topics.VM_POWER_STATE, PublishScope.GLOBAL, instance.getId());
+ } else {
+ if (s_logger.isDebugEnabled())
+ s_logger.debug("VM power state does not change, skip DB writing. vm id: " + instance.getId());
+ }
}
}
}
[13/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
Pragrammatically Answer HA question posted in vCenter since it will block CloudStack from continuously operating on the VM
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/4a414d39
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/4a414d39
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/4a414d39
Branch: refs/heads/master
Commit: 4a414d399004aa9f848ccdd428f64496a0176596
Parents: 85adaf8
Author: Kelven Yang <ke...@gmail.com>
Authored: Tue Jan 28 17:16:04 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../hypervisor/vmware/mo/VirtualMachineMO.java | 23 ++++++++------------
1 file changed, 9 insertions(+), 14 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/4a414d39/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index 3e83bb6..663adbf 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -190,10 +190,10 @@ public class VirtualMachineMO extends BaseMO {
}
public boolean powerOn() throws Exception {
- if(getResetSafePowerState() == VirtualMachinePowerState.POWERED_ON)
- return true;
+ if (getResetSafePowerState() == VirtualMachinePowerState.POWERED_ON)
+ return true;
- ManagedObjectReference morTask = _context.getService().powerOnVMTask(_mor, null);
+ ManagedObjectReference morTask = _context.getService().powerOnVMTask(_mor, null);
// Monitor VM questions
final Boolean[] flags = {false};
final VirtualMachineMO vmMo = this;
@@ -248,17 +248,12 @@ public class VirtualMachineMO extends BaseMO {
}
});
- try {
- boolean result = _context.getVimClient().waitForTask(morTask);
- if (result) {
- _context.waitForTaskProgressDone(morTask);
- return true;
- } else {
- s_logger.error("VMware powerOnVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
- }
- } finally {
- // make sure to let VM question monitor exit
- flags[0] = true;
+ boolean result = _context.getVimClient().waitForTask(morTask);
+ if (result) {
+ _context.waitForTaskProgressDone(morTask);
+ return true;
+ } else {
+ s_logger.error("VMware powerOnVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
}
return false;
[15/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
VirtualMachineManager.migrateAway() need to put under management of new sync model
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/fa7d9ad1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/fa7d9ad1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/fa7d9ad1
Branch: refs/heads/master
Commit: fa7d9ad1a86c3b4274a081fa3a8c7813212b6903
Parents: 434f8da
Author: Kelven Yang <ke...@gmail.com>
Authored: Thu Feb 6 16:44:34 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../src/com/cloud/vm/VirtualMachineManager.java | 2 +-
.../com/cloud/ha/HighAvailabilityManager.java | 3 +
.../com/cloud/vm/VirtualMachineManagerImpl.java | 118 ++++++++++++++++++-
.../src/com/cloud/vm/VmWorkMigrateAway.java | 36 ++++++
.../cloud/ha/HighAvailabilityManagerImpl.java | 17 ++-
5 files changed, 164 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fa7d9ad1/engine/api/src/com/cloud/vm/VirtualMachineManager.java
----------------------------------------------------------------------
diff --git a/engine/api/src/com/cloud/vm/VirtualMachineManager.java b/engine/api/src/com/cloud/vm/VirtualMachineManager.java
index ac79860..fcfa3f1 100644
--- a/engine/api/src/com/cloud/vm/VirtualMachineManager.java
+++ b/engine/api/src/com/cloud/vm/VirtualMachineManager.java
@@ -109,7 +109,7 @@ public interface VirtualMachineManager extends Manager {
void destroy(String vmUuid) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException;
- void migrateAway(String vmUuid, long hostId, DeploymentPlanner planner) throws InsufficientServerCapacityException;
+ void migrateAway(String vmUuid, long hostId) throws InsufficientServerCapacityException;
void migrate(String vmUuid, long srcHostId, DeployDestination dest) throws ResourceUnavailableException, ConcurrentOperationException;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fa7d9ad1/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java
----------------------------------------------------------------------
diff --git a/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java b/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java
index e1b308a..eb60f3e 100644
--- a/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java
+++ b/engine/components-api/src/com/cloud/ha/HighAvailabilityManager.java
@@ -18,6 +18,7 @@ package com.cloud.ha;
import java.util.List;
+import com.cloud.deploy.DeploymentPlanner;
import com.cloud.host.HostVO;
import com.cloud.host.Status;
import com.cloud.utils.component.Manager;
@@ -103,4 +104,6 @@ public interface HighAvailabilityManager extends Manager {
* @return
*/
String getHaTag();
+
+ DeploymentPlanner getHAPlanner();
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fa7d9ad1/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 09a9980..fa0540e 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1546,7 +1546,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
// Disable this hacking thing, VM snapshot task need to be managed by its orchestartion flow istelf instead of
// hacking it here at general VM manager
- /*
+ /*
if (_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())) {
s_logger.error("State transit with event: " + e + " failed due to: " + vm.getInstanceName() + " has active VM snapshots tasks");
return false;
@@ -2183,7 +2183,53 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
@Override
- public void migrateAway(String vmUuid, long srcHostId, DeploymentPlanner planner) throws InsufficientServerCapacityException {
+ public void migrateAway(String vmUuid, long srcHostId) throws InsufficientServerCapacityException {
+ AsyncJobExecutionContext jobContext = AsyncJobExecutionContext.getCurrentExecutionContext();
+ if (!VmJobEnabled.value() || jobContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) {
+ // avoid re-entrance
+
+ VmWorkJobVO placeHolder = null;
+ if (VmJobEnabled.value()) {
+ VirtualMachine vm = _vmDao.findByUuid(vmUuid);
+ placeHolder = createPlaceHolderWork(vm.getId());
+ }
+ try {
+ try {
+ orchestrateMigrateAway(vmUuid, srcHostId, null);
+ } catch (InsufficientServerCapacityException e) {
+ s_logger.warn("Failed to deploy vm " + vmUuid + " with original planner, sending HAPlanner");
+ orchestrateMigrateAway(vmUuid, srcHostId, _haMgr.getHAPlanner());
+ }
+ } finally {
+ if (VmJobEnabled.value())
+ _workJobDao.expunge(placeHolder.getId());
+ }
+ } else {
+ Outcome<VirtualMachine> outcome = migrateVmAwayThroughJobQueue(vmUuid, srcHostId);
+
+ try {
+ VirtualMachine vm = outcome.get();
+ } catch (InterruptedException e) {
+ throw new RuntimeException("Operation is interrupted", e);
+ } catch (java.util.concurrent.ExecutionException e) {
+ throw new RuntimeException("Execution excetion", e);
+ }
+
+ Object jobException = _jobMgr.unmarshallResultObject(outcome.getJob());
+ if (jobException != null) {
+ if (jobException instanceof InsufficientServerCapacityException)
+ throw (InsufficientServerCapacityException)jobException;
+ else if (jobException instanceof ConcurrentOperationException)
+ throw (ConcurrentOperationException)jobException;
+ else if (jobException instanceof RuntimeException)
+ throw (RuntimeException)jobException;
+ else if (jobException instanceof Throwable)
+ throw new RuntimeException("Unexpected exception", (Throwable)jobException);
+ }
+ }
+ }
+
+ private void orchestrateMigrateAway(String vmUuid, long srcHostId, DeploymentPlanner planner) throws InsufficientServerCapacityException {
VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
if (vm == null) {
s_logger.debug("Unable to find a VM for " + vmUuid);
@@ -4562,6 +4608,57 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
VirtualMachine.PowerState.PowerOn, vm.getId(), vm.getPowerHostId());
}
+ public Outcome<VirtualMachine> migrateVmAwayThroughJobQueue(final String vmUuid, final long srcHostId) {
+ final CallContext context = CallContext.current();
+ final User user = context.getCallingUser();
+ final Account account = context.getCallingAccount();
+
+ final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
+
+ Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
+ @Override
+ public Object[] doInTransaction(TransactionStatus status) {
+
+ _vmDao.lockRow(vm.getId(), true);
+
+ List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+ VirtualMachine.Type.Instance, vm.getId(),
+ VmWorkMigrateAway.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(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkMigrateAway.class.getName());
+
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+
+ // save work context info (there are some duplications)
+ VmWorkMigrateAway workInfo = new VmWorkMigrateAway(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
+ return new Object[] {workJob, new Long(workJob.getId())};
+ }
+ });
+
+ final long jobId = (Long)result[1];
+ AsyncJobExecutionContext.getCurrentExecutionContext().joinJob(jobId);
+
+ return new VmStateSyncOutcome((VmWorkJobVO)result[0],
+ VirtualMachine.PowerState.PowerOn, vm.getId(), vm.getPowerHostId());
+ }
+
public Outcome<VirtualMachine> migrateVmWithStorageThroughJobQueue(
final String vmUuid, final long srcHostId, final long destHostId,
final Map<Volume, StoragePool> volumeToPool) {
@@ -4964,6 +5061,23 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
}
+ private Pair<JobInfo.Status, String> orchestrateMigrateAway(VmWorkMigrateAway work) throws Exception {
+ VMInstanceVO vm = _entityMgr.findById(VMInstanceVO.class, work.getVmId());
+ if (vm == null) {
+ s_logger.info("Unable to find vm " + work.getVmId());
+ }
+ assert (vm != null);
+
+ try {
+ orchestrateMigrateAway(vm.getUuid(), work.getSrcHostId(), null);
+ } catch (InsufficientServerCapacityException e) {
+ s_logger.warn("Failed to deploy vm " + vm.getId() + " with original planner, sending HAPlanner");
+ orchestrateMigrateAway(vm.getUuid(), work.getSrcHostId(), _haMgr.getHAPlanner());
+ }
+
+ return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+ }
+
private Pair<JobInfo.Status, String> orchestrateMigrateWithStorage(VmWorkMigrateWithStorage work) throws Exception {
VMInstanceVO vm = _entityMgr.findById(VMInstanceVO.class, work.getVmId());
if (vm == null) {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fa7d9ad1/engine/orchestration/src/com/cloud/vm/VmWorkMigrateAway.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkMigrateAway.java b/engine/orchestration/src/com/cloud/vm/VmWorkMigrateAway.java
new file mode 100644
index 0000000..92189ed
--- /dev/null
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkMigrateAway.java
@@ -0,0 +1,36 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package com.cloud.vm;
+
+public class VmWorkMigrateAway extends VmWork {
+
+ private static final long serialVersionUID = -5917512239025814373L;
+
+ private long srcHostId;
+
+ public VmWorkMigrateAway(long userId, long accountId, long vmId, String handlerName,
+ long srcHostId) {
+ super(userId, accountId, vmId, handlerName);
+
+ this.srcHostId = srcHostId;
+ }
+
+ public long getSrcHostId() {
+ return srcHostId;
+ }
+}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fa7d9ad1/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 3963f29..24a3498 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -32,7 +32,6 @@ import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
import org.apache.log4j.NDC;
-import com.cloud.deploy.HAPlanner;
import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService;
import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
import org.apache.cloudstack.managed.context.ManagedContext;
@@ -48,6 +47,8 @@ import com.cloud.dc.DataCenterVO;
import com.cloud.dc.HostPodVO;
import com.cloud.dc.dao.DataCenterDao;
import com.cloud.dc.dao.HostPodDao;
+import com.cloud.deploy.DeploymentPlanner;
+import com.cloud.deploy.HAPlanner;
import com.cloud.exception.AgentUnavailableException;
import com.cloud.exception.ConcurrentOperationException;
import com.cloud.exception.InsufficientCapacityException;
@@ -148,7 +149,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
}
public void setHaPlanners(List<HAPlanner> haPlanners) {
- this._haPlanners = haPlanners;
+ _haPlanners = haPlanners;
}
@@ -611,13 +612,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
VMInstanceVO vm = _instanceDao.findById(vmId);
// First try starting the vm with its original planner, if it doesn't succeed send HAPlanner as its an emergency.
- boolean result = false;
- try {
- _itMgr.migrateAway(vm.getUuid(), srcHostId, null);
- }catch (InsufficientServerCapacityException e) {
- s_logger.warn("Failed to deploy vm " + vmId + " with original planner, sending HAPlanner");
- _itMgr.migrateAway(vm.getUuid(), srcHostId, _haPlanners.get(0));
- }
+ _itMgr.migrateAway(vm.getUuid(), srcHostId);
return null;
} catch (InsufficientServerCapacityException e) {
s_logger.warn("Insufficient capacity for migrating a VM.");
@@ -935,4 +930,8 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
return _haTag;
}
+ @Override
+ public DeploymentPlanner getHAPlanner() {
+ return _haPlanners.get(0);
+ }
}
[28/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
Add VM level HA for hypervisors that are not integrated with native HA with CloudStack, i.e., Xen/KVM.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/7ce5e5b1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/7ce5e5b1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/7ce5e5b1
Branch: refs/heads/master
Commit: 7ce5e5b1fbcdd12e37501ec6c132219d9977c15b
Parents: 57a00a8
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Feb 21 15:19:30 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:59 2014 -0800
----------------------------------------------------------------------
.../cloud/ha/HighAvailabilityManagerImpl.java | 37 ++++++++++++++++++--
1 file changed, 34 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7ce5e5b1/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 24a3498..4a24d63 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -63,6 +63,8 @@ import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.resource.ResourceManager;
import com.cloud.server.ManagementServer;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.StorageManager;
import com.cloud.storage.dao.GuestOSCategoryDao;
import com.cloud.storage.dao.GuestOSDao;
@@ -71,6 +73,7 @@ import com.cloud.utils.NumbersUtil;
import com.cloud.utils.component.ManagerBase;
import com.cloud.utils.concurrency.NamedThreadFactory;
import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.StateListener;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachine.State;
@@ -100,8 +103,10 @@ import com.cloud.vm.dao.VMInstanceDao;
* ha.retry.wait | time to wait before retrying the work item | seconds | 120 || || stop.retry.wait | time to wait
* before retrying the stop | seconds | 120 || * }
**/
-@Local(value = {HighAvailabilityManager.class})
-public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvailabilityManager, ClusterManagerListener {
+@Local(value = { HighAvailabilityManager.class })
+public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvailabilityManager, ClusterManagerListener,
+ StateListener<State, VirtualMachine.Event, VirtualMachine> {
+
protected static final Logger s_logger = Logger.getLogger(HighAvailabilityManagerImpl.class);
WorkerThread[] _workers;
boolean _stopped;
@@ -118,6 +123,10 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
HostPodDao _podDao;
@Inject
ClusterDetailsDao _clusterDetailsDao;
+
+ @Inject
+ ServiceOfferingDao _serviceOfferingDao;
+
long _serverId;
@Inject
@@ -317,7 +326,6 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
assert false : "How do we hit this when force is true?";
throw new CloudRuntimeException("Caught exception even though it should be handled.", e);
}
- return;
}
if (vm.getHypervisorType() == HypervisorType.VMware || vm.getHypervisorType() == HypervisorType.Hyperv) {
@@ -786,6 +794,7 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
_stopped = true;
_executor = Executors.newScheduledThreadPool(count, new NamedThreadFactory("HA"));
+ VirtualMachine.State.getStateMachine().registerListener(this);
return true;
}
@@ -934,4 +943,26 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
public DeploymentPlanner getHAPlanner() {
return _haPlanners.get(0);
}
+
+ @Override
+ public boolean preStateTransitionEvent(State oldState, VirtualMachine.Event event, State newState, VirtualMachine vo, boolean status, Object opaque) {
+ return true;
+ }
+
+ @Override
+ public boolean postStateTransitionEvent(State oldState, VirtualMachine.Event event, State newState, VirtualMachine vo, boolean status, Object opaque) {
+ if (oldState == State.Running && event == VirtualMachine.Event.FollowAgentPowerOffReport && newState == State.Stopped) {
+ long serviceOfferingId = vo.getServiceOfferingId();
+
+ ServiceOfferingVO serviceOffering = _serviceOfferingDao.findById(serviceOfferingId);
+ if (serviceOffering != null && serviceOffering.getOfferHA()) {
+
+ VMInstanceVO vm = _instanceDao.findById(vo.getId());
+
+ s_logger.info("Detected out-of-band stop of a HA enabled VM " + vm.getInstanceName() + ", will schedule restart");
+ scheduleRestart(vm, true);
+ }
+ }
+ return true;
+ }
}
[27/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
make sure XS report VM state even if there is no running VM on the host.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/b21662f8
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/b21662f8
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/b21662f8
Branch: refs/heads/master
Commit: b21662f8904dabddb4246418459afa68b2df99c8
Parents: 7ce5e5b
Author: Kelven Yang <ke...@gmail.com>
Authored: Mon Feb 24 16:51:58 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:59 2014 -0800
----------------------------------------------------------------------
api/src/org/apache/cloudstack/context/CallContext.java | 2 ++
.../src/com/cloud/vm/VirtualMachineManagerImpl.java | 2 +-
.../src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java | 6 ++++++
.../cloudstack/framework/jobs/AsyncJobExecutionContext.java | 2 +-
.../com/cloud/hypervisor/xen/resource/CitrixResourceBase.java | 7 +++----
5 files changed, 13 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b21662f8/api/src/org/apache/cloudstack/context/CallContext.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/context/CallContext.java b/api/src/org/apache/cloudstack/context/CallContext.java
index 0457c33..f80b921 100644
--- a/api/src/org/apache/cloudstack/context/CallContext.java
+++ b/api/src/org/apache/cloudstack/context/CallContext.java
@@ -252,6 +252,8 @@ public class CallContext {
if (!stack.isEmpty()) {
s_currentContext.set(stack.peek());
+ } else {
+ s_currentContext.set(null);
}
return context;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b21662f8/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 805ecce..6b73f4d 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -3048,7 +3048,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
if(VmJobEnabled.value()) {
- if (ping.getHostVmStateReport() != null && ping.getHostVmStateReport().size() > 0) {
+ if (ping.getHostVmStateReport() != null) {
_syncMgr.processHostVmStatePingReport(agentId, ping.getHostVmStateReport());
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b21662f8/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
index 635603f..6332958 100644
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
@@ -66,6 +66,9 @@ public class VirtualMachinePowerStateSyncImpl implements VirtualMachinePowerStat
private void processReport(long hostId, Map<Long, VirtualMachine.PowerState> translatedInfo) {
+ if (s_logger.isDebugEnabled())
+ s_logger.debug("Process VM state report. host: " + hostId + ", number of records in report: " + translatedInfo.size());
+
for (Map.Entry<Long, VirtualMachine.PowerState> entry : translatedInfo.entrySet()) {
if (s_logger.isDebugEnabled())
@@ -105,6 +108,9 @@ public class VirtualMachinePowerStateSyncImpl implements VirtualMachinePowerStat
}
}
}
+
+ if (s_logger.isDebugEnabled())
+ s_logger.debug("Done with process of VM state report. host: " + hostId);
}
@Override
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b21662f8/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
index 129d9ca..86c6542 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
@@ -207,7 +207,7 @@ public class AsyncJobExecutionContext {
public static String getOriginJobId() {
AsyncJobExecutionContext context = AsyncJobExecutionContext.getCurrentExecutionContext();
if (context != null && context.getJob() != null)
- return "Job-" + context.getJob().getId();
+ return "" + context.getJob().getId();
return "";
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/b21662f8/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 33e7462..bbe15c8 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -324,9 +324,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
static {
s_powerStatesTable = new HashMap<Types.VmPowerState, PowerState>();
s_powerStatesTable.put(Types.VmPowerState.HALTED, PowerState.PowerOff);
- s_powerStatesTable.put(Types.VmPowerState.PAUSED, PowerState.PowerOn);
+ s_powerStatesTable.put(Types.VmPowerState.PAUSED, PowerState.PowerOff);
s_powerStatesTable.put(Types.VmPowerState.RUNNING, PowerState.PowerOn);
- s_powerStatesTable.put(Types.VmPowerState.SUSPENDED, PowerState.PowerOn);
+ s_powerStatesTable.put(Types.VmPowerState.SUSPENDED, PowerState.PowerOff);
s_powerStatesTable.put(Types.VmPowerState.UNRECOGNIZED, PowerState.PowerUnknown);
}
@@ -2524,7 +2524,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (vm_map == null) {
- return null;
+ return vmStates;
}
for (VM.Record record : vm_map.values()) {
if (record.isControlDomain || record.isASnapshot || record.isATemplate) {
@@ -4927,7 +4927,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
if (srr.shared) {
Host host = Host.getByUuid(conn, _host.uuid);
-
boolean found = false;
for (PBD pbd : pbds) {
PBD.Record pbdr = pbd.getRecord(conn);
[03/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
propagate job execution runtime exception to API context
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/86a63c49
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/86a63c49
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/86a63c49
Branch: refs/heads/master
Commit: 86a63c49bc459fe390d05b801e526a69590e89e9
Parents: 206a9ed
Author: Kelven Yang <ke...@gmail.com>
Authored: Mon Jan 27 14:46:12 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:57 2014 -0800
----------------------------------------------------------------------
.../com/cloud/vm/VirtualMachineManagerImpl.java | 29 ++++++++++++++++++++
1 file changed, 29 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/86a63c49/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 1dae94d..fb5d0f1 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -783,6 +783,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
throw (ConcurrentOperationException)jobResult;
else if (jobResult instanceof ResourceUnavailableException)
throw (ResourceUnavailableException)jobResult;
+ else if (jobResult instanceof RuntimeException)
+ throw (RuntimeException)jobResult;
+ else if (jobResult instanceof Throwable)
+ throw new RuntimeException("Unexpected exception", (Throwable)jobResult);
}
}
}
@@ -1333,6 +1337,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
throw (ConcurrentOperationException)jobResult;
else if (jobResult instanceof OperationTimedoutException)
throw (OperationTimedoutException)jobResult;
+ else if (jobResult instanceof RuntimeException)
+ throw (RuntimeException)jobResult;
+ else if (jobResult instanceof Throwable)
+ throw new RuntimeException("Unexpected exception", (Throwable)jobResult);
}
}
}
@@ -1638,6 +1646,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
if (jobResult != null) {
if (jobResult instanceof RuntimeException)
throw (RuntimeException)jobResult;
+ else if (jobResult instanceof Throwable)
+ throw new RuntimeException("Unexpected exception", (Throwable)jobResult);
}
}
}
@@ -1734,6 +1744,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
throw (ConcurrentOperationException)jobResult;
else if (jobResult instanceof RuntimeException)
throw (RuntimeException)jobResult;
+ else if (jobResult instanceof Throwable)
+ throw new RuntimeException("Unexpected exception", (Throwable)jobResult);
+
}
}
}
@@ -2015,6 +2028,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
throw (ResourceUnavailableException)jobException;
else if (jobException instanceof ConcurrentOperationException)
throw (ConcurrentOperationException)jobException;
+ else if (jobException instanceof RuntimeException)
+ throw (RuntimeException)jobException;
+ else if (jobException instanceof Throwable)
+ throw new RuntimeException("Unexpected exception", (Throwable)jobException);
}
}
}
@@ -2312,6 +2329,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
throw (ConcurrentOperationException)jobResult;
else if (jobResult instanceof InsufficientCapacityException)
throw (InsufficientCapacityException)jobResult;
+ else if (jobResult instanceof RuntimeException)
+ throw (RuntimeException)jobResult;
+ else if (jobResult instanceof Throwable)
+ throw new RuntimeException("Unexpected exception", (Throwable)jobResult);
}
}
}
@@ -3252,6 +3273,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
throw (InsufficientCapacityException)jobException;
else if (jobException instanceof RuntimeException)
throw (RuntimeException)jobException;
+ else if (jobException instanceof Throwable)
+ throw new RuntimeException("Unexpected exception", (Throwable)jobException);
else if (jobException instanceof Long)
return requested;
}
@@ -3363,6 +3386,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
throw (ConcurrentOperationException)jobResult;
else if (jobResult instanceof RuntimeException)
throw (RuntimeException)jobResult;
+ else if (jobResult instanceof Throwable)
+ throw new RuntimeException("Unexpected exception", (Throwable)jobResult);
else if (jobResult instanceof Boolean)
return (Boolean)jobResult;
}
@@ -3610,6 +3635,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
throw (ResourceUnavailableException)jobResult;
else if (jobResult instanceof ConcurrentOperationException)
throw (ConcurrentOperationException)jobResult;
+ else if (jobResult instanceof RuntimeException)
+ throw (RuntimeException)jobResult;
+ else if (jobResult instanceof Throwable)
+ throw new RuntimeException("Unexpected exception", (Throwable)jobResult);
}
}
}
[31/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
pass InsufficientCapacityException across job boundary since some HA logic relies on it. Reviewed-By: Self
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/7c7bd093
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/7c7bd093
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/7c7bd093
Branch: refs/heads/master
Commit: 7c7bd0934a57447a1d80f189cdd42578dfbacb77
Parents: 537bf7c
Author: Kelven Yang <ke...@gmail.com>
Authored: Wed Feb 19 17:41:23 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:59 2014 -0800
----------------------------------------------------------------------
.../src/com/cloud/vm/VirtualMachineManagerImpl.java | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/7c7bd093/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 5a33df4..805ecce 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -750,8 +750,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
@Override
- public void advanceStart(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy, DeploymentPlanner planner) throws InsufficientCapacityException,
- ConcurrentOperationException, ResourceUnavailableException {
+ public void advanceStart(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy, DeploymentPlanner planner)
+ throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
AsyncJobExecutionContext jobContext = AsyncJobExecutionContext.getCurrentExecutionContext();
if (!VmJobEnabled.value() || jobContext.isJobDispatchedBy(VmWorkConstants.VM_WORK_JOB_DISPATCHER)) {
@@ -784,6 +784,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
throw (ConcurrentOperationException)jobResult;
else if (jobResult instanceof ResourceUnavailableException)
throw (ResourceUnavailableException)jobResult;
+ else if (jobResult instanceof InsufficientCapacityException)
+ throw (InsufficientCapacityException)jobResult;
else if (jobResult instanceof RuntimeException)
throw (RuntimeException)jobResult;
else if (jobResult instanceof Throwable)
[25/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
NDC.pop() can return empty string, this causes a loop spinning in CallContext.UnregisterAll().
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/cdf605b2
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/cdf605b2
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/cdf605b2
Branch: refs/heads/master
Commit: cdf605b2cd7ccbe40b42810f8aaacb90535496db
Parents: b21662f
Author: Kelven Yang <ke...@gmail.com>
Authored: Tue Feb 25 11:47:51 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:59 2014 -0800
----------------------------------------------------------------------
api/src/org/apache/cloudstack/context/CallContext.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cdf605b2/api/src/org/apache/cloudstack/context/CallContext.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/context/CallContext.java b/api/src/org/apache/cloudstack/context/CallContext.java
index f80b921..22ea55f 100644
--- a/api/src/org/apache/cloudstack/context/CallContext.java
+++ b/api/src/org/apache/cloudstack/context/CallContext.java
@@ -239,7 +239,7 @@ public class CallContext {
String sessionIdOnStack = null;
String sessionIdPushedToNDC = "ctx-" + UuidUtils.first(contextId);
while ((sessionIdOnStack = NDC.pop()) != null) {
- if (sessionIdPushedToNDC.equals(sessionIdOnStack)) {
+ if (sessionIdOnStack.isEmpty() || sessionIdPushedToNDC.equals(sessionIdOnStack)) {
break;
}
if (s_logger.isTraceEnabled()) {
[18/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
Remove the hacking way of blocking VM state transition introduced by individual VM snapshot orchestration flow
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/434f8dab
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/434f8dab
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/434f8dab
Branch: refs/heads/master
Commit: 434f8dab72bfda3f1df414a46cf9235f6c7fbd89
Parents: 58c26ee
Author: Kelven Yang <ke...@gmail.com>
Authored: Tue Feb 4 16:42:57 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../src/com/cloud/vm/VirtualMachineManagerImpl.java | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/434f8dab/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 69f92c9..09a9980 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1543,10 +1543,15 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
protected boolean stateTransitTo(VMInstanceVO vm, VirtualMachine.Event e, Long hostId, String reservationId) throws NoTransitionException {
// if there are active vm snapshots task, state change is not allowed
- if (_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())) {
- s_logger.error("State transit with event: " + e + " failed due to: " + vm.getInstanceName() + " has active VM snapshots tasks");
- return false;
- }
+
+ // Disable this hacking thing, VM snapshot task need to be managed by its orchestartion flow istelf instead of
+ // hacking it here at general VM manager
+ /*
+ if (_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())) {
+ s_logger.error("State transit with event: " + e + " failed due to: " + vm.getInstanceName() + " has active VM snapshots tasks");
+ return false;
+ }
+ */
vm.setReservationId(reservationId);
return _stateMachine.transitTo(vm, e, new Pair<Long, Long>(vm.getHostId(), hostId), _vmDao);
}
[09/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
VirtualMachineManager.checkWorkItems() uses wrong time unit
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e6e12e33
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e6e12e33
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e6e12e33
Branch: refs/heads/master
Commit: e6e12e33de394f39acd9e88e3e1d8cbe59d8474c
Parents: dfb9f49
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Feb 7 15:42:11 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e6e12e33/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 246b43a..a99c5ce 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -636,7 +636,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
}
try {
- Thread.sleep(VmOpWaitInterval.value());
+ Thread.sleep(VmOpWaitInterval.value()*1000);
} catch (InterruptedException e) {
s_logger.info("Waiting for " + vm + " but is interrupted");
throw new ConcurrentOperationException("Waiting for " + vm + " but is interrupted");
[12/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
use lock table for locking
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/fed85813
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/fed85813
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/fed85813
Branch: refs/heads/master
Commit: fed85813e95c31c7159edc367426e9069749cc28
Parents: bfb7835
Author: Kelven Yang <ke...@gmail.com>
Authored: Mon Feb 10 15:35:03 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../com/cloud/vm/VirtualMachineManagerImpl.java | 647 ++++++++++---------
.../com/cloud/storage/VolumeApiServiceImpl.java | 186 +++---
.../vm/snapshot/VMSnapshotManagerImpl.java | 144 +++--
3 files changed, 526 insertions(+), 451 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fed85813/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 a99c5ce..457fad2 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -4417,36 +4417,40 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
public Object[] doInTransaction(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(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkStart.class.getName());
-
- workJob.setAccountId(callingAccount.getId());
- workJob.setUserId(callingUser.getId());
- workJob.setStep(VmWorkJobVO.Step.Starting);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
-
- // save work context info (there are some duplications)
- VmWorkStart workInfo = new VmWorkStart(callingUser.getId(), callingAccount.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER);
- workInfo.setPlan(planToDeploy);
- workInfo.setParams(params);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ 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(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkStart.class.getName());
+
+ workJob.setAccountId(callingAccount.getId());
+ workJob.setUserId(callingUser.getId());
+ workJob.setStep(VmWorkJobVO.Step.Starting);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+
+ // save work context info (there are some duplications)
+ VmWorkStart workInfo = new VmWorkStart(callingUser.getId(), callingAccount.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER);
+ workInfo.setPlan(planToDeploy);
+ workInfo.setParams(params);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
-
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4467,37 +4471,41 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
@Override
public Object[] doInTransaction(TransactionStatus status) {
- _vmDao.lockRow(vm.getId(), true);
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
- List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
- vm.getType(), 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(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkStop.class.getName());
-
- workJob.setAccountId(account.getId());
- workJob.setUserId(user.getId());
- workJob.setStep(VmWorkJobVO.Step.Prepare);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
-
- // save work context info (there are some duplications)
- VmWorkStop workInfo = new VmWorkStop(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, cleanup);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ try {
+ List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+ vm.getType(), 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(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkStop.class.getName());
+
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setStep(VmWorkJobVO.Step.Prepare);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+
+ // save work context info (there are some duplications)
+ VmWorkStop workInfo = new VmWorkStop(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, cleanup);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
-
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4520,37 +4528,40 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
@Override
public Object[] doInTransaction(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(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkReboot.class.getName());
-
- workJob.setAccountId(account.getId());
- workJob.setUserId(user.getId());
- workJob.setStep(VmWorkJobVO.Step.Prepare);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
-
- // save work context info (there are some duplications)
- VmWorkReboot workInfo = new VmWorkReboot(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, params);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ 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(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkReboot.class.getName());
+
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setStep(VmWorkJobVO.Step.Prepare);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+
+ // save work context info (there are some duplications)
+ VmWorkReboot workInfo = new VmWorkReboot(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, params);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
-
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4572,36 +4583,39 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
- _vmDao.lockRow(vm.getId(), true);
-
- List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
- VirtualMachine.Type.Instance, vm.getId(),
- VmWorkMigrate.class.getName());
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ 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 {
+ VmWorkJobVO workJob = null;
+ if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+ assert (pendingWorkJobs.size() == 1);
+ workJob = pendingWorkJobs.get(0);
+ } else {
- workJob = new VmWorkJobVO(context.getContextId());
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkMigrate.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkMigrate.class.getName());
- workJob.setAccountId(account.getId());
- workJob.setUserId(user.getId());
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkMigrate workInfo = new VmWorkMigrate(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, dest);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkMigrate workInfo = new VmWorkMigrate(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, dest);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4622,37 +4636,38 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
Object[] result = Transaction.execute(new TransactionCallback<Object[]>() {
@Override
public Object[] doInTransaction(TransactionStatus status) {
-
- _vmDao.lockRow(vm.getId(), true);
-
- List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
- VirtualMachine.Type.Instance, vm.getId(),
- VmWorkMigrateAway.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(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkMigrateAway.class.getName());
-
- workJob.setAccountId(account.getId());
- workJob.setUserId(user.getId());
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
-
- // save work context info (there are some duplications)
- VmWorkMigrateAway workInfo = new VmWorkMigrateAway(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
-
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+ VirtualMachine.Type.Instance, vm.getId(),
+ VmWorkMigrateAway.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(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkMigrateAway.class.getName());
+
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+
+ // save work context info (there are some duplications)
+ VmWorkMigrateAway workInfo = new VmWorkMigrateAway(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4677,37 +4692,40 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
- _vmDao.lockRow(vm.getId(), true);
-
- List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
- VirtualMachine.Type.Instance, vm.getId(),
- VmWorkMigrateWithStorage.class.getName());
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ 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 {
+ VmWorkJobVO workJob = null;
+ if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+ assert (pendingWorkJobs.size() == 1);
+ workJob = pendingWorkJobs.get(0);
+ } else {
- workJob = new VmWorkJobVO(context.getContextId());
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkMigrate.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkMigrate.class.getName());
- workJob.setAccountId(account.getId());
- workJob.setUserId(user.getId());
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkMigrateWithStorage workInfo = new VmWorkMigrateWithStorage(user.getId(), account.getId(), vm.getId(),
- VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, destHostId, volumeToPool);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkMigrateWithStorage workInfo = new VmWorkMigrateWithStorage(user.getId(), account.getId(), vm.getId(),
+ VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, destHostId, volumeToPool);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4731,38 +4749,41 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
- _vmDao.lockRow(vm.getId(), true);
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+ VirtualMachine.Type.Instance, vm.getId(),
+ VmWorkMigrateForScale.class.getName());
- 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 {
- VmWorkJobVO workJob = null;
- if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
- assert (pendingWorkJobs.size() == 1);
- workJob = pendingWorkJobs.get(0);
- } else {
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob = new VmWorkJobVO(context.getContextId());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkMigrate.class.getName());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkMigrate.class.getName());
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- workJob.setAccountId(account.getId());
- workJob.setUserId(user.getId());
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ // save work context info (there are some duplications)
+ VmWorkMigrateForScale workInfo = new VmWorkMigrateForScale(user.getId(), account.getId(), vm.getId(),
+ VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, dest, newSvcOfferingId);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- // save work context info (there are some duplications)
- VmWorkMigrateForScale workInfo = new VmWorkMigrateForScale(user.getId(), account.getId(), vm.getId(),
- VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, dest, newSvcOfferingId);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
-
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4785,38 +4806,41 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
- _vmDao.lockRow(vm.getId(), true);
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+ VirtualMachine.Type.Instance, vm.getId(),
+ VmWorkStorageMigration.class.getName());
- 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 {
- VmWorkJobVO workJob = null;
- if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
- assert (pendingWorkJobs.size() == 1);
- workJob = pendingWorkJobs.get(0);
- } else {
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob = new VmWorkJobVO(context.getContextId());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkStorageMigration.class.getName());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkStorageMigration.class.getName());
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- workJob.setAccountId(account.getId());
- workJob.setUserId(user.getId());
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ // save work context info (there are some duplications)
+ VmWorkStorageMigration workInfo = new VmWorkStorageMigration(user.getId(), account.getId(), vm.getId(),
+ VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, destPool.getId());
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- // save work context info (there are some duplications)
- VmWorkStorageMigration workInfo = new VmWorkStorageMigration(user.getId(), account.getId(), vm.getId(),
- VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, destPool.getId());
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
-
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4837,37 +4861,41 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
- _vmDao.lockRow(vm.getId(), true);
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
- List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
- VirtualMachine.Type.Instance, vm.getId(),
- VmWorkAddVmToNetwork.class.getName());
+ try {
+ 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 {
+ VmWorkJobVO workJob = null;
+ if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+ assert (pendingWorkJobs.size() == 1);
+ workJob = pendingWorkJobs.get(0);
+ } else {
- workJob = new VmWorkJobVO(context.getContextId());
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkAddVmToNetwork.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkAddVmToNetwork.class.getName());
- workJob.setAccountId(account.getId());
- workJob.setUserId(user.getId());
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkAddVmToNetwork workInfo = new VmWorkAddVmToNetwork(user.getId(), account.getId(), vm.getId(),
- VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, network.getId(), requested);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkAddVmToNetwork workInfo = new VmWorkAddVmToNetwork(user.getId(), account.getId(), vm.getId(),
+ VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, network.getId(), requested);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4888,37 +4916,40 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
- _vmDao.lockRow(vm.getId(), true);
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
+ VirtualMachine.Type.Instance, vm.getId(),
+ VmWorkRemoveNicFromVm.class.getName());
- 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 {
- VmWorkJobVO workJob = null;
- if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
- assert (pendingWorkJobs.size() == 1);
- workJob = pendingWorkJobs.get(0);
- } else {
-
- workJob = new VmWorkJobVO(context.getContextId());
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkRemoveNicFromVm.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkRemoveNicFromVm.class.getName());
- workJob.setAccountId(account.getId());
- workJob.setUserId(user.getId());
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkRemoveNicFromVm workInfo = new VmWorkRemoveNicFromVm(user.getId(), account.getId(), vm.getId(),
- VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, nic.getId());
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkRemoveNicFromVm workInfo = new VmWorkRemoveNicFromVm(user.getId(), account.getId(), vm.getId(),
+ VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, nic.getId());
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4939,37 +4970,40 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
- _vmDao.lockRow(vm.getId(), true);
-
- List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
- VirtualMachine.Type.Instance, vm.getId(),
- VmWorkRemoveVmFromNetwork.class.getName());
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ 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 {
+ VmWorkJobVO workJob = null;
+ if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+ assert (pendingWorkJobs.size() == 1);
+ workJob = pendingWorkJobs.get(0);
+ } else {
- workJob = new VmWorkJobVO(context.getContextId());
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkRemoveVmFromNetwork.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkRemoveVmFromNetwork.class.getName());
- workJob.setAccountId(account.getId());
- workJob.setUserId(user.getId());
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkRemoveVmFromNetwork workInfo = new VmWorkRemoveVmFromNetwork(user.getId(), account.getId(), vm.getId(),
- VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, network, broadcastUri);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkRemoveVmFromNetwork workInfo = new VmWorkRemoveVmFromNetwork(user.getId(), account.getId(), vm.getId(),
+ VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, network, broadcastUri);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
@@ -4992,37 +5026,40 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public Object[] doInTransaction(TransactionStatus status) {
- _vmDao.lockRow(vm.getId(), true);
-
- List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
- VirtualMachine.Type.Instance, vm.getId(),
- VmWorkReconfigure.class.getName());
+ _vmDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ 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 {
+ VmWorkJobVO workJob = null;
+ if (pendingWorkJobs != null && pendingWorkJobs.size() > 0) {
+ assert (pendingWorkJobs.size() == 1);
+ workJob = pendingWorkJobs.get(0);
+ } else {
- workJob = new VmWorkJobVO(context.getContextId());
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkReconfigure.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkReconfigure.class.getName());
- workJob.setAccountId(account.getId());
- workJob.setUserId(user.getId());
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(account.getId());
+ workJob.setUserId(user.getId());
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkReconfigure workInfo = new VmWorkReconfigure(user.getId(), account.getId(), vm.getId(),
- VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, newServiceOffering.getId(), reconfiguringOnExistingHost);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkReconfigure workInfo = new VmWorkReconfigure(user.getId(), account.getId(), vm.getId(),
+ VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, newServiceOffering.getId(), reconfiguringOnExistingHost);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ }
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmDao.unlockFromLockTable(String.valueOf(vm.getId()));
}
- return new Object[] {workJob, new Long(workJob.getId())};
}
});
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fed85813/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
index 1ee9286..184be38 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -2129,30 +2129,34 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
public Object[] doInTransaction(TransactionStatus status) {
VmWorkJobVO workJob = null;
- _vmInstanceDao.lockRow(vm.getId(), true);
- workJob = new VmWorkJobVO(context.getContextId());
+ _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkAttachVolume.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkAttachVolume.class.getName());
- workJob.setAccountId(callingAccount.getId());
- workJob.setUserId(callingUser.getId());
- workJob.setStep(VmWorkJobVO.Step.Starting);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(callingAccount.getId());
+ workJob.setUserId(callingUser.getId());
+ workJob.setStep(VmWorkJobVO.Step.Starting);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkAttachVolume workInfo = new VmWorkAttachVolume(callingUser.getId(), callingAccount.getId(), vm.getId(), VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId,
- deviceId);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkAttachVolume workInfo = new VmWorkAttachVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
+ VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, deviceId);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
- AsyncJobVO jobVo = _jobMgr.getAsyncJob(workJob.getId());
- s_logger.debug("New job " + workJob.getId() + ", result field: " + jobVo.getResult());
+ AsyncJobVO jobVo = _jobMgr.getAsyncJob(workJob.getId());
+ s_logger.debug("New job " + workJob.getId() + ", result field: " + jobVo.getResult());
- return new Object[] {workJob, new Long(workJob.getId())};
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+ }
}
});
@@ -2176,26 +2180,31 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
public Object[] doInTransaction(TransactionStatus status) {
VmWorkJobVO workJob = null;
- _vmInstanceDao.lockRow(vm.getId(), true);
- workJob = new VmWorkJobVO(context.getContextId());
+ _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkDetachVolume.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkDetachVolume.class.getName());
- workJob.setAccountId(callingAccount.getId());
- workJob.setUserId(callingUser.getId());
- workJob.setStep(VmWorkJobVO.Step.Starting);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(callingAccount.getId());
+ workJob.setUserId(callingUser.getId());
+ workJob.setStep(VmWorkJobVO.Step.Starting);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkDetachVolume workInfo = new VmWorkDetachVolume(callingUser.getId(), callingAccount.getId(), vm.getId(), VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkDetachVolume workInfo = new VmWorkDetachVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
+ VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
- return new Object[] {workJob, new Long(workJob.getId())};
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+ }
}
});
@@ -2220,27 +2229,32 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
public Object[] doInTransaction(TransactionStatus status) {
VmWorkJobVO workJob = null;
- _vmInstanceDao.lockRow(vm.getId(), true);
- workJob = new VmWorkJobVO(context.getContextId());
+ _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+
+ try {
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkResizeVolume.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkResizeVolume.class.getName());
- workJob.setAccountId(callingAccount.getId());
- workJob.setUserId(callingUser.getId());
- workJob.setStep(VmWorkJobVO.Step.Starting);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(callingAccount.getId());
+ workJob.setUserId(callingUser.getId());
+ workJob.setStep(VmWorkJobVO.Step.Starting);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkResizeVolume workInfo = new VmWorkResizeVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
- VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, currentSize, newSize, newServiceOfferingId, shrinkOk);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkResizeVolume workInfo = new VmWorkResizeVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
+ VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, currentSize, newSize, newServiceOfferingId, shrinkOk);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
- return new Object[] {workJob, new Long(workJob.getId())};
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+ }
}
});
@@ -2265,27 +2279,31 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
public Object[] doInTransaction(TransactionStatus status) {
VmWorkJobVO workJob = null;
- _vmInstanceDao.lockRow(vm.getId(), true);
- workJob = new VmWorkJobVO(context.getContextId());
+ _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkMigrateVolume.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkMigrateVolume.class.getName());
- workJob.setAccountId(callingAccount.getId());
- workJob.setUserId(callingUser.getId());
- workJob.setStep(VmWorkJobVO.Step.Starting);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(callingAccount.getId());
+ workJob.setUserId(callingUser.getId());
+ workJob.setStep(VmWorkJobVO.Step.Starting);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkMigrateVolume workInfo = new VmWorkMigrateVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
- VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, destPoolId, liveMigrate);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkMigrateVolume workInfo = new VmWorkMigrateVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
+ VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, destPoolId, liveMigrate);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
- return new Object[] {workJob, new Long(workJob.getId())};
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+ }
}
});
@@ -2310,28 +2328,32 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
public Object[] doInTransaction(TransactionStatus status) {
VmWorkJobVO workJob = null;
- _vmInstanceDao.lockRow(vm.getId(), true);
- workJob = new VmWorkJobVO(context.getContextId());
+ _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkTakeVolumeSnapshot.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkTakeVolumeSnapshot.class.getName());
- workJob.setAccountId(callingAccount.getId());
- workJob.setUserId(callingUser.getId());
- workJob.setStep(VmWorkJobVO.Step.Starting);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(callingAccount.getId());
+ workJob.setUserId(callingUser.getId());
+ workJob.setStep(VmWorkJobVO.Step.Starting);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkTakeVolumeSnapshot workInfo = new VmWorkTakeVolumeSnapshot(
- callingUser.getId(), accountId != null ? accountId : callingAccount.getId(), vm.getId(),
- VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, policyId, snapshotId, quiesceVm);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkTakeVolumeSnapshot workInfo = new VmWorkTakeVolumeSnapshot(
+ callingUser.getId(), accountId != null ? accountId : callingAccount.getId(), vm.getId(),
+ VolumeApiServiceImpl.VM_WORK_JOB_HANDLER, volumeId, policyId, snapshotId, quiesceVm);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
- return new Object[] {workJob, new Long(workJob.getId())};
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+ }
}
});
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fed85813/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 2fcbb48..4bae4d0 100644
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -863,27 +863,31 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
public Object[] doInTransaction(TransactionStatus status) {
VmWorkJobVO workJob = null;
- _vmInstanceDao.lockRow(vm.getId(), true);
- workJob = new VmWorkJobVO(context.getContextId());
+ _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkCreateVMSnapshot.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkCreateVMSnapshot.class.getName());
- workJob.setAccountId(callingAccount.getId());
- workJob.setUserId(callingUser.getId());
- workJob.setStep(VmWorkJobVO.Step.Starting);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(callingAccount.getId());
+ workJob.setUserId(callingUser.getId());
+ workJob.setStep(VmWorkJobVO.Step.Starting);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkCreateVMSnapshot workInfo = new VmWorkCreateVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
- VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId, quiesceVm);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkCreateVMSnapshot workInfo = new VmWorkCreateVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
+ VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId, quiesceVm);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
- return new Object[] {workJob, new Long(workJob.getId())};
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+ }
}
});
@@ -907,27 +911,31 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
public Object[] doInTransaction(TransactionStatus status) {
VmWorkJobVO workJob = null;
- _vmInstanceDao.lockRow(vm.getId(), true);
- workJob = new VmWorkJobVO(context.getContextId());
+ _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkDeleteVMSnapshot.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkDeleteVMSnapshot.class.getName());
- workJob.setAccountId(callingAccount.getId());
- workJob.setUserId(callingUser.getId());
- workJob.setStep(VmWorkJobVO.Step.Starting);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(callingAccount.getId());
+ workJob.setUserId(callingUser.getId());
+ workJob.setStep(VmWorkJobVO.Step.Starting);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkDeleteVMSnapshot workInfo = new VmWorkDeleteVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
- VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkDeleteVMSnapshot workInfo = new VmWorkDeleteVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
+ VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
- return new Object[] {workJob, new Long(workJob.getId())};
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+ }
}
});
@@ -951,27 +959,31 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
public Object[] doInTransaction(TransactionStatus status) {
VmWorkJobVO workJob = null;
- _vmInstanceDao.lockRow(vm.getId(), true);
- workJob = new VmWorkJobVO(context.getContextId());
+ _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkRevertToVMSnapshot.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkRevertToVMSnapshot.class.getName());
- workJob.setAccountId(callingAccount.getId());
- workJob.setUserId(callingUser.getId());
- workJob.setStep(VmWorkJobVO.Step.Starting);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(callingAccount.getId());
+ workJob.setUserId(callingUser.getId());
+ workJob.setStep(VmWorkJobVO.Step.Starting);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkRevertToVMSnapshot workInfo = new VmWorkRevertToVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
- VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkRevertToVMSnapshot workInfo = new VmWorkRevertToVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
+ VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, vmSnapshotId);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
- return new Object[] {workJob, new Long(workJob.getId())};
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+ }
}
});
@@ -995,27 +1007,31 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
public Object[] doInTransaction(TransactionStatus status) {
VmWorkJobVO workJob = null;
- _vmInstanceDao.lockRow(vm.getId(), true);
- workJob = new VmWorkJobVO(context.getContextId());
+ _vmInstanceDao.lockInLockTable(String.valueOf(vm.getId()), Integer.MAX_VALUE);
+ try {
+ workJob = new VmWorkJobVO(context.getContextId());
- workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
- workJob.setCmd(VmWorkDeleteAllVMSnapshots.class.getName());
+ workJob.setDispatcher(VmWorkConstants.VM_WORK_JOB_DISPATCHER);
+ workJob.setCmd(VmWorkDeleteAllVMSnapshots.class.getName());
- workJob.setAccountId(callingAccount.getId());
- workJob.setUserId(callingUser.getId());
- workJob.setStep(VmWorkJobVO.Step.Starting);
- workJob.setVmType(VirtualMachine.Type.Instance);
- workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setAccountId(callingAccount.getId());
+ workJob.setUserId(callingUser.getId());
+ workJob.setStep(VmWorkJobVO.Step.Starting);
+ workJob.setVmType(VirtualMachine.Type.Instance);
+ workJob.setVmInstanceId(vm.getId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
- // save work context info (there are some duplications)
- VmWorkDeleteAllVMSnapshots workInfo = new VmWorkDeleteAllVMSnapshots(callingUser.getId(), callingAccount.getId(), vm.getId(),
- VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, type);
- workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
+ // save work context info (there are some duplications)
+ VmWorkDeleteAllVMSnapshots workInfo = new VmWorkDeleteAllVMSnapshots(callingUser.getId(), callingAccount.getId(), vm.getId(),
+ VMSnapshotManagerImpl.VM_WORK_JOB_HANDLER, type);
+ workJob.setCmdInfo(VmWorkSerializer.serialize(workInfo));
- _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
+ _jobMgr.submitAsyncJob(workJob, VmWorkConstants.VM_WORK_QUEUE, vm.getId());
- return new Object[] {workJob, new Long(workJob.getId())};
+ return new Object[] {workJob, new Long(workJob.getId())};
+ } finally {
+ _vmInstanceDao.unlockFromLockTable(String.valueOf(vm.getId()));
+ }
}
});
[04/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
disable cluster-scope report from XS resource
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/90ea3249
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/90ea3249
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/90ea3249
Branch: refs/heads/master
Commit: 90ea3249a8b731be443414b430a5a506ab02bd06
Parents: 5d73217
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Jan 24 15:52:53 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:57 2014 -0800
----------------------------------------------------------------------
api/src/com/cloud/vm/VirtualMachine.java | 8 ++++----
.../com/cloud/vm/VirtualMachinePowerStateSyncImpl.java | 4 ++--
.../hypervisor/xen/resource/CitrixResourceBase.java | 12 ++++++++++--
3 files changed, 16 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90ea3249/api/src/com/cloud/vm/VirtualMachine.java
----------------------------------------------------------------------
diff --git a/api/src/com/cloud/vm/VirtualMachine.java b/api/src/com/cloud/vm/VirtualMachine.java
index 2d98aa9..dd11a82 100755
--- a/api/src/com/cloud/vm/VirtualMachine.java
+++ b/api/src/com/cloud/vm/VirtualMachine.java
@@ -33,10 +33,10 @@ import com.cloud.utils.fsm.StateObject;
*/
public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, InternalIdentity, StateObject<VirtualMachine.State> {
- public enum PowerState {
- PowerUnknown,
- PowerOn,
- PowerOff,
+ public enum PowerState {
+ PowerUnknown,
+ PowerOn,
+ PowerOff,
PowerReportMissing
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90ea3249/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
index fd0077c..2e1a552 100644
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java
@@ -79,8 +79,8 @@ public class VirtualMachinePowerStateSyncImpl implements VirtualMachinePowerStat
} else {
if (s_logger.isDebugEnabled())
s_logger.debug("VM power state does not change, skip DB writing. vm id: " + entry.getKey());
- }
- }
+ }
+ }
// for all running/stopping VMs, we provide monitoring of missing report
List<VMInstanceVO> vmsThatAreMissingReport = _instanceDao.findByHostInStates(hostId, VirtualMachine.State.Running,
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90ea3249/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 96d33c7..12ba7c9 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -239,7 +239,6 @@ import com.cloud.vm.VirtualMachine.PowerState;
import com.cloud.vm.VirtualMachine.State;
import com.cloud.vm.snapshot.VMSnapshot;
-
/**
* CitrixResourceBase encapsulates the calls to the XenServer Xapi process
* to perform the required functionalities for CloudStack.
@@ -2496,6 +2495,9 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
}
protected HashMap<String, HostVmStateReportEntry> getHostVmStateReport(Connection conn) {
+
+ // TODO : new VM sync model does not require a cluster-scope report, we need to optimize
+ // the report accordingly
final HashMap<String, HostVmStateReportEntry> vmStates = new HashMap<String, HostVmStateReportEntry>();
Map<VM, VM.Record> vm_map = null;
for (int i = 0; i < 2; i++) {
@@ -2534,7 +2536,13 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
} catch (XmlRpcException e) {
s_logger.error("Failed to get host uuid for host " + host.toWireString(), e);
}
- vmStates.put(record.nameLabel, new HostVmStateReportEntry(convertPowerState(ps), host_uuid, xstoolsversion));
+
+ if (host_uuid.equalsIgnoreCase(_host.uuid)) {
+ vmStates.put(
+ record.nameLabel,
+ new HostVmStateReportEntry(convertPowerState(ps), host_uuid, xstoolsversion)
+ );
+ }
}
}
[02/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
Add a missing initialization call to setup EntityManager in VmMigrateWork
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/13e956a1
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/13e956a1
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/13e956a1
Branch: refs/heads/master
Commit: 13e956a10ca6944cd4a45348e5bccfacd3b889d3
Parents: 86a63c4
Author: Kelven Yang <ke...@gmail.com>
Authored: Mon Jan 27 16:56:13 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:57 2014 -0800
----------------------------------------------------------------------
.../orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java | 1 +
1 file changed, 1 insertion(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/13e956a1/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 fb5d0f1..84c56ae 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -577,6 +577,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
public boolean configure(String name, Map<String, Object> xmlParams) throws ConfigurationException {
ReservationContextImpl.init(_entityMgr);
VirtualMachineProfileImpl.init(_entityMgr);
+ VmWorkMigrate.init(_entityMgr);
_executor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Vm-Operations-Cleanup"));
_nodeId = ManagementServerNode.getManagementServerId();
[21/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
Remove inner retry loop when CPVM tries to reconnect to host
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/dfb9f491
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/dfb9f491
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/dfb9f491
Branch: refs/heads/master
Commit: dfb9f49117601de61c843bf57f1f372294696e5a
Parents: 38a1300
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Feb 7 13:53:22 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../consoleproxy/ConsoleProxyVncClient.java | 89 ++++++++------------
1 file changed, 36 insertions(+), 53 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/dfb9f491/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyVncClient.java
----------------------------------------------------------------------
diff --git a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyVncClient.java b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyVncClient.java
index 5eb20ee..8fce978 100644
--- a/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyVncClient.java
+++ b/services/console-proxy/server/src/com/cloud/consoleproxy/ConsoleProxyVncClient.java
@@ -82,45 +82,28 @@ public class ConsoleProxyVncClient extends ConsoleProxyClientBase {
String tunnelUrl = getClientParam().getClientTunnelUrl();
String tunnelSession = getClientParam().getClientTunnelSession();
- for (int i = 0; i < 15 && !workerDone; i++) {
- try {
- if (tunnelUrl != null && !tunnelUrl.isEmpty() && tunnelSession != null && !tunnelSession.isEmpty()) {
- URI uri = new URI(tunnelUrl);
- s_logger.info("Connect to VNC server via tunnel. url: " + tunnelUrl + ", session: " + tunnelSession);
-
- ConsoleProxy.ensureRoute(uri.getHost());
- client.connectTo(uri.getHost(), uri.getPort(), uri.getPath() + "?" + uri.getQuery(), tunnelSession,
- "https".equalsIgnoreCase(uri.getScheme()), getClientHostPassword());
- } else {
- s_logger.info("Connect to VNC server directly. host: " + getClientHostAddress() + ", port: " + getClientHostPort());
- ConsoleProxy.ensureRoute(getClientHostAddress());
- client.connectTo(getClientHostAddress(), getClientHostPort(), getClientHostPassword());
- }
- } catch (UnknownHostException e) {
- s_logger.error("Unexpected exception (will retry until timeout)", e);
- } catch (IOException e) {
- s_logger.error("Unexpected exception (will retry until timeout) ", e);
- } catch (Throwable e) {
- s_logger.error("Unexpected exception (will retry until timeout) ", e);
- }
-
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- }
-
+ try {
if (tunnelUrl != null && !tunnelUrl.isEmpty() && tunnelSession != null && !tunnelSession.isEmpty()) {
- ConsoleProxyAuthenticationResult authResult = ConsoleProxy.reAuthenticationExternally(getClientParam());
- if (authResult != null && authResult.isSuccess()) {
- if (authResult.getTunnelUrl() != null && !authResult.getTunnelUrl().isEmpty() && authResult.getTunnelSession() != null &&
- !authResult.getTunnelSession().isEmpty()) {
- tunnelUrl = authResult.getTunnelUrl();
- tunnelSession = authResult.getTunnelSession();
-
- s_logger.info("Reset XAPI session. url: " + tunnelUrl + ", session: " + tunnelSession);
- }
- }
+ URI uri = new URI(tunnelUrl);
+ s_logger.info("Connect to VNC server via tunnel. url: " + tunnelUrl + ", session: " + tunnelSession);
+
+ ConsoleProxy.ensureRoute(uri.getHost());
+ client.connectTo(
+ uri.getHost(), uri.getPort(),
+ uri.getPath() + "?" + uri.getQuery(),
+ tunnelSession, "https".equalsIgnoreCase(uri.getScheme()),
+ getClientHostPassword());
+ } else {
+ s_logger.info("Connect to VNC server directly. host: " + getClientHostAddress() + ", port: " + getClientHostPort());
+ ConsoleProxy.ensureRoute(getClientHostAddress());
+ client.connectTo(getClientHostAddress(), getClientHostPort(), getClientHostPassword());
}
+ } catch (UnknownHostException e) {
+ s_logger.error("Unexpected exception", e);
+ } catch (IOException e) {
+ s_logger.error("Unexpected exception", e);
+ } catch (Throwable e) {
+ s_logger.error("Unexpected exception", e);
}
s_logger.info("Receiver thread stopped.");
@@ -164,23 +147,23 @@ public class ConsoleProxyVncClient extends ConsoleProxyClientBase {
updateFrontEndActivityTime();
- switch (event) {
- case KEY_DOWN:
- sendModifierEvents(modifiers);
- client.sendClientKeyboardEvent(RfbConstants.KEY_DOWN, code, 0);
- break;
+ switch(event) {
+ case KEY_DOWN :
+ sendModifierEvents(modifiers);
+ client.sendClientKeyboardEvent(RfbConstants.KEY_DOWN, code, 0);
+ break;
- case KEY_UP:
- client.sendClientKeyboardEvent(RfbConstants.KEY_UP, code, 0);
- sendModifierEvents(0);
- break;
+ case KEY_UP :
+ client.sendClientKeyboardEvent(RfbConstants.KEY_UP, code, 0);
+ sendModifierEvents(0);
+ break;
- case KEY_PRESS:
- break;
+ case KEY_PRESS :
+ break;
- default:
- assert (false);
- break;
+ default :
+ assert(false);
+ break;
}
}
@@ -224,13 +207,13 @@ public class ConsoleProxyVncClient extends ConsoleProxyClientBase {
if ((modifiers & SHIFT_KEY_MASK) != (lastModifierStates & SHIFT_KEY_MASK))
client.sendClientKeyboardEvent((modifiers & SHIFT_KEY_MASK) != 0 ? RfbConstants.KEY_DOWN : RfbConstants.KEY_UP, X11_KEY_SHIFT, 0);
- if ((modifiers & CTRL_KEY_MASK) != (lastModifierStates & CTRL_KEY_MASK))
+ if((modifiers & CTRL_KEY_MASK) != (lastModifierStates & CTRL_KEY_MASK))
client.sendClientKeyboardEvent((modifiers & CTRL_KEY_MASK) != 0 ? RfbConstants.KEY_DOWN : RfbConstants.KEY_UP, X11_KEY_CTRL, 0);
if ((modifiers & META_KEY_MASK) != (lastModifierStates & META_KEY_MASK))
client.sendClientKeyboardEvent((modifiers & META_KEY_MASK) != 0 ? RfbConstants.KEY_DOWN : RfbConstants.KEY_UP, X11_KEY_META, 0);
- if ((modifiers & ALT_KEY_MASK) != (lastModifierStates & ALT_KEY_MASK))
+ if((modifiers & ALT_KEY_MASK) != (lastModifierStates & ALT_KEY_MASK))
client.sendClientKeyboardEvent((modifiers & ALT_KEY_MASK) != 0 ? RfbConstants.KEY_DOWN : RfbConstants.KEY_UP, X11_KEY_ALT, 0);
lastModifierStates = modifiers;
[19/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
Make sure to let VM question answer monitor exit gracefully
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/9f0d1cee
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/9f0d1cee
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/9f0d1cee
Branch: refs/heads/master
Commit: 9f0d1cee64b0076b9d9cdbd18d38527a75dac7bb
Parents: 6987f23
Author: Kelven Yang <ke...@gmail.com>
Authored: Mon Feb 3 14:01:10 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../hypervisor/vmware/mo/VirtualMachineMO.java | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/9f0d1cee/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index 663adbf..263c656 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -248,12 +248,17 @@ public class VirtualMachineMO extends BaseMO {
}
});
- boolean result = _context.getVimClient().waitForTask(morTask);
- if (result) {
- _context.waitForTaskProgressDone(morTask);
- return true;
- } else {
- s_logger.error("VMware powerOnVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
+ try {
+ boolean result = _context.getVimClient().waitForTask(morTask);
+ if (result) {
+ _context.waitForTaskProgressDone(morTask);
+ return true;
+ } else {
+ s_logger.error("VMware powerOnVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
+ }
+ } finally {
+ // make sure to let VM question monitor exit
+ flags[0] = true;
}
return false;
[22/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
pass NULL host when performing state transition to follow-up with VM power-off report
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/38a13001
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/38a13001
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/38a13001
Branch: refs/heads/master
Commit: 38a13001419cdd7e454b52bd2b26c568771cf980
Parents: 9f0d1ce
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Feb 7 11:49:39 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../src/com/cloud/vm/VirtualMachineManagerImpl.java | 16 ++++++++++------
1 file changed, 10 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/38a13001/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 fa0540e..246b43a 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -1559,11 +1559,15 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
@Override
public boolean stateTransitTo(VirtualMachine vm1, VirtualMachine.Event e, Long hostId) throws NoTransitionException {
VMInstanceVO vm = (VMInstanceVO)vm1;
- // if there are active vm snapshots task, state change is not allowed
- if (_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())) {
- s_logger.error("State transit with event: " + e + " failed due to: " + vm.getInstanceName() + " has active VM snapshots tasks");
- return false;
- }
+
+ /*
+ * Remove the hacking logic here.
+ // if there are active vm snapshots task, state change is not allowed
+ if (_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())) {
+ s_logger.error("State transit with event: " + e + " failed due to: " + vm.getInstanceName() + " has active VM snapshots tasks");
+ return false;
+ }
+ */
State oldState = vm.getState();
if (oldState == State.Starting) {
@@ -4172,7 +4176,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
case Migrating:
s_logger.info("VM " + vm.getInstanceName() + " is at " + vm.getState() + " and we received a power-off report while there is no pending jobs on it");
try {
- stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOffReport, vm.getPowerHostId());
+ stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOffReport, null);
} catch (NoTransitionException e) {
s_logger.warn("Unexpected VM state transition exception, race-condition?", e);
}
[32/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
Do not do investigation for SSVM/CPVM agent host upon disconnect.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/90262a81
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/90262a81
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/90262a81
Branch: refs/heads/master
Commit: 90262a81ec5fdbe56b997a4064db0fdace550180
Parents: 0c48f70
Author: Kelven Yang <ke...@gmail.com>
Authored: Wed Feb 26 17:33:09 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:36:00 2014 -0800
----------------------------------------------------------------------
.../src/com/cloud/agent/manager/AgentManagerImpl.java | 12 ++++++++++--
.../src/com/cloud/agent/manager/DirectAgentAttache.java | 2 +-
.../src/com/cloud/ha/HighAvailabilityManagerImpl.java | 10 ++--------
3 files changed, 13 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90262a81/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
index 251f338..0d41bc1 100755
--- a/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java
@@ -1469,8 +1469,16 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl
status_logger.debug("Ping timeout but host " + agentId + " is in resource state of " + resourceState + ", so no investigation");
disconnectWithoutInvestigation(agentId, Event.ShutdownRequested);
} else {
- status_logger.debug("Ping timeout for host " + agentId + ", do invstigation");
- disconnectWithInvestigation(agentId, Event.PingTimeout);
+ HostVO host = _hostDao.findById(agentId);
+ if (host != null && (host.getType() == Host.Type.ConsoleProxy || host.getType() == Host.Type.SecondaryStorageVM
+ || host.getType() == Host.Type.SecondaryStorageCmdExecutor)) {
+
+ s_logger.warn("Disconnect agent for CPVM/SSVM due to physical connection close. host: " + host.getId());
+ disconnectWithoutInvestigation(agentId, Event.ShutdownRequested);
+ } else {
+ status_logger.debug("Ping timeout for host " + agentId + ", do invstigation");
+ disconnectWithInvestigation(agentId, Event.PingTimeout);
+ }
}
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90262a81/engine/orchestration/src/com/cloud/agent/manager/DirectAgentAttache.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/agent/manager/DirectAgentAttache.java b/engine/orchestration/src/com/cloud/agent/manager/DirectAgentAttache.java
index ef002d0..354da4b 100755
--- a/engine/orchestration/src/com/cloud/agent/manager/DirectAgentAttache.java
+++ b/engine/orchestration/src/com/cloud/agent/manager/DirectAgentAttache.java
@@ -182,7 +182,7 @@ public class DirectAgentAttache extends AgentAttache {
Command[] cmds = _req.getCommands();
ArrayList<Answer> answers = new ArrayList<Answer>(cmds.length);
for (Command cmd : cmds) {
- Answer answer = new Answer(cmd, false, "Bailed out as maximum oustanding task limit reached");
+ Answer answer = new Answer(cmd, false, "Bailed out as maximum outstanding task limit reached");
answers.add(answer);
}
Response resp = new Response(_req, answers.toArray(new Answer[answers.size()]));
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/90262a81/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 4a24d63..b7d5be8 100755
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -63,7 +63,6 @@ import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.Hypervisor.HypervisorType;
import com.cloud.resource.ResourceManager;
import com.cloud.server.ManagementServer;
-import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.StorageManager;
import com.cloud.storage.dao.GuestOSCategoryDao;
@@ -952,13 +951,8 @@ public class HighAvailabilityManagerImpl extends ManagerBase implements HighAvai
@Override
public boolean postStateTransitionEvent(State oldState, VirtualMachine.Event event, State newState, VirtualMachine vo, boolean status, Object opaque) {
if (oldState == State.Running && event == VirtualMachine.Event.FollowAgentPowerOffReport && newState == State.Stopped) {
- long serviceOfferingId = vo.getServiceOfferingId();
-
- ServiceOfferingVO serviceOffering = _serviceOfferingDao.findById(serviceOfferingId);
- if (serviceOffering != null && serviceOffering.getOfferHA()) {
-
- VMInstanceVO vm = _instanceDao.findById(vo.getId());
-
+ VMInstanceVO vm = _instanceDao.findById(vo.getId());
+ if (vm.isHaEnabled()) {
s_logger.info("Detected out-of-band stop of a HA enabled VM " + vm.getInstanceName() + ", will schedule restart");
scheduleRestart(vm, true);
}
[20/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
Pragrammatically Answer HA question posted in vCenter since it will block CloudStack from continuously operating on the VM
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/6987f233
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/6987f233
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/6987f233
Branch: refs/heads/master
Commit: 6987f23380c23aaf38856367f2acb4bf40fb7dd5
Parents: fa7d9ad
Author: Kelven Yang <ke...@gmail.com>
Authored: Tue Jan 28 17:16:04 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../hypervisor/vmware/mo/VirtualMachineMO.java | 17 ++++++-----------
1 file changed, 6 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/6987f233/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index 263c656..663adbf 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -248,17 +248,12 @@ public class VirtualMachineMO extends BaseMO {
}
});
- try {
- boolean result = _context.getVimClient().waitForTask(morTask);
- if (result) {
- _context.waitForTaskProgressDone(morTask);
- return true;
- } else {
- s_logger.error("VMware powerOnVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
- }
- } finally {
- // make sure to let VM question monitor exit
- flags[0] = true;
+ boolean result = _context.getVimClient().waitForTask(morTask);
+ if (result) {
+ _context.waitForTaskProgressDone(morTask);
+ return true;
+ } else {
+ s_logger.error("VMware powerOnVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
}
return false;
[29/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
let KVM only report running VM to workaround the problem when KVM still keeps stopped-VM around in some cases
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/414b1cbb
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/414b1cbb
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/414b1cbb
Branch: refs/heads/master
Commit: 414b1cbb226599853f51f722cb39c49586d05c90
Parents: a8c9238
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Feb 14 15:04:38 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:59 2014 -0800
----------------------------------------------------------------------
.../kvm/resource/LibvirtComputingResource.java | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/414b1cbb/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
index 5d7b0fd..3553b5c 100755
--- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
+++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java
@@ -4436,7 +4436,13 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
s_logger.trace("VM " + dm.getName() + ": powerstate = " + ps + "; vm state=" + state.toString());
String vmName = dm.getName();
- vmStates.put(vmName, new HostVmStateReportEntry(state, conn.getHostName(), null));
+
+ // TODO : for XS/KVM (host-based resource), we require to remove
+ // VM completely from host, for some reason, KVM seems to still keep
+ // Stopped VM around, to work-around that, reporting only powered-on VM
+ //
+ if (state == PowerState.PowerOn)
+ vmStates.put(vmName, new HostVmStateReportEntry(state, conn.getHostName(), null));
} catch (final LibvirtException e) {
s_logger.warn("Unable to get vms", e);
} finally {
@@ -4460,7 +4466,12 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
String vmName = dm.getName();
s_logger.trace("VM " + vmName + ": powerstate = " + ps + "; vm state=" + state.toString());
- vmStates.put(vmName, new HostVmStateReportEntry(state, conn.getHostName(), null));
+ // TODO : for XS/KVM (host-based resource), we require to remove
+ // VM completely from host, for some reason, KVM seems to still keep
+ // Stopped VM around, to work-around that, reporting only powered-on VM
+ //
+ if (state == PowerState.PowerOn)
+ vmStates.put(vmName, new HostVmStateReportEntry(state, conn.getHostName(), null));
} catch (final LibvirtException e) {
s_logger.warn("Unable to get vms", e);
} finally {
[17/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
do not shutdown alien VMs upon host startup. Send StopCommand for out-of-band stopped VM to restore legacy XS/KVM behave
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/18b5fb5a
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/18b5fb5a
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/18b5fb5a
Branch: refs/heads/master
Commit: 18b5fb5a3c6d4dc2d4b132964bc242fe267ec664
Parents: e051490
Author: Kelven Yang <ke...@gmail.com>
Authored: Mon Feb 3 17:01:20 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../src/com/cloud/vm/VirtualMachineManagerImpl.java | 4 +++-
.../hypervisor/xen/resource/CitrixResourceBase.java | 11 ++++++++++-
2 files changed, 13 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/18b5fb5a/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 84c56ae..e7e49b8 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -4132,7 +4132,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
s_logger.info("VM " + vm.getInstanceName() + " is sync-ed to at Stopped state according to power-off report from hypervisor");
- // TODO: we need to forcely release all resource allocation
+ VirtualMachineGuru vmGuru = getVmGuru(vm);
+ VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
+ sendStop(vmGuru, profile, true);
break;
case Destroyed:
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/18b5fb5a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 12ba7c9..33e7462 100644
--- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -347,6 +347,15 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
return _host;
}
+ private static boolean isAlienVm(VM vm, Connection conn) throws XenAPIException, XmlRpcException {
+ // TODO : we need a better way to tell whether or not the VM belongs to CloudStack
+ String vmName = vm.getNameLabel(conn);
+ if (vmName.matches("^[ivs]-\\d+-.+"))
+ return false;
+
+ return true;
+ }
+
protected boolean cleanupHaltedVms(Connection conn) throws XenAPIException, XmlRpcException {
Host host = Host.getByUuid(conn, _host.uuid);
Map<VM, VM.Record> vms = VM.getAllRecords(conn);
@@ -358,7 +367,7 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
continue;
}
- if (VmPowerState.HALTED.equals(vmRec.powerState) && vmRec.affinity.equals(host)) {
+ if (VmPowerState.HALTED.equals(vmRec.powerState) && vmRec.affinity.equals(host) && !isAlienVm(vm, conn)) {
try {
vm.destroy(conn);
} catch (Exception e) {
[14/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
Make sure to let VM question answer monitor exit gracefully
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/e051490c
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/e051490c
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/e051490c
Branch: refs/heads/master
Commit: e051490cea9ad659e05853fd8b38728c06dbfd8f
Parents: 4a414d3
Author: Kelven Yang <ke...@gmail.com>
Authored: Mon Feb 3 14:01:10 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../hypervisor/vmware/mo/VirtualMachineMO.java | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/e051490c/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index 663adbf..263c656 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -248,12 +248,17 @@ public class VirtualMachineMO extends BaseMO {
}
});
- boolean result = _context.getVimClient().waitForTask(morTask);
- if (result) {
- _context.waitForTaskProgressDone(morTask);
- return true;
- } else {
- s_logger.error("VMware powerOnVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
+ try {
+ boolean result = _context.getVimClient().waitForTask(morTask);
+ if (result) {
+ _context.waitForTaskProgressDone(morTask);
+ return true;
+ } else {
+ s_logger.error("VMware powerOnVM_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
+ }
+ } finally {
+ // make sure to let VM question monitor exit
+ flags[0] = true;
}
return false;
[11/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
reboot VR if a out-of-band power-on event is detected
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/ee2adab7
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/ee2adab7
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/ee2adab7
Branch: refs/heads/master
Commit: ee2adab7c7c9cf42eaf93c7eedb6dd32ebd8b501
Parents: fed8581
Author: Kelven Yang <ke...@gmail.com>
Authored: Mon Feb 10 16:58:49 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:58 2014 -0800
----------------------------------------------------------------------
.../VirtualNetworkApplianceManagerImpl.java | 45 ++++++++++++++++++--
1 file changed, 41 insertions(+), 4 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ee2adab7/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 c241aac..a64f15c 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -251,6 +251,7 @@ import com.cloud.utils.db.Transaction;
import com.cloud.utils.db.TransactionCallbackNoReturn;
import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
+import com.cloud.utils.fsm.StateListener;
import com.cloud.utils.net.Ip;
import com.cloud.utils.net.MacAddress;
import com.cloud.utils.net.NetUtils;
@@ -281,9 +282,9 @@ import com.cloud.vm.dao.VMInstanceDao;
/**
* VirtualNetworkApplianceManagerImpl manages the different types of virtual network appliances available in the Cloud Stack.
*/
-@Local(value = {VirtualNetworkApplianceManager.class, VirtualNetworkApplianceService.class})
-public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements VirtualNetworkApplianceManager, VirtualNetworkApplianceService, VirtualMachineGuru,
-Listener, Configurable {
+@Local(value = { VirtualNetworkApplianceManager.class, VirtualNetworkApplianceService.class })
+public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements VirtualNetworkApplianceManager, VirtualNetworkApplianceService,
+ VirtualMachineGuru, Listener, Configurable, StateListener<State, VirtualMachine.Event, VirtualMachine> {
private static final Logger s_logger = Logger.getLogger(VirtualNetworkApplianceManagerImpl.class);
@Inject
@@ -675,6 +676,8 @@ Listener, Configurable {
_checkExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("RouterStatusMonitor"));
_networkStatsUpdateExecutor = Executors.newScheduledThreadPool(1, new NamedThreadFactory("NetworkStatsUpdater"));
+ VirtualMachine.State.getStateMachine().registerListener(this);
+
final Map<String, String> configs = _configDao.getConfiguration("AgentManager", params);
_routerRamSize = NumbersUtil.parseInt(configs.get("router.ram.size"), DEFAULT_ROUTER_VM_RAMSIZE);
@@ -3435,7 +3438,6 @@ Listener, Configurable {
"vmdata",
generateVmDataCommand(router, nic.getIp4Address(), vm.getUserData(), serviceOffering, zoneName, nic.getIp4Address(), vm.getHostName(), vm.getInstanceName(),
vm.getId(), vm.getUuid(), publicKey, nic.getNetworkId()));
-
}
private void createVmDataCommandForVMs(final DomainRouterVO router, final Commands cmds, final long guestNetworkId) {
@@ -4228,4 +4230,39 @@ Listener, Configurable {
public ConfigKey<?>[] getConfigKeys() {
return new ConfigKey<?>[] {UseExternalDnsServers, routerVersionCheckEnabled, SetServiceMonitor};
}
+
+ @Override
+ public boolean preStateTransitionEvent(State oldState, VirtualMachine.Event event, State newState, VirtualMachine vo, boolean status, Object opaque) {
+ return true;
+ }
+
+ @Override
+ public boolean postStateTransitionEvent(State oldState, VirtualMachine.Event event, State newState, VirtualMachine vo, boolean status, Object opaque) {
+ if (oldState == State.Stopped && event == VirtualMachine.Event.FollowAgentPowerOnReport && newState == State.Running) {
+ if (vo.getType() == VirtualMachine.Type.DomainRouter) {
+ s_logger.info("Schedule a router reboot task as router " + vo.getId() + " is powered-on out-of-band. we need to reboot to refresh network rules");
+ _executor.schedule(new RebootTask(vo.getId()), 1000, TimeUnit.MICROSECONDS);
+ }
+ }
+ return true;
+ }
+
+ protected class RebootTask extends ManagedContextRunnable {
+
+ long _routerId;
+
+ public RebootTask(long routerId) {
+ _routerId = routerId;
+ }
+
+ @Override
+ protected void runInContext() {
+ try {
+ s_logger.info("Reboot router " + _routerId + " to refresh network rules");
+ rebootRouter(_routerId, true);
+ } catch (Exception e) {
+ s_logger.warn("Error while rebooting the router", e);
+ }
+ }
+ }
}
[24/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
Let ESX host timeout to reflect disconnect status in vCenter into CloudStack.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/57a00a81
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/57a00a81
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/57a00a81
Branch: refs/heads/master
Commit: 57a00a8172b26ffcc11eae353cc16cba7329eee4
Parents: 24e64ac
Author: Kelven Yang <ke...@gmail.com>
Authored: Thu Feb 20 17:21:57 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:59 2014 -0800
----------------------------------------------------------------------
.../cloud/hypervisor/vmware/resource/VmwareResource.java | 11 +++++++++++
1 file changed, 11 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/57a00a81/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 89947df..3eac0fc 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -4671,6 +4671,17 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
if (newStates == null) {
return null;
}
+
+ VmwareContext context = getServiceContext();
+ VmwareHypervisorHost hyperHost = getHyperHost(context);
+ try {
+ if (!hyperHost.isHyperHostConnected()) {
+ return null;
+ }
+ } catch (Exception e) {
+ s_logger.error("Unexpected exception", e);
+ return null;
+ }
return new PingRoutingCommand(getType(), id, newStates, syncHostVmStates());
}
[07/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
CLOUDSTACK-5928: disable host delta sync when new VM sync is enabled
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/fda72196
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/fda72196
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/fda72196
Branch: refs/heads/master
Commit: fda7219646a6a57574f8fdb9517925e6009d7475
Parents: 441be43
Author: Kelven Yang <ke...@gmail.com>
Authored: Wed Jan 22 11:09:45 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:57 2014 -0800
----------------------------------------------------------------------
.../com/cloud/vm/VirtualMachineManagerImpl.java | 38 +++++++++++++++-----
.../com/cloud/storage/VolumeApiServiceImpl.java | 3 +-
.../vm/snapshot/VMSnapshotManagerImpl.java | 2 +-
3 files changed, 32 insertions(+), 11 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fda72196/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 0ef275e..1b0d6ca 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -342,7 +342,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
false);
static final ConfigKey<Boolean> VmJobEnabled = new ConfigKey<Boolean>("Advanced",
- Boolean.class, "vm.job.enabled", "false",
+ Boolean.class, "vm.job.enabled", "true",
"True to enable new VM sync model. false to use the old way", false);
static final ConfigKey<Long> VmJobCheckInterval = new ConfigKey<Long>("Advanced",
Long.class, "vm.job.check.interval", "3000",
@@ -2954,12 +2954,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
if (cmd instanceof PingRoutingCommand) {
PingRoutingCommand ping = (PingRoutingCommand)cmd;
if (ping.getNewStates() != null && ping.getNewStates().size() > 0) {
- Commands commands = deltaHostSync(agentId, ping.getNewStates());
- if (commands.size() > 0) {
- try {
- _agentMgr.send(agentId, commands, this);
- } catch (final AgentUnavailableException e) {
- s_logger.warn("Agent is now unavailable", e);
+ if (!VmJobEnabled.value()) {
+ Commands commands = deltaHostSync(agentId, ping.getNewStates());
+ if (commands.size() > 0) {
+ try {
+ _agentMgr.send(agentId, commands, this);
+ } catch (final AgentUnavailableException e) {
+ s_logger.warn("Agent is now unavailable", e);
+ }
}
}
}
@@ -3986,6 +3988,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
s_logger.warn("VM " + vmId + " no longer exists when processing VM state report");
}
} else {
+ s_logger.info("There is pending job working on the VM. vm id: " + vmId + ", postpone power-change report by resetting power-change counters");
+
// reset VM power state tracking so that we won't lost signal when VM has
// been translated to
_vmDao.resetVmPowerStateTracking(vmId);
@@ -3994,19 +3998,23 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
private void handlePowerOnReportWithNoPendingJobsOnVM(VMInstanceVO vm) {
//
- // 1) handle left-over transitional VM states
+ // 1) handle left-over transitional VM states
// 2) handle out of band VM live migration
// 3) handle out of sync stationary states, marking VM from Stopped to Running with
// alert messages
//
switch (vm.getState()) {
case Starting:
+ s_logger.info("VM " + vm.getInstanceName() + " is at " + vm.getState() + " and we received a power-on report while there is no pending jobs on it");
+
try {
stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOnReport, vm.getPowerHostId());
} catch (NoTransitionException e) {
s_logger.warn("Unexpected VM state transition exception, race-condition?", e);
}
+ s_logger.info("VM " + vm.getInstanceName() + " is sync-ed to at Running state according to power-on report from hypervisor");
+
// we need to alert admin or user about this risky state transition
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_SYNC, vm.getDataCenterId(), vm.getPodIdToDeployIn(),
VM_SYNC_ALERT_SUBJECT, "VM " + vm.getHostName() + "(" + vm.getInstanceName()
@@ -4021,10 +4029,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
} catch (NoTransitionException e) {
s_logger.warn("Unexpected VM state transition exception, race-condition?", e);
}
+
break;
case Stopping:
case Stopped:
+ s_logger.info("VM " + vm.getInstanceName() + " is at " + vm.getState() + " and we received a power-on report while there is no pending jobs on it");
+
try {
stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOnReport, vm.getPowerHostId());
} catch (NoTransitionException e) {
@@ -4033,6 +4044,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_SYNC, vm.getDataCenterId(), vm.getPodIdToDeployIn(),
VM_SYNC_ALERT_SUBJECT, "VM " + vm.getHostName() + "(" + vm.getInstanceName() + ") state is sync-ed (" + vm.getState()
+ " -> Running) from out-of-context transition. VM network environment may need to be reset");
+
+ s_logger.info("VM " + vm.getInstanceName() + " is sync-ed to at Running state according to power-on report from hypervisor");
break;
case Destroyed:
@@ -4042,11 +4055,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
break;
case Migrating:
+ s_logger.info("VM " + vm.getInstanceName() + " is at " + vm.getState() + " and we received a power-on report while there is no pending jobs on it");
try {
stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOnReport, vm.getPowerHostId());
} catch (NoTransitionException e) {
s_logger.warn("Unexpected VM state transition exception, race-condition?", e);
}
+ s_logger.info("VM " + vm.getInstanceName() + " is sync-ed to at Running state according to power-on report from hypervisor");
break;
case Error:
@@ -4059,7 +4074,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
private void handlePowerOffReportWithNoPendingJobsOnVM(VMInstanceVO vm) {
- // 1) handle left-over transitional VM states
+ // 1) handle left-over transitional VM states
// 2) handle out of sync stationary states, schedule force-stop to release resources
//
switch (vm.getState()) {
@@ -4068,14 +4083,19 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
case Running:
case Stopped:
case Migrating:
+ s_logger.info("VM " + vm.getInstanceName() + " is at " + vm.getState() + " and we received a power-off report while there is no pending jobs on it");
try {
stateTransitTo(vm, VirtualMachine.Event.FollowAgentPowerOffReport, vm.getPowerHostId());
} catch (NoTransitionException e) {
s_logger.warn("Unexpected VM state transition exception, race-condition?", e);
}
+
_alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_SYNC, vm.getDataCenterId(), vm.getPodIdToDeployIn(),
VM_SYNC_ALERT_SUBJECT, "VM " + vm.getHostName() + "(" + vm.getInstanceName() + ") state is sync-ed (" + vm.getState()
+ " -> Stopped) from out-of-context transition.");
+
+ s_logger.info("VM " + vm.getInstanceName() + " is sync-ed to at Stopped state according to power-on report from hypervisor");
+
// TODO: we need to forcely release all resource allocation
break;
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fda72196/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
index c95d316..1ee9286 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -222,7 +222,8 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
VmWorkJobHandlerProxy _jobHandlerProxy = new VmWorkJobHandlerProxy(this);
// TODO
- static final ConfigKey<Boolean> VmJobEnabled = new ConfigKey<Boolean>("Advanced", Boolean.class, "vm.job.enabled", "false",
+ static final ConfigKey<Boolean> VmJobEnabled = new ConfigKey<Boolean>("Advanced",
+ Boolean.class, "vm.job.enabled", "true",
"True to enable new VM sync model. false to use the old way", false);
static final ConfigKey<Long> VmJobCheckInterval = new ConfigKey<Long>("Advanced", Long.class, "vm.job.check.interval", "3000",
"Interval in milliseconds to check if the job is complete", false);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/fda72196/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 78652a2..2fcbb48 100644
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -135,7 +135,7 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
// TODO
static final ConfigKey<Boolean> VmJobEnabled = new ConfigKey<Boolean>("Advanced",
- Boolean.class, "vm.job.enabled", "false",
+ Boolean.class, "vm.job.enabled", "true",
"True to enable new VM sync model. false to use the old way", false);
static final ConfigKey<Long> VmJobCheckInterval = new ConfigKey<Long>("Advanced",
Long.class, "vm.job.check.interval", "3000",
[30/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
add job path to help associate an API job to related internal job. Reviewed-By: Self
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/537bf7ce
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/537bf7ce
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/537bf7ce
Branch: refs/heads/master
Commit: 537bf7ced1b904ddf5476411d31715c951c59dbc
Parents: 414b1cb
Author: Kelven Yang <ke...@gmail.com>
Authored: Wed Feb 19 17:22:28 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:35:59 2014 -0800
----------------------------------------------------------------------
.../apache/cloudstack/context/CallContext.java | 11 +++++
.../cloudstack/context/CallContextListener.java | 3 +-
.../com/cloud/vm/VirtualMachineManagerImpl.java | 24 +++++------
.../src/com/cloud/vm/VmWorkJobDispatcher.java | 12 +++---
.../jobs/AsyncJobExecutionContext.java | 8 +++-
.../jobs/impl/AsyncJobManagerImpl.java | 20 ++++++++++
.../framework/jobs/impl/AsyncJobVO.java | 2 +-
.../managed/context/ManagedContextRunnable.java | 2 +-
.../com/cloud/api/ApiAsyncJobDispatcher.java | 14 +------
server/src/com/cloud/api/ApiServer.java | 6 +--
.../VirtualNetworkApplianceManagerImpl.java | 42 ++++++++++----------
.../com/cloud/storage/VolumeApiServiceImpl.java | 10 ++---
.../storage/snapshot/SnapshotSchedulerImpl.java | 8 ++--
.../vm/snapshot/VMSnapshotManagerImpl.java | 8 ++--
14 files changed, 96 insertions(+), 74 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/api/src/org/apache/cloudstack/context/CallContext.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/context/CallContext.java b/api/src/org/apache/cloudstack/context/CallContext.java
index dbeb5c7..0457c33 100644
--- a/api/src/org/apache/cloudstack/context/CallContext.java
+++ b/api/src/org/apache/cloudstack/context/CallContext.java
@@ -131,7 +131,10 @@ public class CallContext {
protected static CallContext register(User callingUser, Account callingAccount, Long userId, Long accountId, String contextId) {
/*
+<<<<<<< HEAD
Unit tests will have multiple times of setup/tear-down call to this, remove assertions to all unit test to run
+=======
+>>>>>>> a7a8a19... BUG-ID: CS-19295: add job path to help associate an API job to related internal job. Reviewed-By: Self
assert s_currentContext.get() == null : "There's a context already so what does this new register context mean? " + s_currentContext.get().toString();
if (s_currentContext.get() != null) { // FIXME: This should be removed soon. I added this check only to surface all the places that have this problem.
throw new CloudRuntimeException("There's a context already so what does this new register context mean? " + s_currentContext.get().toString());
@@ -154,6 +157,14 @@ public class CallContext {
return callingContext;
}
+ public static CallContext registerPlaceHolderContext() {
+ CallContext context = new CallContext(0, 0, UUID.randomUUID().toString());
+ s_currentContext.set(context);
+
+ s_currentContextStack.get().push(context);
+ return context;
+ }
+
public static CallContext register(User callingUser, Account callingAccount) {
return register(callingUser, callingAccount, UUID.randomUUID().toString());
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/api/src/org/apache/cloudstack/context/CallContextListener.java
----------------------------------------------------------------------
diff --git a/api/src/org/apache/cloudstack/context/CallContextListener.java b/api/src/org/apache/cloudstack/context/CallContextListener.java
index 49866e0..ab9a8c3 100644
--- a/api/src/org/apache/cloudstack/context/CallContextListener.java
+++ b/api/src/org/apache/cloudstack/context/CallContextListener.java
@@ -32,10 +32,9 @@ public class CallContextListener implements ManagedContextListener<Object> {
@Override
public Object onEnterContext(boolean reentry) {
- if (!reentry) {
+ if (!reentry && CallContext.current() == null) {
CallContext.registerSystemCallContextOnceOnly();
}
-
return null;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/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 457fad2..5a33df4 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -4436,7 +4436,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setStep(VmWorkJobVO.Step.Starting);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkStart workInfo = new VmWorkStart(callingUser.getId(), callingAccount.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER);
@@ -4493,7 +4493,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setStep(VmWorkJobVO.Step.Prepare);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkStop workInfo = new VmWorkStop(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, cleanup);
@@ -4549,7 +4549,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setStep(VmWorkJobVO.Step.Prepare);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkReboot workInfo = new VmWorkReboot(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, params);
@@ -4604,7 +4604,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setUserId(user.getId());
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkMigrate workInfo = new VmWorkMigrate(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId, dest);
@@ -4656,7 +4656,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setUserId(user.getId());
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkMigrateAway workInfo = new VmWorkMigrateAway(user.getId(), account.getId(), vm.getId(), VirtualMachineManagerImpl.VM_WORK_JOB_HANDLER, srcHostId);
@@ -4713,7 +4713,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setUserId(user.getId());
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkMigrateWithStorage workInfo = new VmWorkMigrateWithStorage(user.getId(), account.getId(), vm.getId(),
@@ -4770,7 +4770,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setUserId(user.getId());
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkMigrateForScale workInfo = new VmWorkMigrateForScale(user.getId(), account.getId(), vm.getId(),
@@ -4827,7 +4827,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setUserId(user.getId());
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkStorageMigration workInfo = new VmWorkStorageMigration(user.getId(), account.getId(), vm.getId(),
@@ -4883,7 +4883,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setUserId(user.getId());
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkAddVmToNetwork workInfo = new VmWorkAddVmToNetwork(user.getId(), account.getId(), vm.getId(),
@@ -4937,7 +4937,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setUserId(user.getId());
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkRemoveNicFromVm workInfo = new VmWorkRemoveNicFromVm(user.getId(), account.getId(), vm.getId(),
@@ -4991,7 +4991,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setUserId(user.getId());
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkRemoveVmFromNetwork workInfo = new VmWorkRemoveVmFromNetwork(user.getId(), account.getId(), vm.getId(),
@@ -5047,7 +5047,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
workJob.setUserId(user.getId());
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkReconfigure workInfo = new VmWorkReconfigure(user.getId(), account.getId(), vm.getId(),
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
----------------------------------------------------------------------
diff --git a/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java b/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
index 31b2d9c..f302002 100644
--- a/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
+++ b/engine/orchestration/src/com/cloud/vm/VmWorkJobDispatcher.java
@@ -96,10 +96,14 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
return;
}
- CallContext.register(work.getUserId(), work.getAccountId(), job.getRelated());
+ CallContext.register(work.getUserId(), work.getAccountId());
- Pair<JobInfo.Status, String> result = handler.handleVmWorkJob(work);
- _asyncJobMgr.completeAsyncJob(job.getId(), result.first(), 0, result.second());
+ try {
+ Pair<JobInfo.Status, String> result = handler.handleVmWorkJob(work);
+ _asyncJobMgr.completeAsyncJob(job.getId(), result.first(), 0, result.second());
+ } finally {
+ CallContext.unregister();
+ }
} finally {
if (s_logger.isDebugEnabled())
s_logger.debug("Done with run of VM work job: " + cmd + " for VM " + work.getVmId() + ", job origin: " + job.getRelated());
@@ -109,8 +113,6 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
RuntimeException ex = new RuntimeException("Job failed due to exception " + e.getMessage());
_asyncJobMgr.completeAsyncJob(job.getId(), JobInfo.Status.FAILED, 0, _asyncJobMgr.marshallResultObject(ex));
- } finally {
- CallContext.unregister();
}
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
index b6c1692..129d9ca 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJobExecutionContext.java
@@ -204,7 +204,11 @@ public class AsyncJobExecutionContext {
s_currentExectionContext.set(currentContext);
}
- public static String getOriginJobContextId() {
- return String.valueOf(CallContext.current().getContextId());
+ public static String getOriginJobId() {
+ AsyncJobExecutionContext context = AsyncJobExecutionContext.getCurrentExecutionContext();
+ if (context != null && context.getJob() != null)
+ return "Job-" + context.getJob().getId();
+
+ return "";
}
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
index 86e62dc..2be2786 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobManagerImpl.java
@@ -34,8 +34,10 @@ import javax.inject.Inject;
import javax.naming.ConfigurationException;
import org.apache.log4j.Logger;
+import org.apache.log4j.NDC;
import org.apache.cloudstack.api.ApiErrorCode;
+import org.apache.cloudstack.context.CallContext;
import org.apache.cloudstack.framework.config.ConfigDepot;
import org.apache.cloudstack.framework.config.ConfigKey;
import org.apache.cloudstack.framework.config.Configurable;
@@ -428,6 +430,24 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
private Runnable getExecutorRunnable(final AsyncJob job) {
return new ManagedContextRunnable() {
+
+ @Override
+ public void run() {
+ // register place-holder context to avoid installing system account call context
+ if (CallContext.current() == null)
+ CallContext.registerPlaceHolderContext();
+
+ if (job.getRelated() != null && !job.getRelated().isEmpty())
+ NDC.push("Job-" + job.getRelated() + "/" + "Job-" + job.getId());
+ else
+ NDC.push("Job-" + job.getId());
+ try {
+ super.run();
+ } finally {
+ NDC.pop();
+ }
+ }
+
@Override
protected void runInContext() {
long runNumber = getJobRunNumber();
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java
index 24af392..d1ee2df 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/impl/AsyncJobVO.java
@@ -132,7 +132,7 @@ public class AsyncJobVO implements AsyncJob, JobInfo {
public AsyncJobVO() {
uuid = UUID.randomUUID().toString();
- related = UUID.randomUUID().toString();
+ related = "";
status = Status.IN_PROGRESS;
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/ManagedContextRunnable.java
----------------------------------------------------------------------
diff --git a/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/ManagedContextRunnable.java b/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/ManagedContextRunnable.java
index d335215..b4a9758 100644
--- a/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/ManagedContextRunnable.java
+++ b/framework/managed-context/src/main/java/org/apache/cloudstack/managed/context/ManagedContextRunnable.java
@@ -42,7 +42,7 @@ public abstract class ManagedContextRunnable implements Runnable {
}
@Override
- final public void run() {
+ public void run() {
getContext().runWithContext(new Runnable() {
@Override
public void run() {
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/server/src/com/cloud/api/ApiAsyncJobDispatcher.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiAsyncJobDispatcher.java b/server/src/com/cloud/api/ApiAsyncJobDispatcher.java
index 71ac616..f037f2e 100644
--- a/server/src/com/cloud/api/ApiAsyncJobDispatcher.java
+++ b/server/src/com/cloud/api/ApiAsyncJobDispatcher.java
@@ -36,7 +36,6 @@ import org.apache.cloudstack.framework.jobs.AsyncJob;
import org.apache.cloudstack.framework.jobs.AsyncJobDispatcher;
import org.apache.cloudstack.framework.jobs.AsyncJobManager;
import org.apache.cloudstack.jobs.JobInfo;
-import org.apache.cloudstack.managed.context.ManagedContext;
import com.cloud.user.Account;
import com.cloud.user.User;
@@ -54,23 +53,12 @@ public class ApiAsyncJobDispatcher extends AdapterBase implements AsyncJobDispat
private AsyncJobManager _asyncJobMgr;
@Inject
private EntityManager _entityMgr;
- @Inject
- ManagedContext _managedContext;
public ApiAsyncJobDispatcher() {
}
@Override
public void runJob(final AsyncJob job) {
- _managedContext.runWithContext(new Runnable() {
- @Override
- public void run() {
- runJobInContext(job);
- }
- });
- }
-
- protected void runJobInContext(AsyncJob job) {
BaseAsyncCmd cmdObj = null;
try {
Class<?> cmdClass = Class.forName(job.getCmd());
@@ -106,7 +94,7 @@ public class ApiAsyncJobDispatcher extends AdapterBase implements AsyncJobDispat
accountObject = _entityMgr.findById(Account.class, Long.parseLong(acctIdStr));
}
- CallContext.register(user, accountObject, job.getRelated());
+ CallContext.register(user, accountObject);
try {
// dispatch could ultimately queue the job
_dispatcher.dispatch(cmdObj, params, true);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/server/src/com/cloud/api/ApiServer.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/api/ApiServer.java b/server/src/com/cloud/api/ApiServer.java
index ba58b52..25792fb 100755
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@ -522,9 +522,9 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer
params.put("cmdEventType", asyncCmd.getEventType().toString());
Long instanceId = (objectId == null) ? asyncCmd.getInstanceId() : objectId;
- AsyncJobVO job =
- new AsyncJobVO(ctx.getContextId(), callerUserId, caller.getId(), cmdObj.getClass().getName(), ApiGsonHelper.getBuilder().create().toJson(params),
- instanceId, asyncCmd.getInstanceType() != null ? asyncCmd.getInstanceType().toString() : null);
+ AsyncJobVO job = new AsyncJobVO("", callerUserId, caller.getId(), cmdObj.getClass().getName(),
+ ApiGsonHelper.getBuilder().create().toJson(params), instanceId,
+ asyncCmd.getInstanceType() != null ? asyncCmd.getInstanceType().toString() : null);
job.setDispatcher(_asyncDispatcher.getName());
long jobId = _asyncMgr.submitAsyncJob(job);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/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 a64f15c..8404cab 100755
--- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
+++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java
@@ -30,7 +30,6 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TimeZone;
-import java.util.UUID;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@@ -106,6 +105,7 @@ import com.cloud.agent.api.to.StaticNatRuleTO;
import com.cloud.agent.manager.Commands;
import com.cloud.alert.AlertManager;
import com.cloud.api.ApiAsyncJobDispatcher;
+import com.cloud.api.ApiDispatcher;
import com.cloud.api.ApiGsonHelper;
import com.cloud.cluster.ManagementServerHostVO;
import com.cloud.cluster.dao.ManagementServerHostDao;
@@ -4194,26 +4194,26 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V
return (Version.compare(trimmedVersion, MinVRVersion) >= 0);
}
- private List<Long> rebootRouters(final List<DomainRouterVO> routers) {
- final List<Long> jobIds = new ArrayList<Long>();
- for (final DomainRouterVO router : routers) {
- if (!checkRouterVersion(router)) {
- s_logger.debug("Upgrading template for router: " + router.getId());
- final Map<String, String> params = new HashMap<String, String>();
- params.put("ctxUserId", "1");
- params.put("ctxAccountId", "" + router.getAccountId());
-
- final RebootRouterCmd cmd = new RebootRouterCmd();
- ComponentContext.inject(cmd);
- params.put("id", "" + router.getId());
- params.put("ctxStartEventId", "1");
- final AsyncJobVO job =
- new AsyncJobVO(UUID.randomUUID().toString(), User.UID_SYSTEM, router.getAccountId(), RebootRouterCmd.class.getName(), ApiGsonHelper.getBuilder()
- .create()
- .toJson(params), router.getId(), cmd.getInstanceType() != null ? cmd.getInstanceType().toString() : null);
- job.setDispatcher(_asyncDispatcher.getName());
- final long jobId = _asyncMgr.submitAsyncJob(job);
- jobIds.add(jobId);
+ private List<Long> rebootRouters(List<DomainRouterVO> routers){
+ List<Long> jobIds = new ArrayList<Long>();
+ for(DomainRouterVO router: routers){
+ if(!checkRouterVersion(router)){
+ s_logger.debug("Upgrading template for router: "+router.getId());
+ ApiDispatcher.getInstance();
+ Map<String, String> params = new HashMap<String, String>();
+ params.put("ctxUserId", "1");
+ params.put("ctxAccountId", "" + router.getAccountId());
+
+ RebootRouterCmd cmd = new RebootRouterCmd();
+ ComponentContext.inject(cmd);
+ params.put("id", ""+router.getId());
+ params.put("ctxStartEventId", "1");
+ AsyncJobVO job = new AsyncJobVO("", User.UID_SYSTEM, router.getAccountId(), RebootRouterCmd.class.getName(),
+ ApiGsonHelper.getBuilder().create().toJson(params), router.getId(),
+ cmd.getInstanceType() != null ? cmd.getInstanceType().toString() : null);
+ job.setDispatcher(_asyncDispatcher.getName());
+ long jobId = _asyncMgr.submitAsyncJob(job);
+ jobIds.add(jobId);
} else {
s_logger.debug("Router: " + router.getId() + " is already at the latest version. No upgrade required");
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
index 184be38..a94ebab 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -2141,7 +2141,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
workJob.setStep(VmWorkJobVO.Step.Starting);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkAttachVolume workInfo = new VmWorkAttachVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
@@ -2192,7 +2192,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
workJob.setStep(VmWorkJobVO.Step.Starting);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkDetachVolume workInfo = new VmWorkDetachVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
@@ -2242,7 +2242,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
workJob.setStep(VmWorkJobVO.Step.Starting);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkResizeVolume workInfo = new VmWorkResizeVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
@@ -2291,7 +2291,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
workJob.setStep(VmWorkJobVO.Step.Starting);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkMigrateVolume workInfo = new VmWorkMigrateVolume(callingUser.getId(), callingAccount.getId(), vm.getId(),
@@ -2340,7 +2340,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
workJob.setStep(VmWorkJobVO.Step.Starting);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkTakeVolumeSnapshot workInfo = new VmWorkTakeVolumeSnapshot(
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/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 3159059..183a13a 100644
--- a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
@@ -22,7 +22,6 @@ import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
-import java.util.UUID;
import javax.ejb.Local;
import javax.inject.Inject;
@@ -261,10 +260,9 @@ public class SnapshotSchedulerImpl extends ManagerBase implements SnapshotSchedu
params.put("id", "" + cmd.getEntityId());
params.put("ctxStartEventId", "1");
- AsyncJobVO job =
- new AsyncJobVO(UUID.randomUUID().toString(), User.UID_SYSTEM, volume.getAccountId(), CreateSnapshotCmd.class.getName(), ApiGsonHelper.getBuilder()
- .create()
- .toJson(params), cmd.getEntityId(), cmd.getInstanceType() != null ? cmd.getInstanceType().toString() : null);
+ AsyncJobVO job = new AsyncJobVO("", User.UID_SYSTEM, volume.getAccountId(), CreateSnapshotCmd.class.getName(),
+ ApiGsonHelper.getBuilder().create().toJson(params), cmd.getEntityId(),
+ cmd.getInstanceType() != null ? cmd.getInstanceType().toString() : null);
job.setDispatcher(_asyncDispatcher.getName());
long jobId = _asyncMgr.submitAsyncJob(job);
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/537bf7ce/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 4bae4d0..9d7a952 100644
--- a/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
+++ b/server/src/com/cloud/vm/snapshot/VMSnapshotManagerImpl.java
@@ -875,7 +875,7 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
workJob.setStep(VmWorkJobVO.Step.Starting);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkCreateVMSnapshot workInfo = new VmWorkCreateVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
@@ -923,7 +923,7 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
workJob.setStep(VmWorkJobVO.Step.Starting);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkDeleteVMSnapshot workInfo = new VmWorkDeleteVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
@@ -971,7 +971,7 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
workJob.setStep(VmWorkJobVO.Step.Starting);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkRevertToVMSnapshot workInfo = new VmWorkRevertToVMSnapshot(callingUser.getId(), callingAccount.getId(), vm.getId(),
@@ -1019,7 +1019,7 @@ public class VMSnapshotManagerImpl extends ManagerBase implements VMSnapshotMana
workJob.setStep(VmWorkJobVO.Step.Starting);
workJob.setVmType(VirtualMachine.Type.Instance);
workJob.setVmInstanceId(vm.getId());
- workJob.setRelated(AsyncJobExecutionContext.getOriginJobContextId());
+ workJob.setRelated(AsyncJobExecutionContext.getOriginJobId());
// save work context info (there are some duplications)
VmWorkDeleteAllVMSnapshots workInfo = new VmWorkDeleteAllVMSnapshots(callingUser.getId(), callingAccount.getId(), vm.getId(),
[33/33] git commit: updated refs/heads/master to 90262a8
Posted by ke...@apache.org.
pass over volume info through job boundary for all volume related tasks, since volume record may be re-created.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/0c48f707
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/0c48f707
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/0c48f707
Branch: refs/heads/master
Commit: 0c48f707629a58219de95d6a57f8b898eb5d7698
Parents: cdf605b
Author: Kelven Yang <ke...@gmail.com>
Authored: Wed Feb 26 15:44:14 2014 -0800
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Feb 28 15:36:00 2014 -0800
----------------------------------------------------------------------
.../com/cloud/storage/VolumeApiServiceImpl.java | 31 ++++++++++++++------
1 file changed, 22 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/0c48f707/server/src/com/cloud/storage/VolumeApiServiceImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeApiServiceImpl.java b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
index a94ebab..50aa87e 100644
--- a/server/src/com/cloud/storage/VolumeApiServiceImpl.java
+++ b/server/src/com/cloud/storage/VolumeApiServiceImpl.java
@@ -825,7 +825,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
Volume vol = null;
try {
- vol = outcome.get();
+ outcome.get();
} catch (InterruptedException e) {
throw new RuntimeException("Operation is interrupted", e);
} catch (java.util.concurrent.ExecutionException e) {
@@ -838,6 +838,9 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
throw (ConcurrentOperationException)jobResult;
else if (jobResult instanceof Throwable)
throw new RuntimeException("Unexpected exception", (Throwable)jobResult);
+ else if (jobResult instanceof Long) {
+ vol = _volumeDao.findById((Long)jobResult);
+ }
}
return volume;
}
@@ -1025,7 +1028,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
Volume vol = null;
try {
- vol = outcome.get();
+ outcome.get();
} catch (InterruptedException e) {
throw new RuntimeException("Operation is interrupted", e);
} catch (java.util.concurrent.ExecutionException e) {
@@ -1038,6 +1041,9 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
throw (ConcurrentOperationException)jobResult;
else if (jobResult instanceof Throwable)
throw new RuntimeException("Unexpected exception", (Throwable)jobResult);
+ else if (jobResult instanceof Long) {
+ vol = _volumeDao.findById((Long)jobResult);
+ }
}
return vol;
}
@@ -1340,7 +1346,7 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
Volume vol = null;
try {
- vol = outcome.get();
+ outcome.get();
} catch (InterruptedException e) {
throw new RuntimeException("Operation is interrupted", e);
} catch (java.util.concurrent.ExecutionException e) {
@@ -1353,6 +1359,9 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
throw (ConcurrentOperationException)jobResult;
else if (jobResult instanceof Throwable)
throw new RuntimeException("Unexpected exception", (Throwable)jobResult);
+ else if (jobResult instanceof Long) {
+ vol = _volumeDao.findById((Long)jobResult);
+ }
}
return vol;
}
@@ -2365,19 +2374,23 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
}
private Pair<JobInfo.Status, String> orchestrateAttachVolumeToVM(VmWorkAttachVolume work) throws Exception {
- orchestrateAttachVolumeToVM(work.getVmId(), work.getVolumeId(), work.getDeviceId());
- return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+ Volume vol = orchestrateAttachVolumeToVM(work.getVmId(), work.getVolumeId(), work.getDeviceId());
+
+ return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED,
+ _jobMgr.marshallResultObject(new Long(vol.getId())));
}
private Pair<JobInfo.Status, String> orchestrateDetachVolumeFromVM(VmWorkDetachVolume work) throws Exception {
- orchestrateDetachVolumeFromVM(work.getVmId(), work.getVolumeId());
- return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+ Volume vol = orchestrateDetachVolumeFromVM(work.getVmId(), work.getVolumeId());
+ return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED,
+ _jobMgr.marshallResultObject(new Long(vol.getId())));
}
private Pair<JobInfo.Status, String> orchestrateResizeVolume(VmWorkResizeVolume work) throws Exception {
- orchestrateResizeVolume(work.getVolumeId(), work.getCurrentSize(), work.getNewSize(),
+ Volume vol = orchestrateResizeVolume(work.getVolumeId(), work.getCurrentSize(), work.getNewSize(),
work.getNewServiceOfferingId(), work.isShrinkOk());
- return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED, null);
+ return new Pair<JobInfo.Status, String>(JobInfo.Status.SUCCEEDED,
+ _jobMgr.marshallResultObject(new Long(vol.getId())));
}
private Pair<JobInfo.Status, String> orchestrateMigrateVolume(VmWorkMigrateVolume work) throws Exception {