Roy Golan has uploaded a new change for review.

Change subject: core: introduce Numa Placement entity
......................................................................

core: introduce Numa Placement entity

Change-Id: Ib2ebd8f8e8aa87d92f9b01d70639940b0754bc96
Signed-off-by: Roy Golan <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/AbstractVmNumaNodeCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/AddVmNumaNodesCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/UpdateVmNumaNodesCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MemoryPolicyUnit.java
A 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/NumaPlacement.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmNumaNode.java
7 files changed, 100 insertions(+), 31 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/47/38047/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
index 3b21c03..c3479e8 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VmHandler.java
@@ -865,7 +865,12 @@
         }
 
         // check single node pinned
-        if (vmNumaNodes != null && vmNumaNodes.size() == 1) {
+        if (vmNumaNodes != null && vmNumaNodes.size() == 1
+                && vmNumaNodes.get(0).getNumaPlacements().size() == 1
+                && 
vmNumaNodes.get(0).getNumaPlacements().iterator().next().isPinned()) {
+            return ValidationResult.VALID;
+        }
+            if
             List<Pair<Guid, Pair<Boolean, Integer>>> vdsNumaNodeList = 
vmNumaNodes.get(0).getVdsNumaNodeList();
             boolean pinnedToSingleNode = vdsNumaNodeList != null
                     && vdsNumaNodeList.size() == 1
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/AbstractVmNumaNodeCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/AbstractVmNumaNodeCommand.java
index 23484b4..5c09b37 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/AbstractVmNumaNodeCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/AbstractVmNumaNodeCommand.java
@@ -7,6 +7,7 @@
 import org.ovirt.engine.core.bll.VmHandler;
 import org.ovirt.engine.core.common.action.VmNumaNodeOperationParameters;
 import org.ovirt.engine.core.common.businessentities.MigrationSupport;
+import org.ovirt.engine.core.common.businessentities.NumaPlacement;
 import org.ovirt.engine.core.common.businessentities.NumaTuneMode;
 import org.ovirt.engine.core.common.businessentities.VdsNumaNode;
 import org.ovirt.engine.core.common.businessentities.VmNumaNode;
@@ -85,12 +86,8 @@
 
         boolean memStrict = getNumaTuneMode() == NumaTuneMode.STRICT;
         for (VmNumaNode vmNumaNode : vmNumaNodes) {
-            for (Pair<Guid, Pair<Boolean, Integer>> pair : 
vmNumaNode.getVdsNumaNodeList()) {
-                if (pair.getSecond() == null || pair.getSecond().getSecond() 
== null) {
-                    return 
failCanDoAction(VdcBllMessages.VM_NUMA_NODE_PINNED_INDEX_ERROR);
-                }
-
-                Integer index = pair.getSecond().getSecond();
+            for (NumaPlacement placement : vmNumaNode.getNumaPlacements()) {
+                int index = placement.getIndex();
                 for (VdsNumaNode vdsNumaNode : hostNumaNodes) {
                     if (vdsNumaNode.getIndex() == index) {
                         if (memStrict && vmNumaNode.getMemTotal() > 
vdsNumaNode.getMemTotal()) {
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/AddVmNumaNodesCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/AddVmNumaNodesCommand.java
index 80fb6f5..cd0aadf 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/AddVmNumaNodesCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/AddVmNumaNodesCommand.java
@@ -7,6 +7,7 @@
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.VmNumaNodeOperationParameters;
+import org.ovirt.engine.core.common.businessentities.NumaPlacement;
 import org.ovirt.engine.core.common.businessentities.VdsNumaNode;
 import org.ovirt.engine.core.common.businessentities.VmNumaNode;
 import org.ovirt.engine.core.common.utils.Pair;
@@ -31,16 +32,12 @@
         List<VdsNumaNode> nodes = new ArrayList<>();
         for (VmNumaNode vmNumaNode : vmNumaNodes) {
             vmNumaNode.setId(Guid.newGuid());
-            for (Pair<Guid, Pair<Boolean, Integer>> pair : 
vmNumaNode.getVdsNumaNodeList()) {
-                if (pair.getSecond() != null && pair.getSecond().getSecond() 
!= null) {
-                    int index = pair.getSecond().getSecond();
-                    // if pinned set pNode
-                    if (pair.getSecond().getFirst()) {
-                        for (VdsNumaNode vdsNumaNode : vdsNumaNodes) {
-                            if (vdsNumaNode.getIndex() == index) {
-                                pair.setFirst(vdsNumaNode.getId());
-                                break;
-                            }
+            for (NumaPlacement placement : vmNumaNode.getNumaPlacements()) {
+                if (placement.isPinned()) {
+                    for (VdsNumaNode vdsNumaNode : vdsNumaNodes) {
+                        if (vdsNumaNode.getIndex() == placement.getIndex()) {
+                            placement.setPhysicalNodeId(vdsNumaNode.getId());
+                            break;
                         }
                     }
                 }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/UpdateVmNumaNodesCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/UpdateVmNumaNodesCommand.java
index 0fff78d..7aacd26 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/UpdateVmNumaNodesCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/numa/vm/UpdateVmNumaNodesCommand.java
@@ -7,6 +7,7 @@
 import org.ovirt.engine.core.common.AuditLogType;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.VmNumaNodeOperationParameters;
+import org.ovirt.engine.core.common.businessentities.NumaPlacement;
 import org.ovirt.engine.core.common.businessentities.VdsNumaNode;
 import org.ovirt.engine.core.common.businessentities.VmNumaNode;
 import org.ovirt.engine.core.common.utils.Pair;
@@ -29,12 +30,11 @@
 
         List<VdsNumaNode> nodes = new ArrayList<>();
         for (VmNumaNode vmNumaNode : vmNumaNodes) {
-            for (Pair<Guid, Pair<Boolean, Integer>> pair : 
vmNumaNode.getVdsNumaNodeList()) {
-                if (pair.getSecond() != null && pair.getSecond().getFirst()) {
-                    int index = pair.getSecond().getSecond();
+            for (NumaPlacement placement : vmNumaNode.getNumaPlacements()) {
+                if (placement.isPinned()) {
                     for (VdsNumaNode vdsNumaNode : vdsNumaNodes) {
-                        if (vdsNumaNode.getIndex() == index) {
-                            pair.setFirst(vdsNumaNode.getId());
+                        if (vdsNumaNode.getIndex() == placement.getIndex()) {
+                            placement.setPhysicalNodeId(vdsNumaNode.getId());
                             break;
                         }
                     }
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MemoryPolicyUnit.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MemoryPolicyUnit.java
index 844ef18..f37470f 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MemoryPolicyUnit.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/MemoryPolicyUnit.java
@@ -6,6 +6,7 @@
 import java.util.Map;
 
 import org.ovirt.engine.core.bll.scheduling.PolicyUnitImpl;
+import org.ovirt.engine.core.common.businessentities.NumaPlacement;
 import org.ovirt.engine.core.common.businessentities.NumaTuneMode;
 import org.ovirt.engine.core.common.businessentities.VDS;
 import org.ovirt.engine.core.common.businessentities.VM;
@@ -74,13 +75,10 @@
         }
         Map<Integer, VdsNumaNode> indexMap = toMap(pNodes);
         for (VmNumaNode vNode : nodes) {
-            for (Pair<Guid, Pair<Boolean, Integer>> pair : 
vNode.getVdsNumaNodeList()) {
-                if (pair.getSecond() != null && pair.getSecond().getFirst()) {
-                    if (vNode.getMemTotal() > 
indexMap.get(pair.getSecond().getSecond())
-                            .getNumaNodeStatistics()
-                            .getMemFree()) {
-                        return false;
-                    }
+            for (NumaPlacement placement : vNode.getNumaPlacements()) {
+                if (placement.isPinned() && vNode.getMemTotal() >
+                        
indexMap.get(placement.getIndex()).getNumaNodeStatistics().getMemFree()) {
+                    return false;
                 }
             }
         }
@@ -101,8 +99,8 @@
         }
         // iterate through the nodes, and see if there's at least one pinned 
node.
         for (VmNumaNode vmNumaNode : nodes) {
-            for (Pair<Guid, Pair<Boolean, Integer>> pair : 
vmNumaNode.getVdsNumaNodeList()) {
-                if (pair.getSecond() != null && pair.getSecond().getFirst()) {
+            for (NumaPlacement placement : vmNumaNode.getNumaPlacements()) {
+                if (placement.isPinned()) {
                     return true;
                 }
             }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/NumaPlacement.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/NumaPlacement.java
new file mode 100644
index 0000000..7a43eb1
--- /dev/null
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/NumaPlacement.java
@@ -0,0 +1,62 @@
+package org.ovirt.engine.core.common.businessentities;
+
+import org.ovirt.engine.core.compat.Guid;
+
+/**
+ * A representation of the phisical Numa node, its mode and index. A Virtual 
Node can have
+ * a set of those, depending on the configuration.
+ */
+public class NumaPlacement {
+
+    /**
+     * id of the physical numa node
+     */
+    private Guid physicalNodeId;
+    /**
+     * pinned or non pinned cell
+     */
+    private Mode mode;
+    /**
+     * the index of the related physical node
+     */
+    private int index;
+
+    public NumaPlacement(Guid physicalNodeId, Mode mode, int index) {
+        this.physicalNodeId = physicalNodeId;
+        this.mode = mode;
+        this.index = index;
+    }
+
+    public Guid getPhysicalNodeId() {
+        return physicalNodeId;
+    }
+
+    public void setPhysicalNodeId(Guid pNumaId) {
+        this.physicalNodeId = pNumaId;
+    }
+
+    public Mode getMode() {
+        return mode;
+    }
+
+    public void setMode(Mode mode) {
+        this.mode = mode;
+    }
+
+    public int getIndex() {
+        return index;
+    }
+
+    public void setIndex(int index) {
+        this.index = index;
+    }
+
+    public boolean isPinned() {
+        return getMode() == Mode.PINNED;
+    }
+
+    public enum Mode {
+        PINNED,
+        NON_PINNED
+    }
+}
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmNumaNode.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmNumaNode.java
index 8e89cb4..a7d57c2 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmNumaNode.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmNumaNode.java
@@ -1,7 +1,9 @@
 package org.ovirt.engine.core.common.businessentities;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.ovirt.engine.core.common.utils.Pair;
 import org.ovirt.engine.core.compat.Guid;
@@ -18,6 +20,7 @@
 
     public VmNumaNode() {
         setVdsNumaNodeList(new ArrayList<Pair<Guid, Pair<Boolean, 
Integer>>>());
+        numaPlacements = new HashSet<>();
     }
 
     /**
@@ -28,6 +31,13 @@
         return vdsNumaNodeList;
     }
 
+    private Set<NumaPlacement> numaPlacements;
+
+    public Set<NumaPlacement> getNumaPlacements() {
+        return numaPlacements;
+    }
+
+
     public void setVdsNumaNodeList(List<Pair<Guid, Pair<Boolean, Integer>>> 
vdsNumaNodeList) {
         this.vdsNumaNodeList = vdsNumaNodeList;
     }


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib2ebd8f8e8aa87d92f9b01d70639940b0754bc96
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Roy Golan <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to