Gilad Chaplik has uploaded a new change for review. Change subject: core: scheduler: separate policy unit per class ......................................................................
core: scheduler: separate policy unit per class Each policy unit should implement a single file so None, EvenDistribution and PowerSaving policy units will be divided into two policy units, weight and balance. Change-Id: Id25cd653246e14a109b08d91adfb12ceccc505b4 Signed-off-by: Gilad Chaplik <[email protected]> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java R backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionBalancePolicyUnit.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionWeightPolicyUnit.java R backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NoneBalancePolicyUnit.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NoneWeightPolicyUnit.java R backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingBalancePolicyUnit.java A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingWeightPolicyUnit.java 7 files changed, 158 insertions(+), 79 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/61/18561/1 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java index 7b13cff..31a7588 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java @@ -6,14 +6,17 @@ import org.apache.commons.lang.NotImplementedException; import org.ovirt.engine.core.bll.scheduling.policyunits.CPUPolicyUnit; -import org.ovirt.engine.core.bll.scheduling.policyunits.EvenDistributionPolicyUnit; +import org.ovirt.engine.core.bll.scheduling.policyunits.EvenDistributionBalancePolicyUnit; +import org.ovirt.engine.core.bll.scheduling.policyunits.EvenDistributionWeightPolicyUnit; import org.ovirt.engine.core.bll.scheduling.policyunits.MemoryPolicyUnit; import org.ovirt.engine.core.bll.scheduling.policyunits.MigrationDomainPolicyUnit; import org.ovirt.engine.core.bll.scheduling.policyunits.MigrationPolicyUnit; import org.ovirt.engine.core.bll.scheduling.policyunits.NetworkPolicyUnit; -import org.ovirt.engine.core.bll.scheduling.policyunits.NonePolicyUnit; +import org.ovirt.engine.core.bll.scheduling.policyunits.NoneBalancePolicyUnit; +import org.ovirt.engine.core.bll.scheduling.policyunits.NoneWeightPolicyUnit; import org.ovirt.engine.core.bll.scheduling.policyunits.PinToHostPolicyUnit; -import org.ovirt.engine.core.bll.scheduling.policyunits.PowerSavingPolicyUnit; +import org.ovirt.engine.core.bll.scheduling.policyunits.PowerSavingBalancePolicyUnit; +import org.ovirt.engine.core.bll.scheduling.policyunits.PowerSavingWeightPolicyUnit; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; import org.ovirt.engine.core.common.businessentities.VM; @@ -44,11 +47,26 @@ case "Network": return new NetworkPolicyUnit(policyUnit); case "None": - return new NonePolicyUnit(policyUnit); + if (policyUnit.getPolicyUnitType() == PolicyUnitType.Weight) { + return new NoneWeightPolicyUnit(policyUnit); + } + else if (policyUnit.getPolicyUnitType() == PolicyUnitType.LoadBalancing) { + return new NoneBalancePolicyUnit(policyUnit); + } case "PowerSaving": - return new PowerSavingPolicyUnit(policyUnit); + if (policyUnit.getPolicyUnitType() == PolicyUnitType.Weight) { + return new PowerSavingWeightPolicyUnit(policyUnit); + } + else if (policyUnit.getPolicyUnitType() == PolicyUnitType.LoadBalancing) { + return new PowerSavingBalancePolicyUnit(policyUnit); + } case "EvenDistribution": - return new EvenDistributionPolicyUnit(policyUnit); + if (policyUnit.getPolicyUnitType() == PolicyUnitType.Weight) { + return new EvenDistributionWeightPolicyUnit(policyUnit); + } + else if (policyUnit.getPolicyUnitType() == PolicyUnitType.LoadBalancing) { + return new EvenDistributionBalancePolicyUnit(policyUnit); + } default: throw new NotImplementedException("policyUnit: " + policyUnit.getName()); } diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionPolicyUnit.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionBalancePolicyUnit.java similarity index 80% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionPolicyUnit.java rename to backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionBalancePolicyUnit.java index 0b8974eb..ad5922b 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionPolicyUnit.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionBalancePolicyUnit.java @@ -27,52 +27,11 @@ import org.ovirt.engine.core.utils.linq.LinqUtils; import org.ovirt.engine.core.utils.linq.Predicate; -public class EvenDistributionPolicyUnit extends PolicyUnitImpl { +public class EvenDistributionBalancePolicyUnit extends PolicyUnitImpl { - public EvenDistributionPolicyUnit(PolicyUnit policyUnit) { + public EvenDistributionBalancePolicyUnit(PolicyUnit policyUnit) { super(policyUnit); } - - /** - * Calculate a single host weight score according to various parameters. - * @param vds - * @param vm - * @param hostCores - threads/cores according to cluster - * @return - */ - private double calcDistributeMetric(VDS vds, VM vm, int hostCores) { - int vcpu = Config.<Integer> GetValue(ConfigValues.VcpuConsumptionPercentage); - int spmCpu = (vds.getSpmStatus() == VdsSpmStatus.None) ? 0 : Config - .<Integer> GetValue(ConfigValues.SpmVCpuConsumption); - double hostCpu = vds.getUsageCpuPercent(); - double pendingVcpus = vds.getPendingVcpusCount(); - - return (hostCpu / vcpu) + (pendingVcpus + vm.getNumOfCpus() + spmCpu) / hostCores; - } - - protected int calcEvenDistributionScore(VDS vds, VM vm, boolean countThreadsAsCores) { - int score = MaxSchedulerWeight - 1; - Integer effectiveCpuCores = SlaValidator.getEffectiveCpuCores(vds, countThreadsAsCores); - if (effectiveCpuCores != null - && vds.getUsageCpuPercent() != null - && vds.getPendingVcpusCount() != null) { - // round up result, fractions matters - score = Math.min((int) Math.ceil(calcDistributeMetric(vds, vm, effectiveCpuCores)), MaxSchedulerWeight); - } - return score; - } - - @Override - public List<Pair<Guid, Integer>> score(List<VDS> hosts, VM vm, Map<String, String> parameters) { - VDSGroup vdsGroup = DbFacade.getInstance().getVdsGroupDao().get(hosts.get(0).getVdsGroupId()); - boolean countThreadsAsCores = vdsGroup != null ? vdsGroup.getCountThreadsAsCores() : false; - List<Pair<Guid, Integer>> scores = new ArrayList<Pair<Guid, Integer>>(); - for (VDS vds : hosts) { - scores.add(new Pair<Guid, Integer>(vds.getId(), calcEvenDistributionScore(vds, vm, countThreadsAsCores))); - } - return scores; - } - @Override public Pair<List<Guid>, Guid> balance(VDSGroup cluster, diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionWeightPolicyUnit.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionWeightPolicyUnit.java new file mode 100644 index 0000000..a549a3d --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionWeightPolicyUnit.java @@ -0,0 +1,66 @@ +package org.ovirt.engine.core.bll.scheduling.policyunits; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.ovirt.engine.core.bll.scheduling.PolicyUnitImpl; +import org.ovirt.engine.core.bll.scheduling.SlaValidator; +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.businessentities.VdsSpmStatus; +import org.ovirt.engine.core.common.config.Config; +import org.ovirt.engine.core.common.config.ConfigValues; +import org.ovirt.engine.core.common.scheduling.PolicyUnit; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; + +public class EvenDistributionWeightPolicyUnit extends PolicyUnitImpl { + + public EvenDistributionWeightPolicyUnit(PolicyUnit policyUnit) { + super(policyUnit); + } + + /** + * Calculate a single host weight score according to various parameters. + * @param vds + * @param vm + * @param hostCores - threads/cores according to cluster + * @return + */ + private double calcDistributeMetric(VDS vds, VM vm, int hostCores) { + int vcpu = Config.<Integer> GetValue(ConfigValues.VcpuConsumptionPercentage); + int spmCpu = (vds.getSpmStatus() == VdsSpmStatus.None) ? 0 : Config + .<Integer> GetValue(ConfigValues.SpmVCpuConsumption); + double hostCpu = vds.getUsageCpuPercent(); + double pendingVcpus = vds.getPendingVcpusCount(); + + return (hostCpu / vcpu) + (pendingVcpus + vm.getNumOfCpus() + spmCpu) / hostCores; + } + + protected int calcEvenDistributionScore(VDS vds, VM vm, boolean countThreadsAsCores) { + int score = MaxSchedulerWeight - 1; + Integer effectiveCpuCores = SlaValidator.getEffectiveCpuCores(vds, countThreadsAsCores); + if (effectiveCpuCores != null + && vds.getUsageCpuPercent() != null + && vds.getPendingVcpusCount() != null) { + // round up result, fractions matters + score = Math.min((int) Math.ceil(calcDistributeMetric(vds, vm, effectiveCpuCores)), MaxSchedulerWeight); + } + return score; + } + + @Override + public List<Pair<Guid, Integer>> score(List<VDS> hosts, VM vm, Map<String, String> parameters) { + VDSGroup vdsGroup = DbFacade.getInstance().getVdsGroupDao().get(hosts.get(0).getVdsGroupId()); + boolean countThreadsAsCores = vdsGroup != null ? vdsGroup.getCountThreadsAsCores() : false; + List<Pair<Guid, Integer>> scores = new ArrayList<Pair<Guid, Integer>>(); + for (VDS vds : hosts) { + scores.add(new Pair<Guid, Integer>(vds.getId(), calcEvenDistributionScore(vds, vm, countThreadsAsCores))); + } + return scores; + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NonePolicyUnit.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NoneBalancePolicyUnit.java similarity index 65% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NonePolicyUnit.java rename to backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NoneBalancePolicyUnit.java index 8227895..7785ff1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NonePolicyUnit.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NoneBalancePolicyUnit.java @@ -4,22 +4,17 @@ import java.util.List; import java.util.Map; +import org.ovirt.engine.core.bll.scheduling.PolicyUnitImpl; import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; -import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.common.scheduling.PolicyUnit; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; -public class NonePolicyUnit extends EvenDistributionPolicyUnit { +public class NoneBalancePolicyUnit extends PolicyUnitImpl { - public NonePolicyUnit(PolicyUnit policyUnit) { + public NoneBalancePolicyUnit(PolicyUnit policyUnit) { super(policyUnit); - } - - @Override - public List<Pair<Guid, Integer>> score(List<VDS> hosts, VM vm, Map<String, String> parameters) { - return super.score(hosts, vm, parameters); } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NoneWeightPolicyUnit.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NoneWeightPolicyUnit.java new file mode 100644 index 0000000..8a517e5 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NoneWeightPolicyUnit.java @@ -0,0 +1,23 @@ +package org.ovirt.engine.core.bll.scheduling.policyunits; + +import java.util.List; +import java.util.Map; + +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.scheduling.PolicyUnit; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.compat.Guid; + +public class NoneWeightPolicyUnit extends EvenDistributionWeightPolicyUnit { + + public NoneWeightPolicyUnit(PolicyUnit policyUnit) { + super(policyUnit); + } + + @Override + public List<Pair<Guid, Integer>> score(List<VDS> hosts, VM vm, Map<String, String> parameters) { + return super.score(hosts, vm, parameters); + } + +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingPolicyUnit.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingBalancePolicyUnit.java similarity index 80% rename from backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingPolicyUnit.java rename to backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingBalancePolicyUnit.java index 22337fa..10ffbfa 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingPolicyUnit.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingBalancePolicyUnit.java @@ -9,38 +9,18 @@ import org.ovirt.engine.core.common.businessentities.VDS; import org.ovirt.engine.core.common.businessentities.VDSGroup; -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.PolicyUnit; import org.ovirt.engine.core.common.utils.Pair; import org.ovirt.engine.core.compat.Guid; -import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.utils.linq.LinqUtils; import org.ovirt.engine.core.utils.linq.Predicate; -public class PowerSavingPolicyUnit extends EvenDistributionPolicyUnit { +public class PowerSavingBalancePolicyUnit extends EvenDistributionBalancePolicyUnit { - public PowerSavingPolicyUnit(PolicyUnit policyUnit) { + public PowerSavingBalancePolicyUnit(PolicyUnit policyUnit) { super(policyUnit); - } - - @Override - public List<Pair<Guid, Integer>> score(List<VDS> hosts, VM vm, Map<String, String> parameters) { - VDSGroup vdsGroup = null; - List<Pair<Guid, Integer>> scores = new ArrayList<Pair<Guid, Integer>>(); - for (VDS vds : hosts) { - int score = MaxSchedulerWeight - 1; - if (vds.getVmCount() > 0) { - if (vdsGroup == null) { - vdsGroup = DbFacade.getInstance().getVdsGroupDao().get(hosts.get(0).getVdsGroupId()); - } - score -= - calcEvenDistributionScore(vds, vm, vdsGroup != null ? vdsGroup.getCountThreadsAsCores() : false); - } - scores.add(new Pair<Guid, Integer>(vds.getId(), score)); - } - return scores; } @Override diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingWeightPolicyUnit.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingWeightPolicyUnit.java new file mode 100644 index 0000000..54b2586 --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingWeightPolicyUnit.java @@ -0,0 +1,38 @@ +package org.ovirt.engine.core.bll.scheduling.policyunits; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.ovirt.engine.core.common.businessentities.VDS; +import org.ovirt.engine.core.common.businessentities.VDSGroup; +import org.ovirt.engine.core.common.businessentities.VM; +import org.ovirt.engine.core.common.scheduling.PolicyUnit; +import org.ovirt.engine.core.common.utils.Pair; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dal.dbbroker.DbFacade; + +public class PowerSavingWeightPolicyUnit extends EvenDistributionWeightPolicyUnit { + + public PowerSavingWeightPolicyUnit(PolicyUnit policyUnit) { + super(policyUnit); + } + + @Override + public List<Pair<Guid, Integer>> score(List<VDS> hosts, VM vm, Map<String, String> parameters) { + VDSGroup vdsGroup = null; + List<Pair<Guid, Integer>> scores = new ArrayList<Pair<Guid, Integer>>(); + for (VDS vds : hosts) { + int score = MaxSchedulerWeight - 1; + if (vds.getVmCount() > 0) { + if (vdsGroup == null) { + vdsGroup = DbFacade.getInstance().getVdsGroupDao().get(hosts.get(0).getVdsGroupId()); + } + score -= + calcEvenDistributionScore(vds, vm, vdsGroup != null ? vdsGroup.getCountThreadsAsCores() : false); + } + scores.add(new Pair<Guid, Integer>(vds.getId(), score)); + } + return scores; + } +} -- To view, visit http://gerrit.ovirt.org/18561 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Id25cd653246e14a109b08d91adfb12ceccc505b4 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: ovirt-engine-3.3 Gerrit-Owner: Gilad Chaplik <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
