Gilad Chaplik has uploaded a new change for review.

Change subject: core: Handle NUMA preferred tune mode
......................................................................

core: Handle NUMA preferred tune mode

This patch addresses 3 issues:
- 5892ef11 added NumaTuneMode to VmBase, so we need to update all
VmStatic elements (VM templates) that was added since.
- libvirt failure when running in preferred mode without specifying
numa nodes. Added validation to add/edit VM to fail command when preferred
numa tune set and there is no single VM node configured pinned to NUMA
node.

Change-Id: I637fb996d06e97d55bdd8309a668307cac8bb546
Bug-Url: https://bugzilla.redhat.com/1146445
Bug-Url: https://bugzilla.redhat.com/1147261
Signed-off-by: Gilad Chaplik <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
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/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
M 
frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
A 
packaging/dbscripts/upgrade/03_05_1070_set_interleave_default_value_for_numa_tune_mode.sql
8 files changed, 58 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/32/33732/1

diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
index 15e8af5..b78b086 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/AddVmCommand.java
@@ -604,6 +604,12 @@
             return false;
         }
 
+        if 
(!validate(VmHandler.checkNumaPreferredTuneMode(getParameters().getVmStaticData()
+                .getNumaTuneMode(),
+                getParameters().getVmStaticData().getvNumaNodeList(), 
getVmId()))) {
+            return false;
+        }
+
         return true;
     }
 
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
index f66fca5..5d1351b 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVmCommand.java
@@ -630,6 +630,12 @@
             return 
failCanDoAction(VdcBllMessages.BALLOON_REQUESTED_ON_NOT_SUPPORTED_ARCH);
         }
 
+        if 
(!validate(VmHandler.checkNumaPreferredTuneMode(getParameters().getVmStaticData().getNumaTuneMode(),
+                getParameters().getVmStaticData().getvNumaNodeList(),
+                getVmId()))) {
+            return false;
+        }
+
         return true;
     }
 
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 03431a5..ef9cc80 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
@@ -31,6 +31,7 @@
 import org.ovirt.engine.core.common.businessentities.EditableField;
 import org.ovirt.engine.core.common.businessentities.EditableOnVm;
 import org.ovirt.engine.core.common.businessentities.EditableOnVmStatusField;
+import org.ovirt.engine.core.common.businessentities.NumaTuneMode;
 import org.ovirt.engine.core.common.businessentities.StorageDomain;
 import org.ovirt.engine.core.common.businessentities.StorageDomainStatus;
 import org.ovirt.engine.core.common.businessentities.StorageType;
@@ -41,6 +42,7 @@
 import org.ovirt.engine.core.common.businessentities.VmBase;
 import org.ovirt.engine.core.common.businessentities.VmDynamic;
 import org.ovirt.engine.core.common.businessentities.VmInit;
+import org.ovirt.engine.core.common.businessentities.VmNumaNode;
 import org.ovirt.engine.core.common.businessentities.VmStatic;
 import org.ovirt.engine.core.common.businessentities.VolumeType;
 import 
org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
@@ -864,4 +866,35 @@
         canDoActionMessages.add("$unsupportedCpus " + 
StringUtils.strip(unsupportedCpus.toString(), "[]"));
         return false;
     }
+
+    /**
+     * preferred supports single pinned vnuma node (without that VM fails to 
run in libvirt).
+     * used by add/update VM commands
+     */
+    public static ValidationResult checkNumaPreferredTuneMode(NumaTuneMode 
numaTuneMode,
+            List<VmNumaNode> vmNumaNodes,
+            Guid vmId) {
+        // check tune mode
+        if (numaTuneMode != NumaTuneMode.PREFERRED) {
+            return ValidationResult.VALID;
+        }
+
+        if (vmNumaNodes == null && vmId != null) {
+            vmNumaNodes = 
DbFacade.getInstance().getVmNumaNodeDAO().getAllVmNumaNodeByVmId(vmId);
+        }
+
+        // check single node pinned
+        if (vmNumaNodes != null && vmNumaNodes.size() == 1) {
+            List<Pair<Guid, Pair<Boolean, Integer>>> vdsNumaNodeList = 
vmNumaNodes.get(0).getVdsNumaNodeList();
+            boolean pinnedToSingleNode = vdsNumaNodeList != null
+                    && vdsNumaNodeList.size() == 1
+                    && vdsNumaNodeList.get(0).getSecond() != null
+                    && vdsNumaNodeList.get(0).getSecond().getFirst();
+            if (pinnedToSingleNode) {
+                return ValidationResult.VALID;
+            }
+        }
+
+        return new 
ValidationResult(VdcBllMessages.VM_NUMA_NODE_PREFERRED_NOT_PINNED_TO_SINGLE_NODE);
+    }
 }
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 a61c461..23484b4 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
@@ -4,6 +4,7 @@
 import java.util.List;
 
 import org.ovirt.engine.core.bll.VmCommand;
+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.NumaTuneMode;
@@ -58,6 +59,11 @@
     @Override
     protected boolean canDoAction() {
         List<VmNumaNode> vmNumaNodes = getParameters().getVmNumaNodeList();
+
+        if 
(!validate(VmHandler.checkNumaPreferredTuneMode(getParameters().getNumaTuneMode(),
 vmNumaNodes, getVmId()))) {
+            return false;
+        }
+
         if (vmNumaNodes == null || vmNumaNodes.size() == 0) {
             // if VM do not contain any NUMA node, skip checking
             return true;
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
index 5b9c928..6937646 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/errors/VdcBllMessages.java
@@ -385,6 +385,7 @@
     VM_NUMA_PINNED_VDS_NODE_EMPTY(ErrorType.BAD_PARAMETERS),
     VM_NUMA_NODE_PINNED_INDEX_ERROR(ErrorType.BAD_PARAMETERS),
     VM_NUMA_NODE_MEMRORY_ERROR(ErrorType.BAD_PARAMETERS),
+    VM_NUMA_NODE_PREFERRED_NOT_PINNED_TO_SINGLE_NODE(ErrorType.BAD_PARAMETERS),
     CANNOT_PREVIEW_ACTIVE_SNAPSHOT(ErrorType.BAD_PARAMETERS),
     VM_CANNOT_SUSPENDE_HAS_RUNNING_TASKS(ErrorType.CONFLICT),
     VM_CANNOT_REMOVE_HAS_RUNNING_TASKS(ErrorType.CONFLICT),
diff --git 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
index fd6669f..5bafc36 100644
--- 
a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
+++ 
b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties
@@ -706,6 +706,7 @@
 VM_NUMA_PINNED_VDS_NODE_EMPTY=Cannot pin NUMA nodes when VDS NUMA nodes is 
empty.
 VM_NUMA_NODE_PINNED_INDEX_ERROR=NUMA node pinned index error.
 VM_NUMA_NODE_MEMRORY_ERROR=NUMA node memory error.
+VM_NUMA_NODE_PREFERRED_NOT_PINNED_TO_SINGLE_NODE=Preferred NUMA tune mode is 
allowed for a single pinned Virtual NUMA Node.
 ACTION_TYPE_FAILED_TEMPLATE_NOT_FOUND_ON_EXPORT_DOMAIN=Cannot export VM. 
Template ${TemplateName} does not exist on the export domain. if you want to 
export VM without its Template please use TemplateMustExists=false
 ACTION_TYPE_FAILED_VM_NOT_FOUND_ON_EXPORT_DOMAIN=Cannot delete VM, VM not 
exists in export domain
 ACTION_NOT_SUPPORTED_FOR_CLUSTER_POOL_LEVEL=The Action ${action} ${type} is 
not supported for this Cluster or Data Center compatibility version
diff --git 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
index a437db7..9df22a7 100644
--- 
a/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
+++ 
b/frontend/webadmin/modules/frontend/src/main/java/org/ovirt/engine/ui/frontend/AppErrors.java
@@ -3243,6 +3243,9 @@
     @DefaultStringValue("$detailMessage it has insufficient NUMA node free 
memory to run the VM")
     String VAR__DETAIL__NUMA_PINNING_FAILED();
 
+    @DefaultStringValue("Preferred NUMA tune mode is allowed for a single 
pinned Virtual NUMA Node.")
+    String VM_NUMA_NODE_PREFERRED_NOT_PINNED_TO_SINGLE_NODE();
+
     @DefaultStringValue("$detailMessage it is not a Hosted Engine host.")
     String VAR__DETAIL__NOT_HE_HOST();
 
diff --git 
a/packaging/dbscripts/upgrade/03_05_1070_set_interleave_default_value_for_numa_tune_mode.sql
 
b/packaging/dbscripts/upgrade/03_05_1070_set_interleave_default_value_for_numa_tune_mode.sql
new file mode 100644
index 0000000..d58da47
--- /dev/null
+++ 
b/packaging/dbscripts/upgrade/03_05_1070_set_interleave_default_value_for_numa_tune_mode.sql
@@ -0,0 +1,2 @@
+update vm_static set numatune_mode ='interleave';
+


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

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

Reply via email to