Liran Zelkha has uploaded a new change for review. Change subject: restapi: Remove dynamic search from VmPool ......................................................................
restapi: Remove dynamic search from VmPool Dynamic search is extremely slow. This patch removes the usage of dynamic search from the VmPool Rest API. Change-Id: Ife6adfdca7d32aee3eba6a7e7da49d718ddee60f Signed-off-by: [email protected] <[email protected]> --- A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmDataByPoolNameQuery.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmPoolDAO.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmPoolDAODbFacadeImpl.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResource.java M packaging/dbscripts/vm_pools_sp.sql 6 files changed, 73 insertions(+), 7 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/66/26066/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmDataByPoolNameQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmDataByPoolNameQuery.java new file mode 100644 index 0000000..4173449 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/GetVmDataByPoolNameQuery.java @@ -0,0 +1,28 @@ +package org.ovirt.engine.core.bll; + +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.queries.NameQueryParameters; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; + + +public class GetVmDataByPoolNameQuery<P extends NameQueryParameters> extends QueriesCommandBase<P> { + + public GetVmDataByPoolNameQuery(P parameters) { + super(parameters); + } + + @Override + protected void executeQueryCommand() { + VM vm = DbFacade.getInstance() + .getVmPoolDao() + .getVmDataFromPoolByPoolName(getParameters().getName(), getUserID(), getParameters().isFiltered()); + + if (vm != null) { + VmHandler.updateVmInitFromDB(vm.getStaticData(), true); + } + + getQueryReturnValue().setReturnValue(vm); + + + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java index 3a42d45..7b9c47a 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java @@ -144,6 +144,7 @@ GetAllVmsAndVmPools(VdcQueryAuthType.User), IsVmPoolWithSameNameExists, GetVmDataByPoolId(VdcQueryAuthType.User), + GetVmDataByPoolName(VdcQueryAuthType.User), // Tags queries GetAllTags, diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmPoolDAO.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmPoolDAO.java index b334bde..f51fbac 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmPoolDAO.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmPoolDAO.java @@ -117,4 +117,16 @@ * @return a single VM from the pool */ VM getVmDataFromPoolByPoolGuid(Guid vmPoolId, Guid userID, boolean isFiltered); + + /** + * Returns a single VM from the vm pool with the specified name, with optional filtering. + * @param vmPoolName + * the vm pool name + * @param userID + * the ID of the user requesting the information + * @param isFiltered + * Whether the results should be filtered according to the user's permissions + * @return a single VM from the pool + */ + VM getVmDataFromPoolByPoolName(String vmPoolNam, Guid userID, boolean isFiltered); } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmPoolDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmPoolDAODbFacadeImpl.java index 524993a..ce86f5d 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmPoolDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmPoolDAODbFacadeImpl.java @@ -213,4 +213,11 @@ .addValue("pool_id", vmPoolId).addValue("user_id", userID).addValue("is_filtered", isFiltered); return getCallsHandler().executeRead("GetVmDataFromPoolByPoolId", VMRowMapper.instance, parameterSource); } + + @Override + public VM getVmDataFromPoolByPoolName(String vmPoolNam, Guid userID, boolean isFiltered) { + MapSqlParameterSource parameterSource = getCustomMapSqlParameterSource() + .addValue("pool_name", vmPoolNam).addValue("user_id", userID).addValue("is_filtered", isFiltered); + return getCallsHandler().executeRead("GetVmDataFromPoolByPoolName", VMRowMapper.instance, parameterSource); + } } diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResource.java index 794ae88..537531c 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendVmPoolsResource.java @@ -13,7 +13,6 @@ import org.ovirt.engine.core.common.action.AddVmPoolWithVmsParameters; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VmPoolParametersBase; -import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.businessentities.VmDynamic; import org.ovirt.engine.core.common.businessentities.VmPoolType; @@ -23,6 +22,7 @@ import org.ovirt.engine.core.common.interfaces.SearchType; import org.ovirt.engine.core.common.queries.GetVmTemplateParameters; import org.ovirt.engine.core.common.queries.IdQueryParameters; +import org.ovirt.engine.core.common.queries.NameQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; @@ -110,7 +110,10 @@ new IdQueryParameters(asGuid(model.getId())), model.getId()); } - return getEntity(VM.class, SearchType.VM, "Vms: pool=" + model.getName()); + return getEntity(VM.class, + VdcQueryType.GetVmDataByPoolName, + new NameQueryParameters(model.getName()), + "Vms: pool=" + model.getName()); } protected VM mapToVM(VmPool model, VmTemplate template) { @@ -135,9 +138,10 @@ } protected String getClusterId(VmPool pool) { - return getEntity(VDSGroup.class, - SearchType.Cluster, - "Cluster: name=" + pool.getCluster().getName()).getId().toString(); + return getEntity(VM.class, + VdcQueryType.GetVdsGroupByName, + new NameQueryParameters(pool.getCluster().getName()), + "Cluster: name=" + pool.getCluster().getName()).getId().toString(); } protected boolean namedTemplate(VmPool pool) { @@ -152,8 +156,9 @@ pool.getTemplate().getId()); } else { return getEntity(VmTemplate.class, - SearchType.VmTemplate, - "Template: name=" + pool.getTemplate().getName()); + VdcQueryType.GetVmTemplate, + new GetVmTemplateParameters(pool.getTemplate().getName()), + "Template: name=" + pool.getTemplate().getName()); } } diff --git a/packaging/dbscripts/vm_pools_sp.sql b/packaging/dbscripts/vm_pools_sp.sql index e70d5f3..70c2c41 100644 --- a/packaging/dbscripts/vm_pools_sp.sql +++ b/packaging/dbscripts/vm_pools_sp.sql @@ -248,3 +248,16 @@ END; $procedure$ LANGUAGE plpgsql; +CREATE OR REPLACE FUNCTION GetVmDataFromPoolByPoolName(v_pool_name VARCHAR(4000), v_user_id uuid, v_is_filtered boolean) + RETURNS SETOF vms STABLE AS $procedure$ +BEGIN + RETURN QUERY SELECT vms.* + FROM vms WHERE vm_pool_name = v_pool_name + AND (NOT v_is_filtered OR EXISTS (SELECT 1 + FROM user_vm_pool_permissions_view + WHERE user_id = v_user_id AND entity_id = v_pool_id)) + -- Limiting results to 1 since we only need a single VM from the pool to retrieve the pool data + LIMIT 1; +END; $procedure$ +LANGUAGE plpgsql; + -- To view, visit http://gerrit.ovirt.org/26066 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ife6adfdca7d32aee3eba6a7e7da49d718ddee60f Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liran Zelkha <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
