From 8b9fc424d503897f606f767223197a3930ae609b Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 14 Apr 2011 16:52:16 -0400 Subject: [PATCH] bug 8532,8755: don't create multiple HA work if there already has one of HAwork of this VM is created, but not finished status 8532: resolved fixed status 8755: resolved fixed --- core/src/com/cloud/vm/VMInstanceVO.java | 4 ++++ .../com/cloud/capacity/CapacityManagerImpl.java | 6 ++++-- .../cloud/ha/HighAvailabilityManagerImpl.java | 17 +++++++++++++---- .../src/com/cloud/vm/dao/VMInstanceDaoImpl.java | 10 +++++++++- 4 files changed, 30 insertions(+), 7 deletions(-) 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());