Gilad Chaplik has uploaded a new change for review.

Change subject: core: pre-defined weight modules
......................................................................

core: pre-defined weight modules

To be compatible with former scheduler.
* none -> should use evenly distributed
* even distribution -> weight will be calculated according
to cpuLoad, is_spm (config), avg vm consumtions (config),
vm's cpu count and host core count.
* power saving -> host with no vm will be less likely to be
selected, other hosts will be sorted (desc) by even distribution logic.

Change-Id: I55cf5014bc472bf1e126a9737829e7fcf7e21853
Signed-off-by: Gilad Chaplik <[email protected]>
---
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/PolicyUnitImpl.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/EvenDistributionPolicyUnit.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/NonePolicyUnit.java
M 
backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/policyunits/PowerSavingPolicyUnit.java
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
M packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
M packaging/etc/engine-config/engine-config.properties
8 files changed, 61 insertions(+), 12 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/60/18560/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 3f46d55..7b13cff 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
@@ -17,6 +17,8 @@
 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.scheduling.PolicyUnitType;
 import org.ovirt.engine.core.common.utils.Pair;
@@ -25,6 +27,8 @@
 import org.ovirt.engine.core.utils.log.LogFactory;
 
 public class PolicyUnitImpl extends PolicyUnit {
+    public static final int MaxSchedulerWeight = Config.<Integer> 
GetValue(ConfigValues.MaxSchedulerWeight);;
+
     public static PolicyUnitImpl getPolicyUnitImpl(PolicyUnit policyUnit) {
         switch (policyUnit.getName()) {
         case "Migration":
diff --git 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java
 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java
index 928b0eb..b384037 100644
--- 
a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java
+++ 
b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/scheduling/SlaValidator.java
@@ -71,14 +71,15 @@
 
     public static Integer getEffectiveCpuCores(VDS vds) {
         VDSGroup vdsGroup = 
DbFacade.getInstance().getVdsGroupDao().get(vds.getVdsGroupId());
+        return getEffectiveCpuCores(vds, vdsGroup != null ? 
vdsGroup.getCountThreadsAsCores() : false);
+    }
 
+    public static Integer getEffectiveCpuCores(VDS vds, boolean 
countThreadsAsCores) {
         if (vds.getCpuThreads() != null
-                && vdsGroup != null
-                && Boolean.TRUE.equals(vdsGroup.getCountThreadsAsCores())) {
+                && countThreadsAsCores) {
             return vds.getCpuThreads();
         } else {
             return vds.getCpuCores();
         }
     }
-
 }
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/EvenDistributionPolicyUnit.java
index b3d0463..0b8974eb 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/EvenDistributionPolicyUnit.java
@@ -33,15 +33,47 @@
         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(), 
vds.getUsageCpuPercent()));
+            scores.add(new Pair<Guid, Integer>(vds.getId(), 
calcEvenDistributionScore(vds, vm, countThreadsAsCores)));
         }
         return scores;
     }
 
+
     @Override
     public Pair<List<Guid>, Guid> balance(VDSGroup cluster,
             List<VDS> hosts,
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/NonePolicyUnit.java
index 95d2a0c..8227895 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/NonePolicyUnit.java
@@ -4,7 +4,6 @@
 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;
@@ -12,7 +11,7 @@
 import org.ovirt.engine.core.common.utils.Pair;
 import org.ovirt.engine.core.compat.Guid;
 
-public class NonePolicyUnit extends PolicyUnitImpl {
+public class NonePolicyUnit extends EvenDistributionPolicyUnit {
 
     public NonePolicyUnit(PolicyUnit policyUnit) {
         super(policyUnit);
@@ -20,11 +19,7 @@
 
     @Override
     public List<Pair<Guid, Integer>> score(List<VDS> hosts, VM vm, Map<String, 
String> parameters) {
-        List<Pair<Guid, Integer>> list = new ArrayList<Pair<Guid, Integer>>();
-        for (VDS host : hosts) {
-            list.add(new Pair<Guid, Integer>(host.getId(), 1));
-        }
-        return list;
+        return super.score(hosts, vm, parameters);
     }
 
     @Override
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/PowerSavingPolicyUnit.java
index b8ba2aa..22337fa 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/PowerSavingPolicyUnit.java
@@ -15,6 +15,7 @@
 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;
 
@@ -26,9 +27,18 @@
 
     @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) {
-            scores.add(new Pair<Guid, Integer>(vds.getId(), 100 - 
vds.getUsageCpuPercent()));
+            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;
     }
diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
index 139fb45..000192a 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/config/ConfigValues.java
@@ -1465,6 +1465,10 @@
     @DefaultValueAttribute("false")
     ExternalSchedulerEnabled(534),
 
+    @TypeConverterAttribute(Integer.class)
+    @DefaultValueAttribute("1000")
+    MaxSchedulerWeight(535),
+
     Invalid(65535);
 
     private int intValue;
diff --git a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql 
b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
index 9590bee..a66b4ff 100644
--- a/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
+++ b/packaging/dbscripts/upgrade/pre_upgrade/0000_config.sql
@@ -358,6 +358,7 @@
 select fn_db_add_config_value('GlusterFsStorageEnabled','false','3.1');
 select fn_db_add_config_value('GlusterFsStorageEnabled','false','3.2');
 select fn_db_add_config_value('GlusterFsStorageEnabled','true','3.3');
+select fn_db_add_config_value('MaxSchedulerWeight','1000','general');
 select fn_db_add_config_value('MTUOverrideSupported','false','3.0');
 select fn_db_add_config_value('MTUOverrideSupported','true','3.1');
 select fn_db_add_config_value('MTUOverrideSupported','true','3.2');
diff --git a/packaging/etc/engine-config/engine-config.properties 
b/packaging/etc/engine-config/engine-config.properties
index 6fcfea0..d399ae3 100644
--- a/packaging/etc/engine-config/engine-config.properties
+++ b/packaging/etc/engine-config/engine-config.properties
@@ -69,6 +69,8 @@
 MaxNumOfVmSockets.type=Integer
 MaxRerunVmOnVdsCount.description="Max Virtual Machine Rerun Attempts on a Host"
 MaxRerunVmOnVdsCount.type=Integer
+MaxSchedulerWeight.description="Max weight score for a single scheduler weight 
module"
+MaxSchedulerWeight.type=Integer
 MaxStorageVdsDelayCheckSec.description="Max delay for check of domain in 
seconds"
 MaxStorageVdsDelayCheckSec.type=Integer
 MaxStorageVdsTimeoutCheckSec.description="Max timeout for last check of domain 
in seconds"


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I55cf5014bc472bf1e126a9737829e7fcf7e21853
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

Reply via email to