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
