x***@public.gmane.org
2014-05-26 09:02:58 UTC
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.shi-***@public.gmane.org>
---
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.shi-***@public.gmane.org>
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.shi-***@public.gmane.org>
---
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.shi-***@public.gmane.org>