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

Reply via email to