Dudi Maroshi has uploaded a new change for review. Change subject: engine: Add KSM policy to NUMA hosts ......................................................................
engine: Add KSM policy to NUMA hosts 1. Update MomPolicyVDSparameters and with new ksmMergeAcrossNodes field 2. Update UpdateVdsGroupCommand to distribute the KSM policy change to active hosts with concurrent exectuor 3. Refactor SetMOMPolicyParameters VDSCommand, appended new field, refactor all calls Change-Id: I9a4094ea2cd517b6bc4d85d4b9c5b9dc8117748b Bug-Url: https://bugzilla.redhat.com/840114 Signed-off-by: Dudi Maroshi <d...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitVdsOnUpCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateMomPolicyCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVdsGroupCommand.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsGroupOperationCommandBase.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/MomPolicyVDSParameters.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/common/qualifiers/MomPolicyUpdate.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SetMOMPolicyParametersVDSCommand.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/VdsProperties.java D packaging/dbscripts/upgrade/03_06_1570_add_ksm_with_numa_awareness.sql 11 files changed, 126 insertions(+), 24 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/70/42370/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitVdsOnUpCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitVdsOnUpCommand.java index 75fe4e4..1f23d90 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitVdsOnUpCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitVdsOnUpCommand.java @@ -306,7 +306,10 @@ if (cluster.getCompatibilityVersion().compareTo(Version.v3_3) >= 0) { try { returnValue = runVdsCommand(VDSCommandType.SetMOMPolicyParameters, - new MomPolicyVDSParameters(vds, cluster.isEnableBallooning(), cluster.isEnableKsm()) + new MomPolicyVDSParameters(vds, + cluster.isEnableBallooning(), + cluster.isEnableKsm(), + cluster.isKsmMergeAcrossNumaNodes()) ); } catch (VdcBLLException e) { log.error("Could not update MoM policy on host '{}'", vds.getName()); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateMomPolicyCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateMomPolicyCommand.java index a76ff06..ea8e8a6 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateMomPolicyCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateMomPolicyCommand.java @@ -27,7 +27,7 @@ try { succeeded = runVdsCommand(VDSCommandType.SetMOMPolicyParameters, new MomPolicyVDSParameters(getVds(), getVdsGroup().isEnableBallooning(), - getVdsGroup().isEnableKsm()) + getVdsGroup().isEnableKsm(), getVdsGroup().isKsmMergeAcrossNumaNodes()) ).getSucceeded(); } catch (VdcBLLException e) { log.error("Could not update MoM policy on host '{}': {}", diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVdsGroupCommand.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVdsGroupCommand.java index e26fef4..3223c19 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVdsGroupCommand.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/UpdateVdsGroupCommand.java @@ -8,6 +8,7 @@ import java.util.Objects; import java.util.Set; +import javax.enterprise.event.Event; import javax.inject.Inject; import org.apache.commons.collections.CollectionUtils; @@ -42,6 +43,7 @@ import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.gluster.GlusterFeatureSupported; +import org.ovirt.engine.core.common.qualifiers.MomPolicyUpdate; import org.ovirt.engine.core.common.utils.ListUtils; import org.ovirt.engine.core.common.validation.group.UpdateEntity; import org.ovirt.engine.core.compat.Guid; @@ -62,6 +64,10 @@ @Inject private ClusterFeatureDao clusterFeatureDao; + + @Inject + @MomPolicyUpdate + private Event<VDSGroup> momPolicyUpdatedEvent; private List<VDS> allForVdsGroup; private VDSGroup oldGroup; @@ -130,6 +136,9 @@ getParameters().getVdsGroup().setDetectEmulatedMachine(true); } + boolean isKsmPolicyChanged = (getVdsGroup().isKsmMergeAcrossNumaNodes() != getPrevVdsGroup().isKsmMergeAcrossNumaNodes()) || + (getVdsGroup().isEnableKsm() != getPrevVdsGroup().isEnableKsm()); + getVdsGroupDAO().update(getParameters().getVdsGroup()); addOrUpdateAddtionalClusterFeatures(); @@ -150,6 +159,9 @@ alertIfFencingDisabled(); + if (isKsmPolicyChanged) { + momPolicyUpdatedEvent.fire(getVdsGroup()); + } setSucceeded(true); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java index 353c81c..55e4dfc 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsEventListener.java @@ -4,6 +4,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; @@ -46,11 +47,14 @@ import org.ovirt.engine.core.common.businessentities.StoragePool; import org.ovirt.engine.core.common.businessentities.StoragePoolStatus; import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.businessentities.VDSStatus; import org.ovirt.engine.core.common.businessentities.VmDynamic; import org.ovirt.engine.core.common.businessentities.VmStatic; import org.ovirt.engine.core.common.businessentities.gluster.GlusterBrickEntity; import org.ovirt.engine.core.common.businessentities.gluster.GlusterStatus; import org.ovirt.engine.core.common.businessentities.qos.CpuQos; +import org.ovirt.engine.core.common.errors.VdcBLLException; import org.ovirt.engine.core.common.errors.VdcBllErrors; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.common.eventqueue.Event; @@ -58,15 +62,19 @@ import org.ovirt.engine.core.common.eventqueue.EventResult; import org.ovirt.engine.core.common.eventqueue.EventType; import org.ovirt.engine.core.common.locks.LockingGroup; +import org.ovirt.engine.core.common.qualifiers.MomPolicyUpdate; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.common.vdscommands.DisconnectStoragePoolVDSCommandParameters; +import org.ovirt.engine.core.common.vdscommands.MomPolicyVDSParameters; import org.ovirt.engine.core.common.vdscommands.UpdateVmPolicyVDSParams; import org.ovirt.engine.core.common.vdscommands.VDSCommandType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.TransactionScopeOption; +import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; +import org.ovirt.engine.core.dao.VdsDAO; import org.ovirt.engine.core.di.Injector; import org.ovirt.engine.core.utils.linq.Function; import org.ovirt.engine.core.utils.linq.LinqUtils; @@ -90,7 +98,8 @@ private AvailableUpdatesFinder availableUpdatesFinder; @Inject AutoStartVmsRunner autoStartVmsRunner; - + @Inject + private VdsDAO vdsDAO; private static final Logger log = LoggerFactory.getLogger(VdsEventListener.class); @@ -142,11 +151,12 @@ /** * The following method will clear a cache for problematic domains, which were reported by vds + * * @param vds */ private void clearDomainCache(final VDS vds) { eventQueue.submitEventSync(new Event(vds.getStoragePoolId(), - null, vds.getId(), EventType.VDSCLEARCACHE, ""), + null, vds.getId(), EventType.VDSCLEARCACHE, ""), new Callable<EventResult>() { @Override public EventResult call() { @@ -155,7 +165,6 @@ } }); } - @Override public EventResult storageDomainNotOperational(Guid storageDomainId, Guid storagePoolId) { @@ -239,7 +248,7 @@ Map<String, String> customLogValues) { ExecutionHandler.updateSpecificActionJobCompleted(vdsId, VdcActionType.MaintenanceVds, false); SetNonOperationalVdsParameters tempVar = - new SetNonOperationalVdsParameters(vdsId, reason, customLogValues); + new SetNonOperationalVdsParameters(vdsId, reason, customLogValues); tempVar.setStorageDomainId(domainId); tempVar.setShouldBeLogged(logCommand); Backend.getInstance().runInternalAction(VdcActionType.SetNonOperationalVds, @@ -268,7 +277,8 @@ } private void moveBricksToUnknown(final VDS vds) { - List<GlusterBrickEntity> brickEntities = DbFacade.getInstance().getGlusterBrickDao().getGlusterVolumeBricksByServerId(vds.getId()); + List<GlusterBrickEntity> brickEntities = + DbFacade.getInstance().getGlusterBrickDao().getGlusterVolumeBricksByServerId(vds.getId()); for (GlusterBrickEntity brick : brickEntities) { if (brick.getStatus() == GlusterStatus.UP) { brick.setStatus(GlusterStatus.UNKNOWN); @@ -310,11 +320,13 @@ @Override public boolean connectHostToDomainsInActiveOrUnknownStatus(VDS vds) { ConnectHostToStoragePoolServersParameters params = new ConnectHostToStoragePoolServersParameters(vds, false); - return Backend.getInstance().runInternalAction(VdcActionType.ConnectHostToStoragePoolServers, params).getSucceeded(); + return Backend.getInstance() + .runInternalAction(VdcActionType.ConnectHostToStoragePoolServers, params) + .getSucceeded(); } - - private List<VdcActionParametersBase> createMigrateVmToServerParametersList(List<VmStatic> vmsToMigrate, final VDS vds) { + private List<VdcActionParametersBase> createMigrateVmToServerParametersList(List<VmStatic> vmsToMigrate, + final VDS vds) { return LinqUtils.transformToList(vmsToMigrate, new Function<VmStatic, VdcActionParametersBase>() { @Override @@ -374,13 +386,13 @@ @Override public void storagePoolStatusChange(Guid storagePoolId, StoragePoolStatus status, AuditLogType auditLogType, - VdcBllErrors error) { + VdcBllErrors error) { storagePoolStatusChange(storagePoolId, status, auditLogType, error, null); } @Override public void storagePoolStatusChange(Guid storagePoolId, StoragePoolStatus status, AuditLogType auditLogType, - VdcBllErrors error, TransactionScopeOption transactionScopeOption) { + VdcBllErrors error, TransactionScopeOption transactionScopeOption) { SetStoragePoolStatusParameters tempVar = new SetStoragePoolStatusParameters(storagePoolId, status, auditLogType); tempVar.setError(error); @@ -397,7 +409,7 @@ @Override public void runFailedAutoStartVMs(List<Guid> vmIds) { - for (Guid vmId: vmIds) { + for (Guid vmId : vmIds) { // Alert that the virtual machine failed: AuditLogableBase event = new AuditLogableBase(); event.setVmId(vmId); @@ -414,7 +426,10 @@ public void addExternallyManagedVms(List<VmStatic> externalVmList) { for (VmStatic currVm : externalVmList) { AddVmParameters params = new AddVmParameters(currVm); - VdcReturnValueBase returnValue = Backend.getInstance().runInternalAction(VdcActionType.AddVmFromScratch, params, ExecutionHandler.createInternalJobContext()); + VdcReturnValueBase returnValue = + Backend.getInstance().runInternalAction(VdcActionType.AddVmFromScratch, + params, + ExecutionHandler.createInternalJobContext()); if (!returnValue.getSucceeded()) { log.debug("Failed adding Externally managed VM '{}'", currVm.getName()); } @@ -485,7 +500,8 @@ public void onError(@Observes final VDSNetworkException vdsException) { ThreadPoolUtil.execute(new Runnable() { - @Override public void run() { + @Override + public void run() { resourceManagerProvider.get().GetVdsManager( vdsException.getVdsError().getVdsId()).handleNetworkException(vdsException); } @@ -510,4 +526,35 @@ public boolean isUpdateAvailable(VDS host) { return availableUpdatesFinder.isUpdateAvailable(host); } + + // TODO asynch event handler - design infra code to allow async events in segregated thread + public void onMomPolicyChange(@Observes @MomPolicyUpdate final VDSGroup cluster) { + if (cluster == null || cluster.getCompatibilityVersion().compareTo(Version.v3_4) < 0) + return; + List<VDS> activeHostsInCluster = + vdsDAO.getAllForVdsGroupWithStatus(cluster.getId(), VDSStatus.Up); + // collect all Active hosts into a callable list + List<Callable<Object>> callables = new LinkedList<>(); + for (final VDS vds : activeHostsInCluster) { + callables.add(new Callable<Object>() { + @Override + public Object call() { + try { + resourceManagerProvider.get().runVdsCommand(VDSCommandType.SetMOMPolicyParameters, + new MomPolicyVDSParameters(vds, + cluster.isEnableBallooning(), + cluster.isEnableKsm(), + cluster.isKsmMergeAcrossNumaNodes()) + ); + } catch (VdcBLLException e) { + log.error("Could not update MoM policy on host '{}'", vds.getName()); + } + return null; + } + }); + } + // run all VDSCommands concurrently with executor + if (callables.size() > 0) + ThreadPoolUtil.invokeAll(callables); + } } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsGroupOperationCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsGroupOperationCommandBase.java index cfbe4f2..c95b160 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsGroupOperationCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/VdsGroupOperationCommandBase.java @@ -48,6 +48,15 @@ return getParameters().getVdsGroup(); } + /** + * Get the cluster object as it is in database before update + * + * @return Current cluster object before database update, or null if not existing + */ + public VDSGroup getPrevVdsGroup() { + return super.getVdsGroup(); + } + @Override protected void setActionMessageParameters() { addCanDoActionMessage(VdcBllMessages.VAR__TYPE__CLUSTER); diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java index af5c059..7e9272d 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VDSGroup.java @@ -540,9 +540,9 @@ && ObjectUtils.objectsEqual(autoConverge, other.autoConverge) && ObjectUtils.objectsEqual(migrateCompressed, other.migrateCompressed) && ObjectUtils.objectsEqual(glusterTunedProfile, other.glusterTunedProfile) - && ksmMergeAcrossNumaNodes == other.ksmMergeAcrossNumaNodes && ObjectUtils.objectsEqual(maintenanceReasonRequired, other.maintenanceReasonRequired) - && ObjectUtils.objectsEqual(addtionalFeaturesSupported, other.addtionalFeaturesSupported); + && ObjectUtils.objectsEqual(addtionalFeaturesSupported, other.addtionalFeaturesSupported) + && ksmMergeAcrossNumaNodes == other.ksmMergeAcrossNumaNodes; } } diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/MomPolicyVDSParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/MomPolicyVDSParameters.java index 1b2b6c7..f093338 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/MomPolicyVDSParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/vdscommands/MomPolicyVDSParameters.java @@ -8,14 +8,19 @@ public class MomPolicyVDSParameters extends VdsIdVDSCommandParametersBase { private boolean enableBalloon; private boolean enableKsm; - - public MomPolicyVDSParameters(VDS vds, boolean enableBalloon, boolean enableKsm) { - super(vds.getId()); - this.enableBalloon = enableBalloon; - this.enableKsm = enableKsm; - } + private boolean ksmMergeAcrossNumaNodes; public MomPolicyVDSParameters() { + } + + public MomPolicyVDSParameters(VDS vds, + boolean enableBallooning, + boolean enableKsm, + boolean ksmMergeAcrossNumaNodes) { + super(vds.getId()); + this.enableBalloon = enableBallooning; + this.enableKsm = enableKsm; + this.ksmMergeAcrossNumaNodes = ksmMergeAcrossNumaNodes; } public boolean isEnableBalloon() { @@ -33,4 +38,12 @@ public void setEnableKsm(boolean enableKsm) { this.enableKsm = enableKsm; } + + public boolean isKsmMergeAcrossNumaNodes() { + return ksmMergeAcrossNumaNodes; + } + + public void setKsmMergeAcrossNumaNodes(boolean ksmMergeAcrossNumaNodes) { + this.ksmMergeAcrossNumaNodes = ksmMergeAcrossNumaNodes; + } } diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/common/qualifiers/MomPolicyUpdate.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/common/qualifiers/MomPolicyUpdate.java new file mode 100644 index 0000000..921fa3c --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/common/qualifiers/MomPolicyUpdate.java @@ -0,0 +1,17 @@ +package org.ovirt.engine.core.common.qualifiers; + +import java.lang.annotation.Retention; +import java.lang.annotation.Target; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import javax.inject.Qualifier; + +@Qualifier +@Retention(RUNTIME) +@Target({TYPE, METHOD, FIELD, PARAMETER}) +public @interface MomPolicyUpdate { +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SetMOMPolicyParametersVDSCommand.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SetMOMPolicyParametersVDSCommand.java index 7e9123b..c83ec6a 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SetMOMPolicyParametersVDSCommand.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/vdsbroker/SetMOMPolicyParametersVDSCommand.java @@ -28,6 +28,7 @@ Map<String, Object> deviceStruct = new HashMap<>(); deviceStruct.put(VdsProperties.balloonEnabled, getParameters().isEnableBalloon()); deviceStruct.put(VdsProperties.ksmEnabled, getParameters().isEnableKsm()); + deviceStruct.put(VdsProperties.ksmMergeAcrossNodes, getParameters().isKsmMergeAcrossNumaNodes()); return deviceStruct; } } 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 6049c64..ef27b04 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 @@ -468,6 +468,7 @@ // MoM policy tuning public static final String balloonEnabled = "balloonEnabled"; public static final String ksmEnabled = "ksmEnabled"; + public static final String ksmMergeAcrossNodes = "ksmMergeAcrossNodes"; // properties for ServerConnectionListReturnForXmlRpc public static final String serverType = "serverType"; diff --git a/packaging/dbscripts/upgrade/03_06_1570_add_ksm_with_numa_awareness.sql b/packaging/dbscripts/upgrade/03_06_1570_add_ksm_with_numa_awareness.sql deleted file mode 100644 index 98565de..0000000 --- a/packaging/dbscripts/upgrade/03_06_1570_add_ksm_with_numa_awareness.sql +++ /dev/null @@ -1 +0,0 @@ -select fn_db_add_column('vds_groups', 'ksm_merge_across_nodes', 'boolean default TRUE NULL'); \ No newline at end of file -- To view, visit https://gerrit.ovirt.org/42370 To unsubscribe, visit https://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I9a4094ea2cd517b6bc4d85d4b9c5b9dc8117748b Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Dudi Maroshi <d...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches