Arik Hadas has uploaded a new change for review.

Change subject: core: start 'prestarted VMs' immediately after update
......................................................................

core: start 'prestarted VMs' immediately after update

This patch solves a bug in which after increasing the number of
prestarted VMs of a pool, it takes a while (which is defined by the
configuration value "VmPoolMonitorIntervalInMinutes") to start
more VMs to meet the updated number of prestarted VMs.

The solution is to trigger the pool monitoring job to run immediately,
after UpdateVmPoolWithVmsCommand updates the new properties of the
pool.

Change-Id: I636f496b241c042962cfec10880fbee00ce2bab4
Bug-Url: https://bugzilla.redhat.com/888396
Signed-off-by: Arik Hadas <[email protected]>
---
M backend/manager/dbscripts/vms_sp.sql
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmPoolWithVmsCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/interfaces/BackendInternal.java
M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAO.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAODbFacadeImpl.java
7 files changed, 66 insertions(+), 13 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/37/11637/1

diff --git a/backend/manager/dbscripts/vms_sp.sql 
b/backend/manager/dbscripts/vms_sp.sql
index 0c89ada..8a07cba 100644
--- a/backend/manager/dbscripts/vms_sp.sql
+++ b/backend/manager/dbscripts/vms_sp.sql
@@ -1095,4 +1095,12 @@
 
 
 
+Create or replace FUNCTION GetVmsByVmPoolId(v_vm_pool_id UUID) RETURNS SETOF 
vms
+   AS $procedure$
+BEGIN
+      RETURN QUERY SELECT vms.*
+      FROM vms
+      WHERE vm_pool_id = v_vm_pool_id;
+END; $procedure$
+LANGUAGE plpgsql;
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
index 10ef8a8..d6ae590 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java
@@ -85,6 +85,7 @@
     private ErrorTranslator _vdsErrorsTranslator;
     private DateTime _startedAt;
     private static boolean firstInitialization = true;
+    private String poolMonitoringJobId;
 
     public static BackendInternal getInstance() {
         return EjbUtils.findBean(BeanType.BACKEND, BeanProxyType.LOCAL);
@@ -212,10 +213,11 @@
         _startedAt = DateTime.getNow();
 
         int vmPoolMonitorIntervalInMinutes = Config.<Integer> 
GetValue(ConfigValues.VmPoolMonitorIntervalInMinutes);
-        SchedulerUtilQuartzImpl.getInstance().scheduleAFixedDelayJob(new 
VmPoolMonitor(),
-                "managePrestartedVmsInAllVmPools", new Class[] {}, new 
Object[] {},
-                vmPoolMonitorIntervalInMinutes,
-                vmPoolMonitorIntervalInMinutes, TimeUnit.MINUTES);
+        poolMonitoringJobId =
+                
SchedulerUtilQuartzImpl.getInstance().scheduleAFixedDelayJob(new 
VmPoolMonitor(),
+                        "managePrestartedVmsInAllVmPools", new Class[] {}, new 
Object[] {},
+                        vmPoolMonitorIntervalInMinutes,
+                        vmPoolMonitorIntervalInMinutes, TimeUnit.MINUTES);
 
         int quotaCacheIntervalInMinutes = Config.<Integer> 
GetValue(ConfigValues.QuotaCacheIntervalInMinutes);
         
SchedulerUtilQuartzImpl.getInstance().scheduleAFixedDelayJob(QuotaManager.getInstance(),
@@ -581,5 +583,10 @@
         return CommandsFactory.CreateQueryCommand(actionType, parameters);
     }
 
+    @Override
+    public void triggerPoolMonitoringJob() {
+        SchedulerUtilQuartzImpl.getInstance().triggerJob(poolMonitoringJobId);
+    }
+
     private static final Log log = LogFactory.getLog(Backend.class);
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmPoolWithVmsCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmPoolWithVmsCommand.java
index 5603ae1..ac6779f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmPoolWithVmsCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmPoolWithVmsCommand.java
@@ -54,4 +54,10 @@
         return getAddVmsSucceded() ? AuditLogType.USER_UPDATE_VM_POOL_WITH_VMS
                 : AuditLogType.USER_UPDATE_VM_POOL_WITH_VMS_FAILED;
     }
+
+    @Override
+    protected void executeCommand() {
+        super.executeCommand();
+        Backend.getInstance().triggerPoolMonitoringJob();
+    }
 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
index a0a24dc..cc8f552 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmPoolCommandBase.java
@@ -111,17 +111,27 @@
     }
 
     protected static int getNumOfPrestartedVmsInPool(NGuid poolId) {
-        List<VmPoolMap> vmPoolMaps = DbFacade.getInstance().getVmPoolDao()
-                .getVmMapsInVmPoolByVmPoolIdAndStatus(poolId, VMStatus.Up);
-        int prestartedVmsInPool = 0;
-        if (vmPoolMaps != null) {
-            for (VmPoolMap map : vmPoolMaps) {
-                if (canAttachPrestartedVmToUser(map.getvm_guid())) {
-                    prestartedVmsInPool++;
-                }
+        List<VM> vmsInPool = 
DbFacade.getInstance().getVmDao().getAllForVmPool(poolId);
+        int numOfPrestartedVmsInPool = 0;
+        if (vmsInPool != null) {
+            for (VM vm : vmsInPool) {
+                if (isPrestartedVm(vm))
+                    ++numOfPrestartedVmsInPool;
             }
         }
-        return prestartedVmsInPool;
+        return numOfPrestartedVmsInPool;
+    }
+
+    private static boolean isPrestartedVm(VM vm) {
+        switch(vm.getStatus()) {
+        case Up:
+            return canAttachPrestartedVmToUser(vm.getId());
+        case WaitForLaunch:
+        case PoweringUp:
+            return vmIsRunningStateless(vm.getId());
+        default:
+            return false;
+        }
     }
 
     protected static List<VmPoolMap> getListOfVmsInPool(NGuid poolId) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/interfaces/BackendInternal.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/interfaces/BackendInternal.java
index cf0efd5..efa0938 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/interfaces/BackendInternal.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/interfaces/BackendInternal.java
@@ -56,6 +56,11 @@
     public DateTime getStartedAt();
 
     /**
+     * Execute the pool monitoring job immediately
+     */
+    public void triggerPoolMonitoringJob();
+
+    /**
      * Invokes multiple actions of the same action type with different 
parameters under a given execution context which
      * determines the visibility of the action.<br>
      * The context determines the monitoring of the action:
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAO.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAO.java
index a00f2a9..c45edad 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAO.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAO.java
@@ -5,6 +5,7 @@
 
 import org.ovirt.engine.core.common.businessentities.VM;
 import org.ovirt.engine.core.compat.Guid;
+import org.ovirt.engine.core.compat.NGuid;
 
 /**
  * <code>VmDAO</code> defines a type for performing CRUD operations on 
instances of {@link VM}.
@@ -218,4 +219,12 @@
      * @return
      */
     List<VM> getAllForVdsGroup(Guid vds_group_id);
+
+    /**
+     * Retrieves all VMS that belong to the provided vm pool
+     * @param vm_pool_id
+     *             the pool id
+     * @return
+     */
+    List<VM> getAllForVmPool(NGuid vmPoolId);
 }
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAODbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAODbFacadeImpl.java
index 7b8a6ee..5daa663 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAODbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmDAODbFacadeImpl.java
@@ -258,6 +258,14 @@
                         .addValue("vds_group_id", vds_group_id));
     }
 
+    @Override
+    public List<VM> getAllForVmPool(NGuid vmPoolId) {
+        return getCallsHandler().executeReadList("GetVmsByVmPoolId",
+                VMRowMapper.instance,
+                getCustomMapSqlParameterSource()
+                .addValue("vm_pool_id", vmPoolId));
+    }
+
     static final class VMRowMapper implements ParameterizedRowMapper<VM> {
         public static final VMRowMapper instance = new VMRowMapper();
 


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I636f496b241c042962cfec10880fbee00ce2bab4
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Arik Hadas <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to