Gilad Chaplik has uploaded a new change for review. Change subject: engine: enable balance in new arch ......................................................................
engine: enable balance in new arch Change-Id: I2f20928f3be5a04e3cea069d8e254956860758f7 Signed-off-by: Gilad Chaplik <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MigrationHandler.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancer.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/MigrateVmParameters.java 5 files changed, 81 insertions(+), 20 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/75/16375/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java index 1353faf..d12875d 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/InitBackendServicesOnStartupBean.java @@ -1,6 +1,6 @@ package org.ovirt.engine.core.bll; -import java.util.List; +import java.util.ArrayList; import javax.annotation.PostConstruct; import javax.ejb.DependsOn; @@ -12,11 +12,10 @@ import org.ovirt.engine.core.bll.network.MacPoolManager; import org.ovirt.engine.core.bll.provider.ExternalTrustStoreInitializer; import org.ovirt.engine.core.bll.scheduling.MigrationHandler; -import org.ovirt.engine.core.bll.scheduling.VdsLoadBalancer; +import org.ovirt.engine.core.bll.scheduling.SchedulingManager; import org.ovirt.engine.core.bll.storage.StoragePoolStatusHandler; -import org.ovirt.engine.core.common.action.MigrateVmToServerParameters; +import org.ovirt.engine.core.common.action.MigrateVmParameters; import org.ovirt.engine.core.common.action.VdcActionType; -import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.utils.customprop.DevicePropertiesUtils; import org.ovirt.engine.core.utils.customprop.VmPropertiesUtils; @@ -49,17 +48,15 @@ AsyncTaskManager.getInstance().InitAsyncTaskManager(); OvfDataUpdater.getInstance().initOvfDataUpdater(); - VdsLoadBalancer.getInstance().setMigrationHandler(new MigrationHandler() { + SchedulingManager.getInstance().setMigrationHandler(new MigrationHandler() { @Override - public void migrateVMs(List<Pair<Guid, Guid>> list) { - for (Pair<Guid, Guid> pair : list) { - MigrateVmToServerParameters parameters = - new MigrateVmToServerParameters(false, pair.getFirst(), pair.getSecond()); - Backend.getInstance().runInternalAction(VdcActionType.MigrateVmToServer, - parameters, - ExecutionHandler.createInternalJobContext()); - } + public void migrateVM(ArrayList<Guid> initialHosts, Guid vmToMigrate) { + MigrateVmParameters parameters = new MigrateVmParameters(false, vmToMigrate); + parameters.setInitialHosts(initialHosts); + Backend.getInstance().runInternalAction(VdcActionType.MigrateVm, + parameters, + ExecutionHandler.createInternalJobContext()); } }); diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MigrationHandler.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MigrationHandler.java index 7e53bfc..8c35545 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MigrationHandler.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/MigrationHandler.java @@ -1,14 +1,14 @@ package org.ovirt.engine.core.bll.scheduling; -import java.util.List; +import java.util.ArrayList; -import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; public interface MigrationHandler { /** - * this method holds a list of pairs VM id and Host id. each VM should be migrated to the specified Host - * @param list + * delegate for migrating a vm to a set of hosts provided by the scheduler + * @param initialHosts + * @param vmToMigrate */ - void migrateVMs(List<Pair<Guid, Guid>> list); + void migrateVM(ArrayList<Guid> initialHosts, Guid vmToMigrate); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java index 38ce876..1eb97b9 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SchedulingManager.java @@ -8,12 +8,15 @@ import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; import org.ovirt.engine.core.common.businessentities.MigrationSupport; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VDSType; import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; import org.ovirt.engine.core.common.scheduling.ClusterPolicy; import org.ovirt.engine.core.common.scheduling.PolicyUnit; import org.ovirt.engine.core.common.utils.Pair; @@ -24,8 +27,13 @@ import org.ovirt.engine.core.dao.VdsGroupDAO; import org.ovirt.engine.core.dao.scheduling.ClusterPolicyDao; import org.ovirt.engine.core.dao.scheduling.PolicyUnitDao; +import org.ovirt.engine.core.utils.log.Log; +import org.ovirt.engine.core.utils.log.LogFactory; +import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation; +import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzImpl; public class SchedulingManager { + private static Log log = LogFactory.getLog(SchedulingManager.class); /** * singleton */ @@ -36,6 +44,7 @@ synchronized (SchedulingManager.class) { if (instance == null) { instance = new SchedulingManager(); + EnableLoadBalancer(); } } } @@ -54,6 +63,7 @@ private final ConcurrentHashMap<Guid, Object> clusterLockMap = new ConcurrentHashMap<Guid, Object>(); private final VdsFreeMemoryChecker noWaitingMemoryChecker = new VdsFreeMemoryChecker(new NonWaitingDelayer()); + private MigrationHandler migrationHandler; private SchedulingManager() { policyMap = new ConcurrentHashMap<Guid, ClusterPolicy>(); @@ -84,6 +94,13 @@ for (ClusterPolicy clusterPolicy : allClusterPolicies) { policyMap.put(clusterPolicy.getId(), clusterPolicy); } + } + + public void setMigrationHandler(MigrationHandler migrationHandler) { + if (this.migrationHandler != null) { + throw new RuntimeException("Load balance migration handler should be set only once"); + } + this.migrationHandler = migrationHandler; } protected void loadPolicyUnits() { @@ -194,7 +211,9 @@ protected Map<String, Object> createClusterPolicyParameters(VDSGroup cluster, VM vm) { Map<String, Object> parameters = new HashMap<String, Object>(); - parameters.put(PolicyUnitImpl.VM, vm); + if (vm != null) { + parameters.put(PolicyUnitImpl.VM, vm); + } if (cluster.getClusterPolicyProperties() != null) { parameters.putAll(cluster.getClusterPolicyProperties()); } @@ -290,4 +309,38 @@ protected ClusterPolicyDao getClusterPolicyDao() { return DbFacade.getInstance().getClusterPolicyDao(); } + + public static void EnableLoadBalancer() { + if (Config.<Boolean> GetValue(ConfigValues.EnableVdsLoadBalancing)) { + log.info("Start scheduling to enable vds load balancer"); + SchedulerUtilQuartzImpl.getInstance().scheduleAFixedDelayJob(instance, + "PerformLoadBalancing", + new Class[] {}, + new Object[] {}, + Config.<Integer> GetValue(ConfigValues.VdsLoadBalancingeIntervalInMinutes), + Config.<Integer> GetValue(ConfigValues.VdsLoadBalancingeIntervalInMinutes), + TimeUnit.MINUTES); + log.info("Finished scheduling to enable vds load balancer"); + } + } + + @OnTimerMethodAnnotation("PerformLoadBalancing") + public void PerformLoadBalancing() { + log.debugFormat("Load Balancer timer entered."); + List<VDSGroup> clusters = DbFacade.getInstance().getVdsGroupDao().getAll(); + for (VDSGroup cluster : clusters) { + ClusterPolicy policy = policyMap.get(cluster.getClusterPolicyId()); + PolicyUnitImpl policyUnit = policyUnits.get(policy.getBalance()); + List<VDS> hosts = getVdsDAO() + .getAllOfTypes(new VDSType[] { VDSType.VDS, VDSType.oVirtNode }); + Pair<List<Guid>, Guid> pair = policyUnit.balance(cluster, + hosts, + cluster.getClusterPolicyProperties(), + new ArrayList<String>()); + if (pair != null && pair.getSecond() != null) { + migrationHandler.migrateVM((ArrayList<Guid>) pair.getFirst(), pair.getSecond()); + } + } + } + } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancer.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancer.java index 438cfdd..f210c6b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancer.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/VdsLoadBalancer.java @@ -54,7 +54,7 @@ group.gethigh_utilization(), group.getlow_utilization(), group.getcpu_over_commit_duration_minutes(), Config.<Integer> GetValue(ConfigValues.UtilizationThresholdInPercent)); - migrationHandler.migrateVMs(loadBalancingAlgorithm.LoadBalance()); + // migrationHandler.migrateVMs(loadBalancingAlgorithm.LoadBalance()); } else { log.debugFormat("VdsLoadBalancer: Cluster {0} skipped because no selection algorithm selected.", group.getName()); diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/MigrateVmParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/MigrateVmParameters.java index aa2ffb1..d5799f5 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/MigrateVmParameters.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/action/MigrateVmParameters.java @@ -1,5 +1,7 @@ package org.ovirt.engine.core.common.action; +import java.util.ArrayList; + import org.ovirt.engine.core.compat.Guid; /** @@ -9,6 +11,7 @@ public class MigrateVmParameters extends VmOperationParameterBase { private static final long serialVersionUID = -7523728706659584319L; protected boolean forceMigrationForNonMigratableVM; + ArrayList<Guid> initialHosts; public MigrateVmParameters() { } @@ -35,4 +38,12 @@ this.forceMigrationForNonMigratableVM = forceMigrationForNonMigratableVM; } + public ArrayList<Guid> getInitialHosts() { + return initialHosts; + } + + public void setInitialHosts(ArrayList<Guid> initialHosts) { + this.initialHosts = initialHosts; + } + } -- To view, visit http://gerrit.ovirt.org/16375 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I2f20928f3be5a04e3cea069d8e254956860758f7 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Gilad Chaplik <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
