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/14 23:08:57 UTC

[1/2] git commit: updated refs/heads/4.4 to 1db329f

Repository: cloudstack
Updated Branches:
  refs/heads/4.4 14a4dd116 -> 1db329f0f


Deal with concurrent state update for VM and Host objects.


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

Branch: refs/heads/4.4
Commit: ba5621012747aae5d8c8f110936dca98b7537b45
Parents: 14a4dd1
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Mar 14 10:54:27 2014 -0700
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Mar 14 15:08:04 2014 -0700

----------------------------------------------------------------------
 api/src/com/cloud/vm/VirtualMachine.java        |  1 +
 .../com/cloud/vm/VirtualMachineManagerImpl.java | 25 ++-----
 .../src/com/cloud/host/dao/HostDaoImpl.java     | 77 ++++++++++----------
 .../src/com/cloud/vm/dao/VMInstanceDaoImpl.java | 54 ++++++--------
 .../jobs/impl/AsyncJobManagerImpl.java          | 18 +++--
 5 files changed, 80 insertions(+), 95 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ba562101/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 b085d4a..72cbb25 100755
--- a/api/src/com/cloud/vm/VirtualMachine.java
+++ b/api/src/com/cloud/vm/VirtualMachine.java
@@ -102,6 +102,7 @@ public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, I
             s_fsm.addTransition(State.Running, VirtualMachine.Event.StopRequested, State.Stopping);
             s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportShutdowned, State.Stopped);
             s_fsm.addTransition(State.Running, VirtualMachine.Event.AgentReportMigrated, State.Running);
+            s_fsm.addTransition(State.Running, VirtualMachine.Event.OperationSucceeded, State.Running);
             s_fsm.addTransition(State.Migrating, VirtualMachine.Event.MigrationRequested, State.Migrating);
             s_fsm.addTransition(State.Migrating, VirtualMachine.Event.OperationSucceeded, State.Running);
             s_fsm.addTransition(State.Migrating, VirtualMachine.Event.OperationFailed, State.Running);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ba562101/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 e9d2fd2..91d58b8 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -36,12 +36,10 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
-import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
-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;
@@ -51,19 +49,9 @@ import org.apache.cloudstack.framework.config.ConfigDepot;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
-import org.apache.cloudstack.framework.jobs.AsyncJob;
-import org.apache.cloudstack.framework.jobs.AsyncJobExecutionContext;
-import org.apache.cloudstack.framework.jobs.AsyncJobManager;
-import org.apache.cloudstack.framework.jobs.Outcome;
-import org.apache.cloudstack.framework.jobs.dao.VmWorkJobDao;
-import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
-import org.apache.cloudstack.framework.jobs.impl.OutcomeImpl;
-import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO;
 import org.apache.cloudstack.framework.messagebus.MessageBus;
 import org.apache.cloudstack.framework.messagebus.MessageDispatcher;
 import org.apache.cloudstack.framework.messagebus.MessageHandler;
-import org.apache.cloudstack.jobs.JobInfo;
-import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;
@@ -291,7 +279,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     }
 
     public void setHostAllocators(List<HostAllocator> hostAllocators) {
-        this.hostAllocators = hostAllocators;
+        hostAllocators = hostAllocators;
     }
 
     protected List<StoragePoolAllocator> _storagePoolAllocators;
@@ -3243,9 +3231,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         @SuppressWarnings("unchecked")
         public AgentVmInfo(String name, VMInstanceVO vm, State state, String host) {
-            this.name = name;
-            this.state = state;
-            this.vm = vm;
+            name = name;
+            state = state;
+            vm = vm;
             hostUuid = host;
         }
 
@@ -4100,7 +4088,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
 
         List<VmWorkJobVO> pendingWorkJobs = _workJobDao.listPendingWorkJobs(
                 VirtualMachine.Type.Instance, vmId);
-        if (pendingWorkJobs.size() == 0 || !_haMgr.hasPendingHaWork(vmId)) {
+        if (pendingWorkJobs.size() == 0 && !_haMgr.hasPendingHaWork(vmId)) {
             // there is no pending operation job
             VMInstanceVO vm = _vmDao.findById(vmId);
             if (vm != null) {
@@ -4407,7 +4395,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                 @Override
                 public boolean checkCondition() {
                     VMInstanceVO instance = _vmDao.findById(vmId);
-                    if (instance.getPowerState() == desiredPowerState && (srcHostIdForMigration != null && srcHostIdForMigration.equals(instance.getPowerHostId())))
+                    if ((instance.getPowerState() == desiredPowerState && srcHostIdForMigration == null) ||
+                            (instance.getPowerState() == desiredPowerState && (srcHostIdForMigration != null && instance.getPowerHostId() != srcHostIdForMigration)))
                         return true;
                     return false;
                 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ba562101/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
index c2a9826..426c90d 100755
--- a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
+++ b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java
@@ -953,46 +953,49 @@ public class HostDaoImpl extends GenericDaoBase<HostVO, Long> implements HostDao
         int result = update(ub, sc, null);
         assert result <= 1 : "How can this update " + result + " rows? ";
 
-        if (status_logger.isDebugEnabled() && result == 0) {
+        if (result == 0) {
             HostVO ho = findById(host.getId());
             assert ho != null : "How how how? : " + host.getId();
 
-            StringBuilder str = new StringBuilder("Unable to update host for event:").append(event.toString());
-            str.append(". Name=").append(host.getName());
-            str.append("; New=[status=")
-                .append(newStatus.toString())
-                .append(":msid=")
-                .append(newStatus.lostConnection() ? "null" : host.getManagementServerId())
-                .append(":lastpinged=")
-                .append(host.getLastPinged())
-                .append("]");
-            str.append("; Old=[status=")
-                .append(oldStatus.toString())
-                .append(":msid=")
-                .append(host.getManagementServerId())
-                .append(":lastpinged=")
-                .append(oldPingTime)
-                .append("]");
-            str.append("; DB=[status=")
-                .append(vo.getStatus().toString())
-                .append(":msid=")
-                .append(vo.getManagementServerId())
-                .append(":lastpinged=")
-                .append(vo.getLastPinged())
-                .append(":old update count=")
-                .append(oldUpdateCount)
-                .append("]");
-            status_logger.debug(str.toString());
-        } else {
-            StringBuilder msg = new StringBuilder("Agent status update: [");
-            msg.append("id = " + host.getId());
-            msg.append("; name = " + host.getName());
-            msg.append("; old status = " + oldStatus);
-            msg.append("; event = " + event);
-            msg.append("; new status = " + newStatus);
-            msg.append("; old update count = " + oldUpdateCount);
-            msg.append("; new update count = " + newUpdateCount + "]");
-            status_logger.debug(msg.toString());
+            if (status_logger.isDebugEnabled()) {
+
+                StringBuilder str = new StringBuilder("Unable to update host for event:").append(event.toString());
+                str.append(". Name=").append(host.getName());
+                str.append("; New=[status=")
+                        .append(newStatus.toString())
+                        .append(":msid=")
+                        .append(newStatus.lostConnection() ? "null" : host.getManagementServerId())
+                        .append(":lastpinged=")
+                        .append(host.getLastPinged())
+                        .append("]");
+                str.append("; Old=[status=").append(oldStatus.toString()).append(":msid=").append(host.getManagementServerId()).append(":lastpinged=").append(oldPingTime)
+                        .append("]");
+                str.append("; DB=[status=")
+                        .append(vo.getStatus().toString())
+                        .append(":msid=")
+                        .append(vo.getManagementServerId())
+                        .append(":lastpinged=")
+                        .append(vo.getLastPinged())
+                        .append(":old update count=")
+                        .append(oldUpdateCount)
+                        .append("]");
+                status_logger.debug(str.toString());
+            } else {
+                StringBuilder msg = new StringBuilder("Agent status update: [");
+                msg.append("id = " + host.getId());
+                msg.append("; name = " + host.getName());
+                msg.append("; old status = " + oldStatus);
+                msg.append("; event = " + event);
+                msg.append("; new status = " + newStatus);
+                msg.append("; old update count = " + oldUpdateCount);
+                msg.append("; new update count = " + newUpdateCount + "]");
+                status_logger.debug(msg.toString());
+            }
+
+            if (ho.getState() == newStatus) {
+                status_logger.debug("Host " + ho.getName() + " state has already been updated to " + newStatus);
+                return true;
+            }
         }
 
         return result > 0;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ba562101/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
----------------------------------------------------------------------
diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
index 2f25f57..7c59492 100644
--- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@ -452,41 +452,29 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
         ub.set(vmi, _updateTimeAttr, new Date());
 
         int result = update(vmi, sc);
-        if (result == 0 && s_logger.isDebugEnabled()) {
-
+        if (result == 0) {
             VMInstanceVO vo = findByIdIncludingRemoved(vm.getId());
 
-            if (vo != null) {
-                StringBuilder str = new StringBuilder("Unable to update ").append(vo.toString());
-                str.append(": DB Data={Host=")
-                    .append(vo.getHostId())
-                    .append("; State=")
-                    .append(vo.getState().toString())
-                    .append("; updated=")
-                    .append(vo.getUpdated())
-                    .append("; time=")
-                    .append(vo.getUpdateTime());
-                str.append("} New Data: {Host=")
-                    .append(vm.getHostId())
-                    .append("; State=")
-                    .append(vm.getState().toString())
-                    .append("; updated=")
-                    .append(vmi.getUpdated())
-                    .append("; time=")
-                    .append(vo.getUpdateTime());
-                str.append("} Stale Data: {Host=")
-                    .append(oldHostId)
-                    .append("; State=")
-                    .append(oldState)
-                    .append("; updated=")
-                    .append(oldUpdated)
-                    .append("; time=")
-                    .append(oldUpdateDate)
-                    .append("}");
-                s_logger.debug(str.toString());
-
-            } else {
-                s_logger.debug("Unable to update the vm id=" + vm.getId() + "; the vm either doesn't exist or already removed");
+            if (s_logger.isDebugEnabled()) {
+                if (vo != null) {
+                    StringBuilder str = new StringBuilder("Unable to update ").append(vo.toString());
+                    str.append(": DB Data={Host=").append(vo.getHostId()).append("; State=").append(vo.getState().toString()).append("; updated=").append(vo.getUpdated())
+                            .append("; time=").append(vo.getUpdateTime());
+                    str.append("} New Data: {Host=").append(vm.getHostId()).append("; State=").append(vm.getState().toString()).append("; updated=").append(vmi.getUpdated())
+                            .append("; time=").append(vo.getUpdateTime());
+                    str.append("} Stale Data: {Host=").append(oldHostId).append("; State=").append(oldState).append("; updated=").append(oldUpdated).append("; time=")
+                            .append(oldUpdateDate).append("}");
+                    s_logger.debug(str.toString());
+
+                } else {
+                    s_logger.debug("Unable to update the vm id=" + vm.getId() + "; the vm either doesn't exist or already removed");
+                }
+            }
+
+            if (vo != null && vo.getState() == newState) {
+                // allow for concurrent update if target state has already been matched
+                s_logger.debug("VM " + vo.getInstanceName() + " state has been already been updated to " + newState);
+                return true;
             }
         }
         return result > 0;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ba562101/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 49c3032..7f3701d 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
@@ -256,13 +256,17 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
             }
         });
 
-        for (Long id : wakeupList) {
-            // TODO, we assume that all jobs in this category is API job only
-            AsyncJobVO jobToWakeup = _jobDao.findById(id);
-            if (jobToWakeup != null && (jobToWakeup.getPendingSignals() & AsyncJob.Constants.SIGNAL_MASK_WAKEUP) != 0)
-                scheduleExecution(jobToWakeup, false);
-        }
-
+        //
+        // disable wakeup scheduling now, since all API jobs are currently using block-waiting for sub-jobs
+        //
+        /*        
+                for (Long id : wakeupList) {
+                    // TODO, we assume that all jobs in this category is API job only
+                    AsyncJobVO jobToWakeup = _jobDao.findById(id);
+                    if (jobToWakeup != null && (jobToWakeup.getPendingSignals() & AsyncJob.Constants.SIGNAL_MASK_WAKEUP) != 0)
+                        scheduleExecution(jobToWakeup, false);
+                }
+        */
         _messageBus.publish(null, AsyncJob.Topics.JOB_STATE, PublishScope.GLOBAL, jobId);
     }
 


[2/2] git commit: updated refs/heads/4.4 to 1db329f

Posted by ke...@apache.org.
Fix the missing java imports from automatic merge


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

Branch: refs/heads/4.4
Commit: 1db329f0f9d9814c09b1158a0127d5b7f337b2dd
Parents: ba56210
Author: Kelven Yang <ke...@gmail.com>
Authored: Fri Mar 14 14:22:23 2014 -0700
Committer: Kelven Yang <ke...@gmail.com>
Committed: Fri Mar 14 15:08:32 2014 -0700

----------------------------------------------------------------------
 .../src/com/cloud/vm/VirtualMachineManagerImpl.java     | 12 ++++++++++++
 .../framework/jobs/impl/AsyncJobManagerImpl.java        |  2 +-
 2 files changed, 13 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1db329f0/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 91d58b8..ae882bf 100755
--- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -36,10 +36,12 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
+import javax.ejb.Local;
 import javax.inject.Inject;
 import javax.naming.ConfigurationException;
 
 import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao;
+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;
@@ -49,9 +51,19 @@ import org.apache.cloudstack.framework.config.ConfigDepot;
 import org.apache.cloudstack.framework.config.ConfigKey;
 import org.apache.cloudstack.framework.config.Configurable;
 import org.apache.cloudstack.framework.config.dao.ConfigurationDao;
+import org.apache.cloudstack.framework.jobs.AsyncJob;
+import org.apache.cloudstack.framework.jobs.AsyncJobExecutionContext;
+import org.apache.cloudstack.framework.jobs.AsyncJobManager;
+import org.apache.cloudstack.framework.jobs.Outcome;
+import org.apache.cloudstack.framework.jobs.dao.VmWorkJobDao;
+import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO;
+import org.apache.cloudstack.framework.jobs.impl.OutcomeImpl;
+import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO;
 import org.apache.cloudstack.framework.messagebus.MessageBus;
 import org.apache.cloudstack.framework.messagebus.MessageDispatcher;
 import org.apache.cloudstack.framework.messagebus.MessageHandler;
+import org.apache.cloudstack.jobs.JobInfo;
+import org.apache.cloudstack.managed.context.ManagedContextRunnable;
 import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao;
 import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
 import org.apache.cloudstack.storage.to.VolumeObjectTO;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/1db329f0/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 7f3701d..4acfdbf 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
@@ -259,7 +259,7 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
         //
         // disable wakeup scheduling now, since all API jobs are currently using block-waiting for sub-jobs
         //
-        /*        
+        /*
                 for (Long id : wakeupList) {
                     // TODO, we assume that all jobs in this category is API job only
                     AsyncJobVO jobToWakeup = _jobDao.findById(id);