Hello Xiaolei Shi,

I'd like you to do a code review.  Please visit

    http://gerrit.ovirt.org/33185

to review the following change.

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.
This information is calculated in vdsm according to each vcpu pinning
to which physical cpu core and the process(vcpu) consumed memory
mapping to which host numa nodes.
The reported message format from vdsm is:
'vNodeRuntimeInfo': {'<vmNodeIndex>': [<hostNodeIndex>], ...}

Change-Id: I9d2c1dd03e0cc2f7d0ed9593e6ff889712894ac7
Bug-Url: https://bugzilla.redhat.com/1100202
Signed-off-by: Bruce Shi <[email protected]>
---
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/DestroyVmVDSCommand.java
M 
backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.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
11 files changed, 238 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/85/33185/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 ade9120..e665765 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
@@ -15,6 +15,8 @@
     private List<VmJob> vmJobs;
     // NOT PERSISTED
     private VmBalloonInfo vmBalloonInfo;
+    // NOT PERSISTED
+    private List<VmNumaNode> vNumaNodeStatisticsList;
 
     public VmStatistics() {
         cpu_sysField = 0.0;
@@ -22,6 +24,7 @@
         elapsed_timeField = 0.0;
         roundedElapsedTimeField = 0.0;
         vm_guidField = Guid.Empty;
+        vNumaNodeStatisticsList = new ArrayList<VmNumaNode>();
     }
 
     @Override
@@ -39,6 +42,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;
     }
 
@@ -64,7 +68,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() {
@@ -220,4 +225,11 @@
         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..9f942c4 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,24 @@
                 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()) {
+                if (!pair.getSecond().getFirst()) {
+                    
vNodeToPnodeInsertions.add(createVnodeToPnodeParametersMapper(pair, 
node.getId()));
+                }
+            }
+        }
+        if (!vNodeToPnodeDeletions.isEmpty()) {
+            
getCallsHandler().executeStoredProcAsBatch("DeleteUnpinnedNumaNodeMapByVmNumaNodeId",
 vNodeToPnodeDeletions);
+        }
+        if (!vNodeToPnodeInsertions.isEmpty()) {
+            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/DestroyVmVDSCommand.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/DestroyVmVDSCommand.java
index 0124929..b4c14de 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/DestroyVmVDSCommand.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/DestroyVmVDSCommand.java
@@ -30,6 +30,7 @@
 
             final VM curVm = 
DbFacade.getInstance().getVmDao().get(parameters.getVmId());
             
curVm.setInterfaces(DbFacade.getInstance().getVmNetworkInterfaceDao().getAllForVm(curVm.getId()));
+            
curVm.setvNumaNodeList(DbFacade.getInstance().getVmNumaNodeDAO().getAllVmNumaNodeByVmId(curVm.getId()));
 
             DestroyVDSCommand<DestroyVmVDSCommandParameters> vdsBrokerCommand =
                     new 
DestroyVDSCommand<DestroyVmVDSCommandParameters>(parameters);
@@ -61,6 +62,9 @@
                                 .getVdsDynamicDao()
                                 .updatePartialVdsDynamicCalc(getVdsId(), 0, 0, 
0,
                                         -curVm.getVmMemSizeMb(), 
-curVm.getNumOfCpus());
+                        DbFacade.getInstance()
+                                .getVmNumaNodeDAO()
+                                
.massUpdateVmNumaNodeRuntimePinning(curVm.getvNumaNodeList());
                         return null;
                     }
                 });
diff --git 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java
 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java
index 46b1ccc..71f2a2e 100644
--- 
a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java
+++ 
b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java
@@ -21,6 +21,7 @@
 import org.ovirt.engine.core.common.businessentities.VdsStatistics;
 import org.ovirt.engine.core.common.businessentities.VmExitReason;
 import org.ovirt.engine.core.common.businessentities.VmExitStatus;
+import org.ovirt.engine.core.common.businessentities.VmNumaNode;
 import org.ovirt.engine.core.common.businessentities.VmPauseStatus;
 import org.ovirt.engine.core.common.businessentities.network.NetworkStatistics;
 import 
org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
@@ -338,6 +339,10 @@
             statistics.setReceiveRate(0D);
             statistics.setReceiveDropRate(0D);
         }
+        List<VmNumaNode> vmNumaNodes = vm.getvNumaNodeList();
+        for (VmNumaNode node : vmNumaNodes) {
+            node.getVdsNumaNodeList().clear();
+        }
     }
 
     public void UpdateVdsStatisticsData(VdsStatistics vdsStatistics) {
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 f5bd80f..8878f62 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
@@ -48,6 +48,7 @@
 import org.ovirt.engine.core.common.businessentities.VmExitStatus;
 import org.ovirt.engine.core.common.businessentities.VmGuestAgentInterface;
 import org.ovirt.engine.core.common.businessentities.VmJob;
+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;
@@ -76,6 +77,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;
@@ -201,6 +203,20 @@
         saveVmDevicesToDb();
         saveVmJobsToDb();
         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()) {
+                
getDbFacade().getVmNumaNodeDAO().massUpdateVmNumaNodeRuntimePinning(vmNumaNodesToUpdate);
+            }
+        }
     }
 
     private void saveVmGuestAgentNetworkDevices() {
@@ -2057,6 +2073,7 @@
         if (_vdsManager.getRefreshStatistics()) {
             VmStatistics vmStatistics = 
_runningVms.get(vmToUpdate.getId()).getVmStatistics();
             vmToUpdate.updateRunTimeStatisticsData(vmStatistics, vmToUpdate);
+            updateVmNumaNodeRuntimeInfo(vmStatistics, vmToUpdate);
             addVmStatisticsToList(vmToUpdate.getStatisticsData());
             updateInterfaceStatistics(vmToUpdate, vmStatistics);
 
@@ -2068,6 +2085,51 @@
         }
     }
 
+    private void updateVmNumaNodeRuntimeInfo(VmStatistics statistics, VM vm) {
+        if (!vm.getStatus().isRunning()) {
+            vm.getStatisticsData().getvNumaNodeStatisticsList().clear();
+            return;
+        }
+
+        //Build numa nodes map of the host which the vm is running on with 
node index as the key
+        Map<Integer, VdsNumaNode> runOnVdsAllNumaNodesMap = new HashMap<>();
+        List<VdsNumaNode> runOnVdsAllNumaNodes = 
getDbFacade().getVdsNumaNodeDAO().getAllVdsNumaNodeByVdsId(vm.getRunOnVds());
+        for (VdsNumaNode vdsNumaNode : runOnVdsAllNumaNodes) {
+            runOnVdsAllNumaNodesMap.put(vdsNumaNode.getIndex(), vdsNumaNode);
+        }
+
+        //Build numa nodes map of the vm with node index as the key
+        Map<Integer, VmNumaNode> vmAllNumaNodesMap = new HashMap<>();
+        List<VmNumaNode> vmAllNumaNodes = 
getDbFacade().getVmNumaNodeDAO().getAllVmNumaNodeByVmId(vm.getId());
+        for (VmNumaNode vmNumaNode : vmAllNumaNodes) {
+            vmAllNumaNodesMap.put(vmNumaNode.getIndex(), vmNumaNode);
+        }
+
+        //Initialize the unpinned vm numa nodes list with the runtime pinning 
information
+        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);
+                    }
+                }
+                if (!runTimePinList.isEmpty()) {
+                    vNode.setVdsNumaNodeList(runTimePinList);
+                    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 d9e74a8..679c397 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
@@ -45,6 +45,7 @@
 import org.ovirt.engine.core.common.businessentities.VmJob;
 import org.ovirt.engine.core.common.businessentities.VmJobState;
 import org.ovirt.engine.core.common.businessentities.VmJobType;
+import org.ovirt.engine.core.common.businessentities.VmNumaNode;
 import org.ovirt.engine.core.common.businessentities.VmPauseStatus;
 import org.ovirt.engine.core.common.businessentities.VmRngDevice;
 import org.ovirt.engine.core.common.businessentities.VmStatistics;
@@ -58,6 +59,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;
@@ -371,6 +373,11 @@
 
         // ------------- vm jobs -------------
         vm.setVmJobs(getVmJobs(vm.getId(), xmlRpcStruct));
+
+        // ------------- 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) {
@@ -1669,6 +1676,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 3686b1e..999d5ad5 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/33185
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I9d2c1dd03e0cc2f7d0ed9593e6ff889712894ac7
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Gilad Chaplik <[email protected]>
Gerrit-Reviewer: Xiaolei Shi <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to