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
