Xiaolei Shi has uploaded a new change for review. Change subject: core: Collect vm numa node runtime information ......................................................................
core: Collect vm numa node runtime information Collect vm numa node runtime pinning to which host numa nodes data. Change-Id: I9d2c1dd03e0cc2f7d0ed9593e6ff889712894ac7 Bug-Url: https://bugzilla.redhat.com/1100202 Signed-off-by: Bruce Shi <xiao-lei....@hp.com> --- M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmStatistics.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsNumaNodeDAODbFacadeImpl.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmNumaNodeDAO.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmNumaNodeDAODbFacadeImpl.java M backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmNumaNodeDAOTest.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java M packaging/dbscripts/numa_sp.sql 9 files changed, 224 insertions(+), 2 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/96/28096/1 diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmStatistics.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmStatistics.java index f747804..a7bb703 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmStatistics.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmStatistics.java @@ -1,6 +1,7 @@ package org.ovirt.engine.core.common.businessentities; import java.util.ArrayList; +import java.util.List; import org.ovirt.engine.core.common.businessentities.comparators.BusinessEntityGuidComparator; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; @@ -13,6 +14,8 @@ private Double cpu_sysField; // NOT PERSISTED private VmBalloonInfo vmBalloonInfo; + // NOT PERSISTED + private List<VmNumaNode> vNumaNodeStatisticsList; public VmStatistics() { cpu_sysField = 0.0; @@ -20,6 +23,7 @@ elapsed_timeField = 0.0; roundedElapsedTimeField = 0.0; vm_guidField = Guid.Empty; + vNumaNodeStatisticsList = new ArrayList<VmNumaNode>(); } @Override @@ -37,6 +41,7 @@ result = prime * result + ((migrationProgressPercent == null) ? 0 : migrationProgressPercent.hashCode()); result = prime * result + ((disksUsage == null) ? 0 : disksUsage.hashCode()); result = prime * result + ((vm_guidField == null) ? 0 : vm_guidField.hashCode()); + result = prime * result + ((vNumaNodeStatisticsList == null) ? 0 : vNumaNodeStatisticsList.hashCode()); return result; } @@ -62,7 +67,8 @@ && ObjectUtils.objectsEqual(migrationProgressPercent, other.migrationProgressPercent) && ObjectUtils.objectsEqual(usage_network_percentField, other.usage_network_percentField) && ObjectUtils.objectsEqual(disksUsage, other.disksUsage) - && ObjectUtils.objectsEqual(vm_guidField, other.vm_guidField)); + && ObjectUtils.objectsEqual(vm_guidField, other.vm_guidField) + && ObjectUtils.objectsEqual(vNumaNodeStatisticsList, other.vNumaNodeStatisticsList)); } public Double getcpu_sys() { @@ -209,4 +215,12 @@ public void setVmBalloonInfo(VmBalloonInfo vmBalloonInfo) { this.vmBalloonInfo = vmBalloonInfo; } + + public List<VmNumaNode> getvNumaNodeStatisticsList() { + return vNumaNodeStatisticsList; + } + + public void setvNumaNodeStatisticsList(List<VmNumaNode> vNumaNodeStatisticsList) { + this.vNumaNodeStatisticsList = vNumaNodeStatisticsList; + } } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsNumaNodeDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsNumaNodeDAODbFacadeImpl.java index 617a885..bd999ff 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsNumaNodeDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VdsNumaNodeDAODbFacadeImpl.java @@ -153,7 +153,7 @@ .addValue("cpu_core_id", cpuId); } - private MapSqlParameterSource createVnodeToPnodeParametersMapper( + protected MapSqlParameterSource createVnodeToPnodeParametersMapper( Pair<Guid, Pair<Boolean, Integer>> pNode, Guid vNodeId) { return getCustomMapSqlParameterSource() .addValue("id", Guid.newGuid()) diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmNumaNodeDAO.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmNumaNodeDAO.java index 4dffbf9..3505562 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmNumaNodeDAO.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmNumaNodeDAO.java @@ -49,4 +49,13 @@ */ List<Pair<Guid, Integer>> getPinnedNumaNodeIndex(Guid vmId); + /** + * Update vm numa node runtime pinning data of the given list of numa nodes using a more + * efficient method to update all of them at once, rather than each at a time. + * + * @param vmNumaNodes + * the vm numa nodes to be updated + */ + void massUpdateVmNumaNodeRuntimePinning(List<VmNumaNode> vmNumaNodes); + } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmNumaNodeDAODbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmNumaNodeDAODbFacadeImpl.java index cb3d5ee..3b951a7 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmNumaNodeDAODbFacadeImpl.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmNumaNodeDAODbFacadeImpl.java @@ -232,4 +232,18 @@ vNodePinToPnodeRowMapper, parameterSource); } + @Override + public void massUpdateVmNumaNodeRuntimePinning(List<VmNumaNode> vmNumaNodes) { + List<MapSqlParameterSource> vNodeToPnodeDeletions = new ArrayList<>(); + List<MapSqlParameterSource> vNodeToPnodeInsertions = new ArrayList<>(); + for (VmNumaNode node : vmNumaNodes) { + vNodeToPnodeDeletions.add(getCustomMapSqlParameterSource().addValue("vm_numa_node_id", node.getId())); + for (Pair<Guid, Pair<Boolean, Integer>> pair : node.getVdsNumaNodeList()) { + vNodeToPnodeInsertions.add(createVnodeToPnodeParametersMapper(pair, node.getId())); + } + } + getCallsHandler().executeStoredProcAsBatch("DeleteUnpinnedNumaNodeMapByVmNumaNodeId", vNodeToPnodeDeletions); + getCallsHandler().executeStoredProcAsBatch("InsertNumaNodeMap", vNodeToPnodeInsertions); + } + } diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmNumaNodeDAOTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmNumaNodeDAOTest.java index f524604..4256294 100644 --- a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmNumaNodeDAOTest.java +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmNumaNodeDAOTest.java @@ -267,6 +267,88 @@ assertEquals(0, result.size()); } + @Test + public void testMassUpdateVmNumaNodeRuntimePinning() { + List<VmNumaNode> result = vmNumaNodeDao.getAllVmNumaNodeByVmId(ANOTHER_EXISTING_VM_ID); + assertNotNull(result); + assertEquals(0, result.size()); + + Guid vdsNumaNode1 = new Guid("3c2b81e6-5080-4ad1-86a1-cf513b15b515"); + Guid vdsNumaNode2 = new Guid("3c2b81e6-5080-4ad1-86a1-cf513b15b516"); + Guid vmNumaNode1 = Guid.newGuid(); + Guid vmNumaNode2 = Guid.newGuid(); + + List<VdsNumaNode> newVmNode = new ArrayList<>(); + VmNumaNode newVmNumaNode = new VmNumaNode(); + newVmNumaNode.setCpuIds(generateCpuList(0, 4)); + newVmNumaNode.setId(vmNumaNode1); + newVmNumaNode.setIndex(0); + newVmNumaNode.setNumaNodeDistances(generateDistance(2, 0)); + newVmNumaNode.setNumaNodeStatistics(newNodeStatistics); + newVmNumaNode.getVdsNumaNodeList().add(new Pair<>(vdsNumaNode1, new Pair<>(false, 0))); + newVmNode.add(newVmNumaNode); + + newVmNumaNode = new VmNumaNode(); + newVmNumaNode.setCpuIds(generateCpuList(4, 4)); + newVmNumaNode.setId(vmNumaNode2); + newVmNumaNode.setIndex(1); + newVmNumaNode.setNumaNodeDistances(generateDistance(2, 1)); + newVmNumaNode.setNumaNodeStatistics(newNodeStatistics); + newVmNumaNode.getVdsNumaNodeList().add(new Pair<>(vdsNumaNode2, new Pair<>(false, 1))); + newVmNode.add(newVmNumaNode); + + vmNumaNodeDao.massSaveNumaNode(newVmNode, null, ANOTHER_EXISTING_VM_ID); + result = vmNumaNodeDao.getAllVmNumaNodeByVmId(ANOTHER_EXISTING_VM_ID); + assertNotNull(result); + assertEquals(2, result.size()); + + Map<Guid, VmNumaNode> nodes = new HashMap<>(2); + nodes.put(result.get(0).getId(), result.get(0)); + nodes.put(result.get(1).getId(), result.get(1)); + + nodes.get(vmNumaNode1).getVdsNumaNodeList().clear(); + nodes.get(vmNumaNode1).getVdsNumaNodeList().add(new Pair<>(vdsNumaNode2, new Pair<>(false, 1))); + + nodes.get(vmNumaNode2).getVdsNumaNodeList().clear(); + nodes.get(vmNumaNode2).getVdsNumaNodeList().add(new Pair<>(vdsNumaNode1, new Pair<>(false, 0))); + + List<VmNumaNode> updateNodes = new ArrayList<>(); + updateNodes.add(nodes.get(vmNumaNode1)); + updateNodes.add(nodes.get(vmNumaNode2)); + + vmNumaNodeDao.massUpdateVmNumaNodeRuntimePinning(updateNodes); + + result = vmNumaNodeDao.getAllVmNumaNodeByVmId(ANOTHER_EXISTING_VM_ID); + assertNotNull(result); + assertEquals(2, result.size()); + + nodes.clear(); + nodes.put(result.get(0).getId(), result.get(0)); + nodes.put(result.get(1).getId(), result.get(1)); + + assertTrue(nodes.containsKey(vmNumaNode1)); + assertTrue(nodes.containsKey(vmNumaNode2)); + + assertEquals(1, nodes.get(vmNumaNode1).getVdsNumaNodeList().size()); + assertEquals(false, nodes.get(vmNumaNode1).getVdsNumaNodeList().get(0).getSecond().getFirst()); + assertEquals(vdsNumaNode2, nodes.get(vmNumaNode1).getVdsNumaNodeList().get(0).getFirst()); + assertEquals(1, nodes.get(vmNumaNode1).getVdsNumaNodeList().get(0).getSecond().getSecond().intValue()); + + assertEquals(1, nodes.get(vmNumaNode2).getVdsNumaNodeList().size()); + assertEquals(false, nodes.get(vmNumaNode2).getVdsNumaNodeList().get(0).getSecond().getFirst()); + assertEquals(vdsNumaNode1, nodes.get(vmNumaNode2).getVdsNumaNodeList().get(0).getFirst()); + assertEquals(0, nodes.get(vmNumaNode2).getVdsNumaNodeList().get(0).getSecond().getSecond().intValue()); + + List<Guid> vmNodeList = new ArrayList<Guid>(); + vmNodeList.add(vmNumaNode1); + vmNodeList.add(vmNumaNode2); + vmNumaNodeDao.massRemoveNumaNodeByNumaNodeId(vmNodeList); + + result = vmNumaNodeDao.getAllVmNumaNodeByVmId(ANOTHER_EXISTING_VM_ID); + assertNotNull(result); + assertEquals(0, result.size()); + } + private List<Integer> generateCpuList(int fromIndex, int count) { List<Integer> cpuList = new ArrayList<>(count); for (int i = fromIndex; i < (fromIndex + count); i++) { diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java index 5a7f128..5ad3d4a 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/VdsUpdateRunTimeInfo.java @@ -47,6 +47,7 @@ import org.ovirt.engine.core.common.businessentities.VmExitReason; import org.ovirt.engine.core.common.businessentities.VmExitStatus; import org.ovirt.engine.core.common.businessentities.VmGuestAgentInterface; +import org.ovirt.engine.core.common.businessentities.VmNumaNode; import org.ovirt.engine.core.common.businessentities.VmPauseStatus; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.VmStatistics; @@ -75,6 +76,7 @@ import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; import org.ovirt.engine.core.utils.NetworkUtils; +import org.ovirt.engine.core.utils.NumaUtils; import org.ovirt.engine.core.utils.ObjectIdentityChecker; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; @@ -194,7 +196,27 @@ getDbFacade().getLunDao().updateAllInBatch(vmLunDisksToSave); saveVmDevicesToDb(); saveVmGuestAgentNetworkDevices(); + saveVmNumaNodeRuntimeData(); getVdsEventListener().addExternallyManagedVms(_externalVmsToAdd); + } + + private void saveVmNumaNodeRuntimeData() { + if (!_vmStatisticsToSave.isEmpty()) { + final List<VmNumaNode> vmNumaNodesToUpdate = new ArrayList<>(); + for(VmStatistics vmStats : _vmStatisticsToSave.values()) { + vmNumaNodesToUpdate.addAll(vmStats.getvNumaNodeStatisticsList()); + } + if (!vmNumaNodesToUpdate.isEmpty()) { + TransactionSupport.executeInScope(TransactionScopeOption.Required, + new TransactionMethod<Void>() { + @Override + public Void runInTransaction() { + getDbFacade().getVmNumaNodeDAO().massUpdateVmNumaNodeRuntimePinning(vmNumaNodesToUpdate); + return null; + } + }); + } + } } private void saveVmGuestAgentNetworkDevices() { @@ -1960,6 +1982,7 @@ if (_vdsManager.getRefreshStatistics()) { VmStatistics vmStatistics = _runningVms.get(vmToUpdate.getId()).getVmStatistics(); vmToUpdate.updateRunTimeStatisticsData(vmStatistics, vmToUpdate); + updateVmNumaNodeRuntimeInfo(vmStatistics, vmToUpdate); addVmStatisticsToList(vmToUpdate.getStatisticsData()); updateInterfaceStatistics(vmToUpdate, vmStatistics); @@ -1978,6 +2001,44 @@ } } + private void updateVmNumaNodeRuntimeInfo(VmStatistics statistics, VM vm) { + if (vm.getRunOnVds() == null) { + return; + } + List<VdsNumaNode> runOnVdsAllNumaNodes = getDbFacade().getVdsNumaNodeDAO().getAllVdsNumaNodeByVdsId(vm.getRunOnVds()); + List<VmNumaNode> vmAllNumaNodes = getDbFacade().getVmNumaNodeDAO().getAllVmNumaNodeByVmId(vm.getId()); + Map<Integer, VdsNumaNode> runOnVdsAllNumaNodesMap = new HashMap<>(); + Map<Integer, VmNumaNode> vmAllNumaNodesMap = new HashMap<>(); + for (VdsNumaNode vdsNumaNode : runOnVdsAllNumaNodes) { + runOnVdsAllNumaNodesMap.put(vdsNumaNode.getIndex(), vdsNumaNode); + } + for (VmNumaNode vmNumaNode : vmAllNumaNodes) { + vmAllNumaNodesMap.put(vmNumaNode.getIndex(), vmNumaNode); + } + List<VmNumaNode> vmNumaNodesNeedUpdate = new ArrayList<>(); + for (VmNumaNode vNode : statistics.getvNumaNodeStatisticsList()) { + VmNumaNode dbVmNumaNode = vmAllNumaNodesMap.get(vNode.getIndex()); + if (dbVmNumaNode != null) { + vNode.setId(dbVmNumaNode.getId()); + List<Integer> pinnedNodes = NumaUtils.getPinnedNodeIndexList(dbVmNumaNode.getVdsNumaNodeList()); + List<Pair<Guid, Pair<Boolean, Integer>>> runTimePinList = new ArrayList<>(); + for (Pair<Guid, Pair<Boolean, Integer>> pair : vNode.getVdsNumaNodeList()){ + if ((!pinnedNodes.contains(pair.getSecond().getSecond())) && + (runOnVdsAllNumaNodesMap.containsKey(pair.getSecond().getSecond()))) { + pair.setFirst(runOnVdsAllNumaNodesMap.get(pair.getSecond().getSecond()).getId()); + pair.getSecond().setFirst(false); + runTimePinList.add(pair); + } + } + vNode.setVdsNumaNodeList(runTimePinList); + if (!vNode.getVdsNumaNodeList().isEmpty()) { + vmNumaNodesNeedUpdate.add(vNode); + } + } + } + vm.getStatisticsData().getvNumaNodeStatisticsList().addAll(vmNumaNodesNeedUpdate); + } + private void updateInterfaceStatistics(VM vm, VmStatistics statistics) { if (statistics.getInterfaceStatistics() == null) { return; diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java index 3a2950e..6d7e9e0 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsBrokerObjectsBuilder.java @@ -40,6 +40,7 @@ import org.ovirt.engine.core.common.businessentities.VmExitReason; import org.ovirt.engine.core.common.businessentities.VmExitStatus; import org.ovirt.engine.core.common.businessentities.VmGuestAgentInterface; +import org.ovirt.engine.core.common.businessentities.VmNumaNode; import org.ovirt.engine.core.common.businessentities.VmPauseStatus; import org.ovirt.engine.core.common.businessentities.VmStatistics; import org.ovirt.engine.core.common.businessentities.network.InterfaceStatus; @@ -52,6 +53,7 @@ import org.ovirt.engine.core.common.config.Config; import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.utils.EnumUtils; +import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.utils.SizeConverter; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.RpmVersion; @@ -362,6 +364,11 @@ // ------------- vm migration statistics ----------------------- Integer migrationProgress = AssignIntValue(xmlRpcStruct, VdsProperties.vm_migration_progress_percent); vm.setMigrationProgressPercent(migrationProgress != null ? migrationProgress : 0); + + // ------------- vm numa nodes runtime info ------------------------- + if (xmlRpcStruct.containsKey(VdsProperties.VM_NUMA_NODES_RUNTIME_INFO)) { + updateVmNumaNodesRuntimeInfo(vm, xmlRpcStruct); + } } private static VmBalloonInfo getBalloonInfo(Map<String, Object> xmlRpcStruct) { @@ -1593,6 +1600,25 @@ } + /** + * Build through the received vm NUMA nodes runtime information + * @param vm + * @param xmlRpcStruct + */ + private static void updateVmNumaNodesRuntimeInfo(VmStatistics vm, Map<String, Object> xmlRpcStruct) { + Map<String, Object[]> vNodesRunInfo = (Map<String, Object[]>)xmlRpcStruct.get( + VdsProperties.VM_NUMA_NODES_RUNTIME_INFO); + for (Map.Entry<String, Object[]> item : vNodesRunInfo.entrySet()) { + VmNumaNode vNode = new VmNumaNode(); + vNode.setIndex(Integer.valueOf(item.getKey())); + for (Object pNodeIndex : item.getValue()) { + vNode.getVdsNumaNodeList().add(new Pair<>( + Guid.Empty, new Pair<>(false, (Integer)pNodeIndex))); + } + vm.getvNumaNodeStatisticsList().add(vNode); + } + } + private static List<String> extracStringtList(Map<String, Object> xmlRpcStruct, String propertyName) { if (!xmlRpcStruct.containsKey(propertyName)){ return null; diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java index e469c36..ed3b1d1 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java @@ -101,6 +101,7 @@ public static final String VM_NUMA_NODE_MEM = "memory"; public static final String NUMA_TUNE = "numaTune"; public static final String VM_NUMA_NODES = "guestNumaNodes"; + public static final String VM_NUMA_NODES_RUNTIME_INFO = "vNodeRuntimeInfo"; // Network related properties public static final String NETWORK = "network"; diff --git a/packaging/dbscripts/numa_sp.sql b/packaging/dbscripts/numa_sp.sql index 152c070..0e4ad88 100644 --- a/packaging/dbscripts/numa_sp.sql +++ b/packaging/dbscripts/numa_sp.sql @@ -267,6 +267,21 @@ +Create or replace FUNCTION DeleteUnpinnedNumaNodeMapByVmNumaNodeId(v_vm_numa_node_id UUID) +RETURNS VOID + AS $procedure$ +BEGIN + BEGIN + DELETE FROM vm_vds_numa_node_map + WHERE vm_numa_node_id = v_vm_numa_node_id AND is_pinned = FALSE; + END; + + RETURN; +END; $procedure$ +LANGUAGE plpgsql; + + + ---------------------------------------------------------------- -- [numa_node_cpus_view] View -- -- To view, visit http://gerrit.ovirt.org/28096 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I9d2c1dd03e0cc2f7d0ed9593e6ff889712894ac7 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Xiaolei Shi <xiao-lei....@hp.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches