Updated Branches: refs/heads/vmsync 8b4ec1927 -> ca3d6306f
Add support to track host change Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/ca3d6306 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/ca3d6306 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/ca3d6306 Branch: refs/heads/vmsync Commit: ca3d6306f74655e03c6b903c599bb85062874d53 Parents: 8b4ec19 Author: Kelven Yang <[email protected]> Authored: Wed Apr 24 10:41:47 2013 -0700 Committer: Kelven Yang <[email protected]> Committed: Wed Apr 24 10:41:47 2013 -0700 ---------------------------------------------------------------------- core/src/com/cloud/vm/VMInstanceVO.java | 41 +++++++++------ server/src/com/cloud/vm/dao/VMInstanceDao.java | 4 +- server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java | 33 +++++++++++- server/test/com/cloud/vm/dao/VmDaoTest.java | 12 ++-- setup/db/db/schema-410to420.sql | 3 +- 5 files changed, 67 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca3d6306/core/src/com/cloud/vm/VMInstanceVO.java ---------------------------------------------------------------------- diff --git a/core/src/com/cloud/vm/VMInstanceVO.java b/core/src/com/cloud/vm/VMInstanceVO.java index d945e58..28bc5f0 100644 --- a/core/src/com/cloud/vm/VMInstanceVO.java +++ b/core/src/com/cloud/vm/VMInstanceVO.java @@ -96,17 +96,6 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, Vi @Column(name="last_host_id", updatable=true, nullable=true) protected Long lastHostId; - @Enumerated(value=EnumType.STRING) - @Column(name="power_state", updatable=true) - protected PowerState powerState; - - @Column(name="power_state_update_time", updatable=true, nullable=false) - @Temporal(value=TemporalType.TIMESTAMP) - protected Date powerStateUpdateTime; - - @Column(name="power_state_update_count", updatable=true) - protected int powerStateUpdateCount; - @Column(name="pod_id", updatable=true, nullable=false) protected Long podIdToDeployIn; @@ -155,11 +144,6 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, Vi @Enumerated(value=EnumType.STRING) protected HypervisorType hypervisorType; -/* - @Column(name="tags") - protected String tags; -*/ - @Transient Map<String, String> details; @@ -168,6 +152,23 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, Vi @Column(name="disk_offering_id") protected Long diskOfferingId; + + // + // Power state for VM state sync + // + @Enumerated(value=EnumType.STRING) + @Column(name="power_state", updatable=true) + protected PowerState powerState; + + @Column(name="power_state_update_time", updatable=true, nullable=false) + @Temporal(value=TemporalType.TIMESTAMP) + protected Date powerStateUpdateTime; + + @Column(name="power_state_update_count", updatable=true) + protected int powerStateUpdateCount; + + @Column(name="power_host", updatable=true) + protected Long powerHostId; public VMInstanceVO(long id, long serviceOfferingId, @@ -519,4 +520,12 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, Vi public void setPowerStateUpdateCount(int count) { this.powerStateUpdateCount = count; } + + public Long getPowerHostId() { + return this.powerHostId; + } + + public void setPowerHostId(Long hostId) { + this.powerHostId = hostId; + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca3d6306/server/src/com/cloud/vm/dao/VMInstanceDao.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/dao/VMInstanceDao.java b/server/src/com/cloud/vm/dao/VMInstanceDao.java index 1b47826..2a24126 100644 --- a/server/src/com/cloud/vm/dao/VMInstanceDao.java +++ b/server/src/com/cloud/vm/dao/VMInstanceDao.java @@ -116,5 +116,7 @@ public interface VMInstanceDao extends GenericDao<VMInstanceVO, Long>, StateDao< */ List<String> listDistinctHostNames(long networkId, VirtualMachine.Type... types); - void updatePowerState(long instanceId, VirtualMachine.PowerState powerState); + void updatePowerState(long instanceId, long powerHostId, VirtualMachine.PowerState powerState); + void resetVmPowerStateTracking(long instanceId); + void resetHostPowerStateTracking(long hostId); } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca3d6306/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java ---------------------------------------------------------------------- diff --git a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java index 064ef1c..a3846ca 100644 --- a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -29,6 +29,7 @@ import java.util.Map; import javax.annotation.PostConstruct; import javax.ejb.Local; import javax.inject.Inject; +import javax.persistence.Entity; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -629,14 +630,16 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem } @Override @DB - public void updatePowerState(long instanceId, VirtualMachine.PowerState powerState) { + public void updatePowerState(long instanceId, long powerHostId, VirtualMachine.PowerState powerState) { Transaction txn = Transaction.currentTxn(); txn.start(); VMInstanceVO instance = findById(instanceId); if(instance != null) { - if(instance.getPowerState() != powerState) { + Long savedPowerHostId = instance.getPowerHostId(); + if(instance.getPowerState() != powerState || savedPowerHostId == null || savedPowerHostId.longValue() != powerHostId) { instance.setPowerState(powerState); + instance.setPowerHostId(powerHostId); instance.setPowerStateUpdateCount(1); instance.setPowerStateUpdateTime(DateUtil.currentGMTTime()); @@ -654,4 +657,30 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem txn.commit(); } + + @Override @DB + public void resetVmPowerStateTracking(long instanceId) { + Transaction txn = Transaction.currentTxn(); + txn.start(); + VMInstanceVO instance = findById(instanceId); + if(instance != null) { + instance.setPowerStateUpdateCount(0); + instance.setPowerStateUpdateTime(DateUtil.currentGMTTime()); + update(instanceId, instance); + } + + txn.commit(); + } + + @Override @DB + public void resetHostPowerStateTracking(long hostId) { + SearchCriteria<VMInstanceVO> sc = this.createSearchCriteria(); + sc.addAnd("powerHostId", SearchCriteria.Op.EQ, hostId); + + VMInstanceVO instance = this.createForUpdate(); + instance.setPowerStateUpdateCount(0); + instance.setPowerStateUpdateTime(DateUtil.currentGMTTime()); + + this.update(instance, sc); + } } http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca3d6306/server/test/com/cloud/vm/dao/VmDaoTest.java ---------------------------------------------------------------------- diff --git a/server/test/com/cloud/vm/dao/VmDaoTest.java b/server/test/com/cloud/vm/dao/VmDaoTest.java index 546bba3..f5694a4 100644 --- a/server/test/com/cloud/vm/dao/VmDaoTest.java +++ b/server/test/com/cloud/vm/dao/VmDaoTest.java @@ -79,29 +79,29 @@ public class VmDaoTest extends TestCase { VMInstanceVO instance = instanceDao.findById(1L); Assert.assertTrue(instance.getInstanceName().equals("Dummy")); - instanceDao.updatePowerState(1L, VirtualMachine.PowerState.PowerOn); + instanceDao.updatePowerState(1L, 1L, VirtualMachine.PowerState.PowerOn); instance = instanceDao.findById(1L); Assert.assertTrue(instance.getPowerState() == VirtualMachine.PowerState.PowerOn); Assert.assertTrue(instance.getPowerStateUpdateCount() == 1); - instanceDao.updatePowerState(1L, VirtualMachine.PowerState.PowerOn); + instanceDao.updatePowerState(1L, 1L, VirtualMachine.PowerState.PowerOn); instance = instanceDao.findById(1L); Assert.assertTrue(instance.getPowerState() == VirtualMachine.PowerState.PowerOn); Assert.assertTrue(instance.getPowerStateUpdateCount() == 2); - instanceDao.updatePowerState(1L, VirtualMachine.PowerState.PowerOn); + instanceDao.updatePowerState(1L, 1L, VirtualMachine.PowerState.PowerOn); instance = instanceDao.findById(1L); Assert.assertTrue(instance.getPowerState() == VirtualMachine.PowerState.PowerOn); Assert.assertTrue(instance.getPowerStateUpdateCount() == 3); // after 3 times, the update count should stay at 3 - instanceDao.updatePowerState(1L, VirtualMachine.PowerState.PowerOn); + instanceDao.updatePowerState(1L, 1L, VirtualMachine.PowerState.PowerOn); instance = instanceDao.findById(1L); Assert.assertTrue(instance.getPowerState() == VirtualMachine.PowerState.PowerOn); Assert.assertTrue(instance.getPowerStateUpdateCount() == 3); - // after 3 times, the update count should stay at 3 - instanceDao.updatePowerState(1L, VirtualMachine.PowerState.PowerOff); + // if power state is changed, the update count will be reset + instanceDao.updatePowerState(1L, 1L, VirtualMachine.PowerState.PowerOff); instance = instanceDao.findById(1L); Assert.assertTrue(instance.getPowerState() == VirtualMachine.PowerState.PowerOff); Assert.assertTrue(instance.getPowerStateUpdateCount() == 1); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/ca3d6306/setup/db/db/schema-410to420.sql ---------------------------------------------------------------------- diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index 14583b0..5b03148 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -419,4 +419,5 @@ ALTER TABLE `cloud`.`async_job` ADD COLUMN `job_executing_msid` bigint; ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `power_state` VARCHAR(74) DEFAULT 'PowerUnknown'; ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `power_state_update_time` DATETIME; ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `power_state_update_count` INT DEFAULT 0; - +ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `power_host` BIGINT; +ALTER TABLE `cloud`.`vm_instance` ADD CONSTRAINT `fk_vm_instance__power_host` FOREIGN KEY (`power_host`) REFERENCES `cloud`.`host`(`id`);
