diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2022-08-23 06:42:28 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2022-08-23 06:42:28 +0200 |
commit | 81575e0b094f78b790fd18f70eb625bd99eafcbc (patch) | |
tree | 9509d55adc53a7142012dde6f56098755ba706f7 /container-search/src/main/java/com/yahoo/search | |
parent | 75a23ce01938a38b2c6b29d7f92f8cc5da378a7a (diff) |
Separate the notion of decaying cost from averageSearchTime, which is only needed for testing.
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/dispatch/LoadBalancer.java | 28 | ||||
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/dispatch/RequestDuration.java | 4 |
2 files changed, 17 insertions, 15 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 8736f612fc1..04855bf24ed 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 @@ -96,12 +96,12 @@ public class LoadBalancer { interface Decayer { void decay(RequestDuration duration); - double averageSearchTime(); + double averageCost(); } static class NoDecay implements Decayer { public void decay(RequestDuration duration) {} - public double averageSearchTime() { return MIN_QUERY_TIME; } + public double averageCost() { return MIN_QUERY_TIME; } } private final Group group; @@ -131,12 +131,8 @@ public class LoadBalancer { } } - Duration averageSearchTime() { - return Duration.ofNanos((long)(decayer.averageSearchTime()*1_000_000_000)); - } - - double averageSearchTimeInverse() { - return 1.0 / decayer.averageSearchTime(); + double weight() { + return 1.0 / decayer.averageCost(); } int groupId() { @@ -214,6 +210,8 @@ public class LoadBalancer { private static double toDouble(Duration duration) { return duration.toNanos()/1_000_000_000.0; } + private static Duration fromDouble(double seconds) { return Duration.ofNanos((long)(seconds*1_000_000_000));} + static class DecayByRequests implements GroupStatus.Decayer { private long queries; private double averageSearchTime; @@ -230,7 +228,8 @@ public class LoadBalancer { queries++; averageSearchTime = (searchTime + (decayRate - 1) * averageSearchTime) / decayRate; } - public double averageSearchTime() { return averageSearchTime; } + public double averageCost() { return averageSearchTime; } + Duration averageSearchTime() { return fromDouble(averageSearchTime);} } static class DecayByTime implements GroupStatus.Decayer { @@ -244,13 +243,14 @@ public class LoadBalancer { prev = start; } public void decay(RequestDuration duration) { - double searchTime = Math.max(duration.duration().toMillis()/1000.0, MIN_QUERY_TIME); + double searchTime = Math.max(toDouble(duration.duration()), MIN_QUERY_TIME); double decayRate = LATENCY_DECAY_TIME; - double sampleWeight = Math.min(decayRate/2, toDouble(duration.timeSince(prev))); + double sampleWeight = Math.min(decayRate/2, toDouble(duration.difference(prev))); averageSearchTime = (sampleWeight*searchTime + (decayRate - sampleWeight) * averageSearchTime) / decayRate; prev = duration; } - public double averageSearchTime() { return averageSearchTime; } + public double averageCost() { return averageSearchTime; } + Duration averageSearchTime() { return fromDouble(averageSearchTime);} } public AdaptiveScheduler(Type type, Random random, List<GroupStatus> scoreboard) { @@ -267,7 +267,7 @@ public class LoadBalancer { for (GroupStatus gs : scoreboard) { if (rejected == null || !rejected.contains(gs.group.id())) { if (!requireCoverage || gs.group.hasSufficientCoverage()) { - sum += gs.averageSearchTimeInverse(); + sum += gs.weight(); n++; } } @@ -279,7 +279,7 @@ public class LoadBalancer { for (GroupStatus gs : scoreboard) { if (rejected == null || !rejected.contains(gs.group.id())) { if (!requireCoverage || gs.group.hasSufficientCoverage()) { - accum += gs.averageSearchTimeInverse(); + accum += gs.weight(); if (needle < accum / sum) { return Optional.of(gs); } diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/RequestDuration.java b/container-search/src/main/java/com/yahoo/search/dispatch/RequestDuration.java index ad6b7f4a40c..1206277a103 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/RequestDuration.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/RequestDuration.java @@ -5,6 +5,8 @@ import java.time.Duration; import java.time.Instant; /** + * Contains start and and time. Exposes a duration, and lets you measure the time difference between 2 requests. + * It does use System.nanoTime to get a steady clock. * * @author baldersheim */ @@ -29,7 +31,7 @@ class RequestDuration { Duration duration() { return Duration.ofNanos(endTime - startTime); } - Duration timeSince(RequestDuration prev) { + Duration difference(RequestDuration prev) { return Duration.ofNanos(Math.abs(endTime - prev.endTime)); } static RequestDuration of(Duration duration) { |