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

Reply via email to