aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-06-30 12:20:00 +0200
committerGitHub <noreply@github.com>2021-06-30 12:20:00 +0200
commit49833295b149f33c97961a56a689b00efc76f24b (patch)
tree4d69f6fb39ffa5649240852c69e21fb4395c2cec
parent391a434d8b7b6789637265ceecdea5e4390d9f6c (diff)
parentbbb2fd3495f7af472820be15f446ac76e4cde63e (diff)
Merge pull request #18476 from vespa-engine/hmusum/well-balanced-content-when-few-docs
Allow deviation of at least 1 document
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/Group.java6
-rw-r--r--container-search/src/test/java/com/yahoo/search/dispatch/searchcluster/SearchClusterCoverageTest.java18
2 files changed, 23 insertions, 1 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/Group.java b/container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/Group.java
index dca5892e0e7..7faad9d51cc 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/Group.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/Group.java
@@ -68,7 +68,7 @@ public class Group {
if (numWorkingNodes > 0) {
long average = activeDocs / numWorkingNodes;
long deviation = nodes.stream().filter(node -> node.isWorking() == Boolean.TRUE).mapToLong(node -> Math.abs(node.getActiveDocuments() - average)).sum();
- boolean isDeviationSmall = deviation <= (activeDocs * MAX_UNBALANCE);
+ boolean isDeviationSmall = deviation <= maxUnbalance(activeDocs);
if ((!isContentWellBalanced.get() || isDeviationSmall != isContentWellBalanced.get()) && (activeDocs > 0)) {
log.info("Content is " + (isDeviationSmall ? "" : "not ") + "well balanced. Current deviation = " + deviation*100/activeDocs + " %" +
". activeDocs = " + activeDocs + ", deviation = " + deviation + ", average = " + average);
@@ -79,6 +79,10 @@ public class Group {
}
}
+ double maxUnbalance(long activeDocs) {
+ return Math.max(1, activeDocs * MAX_UNBALANCE);
+ }
+
/** Returns the active documents on this group. If unknown, 0 is returned. */
long getActiveDocuments() { return activeDocuments.get(); }
diff --git a/container-search/src/test/java/com/yahoo/search/dispatch/searchcluster/SearchClusterCoverageTest.java b/container-search/src/test/java/com/yahoo/search/dispatch/searchcluster/SearchClusterCoverageTest.java
index 65e7173c4ee..c9f7469acbb 100644
--- a/container-search/src/test/java/com/yahoo/search/dispatch/searchcluster/SearchClusterCoverageTest.java
+++ b/container-search/src/test/java/com/yahoo/search/dispatch/searchcluster/SearchClusterCoverageTest.java
@@ -100,4 +100,22 @@ public class SearchClusterCoverageTest {
assertTrue(tester.group(2).hasSufficientCoverage());
}
+ @Test
+ public void one_group_few_docs_has_well_balanced_content() {
+ var tester = new SearchClusterTester(1, 2);
+
+ Node node0 = tester.group(0).nodes().get(0);
+ Node node1 = tester.group(0).nodes().get(1);
+
+ // 1 document
+ node0.setWorking(true);
+ node1.setWorking(true);
+
+ node0.setActiveDocuments(1);
+ node1.setActiveDocuments(0);
+
+ tester.pingIterationCompleted();
+ assertTrue(tester.group(0).isContentWellBalanced());
+ }
+
}