Michael Kublin has uploaded a new change for review.

Change subject: engine: Compare and set instead of updateVdsDynamic in VM 
scenarious
......................................................................

engine: Compare and set instead of updateVdsDynamic in VM scenarious

The following patch should solve a following problems:
1. Deadlock between RunVmCommandBase.decreasePendingVms and 
VdsUpdateRuntimeInfo.AfterRefreshTreatment
   line with code: 
ResourceManager.getInstance().getEventListener().processOnVmPoweringUp(...);
2. Replace get for vds dynamic , update some values, and after that update in 
db by single db update.
   The old way creates a dirty state fot host status field, fix will reduce a 
noise in host life cycle
   scenarios
3. Performance improved: less db access, less locks acquired, no deadlocks

What is not solved (problems which were before and should be solved in next 
patches)
1. Race between VdsManager.OnTimer() and RunVmCommandBase.decreasePendingVms()
2. RunVmDelayer.evaluated can be based on not updated data
3. Interaction of loop over
   ResourceManager.getInstance().getEventListener().processOnVmPoweringUp(...)
   inside VdsUpdateRuntimeInfo.AfterRefreshTreatment with RunVmCommands - it is 
a war for locks, or
   "code of death" for all system during RunVm scenarious

Change-Id: I363afc5c3411b0c13e6d6c9ed5b16004738b6ca7
Signed-off-by: Michael Kublin <mkub...@redhat.com>
---
M backend/manager/dbscripts/vds_sp.sql
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VdsDynamic.java
D 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/UpdateVdsDynamicDataVDSCommandParameters.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDynamicDAO.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDynamicDAODbFacadeImpl.java
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsDynamicDAOTest.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/CreateVmVDSCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/DestroyVmVDSCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/MigrateVDSCommand.java
D 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/UpdateVdsDynamicDataVDSCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java
13 files changed, 143 insertions(+), 171 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/82/13682/1

diff --git a/backend/manager/dbscripts/vds_sp.sql 
b/backend/manager/dbscripts/vds_sp.sql
index 80d1994..84309f0 100644
--- a/backend/manager/dbscripts/vds_sp.sql
+++ b/backend/manager/dbscripts/vds_sp.sql
@@ -908,6 +908,37 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+Create or replace FUNCTION UpdateSmartUpdatePartialVds(
+        v_vds_guid UUID,
+        v_vmCount INTEGER,
+        v_pendingVcpusCount INTEGER,
+        v_pendingVmemSize INTEGER,
+        v_memCommited INTEGER,
+        v_vmsCoresCount INTEGER)
+RETURNS VOID
+   AS $procedure$
+DECLARE
+    sign int;
+BEGIN
+       IF (v_memCommited = 0 ) THEN
+         sign = 0;
+       ELSEIF (v_memCommited > 0) THEN
+         sign = 1;
+       ELSE 
+         sign = -1;
+       END IF;
+         
+    UPDATE vds_dynamic
+    SET
+      vm_count = GREATEST(vm_count + v_vmCount, 0),
+      pending_vcpus_count = GREATEST(pending_vcpus_count + 
v_pendingVcpusCount, 0),
+      pending_vmem_size = GREATEST(pending_vmem_size + v_pendingVmemSize, 0),
+      mem_commited = GREATEST(mem_commited + sign * (abs(v_memCommited) + 
guest_overhead), 0),
+      vms_cores_count = GREATEST(vms_cores_count + v_vmsCoresCount, 0)
+    WHERE vds_id = v_vds_guid;
+END; $procedure$
+LANGUAGE plpgsql;
+
 Create or replace FUNCTION GetVdsByNetworkId(v_network_id UUID) RETURNS SETOF 
vds
    AS $procedure$
 BEGIN
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
index 04a8b34..4f426db 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/RunVmCommandBase.java
@@ -33,7 +33,6 @@
 import org.ovirt.engine.core.common.locks.LockingGroup;
 import org.ovirt.engine.core.common.utils.Pair;
 import 
org.ovirt.engine.core.common.vdscommands.FailedToRunVmVDSCommandParameters;
-import 
org.ovirt.engine.core.common.vdscommands.UpdateVdsDynamicDataVDSCommandParameters;
 import 
org.ovirt.engine.core.common.vdscommands.UpdateVmDynamicDataVDSCommandParameters;
 import org.ovirt.engine.core.common.vdscommands.VDSCommandType;
 import org.ovirt.engine.core.compat.Guid;
@@ -326,50 +325,15 @@
     protected void decreasePendingVms(Guid vdsId) {
         getDecreaseLock(vdsId).lock();
         try {
-            boolean updateDynamic = false;
-            VDS vds = DbFacade.getInstance().getVdsDao().get(vdsId);
-            if (vds == null)
-                return;
-            // VCPU
-            if (vds.getPendingVcpusCount() != null && 
!vds.getPendingVcpusCount().equals(0)) {
-                vds.setPendingVcpusCount(vds.getPendingVcpusCount() - 
getVm().getNumOfCpus());
-                updateDynamic = true;
-            } else if (log.isDebugEnabled()) {
-                log.debugFormat(
-                        "DecreasePendingVms::Decreasing vds {0} pending vcpu 
count failed, its already 0 or null",
-                        vds.getName(), getVm().getName());
-            }
-            // VMEM
-            if (vds.getPendingVmemSize() > 0) {
-                // decrease min memory assigned, because it is already taken 
in account when VM is up
-                updateDynamic = true;
-                if (vds.getPendingVmemSize() >= getVm().getMinAllocatedMem()) {
-                    vds.setPendingVmemSize(vds.getPendingVmemSize() - 
getVm().getMinAllocatedMem());
-                } else {
-                    if (log.isDebugEnabled()) {
-                        log.debugFormat("Pending host {0} vmem {1} is smaller 
than VM min allocated memory {2},Setting pending host vmem to 0.",
-                                vds.getName(),
-                                vds.getPendingVmemSize(),
-                                getVm().getMinAllocatedMem());
-                    }
-                    vds.setPendingVmemSize(0);
-                }
-            } else if (log.isDebugEnabled()) {
-                log.debugFormat(
-                        "DecreasePendingVms::Decreasing vds {0} pending vmem 
size failed, its already 0 or null",
-                        vds.getName(), getVm().getName());
-            }
-            if (updateDynamic) {
-                Backend.getInstance()
-                        .getResourceManager()
-                        .RunVdsCommand(VDSCommandType.UpdateVdsDynamicData,
-                                new 
UpdateVdsDynamicDataVDSCommandParameters(vds.getDynamicData()));
-                if (log.isDebugEnabled()) {
-                    log.debugFormat("DecreasePendingVms::Decreasing vds {0} 
pending vcpu count, now {1}. Vm: {2}",
-                            vds.getName(), vds.getPendingVcpusCount(), 
getVm().getName());
-                    log.debugFormat("DecreasePendingVms::Decreasing vds {0} 
pending vmem size, now {1}. Vm: {2}",
-                            vds.getName(), vds.getPendingVmemSize(), 
getVm().getName());
-                }
+            DbFacade.getInstance()
+                    .getVdsDynamicDao()
+                    .smartUpdatePartialVds(vdsId, 0, -getVm().getNumOfCpus(), 
-getVm().getMinAllocatedMem(), 0, 0);
+
+            if (log.isDebugEnabled()) {
+                log.debugFormat("DecreasePendingVms::Decreasing vds {0} 
pending vcpu count, in {1}. Vm: {2}",
+                        vdsId, getVm().getNumOfCpus(), getVm().getName());
+                log.debugFormat("DecreasePendingVms::Decreasing vds {0} 
pending vmem size, in {1}. Vm: {2}",
+                        vdsId, getVm().getMinAllocatedMem(), 
getVm().getName());
             }
             getDecreseCondition(vdsId).signal();
         } finally {
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VdsDynamic.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VdsDynamic.java
index 78229f4..230e7f0 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VdsDynamic.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VdsDynamic.java
@@ -132,6 +132,9 @@
         pending_vcpus_count = 0;
         pending_vmem_size = 0;
         transparentHugePagesState = VdsTransparentHugePagesState.Never;
+        vm_count =0;
+        vms_cores_count = 0;
+        guest_overhead = 0;
     }
 
     public VdsDynamic(Integer cpu_cores, Integer cpuThreads, String cpu_model, 
Double cpu_speed_mh, String if_total_speed,
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/UpdateVdsDynamicDataVDSCommandParameters.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/UpdateVdsDynamicDataVDSCommandParameters.java
deleted file mode 100644
index b5c3f5f..0000000
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/UpdateVdsDynamicDataVDSCommandParameters.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package org.ovirt.engine.core.common.vdscommands;
-
-import org.ovirt.engine.core.common.businessentities.VdsDynamic;
-
-public class UpdateVdsDynamicDataVDSCommandParameters extends 
VdsIdVDSCommandParametersBase {
-    private VdsDynamic privateVdsDynamic;
-
-    public VdsDynamic getVdsDynamic() {
-        return privateVdsDynamic;
-    }
-
-    private void setVdsDynamic(VdsDynamic value) {
-        privateVdsDynamic = value;
-    }
-
-    public UpdateVdsDynamicDataVDSCommandParameters(VdsDynamic vdsDynamic) {
-        super(vdsDynamic.getId());
-        setVdsDynamic(vdsDynamic);
-    }
-
-    public UpdateVdsDynamicDataVDSCommandParameters() {
-    }
-
-    @Override
-    public String toString() {
-        return String.format("%s, vdsDynamic=%s", super.toString(), 
getVdsDynamic());
-    }
-}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
index 01e8d26..c876a11 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/VDSCommandType.java
@@ -55,7 +55,6 @@
     HSMClearTask("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     HSMRevertTask("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     UpdateVmDynamicData("org.ovirt.engine.core.vdsbroker"),
-    UpdateVdsDynamicData("org.ovirt.engine.core.vdsbroker"),
     CollectVdsNetworkData("org.ovirt.engine.core.vdsbroker.vdsbroker"),
     GetVmsInfo("org.ovirt.engine.core.vdsbroker.irsbroker"),
     HSMGetStorageDomainInfo("org.ovirt.engine.core.vdsbroker.vdsbroker"),
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDynamicDAO.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDynamicDAO.java
index c832746..2b1f3d8 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDynamicDAO.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDynamicDAO.java
@@ -17,4 +17,15 @@
      * @param netConfigDirty - a new value of field
      */
     void updateNetConfigDirty(Guid id, Boolean netConfigDirty);
+
+    /**
+     * The following method will add a provided values to current values in DB
+     * @param id - id of record to be updated
+     * @param vmCount - a new value will be GREATEST(vm_count + vmCount, 0)
+     * @param pendingVcpusCount - a new value will be 
GREATEST(pending_vcpus_count + pendingVcpusCount, 0)
+     * @param pendingVmemSize - a new value will be GREATEST(pending_vmem_size 
+ pendingVmemSize, 0)
+     * @param memCommited - will decrease or increase value of mem_commited by 
ABS(memCommited) + guest_overhead
+     * @param vmsCoresCount - a new value will be GREATEST(vms_cores_count + 
v_vmsCoresCount, 0)
+     */
+    void smartUpdatePartialVds(Guid id, int vmCount, int pendingVcpusCount, 
int pendingVmemSize, int memCommited, int vmsCoresCount);
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDynamicDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDynamicDAODbFacadeImpl.java
index 2b089d9..9b6adde 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDynamicDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsDynamicDAODbFacadeImpl.java
@@ -42,13 +42,11 @@
             entity.setId(Guid.createGuidFromString(rs
                     .getString("vds_id")));
             entity.setvm_active((Integer) rs.getObject("vm_active"));
-            entity.setvm_count((Integer) rs.getObject("vm_count"));
-            entity.setvms_cores_count((Integer) rs
-                    .getObject("vms_cores_count"));
+            entity.setvm_count(rs.getInt("vm_count"));
+            entity.setvms_cores_count(rs.getInt("vms_cores_count"));
             entity.setvm_migrating((Integer) rs.getObject("vm_migrating"));
             entity.setreserved_mem((Integer) rs.getObject("reserved_mem"));
-            entity.setguest_overhead((Integer) rs
-                    .getObject("guest_overhead"));
+            entity.setguest_overhead(rs.getInt("guest_overhead"));
             entity.setsoftware_version(rs.getString("software_version"));
             entity.setversion_name(rs.getString("version_name"));
             entity.setVersion(new RpmVersion(rs.getString("rpm_version")));
@@ -240,4 +238,23 @@
 
         
getCallsHandler().executeModification("UpdateVdsDynamicNetConfigDirty", 
parameterSource);
     }
+
+    @Override
+    public void smartUpdatePartialVds(Guid id,
+            int vmCount,
+            int pendingVcpusCount,
+            int pendingVmemSize,
+            int memCommited,
+            int vmsCoresCount) {
+        MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
+                .addValue("vds_guid", id)
+                .addValue("vmCount", vmCount)
+                .addValue("pendingVcpusCount", pendingVcpusCount)
+                .addValue("pendingVmemSize", pendingVmemSize)
+                .addValue("memCommited", memCommited)
+                .addValue("vmsCoresCount", vmsCoresCount);
+
+        getCallsHandler().executeModification("UpdateSmartUpdatePartialVds", 
parameterSource);
+
+    }
 }
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsDynamicDAOTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsDynamicDAOTest.java
index faca191..4bf343b 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsDynamicDAOTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VdsDynamicDAOTest.java
@@ -106,4 +106,34 @@
         VdsDynamic after = dao.get(existingVds.getId());
         assertEquals(before, after);
     }
+
+    @Test
+    public void testSmartUpdatePartialVds() {
+        int vmCount = 1;
+        int pendingVcpusCount = 5;
+        int pendingVmemSize = 25;
+        int memCommited = 50;
+        int vmsCoresCount = 15;
+        VdsDynamic before = dao.get(existingVds.getId());
+        before.setvm_count(before.getvm_count() + vmCount);
+        before.setpending_vcpus_count(before.getpending_vcpus_count() + 
pendingVcpusCount);
+        before.setpending_vmem_size(before.getpending_vmem_size() + 
pendingVmemSize);
+        before.setmem_commited(before.getmem_commited() + memCommited + 
before.getguest_overhead());
+        before.setvms_cores_count(before.getvms_cores_count() + vmsCoresCount);
+        dao.smartUpdatePartialVds(before.getId(),
+                vmCount,
+                pendingVcpusCount,
+                pendingVmemSize,
+                memCommited,
+                vmsCoresCount);
+        VdsDynamic after = dao.get(existingVds.getId());
+        assertEquals(before, after);
+
+        vmCount = before.getvm_count() + 1;
+        before.setvm_count(0);
+        before.setmem_commited(before.getmem_commited() - memCommited - 
before.getguest_overhead());
+        dao.smartUpdatePartialVds(before.getId(), -vmCount, 0, 0, 
-memCommited, 0);
+        after = dao.get(existingVds.getId());
+        assertEquals(before, after);
+    }
 }
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/CreateVmVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/CreateVmVDSCommand.java
index c412079..9de75dc 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/CreateVmVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/CreateVmVDSCommand.java
@@ -103,17 +103,15 @@
     }
 
     private void HandleVdsInformation() {
-        getVds().setMemCommited(getVds().getMemCommited() + 
getParameters().getVm().getVmMemSizeMb());
-        getVds().setMemCommited(getVds().getMemCommited() + 
getVds().getGuestOverhead());
-        getVds().setVmCount(getVds().getVmCount() + 1);
-        getVds().setVmsCoresCount(getVds().getVmsCoresCount() + 
getParameters().getVm().getNumOfCpus());
-        getVds().setPendingVcpusCount(
-                getVds().getPendingVcpusCount() + 
getParameters().getVm().getNumOfCpus());
-        getVds().setPendingVmemSize(
-                getVds().getPendingVmemSize() + 
getParameters().getVm().getMinAllocatedMem());
-        log.infoFormat("IncreasePendingVms::CreateVmIncreasing vds {0} pending 
vcpu count, now {1}. Vm: {2}", getVds()
-                .getName(), getVds().getPendingVcpusCount(), 
getParameters().getVm().getName());
-        _vdsManager.UpdateDynamicData(getVds().getDynamicData());
+        DbFacade.getInstance()
+                .getVdsDynamicDao()
+                .smartUpdatePartialVds(getVds().getId(),
+                        1,
+                        getParameters().getVm().getNumOfCpus(),
+                        getParameters().getVm().getMinAllocatedMem(),
+                        getParameters().getVm().getVmMemSizeMb(),
+                        getParameters().getVm().getNumOfCpus());
+
     }
 
     private boolean CanExecute() {
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/DestroyVmVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/DestroyVmVDSCommand.java
index fc84f87..3ad2b42 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/DestroyVmVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/DestroyVmVDSCommand.java
@@ -57,10 +57,10 @@
                                 
DbFacade.getInstance().getVmNetworkStatisticsDao().update(stats);
                             }
                         }
-                        getVds().setMemCommited(getVds().getMemCommited() - 
curVm.getVmMemSizeMb());
-                        getVds().setMemCommited(getVds().getMemCommited() - 
getVds().getGuestOverhead());
-                        getVds().setVmsCoresCount(getVds().getVmsCoresCount() 
- curVm.getNumOfCpus());
-                        
_vdsManager.UpdateDynamicData(getVds().getDynamicData());
+                        DbFacade.getInstance()
+                                .getVdsDynamicDao()
+                                .smartUpdatePartialVds(getVdsId(), 0, 0, 0,
+                                        -curVm.getVmMemSizeMb(), 
-curVm.getNumOfCpus());
                         return null;
                     }
                 });
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/MigrateVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/MigrateVDSCommand.java
index 2578b5a..0947dd0 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/MigrateVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/MigrateVDSCommand.java
@@ -1,6 +1,5 @@
 package org.ovirt.engine.core.vdsbroker;
 
-import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.common.businessentities.VMStatus;
 import org.ovirt.engine.core.common.vdscommands.MigrateVDSCommandParameters;
@@ -9,7 +8,6 @@
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.utils.log.Log;
 import org.ovirt.engine.core.utils.log.LogFactory;
-import org.ovirt.engine.core.utils.threadpool.ThreadPoolUtil;
 import org.ovirt.engine.core.utils.transaction.TransactionMethod;
 import org.ovirt.engine.core.utils.transaction.TransactionSupport;
 import org.ovirt.engine.core.vdsbroker.vdsbroker.MigrateBrokerVDSCommand;
@@ -54,7 +52,7 @@
             });
 
             if (retval == VMStatus.MigratingFrom) {
-                updateDestinationVdsThreaded(parameters.getDstVdsId(), vm);
+                updateDestinationVds(parameters.getDstVdsId(), vm);
             }
 
             getVDSReturnValue().setReturnValue(retval);
@@ -63,53 +61,22 @@
         }
     }
 
-    private void updateDestinationVdsThreaded(Guid dstVdsId, final VM vm) {
-        final VdsManager vdsManager = 
ResourceManager.getInstance().GetVdsManager(dstVdsId);
-
-        if (vdsManager != null) {
-            ThreadPoolUtil.execute(new Runnable() {
-                @Override
-                public void run() {
-                    updateDestinationVdsOnTimer(vdsManager, vm);
-                }
-            });
-        }
-    }
-
-    private void updateDestinationVdsOnTimer(final VdsManager vdsManager, 
final VM vm) {
-        synchronized (vdsManager.getLockObj()) {
-            VDS vds = 
DbFacade.getInstance().getVdsDao().get(vdsManager.getVdsId());
-            try {
-                vds.setVmCount(vds.getVmCount() + 1);
-                vds.setPendingVcpusCount(vds.getPendingVcpusCount() + 
vm.getNumOfCpus());
-                vds.setPendingVmemSize(vds.getPendingVmemSize() + 
vm.getMinAllocatedMem());
-                if (log.isDebugEnabled()) {
-                    log.debugFormat(
-                            "IncreasePendingVms::MigrateVm Increasing vds {0} 
pending vcpu count, now {1}, and pending vmem size, now {2}. Vm: {3}",
-                            vds.getName(),
-                            vds.getPendingVcpusCount(),
-                            vds.getPendingVmemSize(),
-                            vm.getName());
-                }
-                vdsManager.UpdateDynamicData(vds.getDynamicData());
-            } catch (RuntimeException ex) {
-                if (vds == null) {
-                    log.fatalFormat(
-                            "VDS::migrate:: Could not update destination vds 
commited memory to db. vds {0} : was not find, error: {1}, {2}",
-                            vdsManager.getVdsId(),
-                            ex.toString(),
-                            ex.getStackTrace()[0]);
-                } else {
-                    log.fatalFormat(
-                            "VDS::migrate:: Could not update destination vds 
commited memory to db. vds {0} : {1}, error: {2}, {3}",
-                            vds.getId(),
-                            vds.getName(),
-                            ex.toString(),
-                            ex.getStackTrace()[0]);
-                }
+    private void updateDestinationVds(final Guid dstVdsId, final VM vm) {
+        TransactionSupport.executeInNewTransaction(new 
TransactionMethod<Void>() {
+            @Override
+            public Void runInTransaction() {
+                DbFacade.getInstance()
+                        .getVdsDynamicDao()
+                        .smartUpdatePartialVds(dstVdsId, 1, vm.getNumOfCpus(), 
vm.getMinAllocatedMem(), 0, 0);
+                return null;
             }
-
-        }
+        });
+        log.debugFormat(
+                "IncreasePendingVms::MigrateVm Increasing vds {0} pending vcpu 
count, in {1}, and pending vmem size, in {2}. Vm: {3}",
+                dstVdsId,
+                vm.getNumOfCpus(),
+                vm.getMinAllocatedMem(),
+                vm.getName());
     }
 
     private static Log log = LogFactory.getLog(MigrateVDSCommand.class);
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/UpdateVdsDynamicDataVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/UpdateVdsDynamicDataVDSCommand.java
deleted file mode 100644
index c6d0da6..0000000
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/UpdateVdsDynamicDataVDSCommand.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.ovirt.engine.core.vdsbroker;
-
-import org.ovirt.engine.core.common.vdscommands.*;
-
-public class UpdateVdsDynamicDataVDSCommand<P extends 
UpdateVdsDynamicDataVDSCommandParameters>
-        extends VdsIdVDSCommandBase<P> {
-    public UpdateVdsDynamicDataVDSCommand(P parameters) {
-        super(parameters);
-    }
-
-    @Override
-    protected void ExecuteVdsIdCommand() {
-        if (_vdsManager != null) {
-            _vdsManager.UpdateDynamicData(getParameters().getVdsDynamic());
-        } else {
-            getVDSReturnValue().setSucceeded(false);
-        }
-    }
-}
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 7f34ae1..ea519dc 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
@@ -112,7 +112,7 @@
     private boolean processHardwareCapsNeeded;
     private boolean refreshedCapabilities = false;
     private static Map<Guid, Long> hostDownTimes = new HashMap<Guid, Long>();
-    private int runningVmsInTransition = 0;
+    private boolean runningVmsInTransition;
 
     private static final Log log = 
LogFactory.getLog(VdsUpdateRunTimeInfo.class);
 
@@ -367,7 +367,8 @@
 
         for (VM vm : _vmDict.values()) {
             if (vm.isRunning() && vm.getStatus() != VMStatus.Up) {
-                runningVmsInTransition++;
+                runningVmsInTransition = true;
+                break;
             }
         }
     }
@@ -1616,13 +1617,11 @@
     }
 
     private void refreshCommitedMemory() {
-        Integer memCommited = _vds.getGuestOverhead() != null ? 0 : null;
+        Integer memCommited = _vds.getGuestOverhead();
         int vmsCoresCount = 0;
         for (VM vm : _vmDict.values()) {
-            if (_vds.getGuestOverhead() != null) {
-                memCommited += vm.getVmMemSizeMb();
-                memCommited += _vds.getGuestOverhead();
-            }
+            memCommited += vm.getVmMemSizeMb();
+            memCommited += _vds.getGuestOverhead();
             vmsCoresCount += vm.getNumOfCpus();
         }
         if (memCommited == null || !memCommited.equals(_vds.getMemCommited())) 
{
@@ -1634,12 +1633,12 @@
             _saveVdsDynamic = true;
         }
 
-        if (_vds.getPendingVcpusCount() != 0 && runningVmsInTransition == 0) {
+        if (_vds.getPendingVcpusCount() != 0 && !runningVmsInTransition) {
             _vds.setPendingVcpusCount(0);
             _saveVdsDynamic = true;
         }
 
-        if (_vds.getPendingVmemSize() != 0 && runningVmsInTransition == 0) {
+        if (_vds.getPendingVmemSize() != 0 && !runningVmsInTransition) {
             // set also vmem size to 0
             _vds.setPendingVmemSize(0);
             _saveVdsDynamic = true;


--
To view, visit http://gerrit.ovirt.org/13682
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I363afc5c3411b0c13e6d6c9ed5b16004738b6ca7
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Michael Kublin <mkub...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to