Martin Sivák has uploaded a new change for review. Change subject: core: Clean pending memory and CPUs only during init ......................................................................
core: Clean pending memory and CPUs only during init When the engine tries to start a VM, we leave pending memory and CPU information in the database. This information is removed when the VDSM reports the VM as fully Up. However when the engine crashes without telling VDSM, the info needs to be removed as no VM was actually started. We dealt with this in VdsUpdateRuntimeInfo so far, but that caused a race condition: We removed the pending data because the engine did not manage to send the VM start event to VDSM before the next VDSM update. This patch moves the cleanup to the engine startup routines to make sure it gets applied only in cases of real engine crashes. Change-Id: I84c2ba29368c0b6bc400087512d7b3a68c5c8f5c Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1008146 Signed-off-by: Martin Sivak <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java 3 files changed, 30 insertions(+), 21 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/72/20172/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java index 4f72cfa..6a1eb95 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java @@ -210,8 +210,8 @@ 1, vm.getNumOfCpus(), vm.getMinAllocatedMem(), - vm.getVmMemSizeMb(), - vm.getNumOfCpus()); + 0, + 0); } return bestHost; } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java index b35ce48..df2ec4f 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java @@ -69,6 +69,9 @@ } } + // Is there any VM that is not fully Up or fully Down? + boolean runningVmsInTransition = false; + // Cleanup all vms dynamic data. This is defensive code on power crash List<VM> vms = DbFacade.getInstance().getVmDao().getAll(); for (VM vm : vms) { @@ -83,7 +86,32 @@ SetVmUnknown(vm); } } + + if (vm.isRunning() && vm.getStatus() != VMStatus.Up) { + runningVmsInTransition = true; + } } + + // Clean pending memory and CPUs if there is no VM in transition on a given Host + // (meaning we tried to start a VM and the engine crashed before telling VDSM about it) + for (VDS _vds : allVdsList) { + boolean _saveVdsDynamic = false; + + if (_vds.getPendingVcpusCount() != 0 && !runningVmsInTransition) { + _vds.setPendingVcpusCount(0); + _saveVdsDynamic = true; + } + + if (_vds.getPendingVmemSize() != 0 && !runningVmsInTransition) { + _vds.setPendingVmemSize(0); + _saveVdsDynamic = true; + } + + if (_saveVdsDynamic) { + DbFacade.getInstance().getVdsDynamicDao().update(_vds.getDynamicData()); + } + } + // Populate the VDS dictionary for (VDS curVds : allVdsList) { AddVds(curVds, true); diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java index 2b64237..8a16d83 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java @@ -117,7 +117,6 @@ private boolean processHardwareCapsNeeded; private boolean refreshedCapabilities = false; private static Map<Guid, Long> hostDownTimes = new HashMap<Guid, Long>(); - private boolean runningVmsInTransition; private static final Log log = LogFactory.getLog(VdsUpdateRunTimeInfo.class); @@ -329,13 +328,6 @@ _firstStatus = _vds.getStatus(); this.monitoringStrategy = monitoringStrategy; _vmDict = getDbFacade().getVmDao().getAllRunningByVds(_vds.getId()); - - for (VM vm : _vmDict.values()) { - if (vm.isRunning() && vm.getStatus() != VMStatus.Up) { - runningVmsInTransition = true; - break; - } - } } public void Refresh() { @@ -1839,17 +1831,6 @@ } if (_vds.getVmsCoresCount() == null || !_vds.getVmsCoresCount().equals(vmsCoresCount)) { _vds.setVmsCoresCount(vmsCoresCount); - _saveVdsDynamic = true; - } - - if (_vds.getPendingVcpusCount() != 0 && !runningVmsInTransition) { - _vds.setPendingVcpusCount(0); - _saveVdsDynamic = true; - } - - if (_vds.getPendingVmemSize() != 0 && !runningVmsInTransition) { - // set also vmem size to 0 - _vds.setPendingVmemSize(0); _saveVdsDynamic = true; } } -- To view, visit http://gerrit.ovirt.org/20172 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I84c2ba29368c0b6bc400087512d7b3a68c5c8f5c Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Martin Sivák <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
