diff --git a/core/src/com/cloud/vm/VMInstanceVO.java b/core/src/com/cloud/vm/VMInstanceVO.java index 31fe898b9d1..5f6ae97ed50 100644 --- a/core/src/com/cloud/vm/VMInstanceVO.java +++ b/core/src/com/cloud/vm/VMInstanceVO.java @@ -303,6 +303,10 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject items = _haDao.findPreviousHA(vm.getId()); int maxRetries = 0; + boolean NeedToAddNew = true; for (final HaWorkVO item : items) { if (maxRetries < item.getTimesTried() && !item.canScheduleNew(_timeBetweenFailures)) { maxRetries = item.getTimesTried(); @@ -306,15 +307,23 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager, Clu } } - final HaWorkVO work = new HaWorkVO(vm.getId(), vm.getType(), WorkType.HA, investigate ? Step.Investigating : Step.Scheduled, hostId, vm.getState(), - maxRetries + 1, vm.getUpdated()); - _haDao.persist(work); - + for (final HaWorkVO item : items) { + if (!(item.getStep() == Step.Error || item.getStep() == Step.Done || item.getStep() == Step.Cancelled)) { + NeedToAddNew = false; + } + } + if (NeedToAddNew) { + final HaWorkVO work = new HaWorkVO(vm.getId(), vm.getType(), WorkType.HA, investigate ? Step.Investigating : Step.Scheduled, hostId, vm.getState(), + maxRetries + 1, vm.getUpdated()); + _haDao.persist(work); + } + if (s_logger.isInfoEnabled()) { s_logger.info("Schedule vm for HA: " + vm.toString()); } wakeupWorkers(); + } protected Long restart(final HaWorkVO work) { diff --git a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java index aeb01837200..14bc7af2b94 100644 --- a/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/server/src/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -250,8 +250,10 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem } return false; } + VMInstanceVO vmi = (VMInstanceVO)vm; - + Long oldHostId = vmi.getHostId(); + SearchCriteria sc = StateChangeSearch.create(); sc.setParameters("id", vmi.getId()); sc.setParameters("states", oldState); @@ -260,12 +262,18 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem vmi.incrUpdated(); UpdateBuilder ub = getUpdateBuilder(vmi); + ub.set(vmi, "state", newState); ub.set(vmi, "hostId", hostId); ub.set(vmi, _updateTimeAttr, new Date()); int result = update(vmi, sc); if (result == 0 && s_logger.isDebugEnabled()) { + /*update builder will change the state/hostid/updated, even update is failed*/ + vmi.setState(oldState); + vmi.setHostId(oldHostId); + vmi.decrUpdated(); + VMInstanceVO vo = findById(vm.getId()); StringBuilder str = new StringBuilder("Unable to update ").append(vo.toString()); str.append(": DB Data={Host=").append(vo.getHostId()).append("; State=").append(vo.getState().toString()).append("; updated=").append(vo.getUpdated());