aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-08-22 17:03:49 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2022-08-22 17:03:49 +0200
commit75a23ce01938a38b2c6b29d7f92f8cc5da378a7a (patch)
treed82c9f06117f72e0b29b2d777fcd4f0bd1426a08
parent591909a0ceaf0de0d89f2aeb0d60d36dbe2a0a62 (diff)
Cap sampleWeight at 50%
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/LoadBalancer.java2
-rw-r--r--container-search/src/test/java/com/yahoo/search/dispatch/LoadBalancerTest.java15
2 files changed, 12 insertions, 5 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/LoadBalancer.java b/container-search/src/main/java/com/yahoo/search/dispatch/LoadBalancer.java
index 99960be5d65..8736f612fc1 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/LoadBalancer.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/LoadBalancer.java
@@ -246,7 +246,7 @@ public class LoadBalancer {
public void decay(RequestDuration duration) {
double searchTime = Math.max(duration.duration().toMillis()/1000.0, MIN_QUERY_TIME);
double decayRate = LATENCY_DECAY_TIME;
- double sampleWeight = toDouble(duration.timeSince(prev));
+ double sampleWeight = Math.min(decayRate/2, toDouble(duration.timeSince(prev)));
averageSearchTime = (sampleWeight*searchTime + (decayRate - sampleWeight) * averageSearchTime) / decayRate;
prev = duration;
}
diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/LoadBalancerTest.java b/container-search/src/test/java/com/yahoo/search/dispatch/LoadBalancerTest.java
index 1499a4bb324..283c2bc743a 100644
--- a/container-search/src/test/java/com/yahoo/search/dispatch/LoadBalancerTest.java
+++ b/container-search/src/test/java/com/yahoo/search/dispatch/LoadBalancerTest.java
@@ -27,7 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
* @author ollivir
*/
public class LoadBalancerTest {
-
+ private static final double delta = 0.0000001;
@Test
void requireThatLoadBalancerServesSingleNodeSetups() {
Node n1 = new Node(0, "test-node1", 0);
@@ -212,7 +212,6 @@ public class LoadBalancerTest {
@Test
public void requireDecayByTimeToDependOnlyOnTime() {
- double delta = 0.0000001;
GroupStatus.Decayer decayer = new AdaptiveScheduler.DecayByTime(Duration.ofMillis(2), RequestDuration.of(Instant.EPOCH, Duration.ZERO));
assertEquals(0.002, decayer.averageSearchTime(), delta);
decayer.decay(RequestDuration.of(Instant.ofEpochMilli(1000), Duration.ofMillis(10)));
@@ -227,13 +226,21 @@ public class LoadBalancerTest {
assertEquals(0.0059959552, decayer.averageSearchTime(), delta);
decayer.decay(RequestDuration.of(Instant.ofEpochMilli(3000), Duration.ofMillis(10)));
assertEquals(0.006076036096, decayer.averageSearchTime(), delta);
- decayer.decay(RequestDuration.of(Instant.ofEpochMilli(6000), Duration.ofMillis(10)));
- assertEquals(0.0084304144384, decayer.averageSearchTime(), delta);
+ decayer.decay(RequestDuration.of(Instant.ofEpochMilli(5000), Duration.ofMillis(10)));
+ assertEquals(0.0076456216576000005, decayer.averageSearchTime(), delta);
assertEquals(110, countRequestsToReach90p(Duration.ofMillis(100), Duration.ofMillis(10)));
assertEquals(55, countRequestsToReach90p(Duration.ofMillis(200), Duration.ofMillis(10)));
assertEquals(11, countRequestsToReach90p(Duration.ofMillis(1000), Duration.ofMillis(10)));
}
+ @Test
+ public void requireDecayByTimeToNotJumpTooFar() {
+ GroupStatus.Decayer decayer = new AdaptiveScheduler.DecayByTime(Duration.ofMillis(2), RequestDuration.of(Instant.EPOCH, Duration.ZERO));
+ assertEquals(0.002, decayer.averageSearchTime(), delta);
+ decayer.decay(RequestDuration.of(Instant.ofEpochMilli(10000), Duration.ofMillis(10)));
+ assertEquals(0.006, decayer.averageSearchTime(), delta); // Capped at 50% sampleWeight
+ }
+
private static void updateSearchTime(GroupStatus gs, RequestDuration time) {
gs.allocate();
gs.release(true, time);