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