diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in
index 71461e0e30f..b539293635f 100755
--- a/client/tomcatconf/components.xml.in
+++ b/client/tomcatconf/components.xml.in
@@ -72,7 +72,7 @@
-
+
diff --git a/server/src/com/cloud/agent/manager/AgentManagerImpl.java b/server/src/com/cloud/agent/manager/AgentManagerImpl.java
index 6c2e9288d85..bace866e4e4 100755
--- a/server/src/com/cloud/agent/manager/AgentManagerImpl.java
+++ b/server/src/com/cloud/agent/manager/AgentManagerImpl.java
@@ -2112,10 +2112,12 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
List capacities = _capacityDao.search(capacitySC, null);
// remove old entries, we'll recalculate them anyway
- if ((capacities != null) && !capacities.isEmpty()) {
- for (CapacityVO capacity : capacities) {
- _capacityDao.remove(capacity.getId());
- }
+ if (startup instanceof StartupStorageCommand) {
+ if ((capacities != null) && !capacities.isEmpty()) {
+ for (CapacityVO capacity : capacities) {
+ _capacityDao.remove(capacity.getId());
+ }
+ }
}
if (startup instanceof StartupStorageCommand) {
@@ -2130,14 +2132,57 @@ public class AgentManagerImpl implements AgentManager, HandlerFactory, ResourceS
_capacityDao.persist(capacity);
}
} else if (startup instanceof StartupRoutingCommand) {
-
- CapacityVO capacity = new CapacityVO(server.getId(), server.getDataCenterId(), server.getPodId(), 0L,
- server.getTotalMemory(), CapacityVO.CAPACITY_TYPE_MEMORY);
- _capacityDao.persist(capacity);
-
- capacity = new CapacityVO(server.getId(), server.getDataCenterId(), server.getPodId(), 0L, (long)(server.getCpus().longValue()
- * server.getSpeed().longValue()*_cpuOverProvisioningFactor), CapacityVO.CAPACITY_TYPE_CPU);
- _capacityDao.persist(capacity);
+ SearchCriteria capacityCPU = _capacityDao.createSearchCriteria();
+ capacityCPU.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, server.getId());
+ capacityCPU.addAnd("dataCenterId", SearchCriteria.Op.EQ, server.getDataCenterId());
+ capacityCPU.addAnd("podId", SearchCriteria.Op.EQ, server.getPodId());
+ capacityCPU.addAnd("capacityType", SearchCriteria.Op.EQ, CapacityVO.CAPACITY_TYPE_CPU);
+ List capacityVOCpus = _capacityDao.search(capacitySC, null);
+
+ if (capacityVOCpus != null && !capacityVOCpus.isEmpty()) {
+ CapacityVO CapacityVOCpu = capacityVOCpus.get(0);
+ long newTotalCpu = (long)(server.getCpus().longValue() * server.getSpeed().longValue()*_cpuOverProvisioningFactor);
+ if (CapacityVOCpu.getTotalCapacity() < newTotalCpu) {
+ CapacityVOCpu.setTotalCapacity(newTotalCpu);
+ } else if (CapacityVOCpu.getUsedCapacity() + CapacityVOCpu.getReservedCapacity() > newTotalCpu && CapacityVOCpu.getUsedCapacity() < newTotalCpu) {
+ CapacityVOCpu.setReservedCapacity(0);
+ CapacityVOCpu.setTotalCapacity(newTotalCpu);
+ } else {
+ s_logger.debug("What? new cpu is :" + newTotalCpu + ", old one is " + CapacityVOCpu.getUsedCapacity() + "," + CapacityVOCpu.getReservedCapacity() + "," +
+ CapacityVOCpu.getTotalCapacity());
+ }
+ _capacityDao.update(CapacityVOCpu.getId(), CapacityVOCpu);
+ } else {
+ CapacityVO capacity = new CapacityVO(server.getId(), server.getDataCenterId(), server.getPodId(), 0L, (long)(server.getCpus().longValue()
+ * server.getSpeed().longValue()*_cpuOverProvisioningFactor), CapacityVO.CAPACITY_TYPE_CPU);
+ _capacityDao.persist(capacity);
+ }
+
+ SearchCriteria capacityMem = _capacityDao.createSearchCriteria();
+ capacityMem.addAnd("hostOrPoolId", SearchCriteria.Op.EQ, server.getId());
+ capacityMem.addAnd("dataCenterId", SearchCriteria.Op.EQ, server.getDataCenterId());
+ capacityMem.addAnd("podId", SearchCriteria.Op.EQ, server.getPodId());
+ capacityMem.addAnd("capacityType", SearchCriteria.Op.EQ, CapacityVO.CAPACITY_TYPE_MEMORY);
+ List capacityVOMems = _capacityDao.search(capacitySC, null);
+
+ if (capacityVOMems != null && !capacityVOMems.isEmpty()) {
+ CapacityVO CapacityVOMem = capacityVOMems.get(0);
+ long newTotalMem = server.getTotalMemory();
+ if (CapacityVOMem.getTotalCapacity() < newTotalMem) {
+ CapacityVOMem.setTotalCapacity(newTotalMem);
+ } else if (CapacityVOMem.getUsedCapacity() + CapacityVOMem.getReservedCapacity() > newTotalMem && CapacityVOMem.getUsedCapacity() < newTotalMem) {
+ CapacityVOMem.setReservedCapacity(0);
+ CapacityVOMem.setTotalCapacity(newTotalMem);
+ } else {
+ s_logger.debug("What? new cpu is :" + newTotalMem + ", old one is " + CapacityVOMem.getUsedCapacity() + "," + CapacityVOMem.getReservedCapacity() + "," +
+ CapacityVOMem.getTotalCapacity());
+ }
+ _capacityDao.update(CapacityVOMem.getId(), CapacityVOMem);
+ } else {
+ CapacityVO capacity = new CapacityVO(server.getId(), server.getDataCenterId(), server.getPodId(), 0L,
+ server.getTotalMemory(), CapacityVO.CAPACITY_TYPE_MEMORY);
+ _capacityDao.persist(capacity);
+ }
}
}
diff --git a/server/src/com/cloud/capacity/dao/CapacityDao.java b/server/src/com/cloud/capacity/dao/CapacityDao.java
index 6c1ae593577..36502e06d1d 100644
--- a/server/src/com/cloud/capacity/dao/CapacityDao.java
+++ b/server/src/com/cloud/capacity/dao/CapacityDao.java
@@ -20,9 +20,11 @@ package com.cloud.capacity.dao;
import com.cloud.capacity.CapacityVO;
import com.cloud.utils.db.GenericDao;
+import com.cloud.vm.VMInstanceVO;
public interface CapacityDao extends GenericDao {
void clearNonStorageCapacities();
void clearStorageCapacities();
- CapacityVO findByHostIdType(Long hostId, short capacityType);
+ CapacityVO findByHostIdType(Long hostId, short capacityType);
+
}
diff --git a/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java b/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java
index 99a5b0e1dce..b1f5cdb258e 100644
--- a/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java
+++ b/server/src/com/cloud/capacity/dao/CapacityDaoImpl.java
@@ -25,10 +25,13 @@ import javax.ejb.Local;
import org.apache.log4j.Logger;
import com.cloud.capacity.CapacityVO;
+import com.cloud.service.ServiceOfferingVO;
+import com.cloud.utils.db.DB;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
import com.cloud.utils.db.Transaction;
+import com.cloud.vm.VMInstanceVO;
@Local(value = { CapacityDao.class })
public class CapacityDaoImpl extends GenericDaoBase implements CapacityDao {
@@ -37,10 +40,10 @@ public class CapacityDaoImpl extends GenericDaoBase implements
private static final String ADD_ALLOCATED_SQL = "UPDATE `cloud`.`op_host_capacity` SET used_capacity = used_capacity + ? WHERE host_id = ? AND capacity_type = ?";
private static final String SUBTRACT_ALLOCATED_SQL = "UPDATE `cloud`.`op_host_capacity` SET used_capacity = used_capacity - ? WHERE host_id = ? AND capacity_type = ?";
private static final String CLEAR_STORAGE_CAPACITIES = "DELETE FROM `cloud`.`op_host_capacity` WHERE capacity_type=2 OR capacity_type=3 OR capacity_type=6"; //clear storage and secondary_storage capacities
- private static final String CLEAR_NON_STORAGE_CAPACITIES = "DELETE FROM `cloud`.`op_host_capacity` WHERE capacity_type<>2 AND capacity_type<>3 AND capacity_type<>6"; //clear non-storage and non-secondary_storage capacities
+ private static final String CLEAR_NON_STORAGE_CAPACITIES = "DELETE FROM `cloud`.`op_host_capacity` WHERE capacity_type<>2 AND capacity_type<>3 AND capacity_type<>6 AND capacity_type<>0 AND capacity_type<>1"; //clear non-storage and non-secondary_storage capacities
private SearchBuilder _hostIdTypeSearch;
- public void CapacityDaoImple() {
+ public CapacityDaoImpl() {
_hostIdTypeSearch = createSearchBuilder();
_hostIdTypeSearch.and("hostId", _hostIdTypeSearch.entity().getHostOrPoolId(), SearchCriteria.Op.EQ);
_hostIdTypeSearch.and("type", _hostIdTypeSearch.entity().getCapacityType(), SearchCriteria.Op.EQ);
diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
index 63c67256e70..1e056a0cb79 100644
--- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
+++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java
@@ -2357,7 +2357,7 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
String multicastRateStr = _configDao.getValue("multicast.throttling.rate");
_networkRate = ((networkRateStr == null) ? 200 : Integer.parseInt(networkRateStr));
_multicastRate = ((multicastRateStr == null) ? 10 : Integer.parseInt(multicastRateStr));
- _serviceOffering = new ServiceOfferingVO("System Offering For Console Proxy", 1, _proxyRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized,
+ _serviceOffering = new ServiceOfferingVO("System Offering For Console Proxy", 1, _proxyRamSize, 500, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized,
useLocalStorage, true, null, true);
_serviceOffering.setUniqueName("Cloud.com-ConsoleProxy");
_serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering);
diff --git a/server/src/com/cloud/deploy/FirstFitPlanner.java b/server/src/com/cloud/deploy/FirstFitPlanner.java
index 85c4dd9f4ea..da02eeda831 100644
--- a/server/src/com/cloud/deploy/FirstFitPlanner.java
+++ b/server/src/com/cloud/deploy/FirstFitPlanner.java
@@ -3,6 +3,8 @@ package com.cloud.deploy;
import java.util.Collections;
import java.util.List;
+import javax.ejb.Local;
+
import com.cloud.capacity.CapacityVO;
import com.cloud.capacity.dao.CapacityDao;
import com.cloud.dc.ClusterVO;
@@ -20,10 +22,11 @@ import com.cloud.host.dao.HostDao;
import com.cloud.offering.ServiceOffering;
import com.cloud.org.Cluster;
import com.cloud.utils.component.Inject;
+import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
-
+@Local(value=DeploymentPlanner.class)
public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
@Inject private HostDao _hostDao;
@Inject private CapacityDao _capacityDao;
@@ -95,15 +98,24 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
return null;
}
- private boolean deployToHost(Long hostId, Integer cpu, long ram, boolean fromLastHost) {
+
+ @Override
+ public boolean check(VirtualMachineProfile vm, DeploymentPlan plan,
+ DeployDestination dest, ExcludeList exclude) {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ @DB
+ protected boolean deployToHost(Long hostId, Integer cpu, long ram, boolean fromLastHost) {
CapacityVO capacityCpu = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_CPU);
CapacityVO capacityMem = _capacityDao.findByHostIdType(hostId, CapacityVO.CAPACITY_TYPE_MEMORY);
Transaction txn = Transaction.currentTxn();
- txn.start();
-
+
try {
+ txn.start();
capacityCpu = _capacityDao.lockRow(capacityCpu.getId(), true);
capacityMem = _capacityDao.lockRow(capacityMem.getId(), true);
@@ -119,21 +131,23 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
/*alloc from reserved*/
if (reservedCpu >= cpu && reservedMem >= ram) {
capacityCpu.setReservedCapacity(reservedCpu - cpu);
- capacityMem.setReservedCapacity(reservedMem - ram);
+ capacityMem.setReservedCapacity(reservedMem - ram);
+ capacityCpu.setUsedCapacity(usedCpu + cpu);
+ capacityMem.setUsedCapacity(usedMem + ram);
success = true;
}
} else {
/*alloc from free resource*/
if ((reservedCpu + usedCpu + cpu <= totalCpu) && (reservedMem + usedMem + ram <= totalMem)) {
capacityCpu.setUsedCapacity(usedCpu + cpu);
- capacityMem.setUsedCapacity(totalMem + ram);
+ capacityMem.setUsedCapacity(usedMem + ram);
success = true;
}
}
if (success) {
_capacityDao.update(capacityCpu.getId(), capacityCpu);
- _capacityDao.update(capacityMem.getId(), capacityMem);
+ _capacityDao.update(capacityMem.getId(), capacityMem);
}
txn.commit();
@@ -143,11 +157,5 @@ public class FirstFitPlanner extends PlannerBase implements DeploymentPlanner {
return false;
}
}
- @Override
- public boolean check(VirtualMachineProfile vm, DeploymentPlan plan,
- DeployDestination dest, ExcludeList exclude) {
- // TODO Auto-generated method stub
- return false;
- }
-
+
}
diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
index 2860ca1b517..ea752049bd8 100644
--- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
+++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java
@@ -359,9 +359,8 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
if (work.getStep() == Step.Investigating) {
if (vm.getHostId() == null || vm.getHostId() != work.getHostId()) {
s_logger.info("VM " + vm.toString() + " is now no longer on host " + work.getHostId());
- if (vm.getState() == State.Starting && vm.getUpdated() == work.getUpdateTime()) {
- vm.setHostId(null);
- _itMgr.stateTransitTo(vm, Event.AgentReportStopped);
+ if (vm.getState() == State.Starting && vm.getUpdated() == work.getUpdateTime()) {
+ _itMgr.stateTransitTo(vm, Event.AgentReportStopped, null);
}
return null;
}
@@ -521,7 +520,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
s_logger.debug("Both states are " + agentState.toString() + " for " + serverName);
}
assert (agentState == State.Stopped || agentState == State.Running) : "If the states we send up is changed, this must be changed.";
- _itMgr.stateTransitTo(vm, agentState == State.Stopped ? VirtualMachine.Event.AgentReportStopped : VirtualMachine.Event.AgentReportRunning);
+ _itMgr.stateTransitTo(vm, agentState == State.Stopped ? VirtualMachine.Event.AgentReportStopped : VirtualMachine.Event.AgentReportRunning, vm.getHostId());
if (agentState == State.Stopped) {
s_logger.debug("State matches but the agent said stopped so let's send a cleanup anyways.");
return info.mgr.cleanup(vm, agentName);
@@ -551,9 +550,8 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
} else if (serverState == State.Starting) {
s_logger.debug("Ignoring VM in starting mode: " + vm.getHostName());
} else {
- s_logger.debug("Sending cleanup to a stopped vm: " + agentName);
- vm.setHostId(null);
- _itMgr.stateTransitTo(vm, VirtualMachine.Event.AgentReportStopped);
+ s_logger.debug("Sending cleanup to a stopped vm: " + agentName);
+ _itMgr.stateTransitTo(vm, VirtualMachine.Event.AgentReportStopped, null);
command = info.mgr.cleanup(vm, agentName);
}
} else if (agentState == State.Running) {
@@ -577,7 +575,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
vm = info.mgr.get(vm.getId());
command = info.mgr.cleanup(vm, agentName);
} else {
- _itMgr.stateTransitTo(vm, VirtualMachine.Event.AgentReportRunning);
+ _itMgr.stateTransitTo(vm, VirtualMachine.Event.AgentReportRunning, vm.getHostId());
}
} /*else if (agentState == State.Unknown) {
if (serverState == State.Running) {
@@ -749,7 +747,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
if (work.getStep() == Step.Migrating) {
vm = mgr.get(vmId); // let's see if anything has changed.
boolean migrated = false;
- if (vm == null || vm.getRemoved() != null || vm.getHostId() == null || !_itMgr.stateTransitTo(vm, Event.MigrationRequested)) {
+ if (vm == null || vm.getRemoved() != null || vm.getHostId() == null || !_itMgr.stateTransitTo(vm, Event.MigrationRequested, vm.getHostId())) {
s_logger.info("Migration cancelled because state has changed: " + vm.toString());
} else {
try {
@@ -779,7 +777,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
HostPodVO podVO = _podDao.findById(vm.getPodId());
_alertMgr.sendAlert(alertType, fromHost.getDataCenterId(), fromHost.getPodId(), "Unable to migrate vm " + vm.getHostName() + " from host " + fromHost.getName() + " in zone " + dcVO.getName() + " and pod " + podVO.getName(), "Migrate Command failed. Please check logs.");
- _itMgr.stateTransitTo(vm, Event.OperationFailed);
+ _itMgr.stateTransitTo(vm, Event.OperationFailed, vm.getHostId());
_agentMgr.maintenanceFailed(vm.getHostId());
Command cleanup = mgr.cleanup(vm, null);
@@ -809,8 +807,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager {
} catch (final OperationTimedoutException e) {
s_logger.warn("Operation timed outfor " + vm.toString());
}
- vm.setHostId(toHost.getId());
- _itMgr.stateTransitTo(vm, Event.OperationFailed);
+ _itMgr.stateTransitTo(vm, Event.OperationFailed, toHost.getId());
return (System.currentTimeMillis() >> 10) + _migrateRetryInterval;
}
diff --git a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java
index 19f42905e8e..3116ba0e722 100644
--- a/server/src/com/cloud/network/router/DomainRouterManagerImpl.java
+++ b/server/src/com/cloud/network/router/DomainRouterManagerImpl.java
@@ -1517,7 +1517,7 @@ public class DomainRouterManagerImpl implements DomainRouterManager, DomainRoute
String multicastRateStr = _configDao.getValue("multicast.throttling.rate");
_networkRate = ((networkRateStr == null) ? 200 : Integer.parseInt(networkRateStr));
_multicastRate = ((multicastRateStr == null) ? 10 : Integer.parseInt(multicastRateStr));
- _offering = new ServiceOfferingVO("System Offering For Software Router", 1, _routerRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, useLocalStorage, true, null, true);
+ _offering = new ServiceOfferingVO("System Offering For Software Router", 1, _routerRamSize, 500, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, useLocalStorage, true, null, true);
_offering.setUniqueName("Cloud.Com-SoftwareRouter");
_offering = _serviceOfferingDao.persistSystemServiceOffering(_offering);
_template = _templateDao.findRoutingTemplate();
diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
index 991d22daa80..0d36ddb6480 100644
--- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
+++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
@@ -1466,7 +1466,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
String multicastRateStr = _configDao.getValue("multicast.throttling.rate");
_networkRate = ((networkRateStr == null) ? 200 : Integer.parseInt(networkRateStr));
_multicastRate = ((multicastRateStr == null) ? 10 : Integer.parseInt(multicastRateStr));
- _serviceOffering = new ServiceOfferingVO("System Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 0, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, useLocalStorage, true, null, true);
+ _serviceOffering = new ServiceOfferingVO("System Offering For Secondary Storage VM", 1, _secStorageVmRamSize, 500, 0, 0, false, null, NetworkOffering.GuestIpType.Virtualized, useLocalStorage, true, null, true);
_serviceOffering.setUniqueName("Cloud.com-SecondaryStorage");
_serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering);
_template = _templateDao.findConsoleProxyTemplate();
diff --git a/server/src/com/cloud/vm/MauriceMoss.java b/server/src/com/cloud/vm/MauriceMoss.java
index 670e0646c28..05f4c0e5fbf 100644
--- a/server/src/com/cloud/vm/MauriceMoss.java
+++ b/server/src/com/cloud/vm/MauriceMoss.java
@@ -174,7 +174,7 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
_storageMgr.allocateRawVolume(VolumeType.DATADISK, "DATA-" + vm.getId(), offering.first(), offering.second(), vm, owner);
}
- stateTransitTo(vm, Event.OperationSucceeded);
+ stateTransitTo(vm, Event.OperationSucceeded, null);
txn.commit();
if (s_logger.isDebugEnabled()) {
s_logger.debug("Allocation completed for VM: " + vm);
@@ -238,7 +238,7 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
if (s_logger.isDebugEnabled()) {
s_logger.debug("Destroying vm " + vm);
}
- if (!stateTransitTo(vm, VirtualMachine.Event.DestroyRequested)) {
+ if (!stateTransitTo(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) {
s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm.toString());
return false;
}
@@ -326,7 +326,7 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
vm.setReservationId(work.getId());
- if (!stateTransitTo(vm, Event.StartRequested)) {
+ if (!stateTransitTo(vm, Event.StartRequested, null)) {
throw new ConcurrentOperationException("Unable to start vm " + vm + " due to concurrent operations");
}
@@ -334,7 +334,7 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
int retry = _retry;
while (retry-- != 0) { // It's != so that it can match -1.
if (retry < (_retry -1)) {
- stateTransitTo(vm, Event.OperationRetry);
+ stateTransitTo(vm, Event.OperationRetry, null);
}
VirtualMachineProfileImpl vmProfile = new VirtualMachineProfileImpl(vm, template, offering, null, params);
@@ -353,13 +353,12 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
}
vm.setDataCenterId(dest.getDataCenter().getId());
- vm.setPodId(dest.getPod().getId());
- vm.setHostId(dest.getHost().getId());
+ vm.setPodId(dest.getPod().getId());
try {
_storageMgr.prepare(vmProfile, dest);
} catch (ConcurrentOperationException e) {
- stateTransitTo(vm, Event.OperationFailed);
+ stateTransitTo(vm, Event.OperationFailed, null);
throw e;
} catch (StorageUnavailableException e) {
s_logger.warn("Unable to contact storage.", e);
@@ -379,7 +378,7 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
try {
Answer[] answers = _agentMgr.send(dest.getHost().getId(), cmds);
if (answers[0].getResult() && vmGuru.finalizeStart(cmds, vmProfile, dest, context)) {
- if (!stateTransitTo(vm, Event.OperationSucceeded)) {
+ if (!stateTransitTo(vm, Event.OperationSucceeded, dest.getHost().getId())) {
throw new CloudRuntimeException("Unable to transition to a new state.");
}
return vm;
@@ -394,7 +393,7 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
}
}
- stateTransitTo(vm, Event.OperationFailed);
+ stateTransitTo(vm, Event.OperationFailed, null);
if (s_logger.isDebugEnabled()) {
s_logger.debug("Creation complete for VM " + vm);
@@ -418,7 +417,7 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
return true;
}
- if (!stateTransitTo(vm, Event.StopRequested)) {
+ if (!stateTransitTo(vm, Event.StopRequested, vm.getHostId())) {
throw new ConcurrentOperationException("VM is being operated on by someone else.");
}
@@ -447,7 +446,7 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
}
} finally {
if (!stopped) {
- stateTransitTo(vm, Event.OperationFailed);
+ stateTransitTo(vm, Event.OperationFailed, vm.getHostId());
}
}
@@ -482,8 +481,8 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
}
vm.setReservationId(null);
- vm.setHostId(null);
- stateTransitTo(vm, Event.OperationSucceeded);
+
+ stateTransitTo(vm, Event.OperationSucceeded, null);
if (cleanup) {
ItWorkVO work = new ItWorkVO(reservationId, _nodeId, Type.Cleanup);
@@ -541,7 +540,7 @@ public class MauriceMoss implements VmManager, ClusterManagerListener {
}
@Override
- public boolean stateTransitTo(VMInstanceVO vm, VirtualMachine.Event e) {
- return _stateMachine.transitTO(vm, e);
+ public boolean stateTransitTo(VMInstanceVO vm, VirtualMachine.Event e, Long id) {
+ return _stateMachine.transitTO(vm, e, id);
}
}
diff --git a/server/src/com/cloud/vm/VMStateListener.java b/server/src/com/cloud/vm/VMStateListener.java
index 3fdefd61b99..d07ffefbbfe 100644
--- a/server/src/com/cloud/vm/VMStateListener.java
+++ b/server/src/com/cloud/vm/VMStateListener.java
@@ -22,9 +22,8 @@ public class VMStateListener implements StateListener= vmCPU)
+ capacityCpu.setUsedCapacity(usedCpu - vmCPU);
+ if (usedMem >= vmMem)
+ capacityMemory.setUsedCapacity(usedMem - vmMem);
+
+ if (moveToReservered) {
+ if (reservedCpu + vmCPU <= totalCpu) {
+ capacityCpu.setReservedCapacity(reservedCpu + vmCPU);
+ }
+ if (reservedMem + vmMem <= totalMem) {
+ capacityMemory.setReservedCapacity(reservedMem + vmMem);
+ }
}
- } else if (oldState == State.Running) {
- if (event == Event.AgentReportStopped) {
- releaseResource(vm, false, true);
+ } else {
+ if (reservedCpu >= vmCPU) {
+ capacityCpu.setReservedCapacity(reservedCpu - vmCPU);
}
- } else if (oldState == State.Migrating) {
- if (event == Event.AgentReportStopped) {
- releaseResource(vm, false, true);
- }
- } else if (oldState == State.Stopping) {
- if (event == Event.AgentReportStopped || event == Event.OperationSucceeded) {
- releaseResource(vm, false, true);
- }
- } else if (oldState == State.Stopped) {
- if (event == Event.DestroyRequested) {
- releaseResource(vm, true, false);
-
- vm.setLastHostId(null);
- _vmDao.update(vm.getId(), vm);
+ if (reservedMem >= vmMem) {
+ capacityMemory.setReservedCapacity(reservedMem - vmMem);
}
}
- return true;
- }
-
- @DB
- private void releaseResource(VMInstanceVO vm, boolean moveFromReserved, boolean moveToReservered) {
- CapacityVO capacityCpu = _capacityDao.findByHostIdType(vm.getHostId(), CapacityVO.CAPACITY_TYPE_CPU);
- CapacityVO capacityMemory = _capacityDao.findByHostIdType(vm.getHostId(), CapacityVO.CAPACITY_TYPE_MEMORY);
-
- ServiceOfferingVO offeringVO = _offeringDao.findById(vm.getServiceOfferingId());
- int cpu = offeringVO.getCpu();
- int speed = offeringVO.getSpeed();
- int vmCPU = cpu * speed;
- int vmMem = offeringVO.getRamSize();
-
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- try {
- capacityCpu = _capacityDao.lockRow(capacityCpu.getId(), true);
- capacityMemory = _capacityDao.lockRow(capacityMemory.getId(), true);
- long usedCpu = capacityCpu.getUsedCapacity();
- long usedMem = capacityMemory.getUsedCapacity();
- long reservedCpu = capacityCpu.getReservedCapacity();
- long reservedMem = capacityMemory.getReservedCapacity();
- long totalCpu = capacityCpu.getTotalCapacity();
- long totalMem = capacityMemory.getTotalCapacity();
+ _capacityDao.update(capacityCpu.getId(), capacityCpu);
+ _capacityDao.update(capacityMemory.getId(), capacityMemory);
- if (!moveFromReserved) {
- /*move resource from used*/
- if (usedCpu >= vmCPU)
- capacityCpu.setUsedCapacity(usedCpu - vmCPU);
- if (usedMem >= vmMem)
- capacityMemory.setUsedCapacity(usedMem - vmMem);
-
- if (moveToReservered) {
- if (reservedCpu + vmCPU <= totalCpu) {
- capacityCpu.setReservedCapacity(reservedCpu + vmCPU);
- }
- if (reservedMem + vmMem <= totalMem) {
- capacityMemory.setReservedCapacity(reservedMem + vmMem);
- }
- }
- } else {
- if (reservedCpu >= vmCPU) {
- capacityCpu.setReservedCapacity(reservedCpu - vmCPU);
- }
- if (reservedMem >= vmMem) {
- capacityMemory.setReservedCapacity(reservedMem - vmMem);
- }
- }
-
- _capacityDao.update(capacityCpu.getId(), capacityCpu);
- _capacityDao.update(capacityMemory.getId(), capacityMemory);
- txn.commit();
- } catch (Exception e) {
- txn.rollback();
- }
}
}
diff --git a/server/src/com/cloud/vm/VmManager.java b/server/src/com/cloud/vm/VmManager.java
index 69a56ce5803..49e07646f77 100644
--- a/server/src/com/cloud/vm/VmManager.java
+++ b/server/src/com/cloud/vm/VmManager.java
@@ -77,6 +77,6 @@ public interface VmManager extends Manager {
void registerGuru(VirtualMachine.Type type, VirtualMachineGuru guru);
- boolean stateTransitTo(VMInstanceVO vm, Event e);
+ boolean stateTransitTo(VMInstanceVO vm, Event e, Long id);
}
diff --git a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
index 1e4d7a6ce31..e927a8dea49 100644
--- a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@ -295,7 +295,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem
@Override
public boolean updateState(State oldState, Event event,
- State newState, VMInstanceVO vm) {
+ State newState, VMInstanceVO vm, Long hostId) {
if (newState == null) {
if (s_logger.isDebugEnabled()) {
s_logger.debug("There's no way to transition from old state: " + oldState.toString() + " event: " + event.toString());
@@ -312,7 +312,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem
vm.incrUpdated();
UpdateBuilder ub = getUpdateBuilder(vm);
ub.set(vm, "state", newState);
- ub.set(vm, "hostId", vm.getHostId());
+ ub.set(vm, "hostId", hostId);
ub.set(vm, _updateTimeAttr, new Date());
int result = update(vm, sc);
diff --git a/utils/src/com/cloud/utils/fsm/StateDao.java b/utils/src/com/cloud/utils/fsm/StateDao.java
index e88d2ff468b..10b260e39d1 100644
--- a/utils/src/com/cloud/utils/fsm/StateDao.java
+++ b/utils/src/com/cloud/utils/fsm/StateDao.java
@@ -1,5 +1,7 @@
package com.cloud.utils.fsm;
+
public interface StateDao {
- boolean updateState(S currentState, E event, S nextState, V vo);
+ boolean updateState(S currentState, E event, S nextState, V vo, Long id);
+
}
diff --git a/utils/src/com/cloud/utils/fsm/StateListener.java b/utils/src/com/cloud/utils/fsm/StateListener.java
index f5babc0679e..c54bff436b2 100644
--- a/utils/src/com/cloud/utils/fsm/StateListener.java
+++ b/utils/src/com/cloud/utils/fsm/StateListener.java
@@ -1,5 +1,5 @@
package com.cloud.utils.fsm;
public interface StateListener {
- public boolean processStateTransitionEvent(S oldState, E event, S newState, V vo, boolean status);
+ public boolean processStateTransitionEvent(S oldState, E event, S newState, V vo, boolean status, Long id);
}
\ No newline at end of file
diff --git a/utils/src/com/cloud/utils/fsm/StateMachine2.java b/utils/src/com/cloud/utils/fsm/StateMachine2.java
index 5ccadbe71fb..0afa09e7e0a 100644
--- a/utils/src/com/cloud/utils/fsm/StateMachine2.java
+++ b/utils/src/com/cloud/utils/fsm/StateMachine2.java
@@ -97,35 +97,23 @@ public class StateMachine2> {
return entry.prevStates.get(e);
}
- @DB
- public boolean transitTO(V vo, E e) {
+
+ public boolean transitTO(V vo, E e, Long id) {
S currentState = vo.getState();
S nextState = getNextState(currentState, e);
-
+
boolean transitionStatus = true;
if (nextState == null) {
transitionStatus = false;
}
- Transaction txn = Transaction.currentTxn();
- txn.start();
-
- try {
-
- transitionStatus = _instanceDao.updateState(currentState, e, nextState, vo);
-
- for (StateListener listener : _listeners) {
- listener.processStateTransitionEvent(currentState, e, nextState, vo, transitionStatus);
- }
- txn.commit();
-
- } catch (Exception ex) {
- txn.rollback();
+ for (StateListener listener : _listeners) {
+ transitionStatus = listener.processStateTransitionEvent(currentState, e, nextState, vo, transitionStatus, id);
}
return transitionStatus;
}
-
+
public boolean registerListener(StateListener listener) {
return _listeners.add(listener);
}