Liran Zelkha has uploaded a new change for review. Change subject: core: long query response time while many simultaneously queries are running ......................................................................
core: long query response time while many simultaneously queries are running we found the postgres running this function 'getdiskbydiskid' so many times when the engine started which makes disaster on the sys with 100% CPU utilization Change-Id: I94e20d782bc4e2befaf4338f51551a2855509769 Bug-Url: https://bugzilla.redhat.com/1085408 Signed-off-by: lzel...@redhat.com <lzel...@redhat.com> --- M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskDao.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskDaoDbFacadeImpl.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java M packaging/dbscripts/all_disks_sp.sql 4 files changed, 60 insertions(+), 9 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/86/27586/1 diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskDao.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskDao.java index f1bbb1f..f17d876 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskDao.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskDao.java @@ -1,6 +1,7 @@ package org.ovirt.engine.core.dao; import java.util.List; +import java.util.Map; import org.ovirt.engine.core.common.businessentities.Disk; import org.ovirt.engine.core.compat.Guid; @@ -117,4 +118,12 @@ * @return the list of disks */ List<Disk> getAllForVmPartialData(Guid vmId, boolean onlyPluggedDisks, Guid userID, boolean isFiltered); + + /** + * Get a list of Disks based on their Guids + * @param diskGuids + * The disks to load + * @return A map of the disks + */ + Map<Guid, Disk> getAllDisks(List<Guid> diskGuids) throws Exception; } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskDaoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskDaoDbFacadeImpl.java index d41dc52..2cf6292 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskDaoDbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/DiskDaoDbFacadeImpl.java @@ -1,8 +1,12 @@ package org.ovirt.engine.core.dao; +import java.sql.Array; +import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.ovirt.engine.core.common.businessentities.Disk; import org.ovirt.engine.core.common.businessentities.Disk.DiskStorageType; @@ -166,4 +170,23 @@ return new LunDisk(); } } + + @Override + public Map<Guid, Disk> getAllDisks(List<Guid> diskGuids) throws Exception { + Connection c = jdbcTemplate.getDataSource().getConnection(); + Array diskArray = c.createArrayOf("uuid", diskGuids.toArray()); + + List<Disk> disks = getCallsHandler().executeReadList("GetDisksByDiskIds", + DiskRowMapper.instance, + getCustomMapSqlParameterSource() + .addValue("disk_ids", diskArray)); + + c.close(); + Map<Guid, Disk> diskMap = new HashMap<Guid, Disk>(); + for (Disk disk : disks) { + diskMap.put(disk.getId(), disk); + } + + return diskMap; + } } 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 b923f79..23c3476 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 @@ -1860,17 +1860,26 @@ addVmStatisticsToList(vmToUpdate.getStatisticsData()); updateInterfaceStatistics(vmToUpdate, vmStatistics); + List<Guid> diskGuids = new ArrayList<>(); for (DiskImageDynamic imageDynamic : _runningVms.get(vmToUpdate.getId()).getVmDynamic().getDisks()) { - Disk disk = getDbFacade().getDiskDao().get(imageDynamic.getId()); - // We have disk_id statistics, which is good, but disk_image_dynamic table contains image_id, so we - // update for the AI. - // We also check if the disk is null, as, for external VMs the disk is not in the database - if (disk != null && disk.getDiskStorageType() == DiskStorageType.IMAGE) { - DiskImage diskImage = (DiskImage) disk; - Guid activeImageId = diskImage.getImageId(); - imageDynamic.setId(activeImageId); - _vmDiskImageDynamicToSave.put(activeImageId, imageDynamic); + diskGuids.add(imageDynamic.getId()); + } + try { + Map<Guid, Disk> disks = getDbFacade().getDiskDao().getAllDisks(diskGuids); + for (DiskImageDynamic imageDynamic : _runningVms.get(vmToUpdate.getId()).getVmDynamic().getDisks()) { + Disk disk = disks.get(imageDynamic.getId()); + // We have disk_id statistics, which is good, but disk_image_dynamic table contains image_id, so we + // update for the AI. + // We also check if the disk is null, as, for external VMs the disk is not in the database + if (disk != null && disk.getDiskStorageType() == DiskStorageType.IMAGE) { + DiskImage diskImage = (DiskImage) disk; + Guid activeImageId = diskImage.getImageId(); + imageDynamic.setId(activeImageId); + _vmDiskImageDynamicToSave.put(activeImageId, imageDynamic); + } } + } catch (Exception e) { + log.error("Can't load statistics data", e); } } } diff --git a/packaging/dbscripts/all_disks_sp.sql b/packaging/dbscripts/all_disks_sp.sql index 6130131..32c55e4 100644 --- a/packaging/dbscripts/all_disks_sp.sql +++ b/packaging/dbscripts/all_disks_sp.sql @@ -36,6 +36,16 @@ END; $procedure$ LANGUAGE plpgsql; +Create or replace FUNCTION GetDisksByDiskIds(v_disk_ids UUID[]) +RETURNS SETOF all_disks STABLE +AS $procedure$ +BEGIN + RETURN QUERY + SELECT * + FROM all_disks + WHERE image_group_id = any(v_disk_ids); +END; $procedure$ +LANGUAGE plpgsql; Create or replace FUNCTION GetDisksVmGuid(v_vm_guid UUID, v_only_plugged BOOLEAN, v_user_id UUID, v_is_filtered BOOLEAN) RETURNS SETOF all_disks_including_snapshots STABLE -- To view, visit http://gerrit.ovirt.org/27586 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I94e20d782bc4e2befaf4338f51551a2855509769 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Liran Zelkha <lzel...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches