Gilad Chaplik has uploaded a new change for review.

Change subject: core: scheduling: increase NetworkPolicyUnit performance
......................................................................

core: scheduling: increase NetworkPolicyUnit performance

Fetch for all cluster's hosts' NICs instead of fetching
NICS for each host.

Change-Id: I1b394b5d50abcbf58c63cb2d2af3867197ddb788
Signed-off-by: Gilad Chaplik <gchap...@redhat.com>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java
M 
backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java
M 
backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/InterfaceDaoTest.java
M packaging/dbscripts/create_views.sql
M packaging/dbscripts/network_sp.sql
6 files changed, 70 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/63/22463/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java
index cac521a..2ff4800 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.core.bll.scheduling.policyunits;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -16,6 +17,7 @@
 import org.ovirt.engine.core.common.config.ConfigValues;
 import org.ovirt.engine.core.common.errors.VdcBllMessages;
 import org.ovirt.engine.core.common.scheduling.PolicyUnit;
+import org.ovirt.engine.core.compat.Guid;
 import org.ovirt.engine.core.dal.dbbroker.DbFacade;
 import org.ovirt.engine.core.dao.network.InterfaceDao;
 import org.ovirt.engine.core.dao.network.NetworkDao;
@@ -42,9 +44,16 @@
         } else {
             return null;
         }
+        Map<Guid, List<VdsNetworkInterface>> allInterfacesForVdsMap =
+                getAllInterfacesForVdsGroupMap(hosts.get(0).getVdsGroupId());
         for (VDS host : hosts) {
             VdcBllMessages returnValue =
-                    validateRequiredNetworksAvailable(host, vm, vmNICs, 
clusterNetworks, networksByName);
+                    validateRequiredNetworksAvailable(host,
+                            vm,
+                            vmNICs,
+                            clusterNetworks,
+                            networksByName,
+                            allInterfacesForVdsMap.get(host.getId()));
             if (VdcBllMessages.ACTION_TYPE_FAILED_VDS_VM_NETWORKS == 
returnValue) {
                 StringBuilder sbBuilder = new StringBuilder();
                 
sbBuilder.append(Entities.vmInterfacesByNetworkName(vmNICs).keySet());
@@ -61,6 +70,28 @@
         }
         hosts.removeAll(toRemoveHostList);
         return hosts;
+    }
+
+    /**
+     * Fetches all host interfaces per cluster, and generates a map
+     * containing interfaces per host.
+     *
+     * @param vdsGroupId
+     * @return
+     *          map key = hostId, value = list of host's interfaces
+     */
+    private Map<Guid, List<VdsNetworkInterface>> 
getAllInterfacesForVdsGroupMap(Guid vdsGroupId) {
+        Map<Guid, List<VdsNetworkInterface>> map = new HashMap<Guid, 
List<VdsNetworkInterface>>();
+        List<VdsNetworkInterface> allInterfacesForVdsGroup =
+                getInterfaceDAO().getAllInterfacesForVdsGroup(vdsGroupId);
+        for (VdsNetworkInterface vdsNetworkInterface : 
allInterfacesForVdsGroup) {
+            Guid vdsId = vdsNetworkInterface.getVdsId();
+            if (map.get(vdsId) == null) {
+                map.put(vdsId, new ArrayList<VdsNetworkInterface>());
+            }
+            map.get(vdsId).add(vdsNetworkInterface);
+        }
+        return map;
     }
 
     /**
@@ -82,9 +113,8 @@
             VM vm,
             List<VmNetworkInterface> vmNICs,
             List<Network> clusterNetworks,
-            Map<String, Network> networksByName) {
-        // TODO: retrieve interfaces by cluster
-        final List<VdsNetworkInterface> allInterfacesForVds = 
getInterfaceDAO().getAllInterfacesForVds(vds.getId());
+            Map<String, Network> networksByName,
+            List<VdsNetworkInterface> allInterfacesForVds) {
 
         boolean onlyRequiredNetworks =
                 Config.<Boolean> 
getValue(ConfigValues.OnlyRequiredNetworksMandatoryForVdsSelection);
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java
index 03b72a8..4c920dc 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDao.java
@@ -69,6 +69,15 @@
     List<VdsNetworkInterface> getAllInterfacesForVds(Guid id);
 
     /**
+     * Retrieves all interfaces for the given Cluster id.
+     *
+     * @param id
+     *            the cluster id
+     * @return the list of interfaces
+     */
+    List<VdsNetworkInterface> getAllInterfacesForVdsGroup(Guid vdsGroupId);
+
+    /**
      * Retrieves all interfaces for the given VDS id with optional filtering.
      *
      * @param id
diff --git 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java
 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java
index f7b92cf..a9d72fb 100644
--- 
a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java
+++ 
b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/network/InterfaceDaoDbFacadeImpl.java
@@ -168,6 +168,16 @@
     }
 
     @Override
+    public List<VdsNetworkInterface> getAllInterfacesForVdsGroup(Guid 
vdsGroupId) {
+        MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
+                .addValue("vds_group_id", vdsGroupId);
+
+        return 
getCallsHandler().executeReadList("Getinterface_viewByVdsGroupId",
+                vdsNetworkInterfaceRowMapper,
+                parameterSource);
+    }
+
+    @Override
     public List<VdsNetworkInterface> getAllInterfacesWithIpAddress(Guid 
clusterId, String ipAddress) {
         MapSqlParameterSource parameterSource = 
getCustomMapSqlParameterSource()
                 .addValue("addr", ipAddress).addValue("cluster_id", clusterId);
diff --git 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/InterfaceDaoTest.java
 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/InterfaceDaoTest.java
index 87b2da0..94017c0 100644
--- 
a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/InterfaceDaoTest.java
+++ 
b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/network/InterfaceDaoTest.java
@@ -316,4 +316,11 @@
         assertEquals(1, interfaces.size());
         assertGetAllForVdsCorrectResult(interfaces);
     }
+
+    @Test
+    public void testGetAllInterfacesByVdsGroupId() {
+        List<VdsNetworkInterface> interfaces = 
dao.getAllInterfacesForVdsGroup(CLUSTER_ID);
+        assertNotNull(interfaces);
+        assertEquals(1, interfaces.size());
+    }
 }
diff --git a/packaging/dbscripts/create_views.sql 
b/packaging/dbscripts/create_views.sql
index ebcc883..67d9fdf 100644
--- a/packaging/dbscripts/create_views.sql
+++ b/packaging/dbscripts/create_views.sql
@@ -867,7 +867,7 @@
       vds_interface.subnet, vds_interface.addr, vds_interface.speed, 
vds_interface.vlan_id, vds_interface.bond_type,
       vds_interface.bond_name, vds_interface.is_bond, vds_interface.bond_opts, 
vds_interface.mac_addr,
       vds_interface.network_name, vds_interface.name, vds_static.vds_id, 
vds_static.vds_name,  vds_interface.id,
-      vds_interface.boot_protocol, vds_interface.mtu as mtu, 
vds_interface.bridged, 1 AS is_vds
+      vds_interface.boot_protocol, vds_interface.mtu as mtu, 
vds_interface.bridged, 1 AS is_vds, vds_static.vds_group_id
   FROM vds_interface_statistics
   JOIN vds_interface ON vds_interface_statistics.id = vds_interface.id
   JOIN vds_static ON vds_interface.vds_id = vds_static.vds_id;
diff --git a/packaging/dbscripts/network_sp.sql 
b/packaging/dbscripts/network_sp.sql
index aadfc46..ddd39e7 100644
--- a/packaging/dbscripts/network_sp.sql
+++ b/packaging/dbscripts/network_sp.sql
@@ -358,6 +358,15 @@
 END; $procedure$
 LANGUAGE plpgsql;
 
+Create or replace FUNCTION Getinterface_viewByVdsGroupId(v_vds_group_id UUID)
+RETURNS SETOF vds_interface_view STABLE
+   AS $procedure$
+BEGIN
+   RETURN QUERY SELECT *
+   FROM vds_interface_view
+   WHERE vds_group_id = v_vds_group_id;
+END; $procedure$
+LANGUAGE plpgsql;
 
 Create or replace FUNCTION Getinterface_viewByAddr(v_cluster_id UUID, v_addr 
VARCHAR(50))
 RETURNS SETOF vds_interface_view STABLE


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1b394b5d50abcbf58c63cb2d2af3867197ddb788
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Gilad Chaplik <gchap...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to