@Override public boolean postStateTransitionEvent( State oldState, Event event, State newState, VirtualMachine vm, boolean status, Object opaque) { if (!status) { return false; } @SuppressWarnings("unchecked") Pair<Long, Long> hosts = (Pair<Long, Long>) opaque; Long oldHostId = hosts.first(); s_logger.debug( "VM state transitted from :" + oldState + " to " + newState + " with event: " + event + "vm's original host id: " + vm.getLastHostId() + " new host id: " + vm.getHostId() + " host id before state transition: " + oldHostId); if (oldState == State.Starting) { if (newState != State.Running) { releaseVmCapacity(vm, false, false, oldHostId); } } else if (oldState == State.Running) { if (event == Event.AgentReportStopped) { releaseVmCapacity(vm, false, true, oldHostId); } else if (event == Event.AgentReportMigrated) { releaseVmCapacity(vm, false, false, oldHostId); } } else if (oldState == State.Migrating) { if (event == Event.AgentReportStopped) { /* Release capacity from original host */ releaseVmCapacity(vm, false, false, vm.getLastHostId()); releaseVmCapacity(vm, false, false, oldHostId); } else if (event == Event.OperationFailed) { /* Release from dest host */ releaseVmCapacity(vm, false, false, oldHostId); } else if (event == Event.OperationSucceeded) { releaseVmCapacity(vm, false, false, vm.getLastHostId()); } } else if (oldState == State.Stopping) { if (event == Event.OperationSucceeded) { releaseVmCapacity(vm, false, true, oldHostId); } else if (event == Event.AgentReportStopped) { releaseVmCapacity(vm, false, false, oldHostId); } else if (event == Event.AgentReportMigrated) { releaseVmCapacity(vm, false, false, oldHostId); } } else if (oldState == State.Stopped) { if (event == Event.DestroyRequested || event == Event.ExpungeOperation) { releaseVmCapacity(vm, true, false, vm.getLastHostId()); } else if (event == Event.AgentReportMigrated) { releaseVmCapacity(vm, false, false, oldHostId); } } if ((newState == State.Starting || newState == State.Migrating || event == Event.AgentReportMigrated) && vm.getHostId() != null) { boolean fromLastHost = false; if (vm.getLastHostId() == vm.getHostId()) { s_logger.debug("VM starting again on the last host it was stopped on"); fromLastHost = true; } allocateVmCapacity(vm, fromLastHost); } return true; }