package org.ovirt.engine.core.bll;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.ovirt.engine.core.common.businessentities.VDSGroup;
import org.ovirt.engine.core.common.businessentities.VdsSelectionAlgorithm;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.compat.LogCompat;
import org.ovirt.engine.core.compat.LogFactoryCompat;
import org.ovirt.engine.core.dal.dbbroker.DbFacade;
import org.ovirt.engine.core.utils.timer.OnTimerMethodAnnotation;
import org.ovirt.engine.core.utils.timer.SchedulerUtilQuartzImpl;
/**
* This class responcible to perform periodically load balancing of servers Its
* activated only if load balancing enabled by configuration.
*/
public final class VdsLoadBalancer {
private static LogCompat log = LogFactoryCompat.getLog(VdsLoadBalancer.class);
private static VdsLoadBalancer instance = new VdsLoadBalancer();
private VdsLoadBalancer() {
}
@OnTimerMethodAnnotation("PerformLoadBalancing")
public void PerformLoadBalancing() {
log.debugFormat("VdsLoadBalancer: Load Balancer timer entered.");
// get all clusters
List<VDSGroup> groups = DbFacade.getInstance().getVdsGroupDAO().getAll();
for (VDSGroup group : groups) {
if (group.getselection_algorithm() != VdsSelectionAlgorithm.None) {
VdsLoadBalancingAlgorithm loadBalancingAlgorithm = VdsLoadBalancingAlgorithm
.CreateVdsLoadBalancingAlgorithm(group);
log.infoFormat("VdsLoadBalancer: Starting load balance for cluster: {0}, algorithm: {1}.",
group.getname(), group.getselection_algorithm().toString());
log.infoFormat("VdsLoadBalancer: high util: {0}, low util: {1}, duration: {2}, threashold: {3}",
group.gethigh_utilization(), group.getlow_utilization(),
group.getcpu_over_commit_duration_minutes(),
Config.<Integer> GetValue(ConfigValues.UtilizationThresholdInPercent));
loadBalancingAlgorithm.LoadBalance();
} else {
log.debugFormat("VdsLoadBalancer: Cluster {0} skipped because no selection algorithm selected.",
group.getname());
}
}
}
public static void EnableLoadBalancer() {
SchedulerUtilQuartzImpl.getInstance().scheduleAFixedDelayJob(instance, "PerformLoadBalancing", new Class[] {},
new Object[] {}, Config.<Integer> GetValue(ConfigValues.VdsLoadBalancingeIntervalInMinutes),
Config.<Integer> GetValue(ConfigValues.VdsLoadBalancingeIntervalInMinutes), TimeUnit.MINUTES);
}
}