introducing a new error state

This commit is contained in:
abhishek 2010-12-06 09:50:02 -08:00
parent 469d4e6e65
commit b4dd261fc2
3 changed files with 26 additions and 4 deletions

View File

@ -79,9 +79,10 @@ public enum State implements FiniteState<State, Event> {
static {
s_fsm.addTransition(null, VirtualMachine.Event.CreateRequested, State.Creating);
s_fsm.addTransition(State.Creating, VirtualMachine.Event.OperationSucceeded, State.Stopped);
s_fsm.addTransition(State.Creating, VirtualMachine.Event.OperationFailed, State.Destroyed);
s_fsm.addTransition(State.Creating, VirtualMachine.Event.OperationFailed, State.Error);
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.StartRequested, State.Starting);
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.DestroyRequested, State.Destroyed);
s_fsm.addTransition(State.Error, VirtualMachine.Event.DestroyRequested, State.Destroyed);
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.StopRequested, State.Stopped);
s_fsm.addTransition(State.Stopped, VirtualMachine.Event.AgentReportStopped, State.Stopped);
s_fsm.addTransition(State.Starting, VirtualMachine.Event.OperationRetry, State.Starting);

View File

@ -527,8 +527,9 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
_stateMachine.addTransition(null, VirtualMachine.Event.CreateRequested, State.Creating);
_stateMachine.addTransition(State.Creating, VirtualMachine.Event.OperationSucceeded, State.Stopped);
_stateMachine.addTransition(State.Creating, VirtualMachine.Event.OperationFailed, State.Destroyed);
_stateMachine.addTransition(State.Creating, VirtualMachine.Event.OperationFailed, State.Error);
_stateMachine.addTransition(State.Stopped, VirtualMachine.Event.StartRequested, State.Starting);
_stateMachine.addTransition(State.Error, VirtualMachine.Event.DestroyRequested, State.Destroyed);
_stateMachine.addTransition(State.Stopped, VirtualMachine.Event.DestroyRequested, State.Destroyed);
_stateMachine.addTransition(State.Stopped, VirtualMachine.Event.StopRequested, State.Stopped);
_stateMachine.addTransition(State.Stopped, VirtualMachine.Event.AgentReportStopped, State.Stopped);

View File

@ -1748,6 +1748,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
throw (ResourceAllocationException)th;
}
throw new CloudRuntimeException("Unable to create vm", th);
}finally{
updateVmStateForFailedVmCreation(vmId);
}
}
@ -2953,8 +2955,19 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
s_logger.error("Unable to create vm", th);
throw new CloudRuntimeException("Unable to create vm: "+th.getMessage(), th);
} finally{
updateVmStateForFailedVmCreation(vmId);
}
}
private void updateVmStateForFailedVmCreation(Long vmId) {
UserVmVO vm = _vmDao.findById(vmId);
if(vm != null){
if(vm.getState().equals(State.Creating)){
_vmDao.updateIf(vm, VirtualMachine.Event.OperationFailed, null);
}
}
}
@DB
@Override
@ -3116,6 +3129,8 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
_accountMgr.decrementResourceCount(account.getId(), ResourceType.volume, numVolumes);
s_logger.error("Unable to create vm", th);
throw new CloudRuntimeException("Unable to create vm", th);
}finally{
updateVmStateForFailedVmCreation(vmId);
}
}
@ -3741,8 +3756,13 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, VirtualM
UserVmVO vm = new UserVmVO(id, VirtualMachineName.getVmName(id, owner.getId(), _instance), cmd.getDisplayName(),
template.getId(), template.getGuestOSId(), offering.getOfferHA(), domain.getId(), owner.getId(), offering.getId(), userData);
if (_itMgr.allocate(vm, template, offering, rootDiskOffering, dataDiskOfferings, networks, null, plan, owner) == null) {
return null;
try{
if (_itMgr.allocate(vm, template, offering, rootDiskOffering, dataDiskOfferings, networks, null, plan, owner) == null) {
return null;
}
}finally{
updateVmStateForFailedVmCreation(id);
}
if (s_logger.isDebugEnabled()) {