Martin Sivák has uploaded a new change for review. Change subject: engine: Make NetworkPolicyUnit aware of multiple clusters ......................................................................
engine: Make NetworkPolicyUnit aware of multiple clusters NetworkPolicyUnit operated with assumption that there is just a single cluster and the display network never changes. It cached the resolved displayNetwork based on this assumption. This patch fixes that and adds support for multiple clusters and network changes to the cache structure. Change-Id: I6e85a81fa4a2248750f480e85e63096c118d25cb Bug-Url: https://bugzilla.redhat.com/1098345 Signed-off-by: Martin Sivak <msi...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NetworkPolicyUnit.java 1 file changed, 34 insertions(+), 17 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/90/27990/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 a0e0498..76cc5bf 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,9 +1,5 @@ package org.ovirt.engine.core.bll.scheduling.policyunits; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.scheduling.PolicyUnitImpl; import org.ovirt.engine.core.common.businessentities.Entities; @@ -16,28 +12,38 @@ 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; import org.ovirt.engine.core.dao.network.VmNetworkInterfaceDao; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + public class NetworkPolicyUnit extends PolicyUnitImpl { public NetworkPolicyUnit(PolicyUnit policyUnit) { super(policyUnit); + displayNetworks = new HashMap<>(); } - private boolean displayNetworkInitialized; - private Network displayNetwork; + /* display Network cache maps VdsGroup Guid to Network */ + private Map<Guid, Network> displayNetworks; @Override public List<VDS> filter(List<VDS> hosts, VM vm, Map<String, String> parameters, List<String> messages) { List<VDS> toRemoveHostList = new ArrayList<VDS>(); List<VmNetworkInterface> vmNICs; - List<Network> clusterNetworks; + Set<Network> clusterNetworks; Map<String, Network> networksByName; if (hosts != null && hosts.size() > 0) { - clusterNetworks = getNetworkDAO().getAllForCluster(hosts.get(0).getVdsGroupId()); - networksByName = Entities.entitiesByName(clusterNetworks); + final List<Network> networkList = getNetworkDAO().getAllForCluster(hosts.get(0).getVdsGroupId()); + clusterNetworks = new HashSet<>(networkList); + networksByName = Entities.entitiesByName(networkList); vmNICs = getVmNetworkInterfaceDao().getAllForVm(vm.getId()); } else { return null; @@ -81,7 +87,7 @@ private VdcBllMessages validateRequiredNetworksAvailable(VDS vds, VM vm, List<VmNetworkInterface> vmNICs, - List<Network> clusterNetworks, + Set<Network> clusterNetworks, Map<String, Network> networksByName) { // TODO: retrieve interfaces by cluster final List<VdsNetworkInterface> allInterfacesForVds = getInterfaceDAO().getAllInterfacesForVds(vds.getId()); @@ -136,13 +142,24 @@ private boolean isDisplayNetworkAvailable(VDS host, boolean onlyRequiredNetworks, List<VdsNetworkInterface> allInterfacesForVds, - List<Network> allNetworksInCluster) { + Set<Network> allNetworksInCluster) { if (onlyRequiredNetworks) { return true; } - if (!displayNetworkInitialized) { - resolveClusterDisplayNetwork(host, allNetworksInCluster); + /* Check whether the display Network cache for cluster was initialized + and initialize it if it wasn't. + + Also check if the network still belongs to the cluster and is still + marked as display network - otherwise reinitialize + */ + Guid cluster = host.getVdsGroupId(); + Network displayNetwork = displayNetworks.get(cluster); + if (!displayNetworks.containsKey(cluster) + || displayNetwork == null + || !displayNetwork.getCluster().isDisplay() + || !allNetworksInCluster.contains(displayNetwork)) { + displayNetwork = resolveClusterDisplayNetwork(host, allNetworksInCluster); } if (displayNetwork == null) { @@ -159,16 +176,16 @@ return false; } - private void resolveClusterDisplayNetwork(VDS host, List<Network> allNetworksInCluster) { + private Network resolveClusterDisplayNetwork(VDS host, Set<Network> allNetworksInCluster) { // Find the cluster's display network for (Network tempNetwork : allNetworksInCluster) { if (tempNetwork.getCluster().isDisplay()) { - displayNetwork = tempNetwork; - break; + displayNetworks.put(host.getVdsGroupId(), tempNetwork); + return tempNetwork; } } - displayNetworkInitialized = true; + return null; } private VmNetworkInterfaceDao getVmNetworkInterfaceDao() { -- To view, visit http://gerrit.ovirt.org/27990 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I6e85a81fa4a2248750f480e85e63096c118d25cb Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.3 Gerrit-Owner: Martin Sivák <msi...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches