diff --git a/container/tomcat/src/main/java/org/jboss/modcluster/container/tomcat/ModClusterListener.java b/container/tomcat/src/main/java/org/jboss/modcluster/container/tomcat/ModClusterListener.java index f1617c5c5..4c0336b4d 100644 --- a/container/tomcat/src/main/java/org/jboss/modcluster/container/tomcat/ModClusterListener.java +++ b/container/tomcat/src/main/java/org/jboss/modcluster/container/tomcat/ModClusterListener.java @@ -73,6 +73,7 @@ public class ModClusterListener extends ModClusterConfig implements TomcatConnec private float decayFactor = DynamicLoadBalanceFactorProvider.DEFAULT_DECAY_FACTOR; private int history = DynamicLoadBalanceFactorProvider.DEFAULT_HISTORY; private double capacity = LoadMetric.DEFAULT_CAPACITY; + private boolean rampUp = false; public ModClusterListener() { ModClusterService service = new ModClusterService(this, this); @@ -102,7 +103,7 @@ public LoadMetric run() { metric.setCapacity(this.capacity); - DynamicLoadBalanceFactorProvider provider = new DynamicLoadBalanceFactorProvider(Collections.singleton(metric)); + DynamicLoadBalanceFactorProvider provider = new DynamicLoadBalanceFactorProvider(Collections.singleton(metric), rampUp); provider.setDecayFactor(this.decayFactor); provider.setHistory(this.history); @@ -254,6 +255,14 @@ public void setLoadMetricCapacity(String capacity) { this.capacity = Double.parseDouble(capacity); } + public boolean isRampUp() { + return rampUp; + } + + public void setRampUp(boolean rampUp) { + this.rampUp = rampUp; + } + // ---------------------------------------- ModClusterServiceMBean ---------------------------------------- @Override diff --git a/core/src/main/java/org/jboss/modcluster/load/impl/DynamicLoadBalanceFactorProvider.java b/core/src/main/java/org/jboss/modcluster/load/impl/DynamicLoadBalanceFactorProvider.java index 5e3a1e67b..54e91ddbd 100755 --- a/core/src/main/java/org/jboss/modcluster/load/impl/DynamicLoadBalanceFactorProvider.java +++ b/core/src/main/java/org/jboss/modcluster/load/impl/DynamicLoadBalanceFactorProvider.java @@ -51,8 +51,19 @@ public class DynamicLoadBalanceFactorProvider implements LoadBalanceFactorProvid private volatile int history = DEFAULT_HISTORY; public DynamicLoadBalanceFactorProvider(Set metrics) { + this(metrics, false); + } + + public DynamicLoadBalanceFactorProvider(Set metrics, boolean rampUp) { for (LoadMetric metric : metrics) { - this.loadHistory.put(metric, new ArrayList(this.history + 1)); + ArrayList history = new ArrayList<>(this.history + 1); + if (rampUp) { + // If ramping up is enabled pre-populate the list with *full* load + for (int i = 0; i < this.history; i++) { + history.add(0d); + } + } + this.loadHistory.put(metric, history); } } diff --git a/core/src/test/java/org/jboss/modcluster/load/impl/DynamicLoadBalanceFactorProviderTest.java b/core/src/test/java/org/jboss/modcluster/load/impl/DynamicLoadBalanceFactorProviderTest.java index 512fbbcac..5018903a2 100644 --- a/core/src/test/java/org/jboss/modcluster/load/impl/DynamicLoadBalanceFactorProviderTest.java +++ b/core/src/test/java/org/jboss/modcluster/load/impl/DynamicLoadBalanceFactorProviderTest.java @@ -75,4 +75,27 @@ public void getLoadBalanceFactorWithFloatDecayFactor() throws Exception { assertEquals(64, provider.getLoadBalanceFactor(engine)); // 100-(0.3*100/1.5+0.4*100)/(100/1.5+100)*100 = 64 assertEquals(57, provider.getLoadBalanceFactor(engine)); // 100-(0.3*100/(1.5^2)+0.4*100/1.5+0.5*100)/(100/(1.5^2)+100/1.5+100)*100 = 57.3684 } + + @Test + public void getLoadBalanceFactorRampUpTime() throws Exception { + Engine engine = mock(Engine.class); + + Set metrics = new HashSet<>(); + LoadMetric metric = mock(LoadMetric.class); + when(metric.getWeight()).thenReturn(LoadMetric.DEFAULT_WEIGHT); + when(metric.getCapacity()).thenReturn(LoadMetric.DEFAULT_CAPACITY); + when(metric.getLoad(engine)).thenReturn(1d); + metrics.add(metric); + + DynamicLoadBalanceFactorProvider provider = new DynamicLoadBalanceFactorProvider(metrics, true); + provider.setHistory(3); + provider.setDecayFactor(1f); + + assertEquals(75, provider.getLoadBalanceFactor(engine)); + assertEquals(50, provider.getLoadBalanceFactor(engine)); + assertEquals(25, provider.getLoadBalanceFactor(engine)); + assertEquals(1, provider.getLoadBalanceFactor(engine)); + assertEquals(1, provider.getLoadBalanceFactor(engine)); + } + }