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

Reply via email to