You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ah...@apache.org on 2013/06/05 05:07:46 UTC

[1/2] git commit: updated refs/heads/vmsync to 2e1e2ba

Updated Branches:
  refs/heads/vmsync 3327371f9 -> 2e1e2babc


Fixed index out of bounds exception


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

Branch: refs/heads/vmsync
Commit: 2c75352f7cb00c2cf971b86e4adef17ad89d1b50
Parents: 3327371
Author: Alex Huang <al...@gmail.com>
Authored: Tue Jun 4 15:43:14 2013 -0700
Committer: Alex Huang <al...@gmail.com>
Committed: Tue Jun 4 20:10:28 2013 -0700

----------------------------------------------------------------------
 .../framework/messagebus/MessageBusBase.java       |   98 +++++++--------
 1 files changed, 48 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2c75352f/framework/ipc/src/org/apache/cloudstack/framework/messagebus/MessageBusBase.java
----------------------------------------------------------------------
diff --git a/framework/ipc/src/org/apache/cloudstack/framework/messagebus/MessageBusBase.java b/framework/ipc/src/org/apache/cloudstack/framework/messagebus/MessageBusBase.java
index 9cf5e77..401539b 100644
--- a/framework/ipc/src/org/apache/cloudstack/framework/messagebus/MessageBusBase.java
+++ b/framework/ipc/src/org/apache/cloudstack/framework/messagebus/MessageBusBase.java
@@ -30,11 +30,11 @@ import org.apache.cloudstack.framework.serializer.MessageSerializer;
 
 public class MessageBusBase implements MessageBus {
 
-	private Gate _gate;
-	private List<ActionRecord> _pendingActions;
+	private final Gate _gate;
+	private final List<ActionRecord> _pendingActions;
 	
-	private SubscriptionNode _subscriberRoot;
-	private MessageSerializer _messageSerializer; 
+	private final SubscriptionNode _subscriberRoot;
+	private MessageSerializer _messageSerializer;
 	
 	public MessageBusBase() {
 		_gate = new Gate();
@@ -77,7 +77,7 @@ public class MessageBusBase implements MessageBus {
 				if(current != null)
 					current.removeSubscriber(subscriber, false);
 			} else {
-				this._subscriberRoot.removeSubscriber(subscriber, true);
+				_subscriberRoot.removeSubscriber(subscriber, true);
 			}
 			_gate.leave();
 		} else {
@@ -129,7 +129,7 @@ public class MessageBusBase implements MessageBus {
 	}
 	
 	@Override
-	public void publish(String senderAddress, String subject, PublishScope scope, 
+	public void publish(String senderAddress, String subject, PublishScope scope,
 		Object args) {
 		
 		if(_gate.enter(true)) {
@@ -151,40 +151,38 @@ public class MessageBusBase implements MessageBus {
 	private void onGateOpen() {
 		synchronized(_pendingActions) {
 			ActionRecord record = null;
-			if(_pendingActions.size() > 0) {
-				while((record = _pendingActions.remove(0)) != null) {
-					switch(record.getType()) {
-					case Subscribe :
-						{
-							SubscriptionNode current = locate(record.getSubject(), null, true);
-							assert(current != null);
-							current.addSubscriber(record.getSubscriber());
-						}
-						break;
-						
-					case Unsubscribe :
-						if(record.getSubject() != null) {
-							SubscriptionNode current = locate(record.getSubject(), null, false);
-							if(current != null)
-								current.removeSubscriber(record.getSubscriber(), false);
-						} else {
-							this._subscriberRoot.removeSubscriber(record.getSubscriber(), true);
-						}
-						break;
+            while (_pendingActions.size() > 0) {
+                record = _pendingActions.remove(0);
+                switch (record.getType()) {
+                case Subscribe: {
+                    SubscriptionNode current = locate(record.getSubject(), null, true);
+                    assert (current != null);
+                    current.addSubscriber(record.getSubscriber());
+                }
+                    break;
+
+                case Unsubscribe:
+                    if (record.getSubject() != null) {
+                        SubscriptionNode current = locate(record.getSubject(), null, false);
+                        if (current != null)
+                            current.removeSubscriber(record.getSubscriber(), false);
+                    } else {
+                        _subscriberRoot.removeSubscriber(record.getSubscriber(), true);
+                    }
+                    break;
+
+                case ClearAll:
+                    _subscriberRoot.clearAll();
+                    break;
 					
-					case ClearAll :
-						_subscriberRoot.clearAll();
-						break;
-						
-					case Prune :
-						doPrune();
-						break;
-						
-					default :
-						assert(false);
-						break;
+                case Prune:
+                    doPrune();
+                    break;
 					
-					}
+                default:
+                    assert (false);
+                    break;
+
 				}
 			}
 		}
@@ -202,7 +200,7 @@ public class MessageBusBase implements MessageBus {
 		return locate(subjectPathTokens, _subscriberRoot, chainFromTop, createPath);
 	}
 	
-	private static SubscriptionNode locate(String[] subjectPathTokens, 
+	private static SubscriptionNode locate(String[] subjectPathTokens,
 		SubscriptionNode current, List<SubscriptionNode> chainFromTop, boolean createPath) {
 		
 		assert(current != null);
@@ -223,7 +221,7 @@ public class MessageBusBase implements MessageBus {
 		}
 		
 		if(subjectPathTokens.length > 1) {
-			return locate((String[])Arrays.copyOfRange(subjectPathTokens, 1, subjectPathTokens.length),
+			return locate(Arrays.copyOfRange(subjectPathTokens, 1, subjectPathTokens.length),
 				next, chainFromTop, createPath);
 		} else {
 			return next;
@@ -242,9 +240,9 @@ public class MessageBusBase implements MessageBus {
 	}
 	
 	private static class ActionRecord {
-		private ActionType _type;
-		private String _subject;
-		private MessageSubscriber _subscriber;
+		private final ActionType _type;
+		private final String _subject;
+		private final MessageSubscriber _subscriber;
 		
 		public ActionRecord(ActionType type, String subject, MessageSubscriber subscriber) {
 			_type = type;
@@ -252,8 +250,8 @@ public class MessageBusBase implements MessageBus {
 			_subscriber = subscriber;
 		}
 		
-		public ActionType getType() { 
-			return _type; 
+		public ActionType getType() {
+			return _type;
 		}
 		
 		public String getSubject() {
@@ -320,10 +318,10 @@ public class MessageBusBase implements MessageBus {
 	}
 	
 	private static class SubscriptionNode {
-		private String _nodeKey;
-		private List<MessageSubscriber> _subscribers;
-		private Map<String, SubscriptionNode> _children;
-		private SubscriptionNode _parent;
+		private final String _nodeKey;
+		private final List<MessageSubscriber> _subscribers;
+		private final Map<String, SubscriptionNode> _children;
+		private final SubscriptionNode _parent;
 		
 		public SubscriptionNode(SubscriptionNode parent, String nodeKey, MessageSubscriber subscriber) {
 			assert(nodeKey != null);
@@ -338,7 +336,7 @@ public class MessageBusBase implements MessageBus {
 		}
 		
 		public SubscriptionNode getParent() {
-			return _parent;			
+			return _parent;
 		}
 		
 		public String getNodeKey() {


[2/2] git commit: updated refs/heads/vmsync to 2e1e2ba

Posted by ah...@apache.org.
More fixes on starting from jobs


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

Branch: refs/heads/vmsync
Commit: 2e1e2babcb524c5cd36d48e26bc4d5eb0d62a9e3
Parents: 2c75352
Author: Alex Huang <al...@gmail.com>
Authored: Tue Jun 4 20:10:03 2013 -0700
Committer: Alex Huang <al...@gmail.com>
Committed: Tue Jun 4 20:10:29 2013 -0700

----------------------------------------------------------------------
 .../org/apache/cloudstack/context/CallContext.java |    2 +-
 .../src/com/cloud/vm/VirtualMachineManager.java    |   10 ---
 .../apache/cloudstack/framework/jobs/AsyncJob.java |    2 -
 .../cloudstack/framework/jobs/impl/AsyncJobVO.java |   13 +---
 server/src/com/cloud/api/ApiServer.java            |    2 +-
 .../com/cloud/async/AsyncJobExecutionContext.java  |   15 ++++-
 .../src/com/cloud/async/AsyncJobManagerImpl.java   |    4 -
 .../storage/snapshot/SnapshotSchedulerImpl.java    |    3 +-
 server/src/com/cloud/vm/SystemVmLoadScanner.java   |    2 +
 .../com/cloud/vm/VirtualMachineManagerImpl.java    |   58 +++++++++------
 server/src/com/cloud/vm/VmWorkJobDispatcher.java   |   20 ++++--
 .../vm/VmWorkMockVirtualMachineManagerImpl.java    |   18 -----
 12 files changed, 70 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/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 bc8ad00..4eb46d1 100644
--- a/api/src/org/apache/cloudstack/context/CallContext.java
+++ b/api/src/org/apache/cloudstack/context/CallContext.java
@@ -95,7 +95,7 @@ public class CallContext {
         CallContext callingContext = new CallContext(callingUser, callingAccount, sessionId);
         s_currentContext.set(callingContext);
         if (sessionId != null) {
-            NDC.push(sessionId);
+            NDC.push("job-" + sessionId);
         }
         s_logger.debug("Setting calling context: " + s_currentContext.get());
         return callingContext;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/engine/components-api/src/com/cloud/vm/VirtualMachineManager.java
----------------------------------------------------------------------
diff --git a/engine/components-api/src/com/cloud/vm/VirtualMachineManager.java b/engine/components-api/src/com/cloud/vm/VirtualMachineManager.java
index 97d1ff1..922a1f4 100644
--- a/engine/components-api/src/com/cloud/vm/VirtualMachineManager.java
+++ b/engine/components-api/src/com/cloud/vm/VirtualMachineManager.java
@@ -27,7 +27,6 @@ import com.cloud.agent.api.to.NicTO;
 import com.cloud.agent.api.to.VirtualMachineTO;
 import com.cloud.deploy.DeployDestination;
 import com.cloud.deploy.DeploymentPlan;
-import com.cloud.exception.AgentUnavailableException;
 import com.cloud.exception.ConcurrentOperationException;
 import com.cloud.exception.InsufficientCapacityException;
 import com.cloud.exception.InsufficientServerCapacityException;
@@ -201,14 +200,5 @@ public interface VirtualMachineManager extends Manager {
             throws ResourceUnavailableException, ConcurrentOperationException,
             ManagementServerException, VirtualMachineMigrationException;
 
-    //
-    // VM work handlers
-    //
-    VirtualMachine processVmStartWork(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account, DeploymentPlan planToDeploy)
-           throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException;
-
-    boolean processVmStopWork(String vmUuid, boolean forced, User user, Account account)
-    	throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException;
-
     NicTO toNicTO(NicProfile nic, HypervisorType hypervisorType);
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java
----------------------------------------------------------------------
diff --git a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java
index 92c89ee..14d6479 100644
--- a/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java
+++ b/framework/jobs/src/org/apache/cloudstack/framework/jobs/AsyncJob.java
@@ -90,8 +90,6 @@ public interface AsyncJob extends Job {
     @Override
     Date getLastPolled();
 
-    Date getRemoved();
-
     @Override
     String getInstanceType();
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/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 f2ea4ac..bb7d872 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
@@ -125,12 +125,12 @@ public class AsyncJobVO implements AsyncJob, Job {
         uuid = UUID.randomUUID().toString();
     }
 
-    public AsyncJobVO(long userId, long accountId, String cmd, String cmdInfo, Long instanceId, String instanceType) {
+    public AsyncJobVO(String uuid, long userId, long accountId, String cmd, String cmdInfo, Long instanceId, String instanceType) {
 		this.userId = userId;
 		this.accountId = accountId;
 		this.cmd = cmd;
 		this.cmdInfo = cmdInfo;
-	    uuid = UUID.randomUUID().toString();
+        this.uuid = uuid;
 	    this.instanceId = instanceId;
 	    this.instanceType = instanceType;
     }
@@ -313,15 +313,6 @@ public class AsyncJobVO implements AsyncJob, Job {
 		this.lastPolled = lastPolled;
 	}
 
-	@Override
-    public Date getRemoved() {
-		return removed;
-	}
-
-	public void setRemoved(Date removed) {
-		this.removed = removed;
-	}
-	
     @Override
     public String getInstanceType() {
 		return instanceType;

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/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 4db9bb8..2863803 100755
--- a/server/src/com/cloud/api/ApiServer.java
+++ b/server/src/com/cloud/api/ApiServer.java
@@ -520,7 +520,7 @@ public class ApiServer extends ManagerBase implements HttpRequestHandler, ApiSer
             params.put("ctxStartEventId", String.valueOf(startEventId));
 
             Long instanceId = (objectId == null) ? asyncCmd.getInstanceId() : objectId;
-            AsyncJobVO job = new AsyncJobVO(callerUserId, caller.getId(), cmdObj.getClass().getName(),
+            AsyncJobVO job = new AsyncJobVO(ctx.getSessionId(), callerUserId, caller.getId(), cmdObj.getClass().getName(),
                     ApiGsonHelper.getBuilder().create().toJson(params), instanceId,
                     asyncCmd.getInstanceType() != null ? asyncCmd.getInstanceType().toString() : null);
             job.setDispatcher(_asyncDispatcher.getName());

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/server/src/com/cloud/async/AsyncJobExecutionContext.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/async/AsyncJobExecutionContext.java b/server/src/com/cloud/async/AsyncJobExecutionContext.java
index 9ca38a9..1e4b5dc 100644
--- a/server/src/com/cloud/async/AsyncJobExecutionContext.java
+++ b/server/src/com/cloud/async/AsyncJobExecutionContext.java
@@ -147,7 +147,20 @@ public class AsyncJobExecutionContext  {
 		return context;
 	}
 	
-	public static void setCurrentExecutionContext(AsyncJobExecutionContext currentContext) {
+    public static AsyncJobExecutionContext registerPseudoExecutionContext() {
+        AsyncJobExecutionContext context = s_currentExectionContext.get();
+        if (context == null) {
+            context = new AsyncJobExecutionContext();
+            context = ComponentContext.inject(context);
+            context.getJob();
+            setCurrentExecutionContext(context);
+        }
+
+        return context;
+    }
+
+    // This is intended to be package level access for AsyncJobManagerImpl only.
+    static void setCurrentExecutionContext(AsyncJobExecutionContext currentContext) {
 		s_currentExectionContext.set(currentContext);
 	}
 }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/server/src/com/cloud/async/AsyncJobManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/async/AsyncJobManagerImpl.java b/server/src/com/cloud/async/AsyncJobManagerImpl.java
index f147bb0..40ebe2b 100644
--- a/server/src/com/cloud/async/AsyncJobManagerImpl.java
+++ b/server/src/com/cloud/async/AsyncJobManagerImpl.java
@@ -34,7 +34,6 @@ 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.api.command.user.job.QueryAsyncJobResultCmd;
@@ -517,8 +516,6 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
             		//
             		// setup execution environment
             		//
-                    NDC.push("job-" + job.getId());
-                    
             		txn = Transaction.open(Transaction.CLOUD_DB);
             		
                     try {
@@ -588,7 +585,6 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager,
 	                    if(txn != null)
 	                    	txn.close();
 	                    
-	                    NDC.pop();
                     } catch(Throwable e) {
                 		s_logger.error("Double exception", e);
                     }

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/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 32d1c19..a8ef32b 100644
--- a/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotSchedulerImpl.java
@@ -22,6 +22,7 @@ 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;
@@ -247,7 +248,7 @@ public class SnapshotSchedulerImpl extends ManagerBase implements SnapshotSchedu
                 params.put("id", ""+cmd.getEntityId());
                 params.put("ctxStartEventId", "1");
 
-                AsyncJobVO job = new AsyncJobVO(User.UID_SYSTEM, volume.getAccountId(), CreateSnapshotCmd.class.getName(),
+                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);
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/server/src/com/cloud/vm/SystemVmLoadScanner.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/SystemVmLoadScanner.java b/server/src/com/cloud/vm/SystemVmLoadScanner.java
index a220757..9eafe0f 100644
--- a/server/src/com/cloud/vm/SystemVmLoadScanner.java
+++ b/server/src/com/cloud/vm/SystemVmLoadScanner.java
@@ -24,6 +24,7 @@ import org.apache.log4j.Logger;
 
 import org.apache.cloudstack.context.CallContext;
 
+import com.cloud.async.AsyncJobExecutionContext;
 import com.cloud.exception.CloudAuthenticationException;
 import com.cloud.utils.Pair;
 import com.cloud.utils.concurrency.NamedThreadFactory;
@@ -72,6 +73,7 @@ public class SystemVmLoadScanner<T> {
             public void run() {
                 try {
                     CallContext.registerOnceOnly();
+                    AsyncJobExecutionContext.registerPseudoExecutionContext();
                 } catch (CloudAuthenticationException e) {
                     s_logger.error("Unable to start the capacity scan task", e);
                     System.exit(1);

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
index db6ae65..7a62d3d 100755
--- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
+++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java
@@ -266,20 +266,24 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
     protected AffinityGroupVMMapDao _affinityGroupVMMapDao;
 
     protected List<DeploymentPlanner> _planners;
+
     public List<DeploymentPlanner> getPlanners() {
-		return _planners;
-	}
-	public void setPlanners(List<DeploymentPlanner> _planners) {
-		this._planners = _planners;
-	}
+        return _planners;
+    }
+
+    public void setPlanners(List<DeploymentPlanner> _planners) {
+        this._planners = _planners;
+    }
 
     protected List<HostAllocator> _hostAllocators;
+
     public List<HostAllocator> getHostAllocators() {
-		return _hostAllocators;
-	}
-	public void setHostAllocators(List<HostAllocator> _hostAllocators) {
-		this._hostAllocators = _hostAllocators;
-	}
+        return _hostAllocators;
+    }
+
+    public void setHostAllocators(List<HostAllocator> _hostAllocators) {
+        this._hostAllocators = _hostAllocators;
+    }
 
 	@Inject
     protected List<StoragePoolAllocator> _storagePoolAllocators;
@@ -804,9 +808,12 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         return;
     }
 
-    @Override
-    public VirtualMachine processVmStartWork(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account, DeploymentPlan planToDeploy)
+    public void processVmStartWork(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, DeploymentPlan planToDeploy)
             throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
+        CallContext context = CallContext.current();
+        User caller = context.getCallingUser();
+        Account account = context.getCallingAccount();
+
         VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
         VirtualMachineGuru vmGuru = getVmGuru(vm);
   
@@ -997,7 +1004,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                             if (s_logger.isDebugEnabled()) {
                                 s_logger.debug("Start completed for VM " + vm);
                             }
-                            return startedVm;
+                            return;
                         } else {
                             if (s_logger.isDebugEnabled()) {
                                 s_logger.info("The guru did not like the answers so stopping " + vm);
@@ -1073,8 +1080,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             throw new CloudRuntimeException("Unable to start instance '" + vm.getHostName()
                             + "' (" + vm.getUuid() + "), see management server log for details");
         }
-
-        return startedVm;
     }
     
     @Override
@@ -1259,9 +1264,12 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
         }
     }
 
-    @Override
-    public boolean processVmStopWork(String vmUuid, boolean forced, User user, Account account) throws AgentUnavailableException,
+    public void processVmStopWork(String vmUuid, boolean forced) throws AgentUnavailableException,
             OperationTimedoutException, ConcurrentOperationException {
+        CallContext context = CallContext.current();
+        User user = context.getCallingUser();
+        Account account = context.getCallingAccount();
+
         VmWorkJobVO work = _workJobDao.findById(AsyncJobExecutionContext.getCurrentExecutionContext().getJob().getId());
 
         final VMInstanceVO vm = _vmDao.findByUuid(vmUuid);
@@ -1271,7 +1279,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                 if (s_logger.isDebugEnabled()) {
                     s_logger.debug("HostId is null but this is not a forced stop, cannot stop vm " + vm + " with state:" + vm.getState());
                 }
-                return false;
+                return;
             }
             
             try {
@@ -1281,7 +1289,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
             }
   
             _workJobDao.updateStep(work.getId(), VmWorkJobVO.Step.Done);
-            return true;
+            return;
         }
 
         VirtualMachineGuru vmGuru = getVmGuru(vm);
@@ -1313,10 +1321,11 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                         if (s_logger.isDebugEnabled()) {
                             s_logger.debug("Updating work item to Done, id:" + work.getId());
                         }
-                        return changeState(vm, Event.AgentReportStopped, null, work, Step.Done);
+                        changeState(vm, Event.AgentReportStopped, null, work, Step.Done);
+                        return;
                     } catch (NoTransitionException e) {
                         s_logger.warn("Unable to cleanup " + vm);
-                        return false;
+                        return;
                     }
                 } else {
                     if (s_logger.isDebugEnabled()) {
@@ -1351,7 +1360,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                     } catch (NoTransitionException e) {
                         s_logger.warn("Unable to transition the state " + vm);
                     }
-                    return false;
+                    return;
                 } else {
                     s_logger.warn("Unable to actually stop " + vm + " but continue with release because it's a force stop");
                     vmGuru.finalizeStop(profile, answer);
@@ -1387,10 +1396,11 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac
                 _workJobDao.updateStep(work.getId(), VmWorkJobVO.Step.Done);
             }
 
-            return stateTransitTo(vm, Event.OperationSucceeded, null, null);
+            stateTransitTo(vm, Event.OperationSucceeded, null, null);
+            return;
         } catch (NoTransitionException e) {
             s_logger.warn(e.getMessage());
-            return false;
+            return;
         }
     }
 

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/server/src/com/cloud/vm/VmWorkJobDispatcher.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/vm/VmWorkJobDispatcher.java b/server/src/com/cloud/vm/VmWorkJobDispatcher.java
index c37e65d..04d9204 100644
--- a/server/src/com/cloud/vm/VmWorkJobDispatcher.java
+++ b/server/src/com/cloud/vm/VmWorkJobDispatcher.java
@@ -41,7 +41,8 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
     public final static String Start = "start";
     public final static String Stop = "stop";
 
-	@Inject private VirtualMachineManager _vmMgr;
+    @Inject
+    private VirtualMachineManagerImpl _vmMgr;
 	@Inject private AsyncJobManager _asyncJobMgr;
     @Inject private AccountDao _accountDao;
     @Inject private VMInstanceDao _instanceDao;
@@ -50,25 +51,32 @@ public class VmWorkJobDispatcher extends AdapterBase implements AsyncJobDispatch
     
 	@Override
     public void runJob(AsyncJob job) {
+        VmWork work = null;
         try {
         	String cmd = job.getCmd();
         	assert(cmd != null);
         	
-        	VmWork work = (VmWork)ApiSerializerHelper.fromSerializedString(job.getCmdInfo());
+            work = (VmWork)ApiSerializerHelper.fromSerializedString(job.getCmdInfo());
         	assert(work != null);
         	
+            CallContext context = CallContext.register(work.getUserId(), work.getAccountId(), "job-" + job.getShortUuid());
+
             VMInstanceVO vm = _instanceDao.findById(work.getVmId());
+            if (vm == null) {
+                s_logger.info("Unable to find vm " + work.getVmId());
+            }
             assert(vm != null);
     
-            CallContext context = CallContext.register(work.getUserId(), work.getAccountId(), "job-" + job.getShortUuid());
             if (cmd.equals(Start)) {
-                _vmMgr.start(vm.getUuid(), null, context.getCallingUser(), context.getCallingAccount());
+                VmWorkStart start = (VmWorkStart)work;
+                _vmMgr.processVmStartWork(vm.getUuid(), start.getParams(), start.getPlan());
             } else if (cmd.equals(Stop)) {
-                _vmMgr.stop(vm.getUuid(), context.getCallingUser(), context.getCallingAccount());
+                VmWorkStop stop = (VmWorkStop)work;
+                _vmMgr.processVmStopWork(vm.getUuid(), stop.isForceStop());
             }
             _asyncJobMgr.completeAsyncJob(job.getId(), AsyncJobConstants.STATUS_SUCCEEDED, 0, null);
         } catch(Throwable e) {
-        	s_logger.error("Unexpected exception", e);
+            s_logger.error("Unable to complete " + job, e);
             _asyncJobMgr.completeAsyncJob(job.getId(), AsyncJobConstants.STATUS_FAILED, 0, e);
         } finally {
             CallContext.unregister();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/2e1e2bab/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java b/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java
index 698fe80..98b5af8 100644
--- a/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java
+++ b/server/test/com/cloud/vm/VmWorkMockVirtualMachineManagerImpl.java
@@ -341,18 +341,6 @@ public class VmWorkMockVirtualMachineManagerImpl implements VirtualMachineManage
         return false;
 	}
 
-	@Override
-    public VirtualMachine processVmStartWork(String vmUuid, Map<VirtualMachineProfile.Param, Object> params, User caller, Account account, DeploymentPlan planToDeploy)
-            throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException {
-    	
-		try {
-			Thread.sleep(120000);
-		} catch (InterruptedException e) {
-		}
-    	
-        return null;
-    }
-
 	int wakeupCount = 0;
 	public void processVmStartWakeup() {
 		s_logger.info("processVmStartWakeup. job-" + AsyncJobExecutionContext.getCurrentExecutionContext().getJob().getId());
@@ -364,12 +352,6 @@ public class VmWorkMockVirtualMachineManagerImpl implements VirtualMachineManage
 		}
 	}
 	
-	@Override
-    public boolean processVmStopWork(String vmUuid, boolean forced, User user, Account account)
-        throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException {
-    	return true;
-    }
-
     @Override
     public VirtualMachine migrateWithStorage(String vmUuid, long srcId, long destId, Map<VolumeVO, StoragePoolVO> volumeToPool) throws ResourceUnavailableException,
             ConcurrentOperationException, ManagementServerException, VirtualMachineMigrationException {