mirror of https://github.com/apache/cloudstack.git
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
This commit is contained in:
parent
dd808e45ab
commit
8b9fc424d5
|
|
@ -303,6 +303,10 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject<State, Vi
|
|||
|
||||
public void incrUpdated() {
|
||||
updated++;
|
||||
}
|
||||
|
||||
public void decrUpdated() {
|
||||
updated--;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -443,11 +443,13 @@ public class CapacityManagerImpl implements CapacityManager , StateListener<Stat
|
|||
|
||||
@Override
|
||||
public boolean postStateTransitionEvent(State oldState, Event event, State newState, VirtualMachine vm, boolean status, Long oldHostId) {
|
||||
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 (!status) {
|
||||
return false;
|
||||
}
|
||||
|
||||
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 (event == Event.OperationFailed) {
|
||||
|
|
|
|||
|
|
@ -299,6 +299,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager, Clu
|
|||
|
||||
final List<HaWorkVO> 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) {
|
||||
|
|
|
|||
|
|
@ -250,8 +250,10 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
VMInstanceVO vmi = (VMInstanceVO)vm;
|
||||
|
||||
Long oldHostId = vmi.getHostId();
|
||||
|
||||
SearchCriteria<VMInstanceVO> sc = StateChangeSearch.create();
|
||||
sc.setParameters("id", vmi.getId());
|
||||
sc.setParameters("states", oldState);
|
||||
|
|
@ -260,12 +262,18 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> 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());
|
||||
|
|
|
|||
Loading…
Reference in New Issue