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
