diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-08-18 13:16:59 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-08-18 13:16:59 +0200 |
commit | 4f1437c35a6adbb5df26c3372bba5f32c3cdf882 (patch) | |
tree | 13e1d495343cf52e55b1ec7d19d3af6ddf803d09 /container-search | |
parent | 008827e05bef46027d54d33e01e597e45d9435e8 (diff) |
Handle single group
Diffstat (limited to 'container-search')
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/dispatch/SearchCluster.java | 27 | ||||
-rw-r--r-- | container-search/src/test/java/com/yahoo/prelude/fastsearch/test/DirectSearchTestCase.java | 34 |
2 files changed, 38 insertions, 23 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/SearchCluster.java b/container-search/src/main/java/com/yahoo/search/dispatch/SearchCluster.java index ff0d420027f..05c27c6ca86 100644 --- a/container-search/src/main/java/com/yahoo/search/dispatch/SearchCluster.java +++ b/container-search/src/main/java/com/yahoo/search/dispatch/SearchCluster.java @@ -131,19 +131,22 @@ public class SearchCluster implements NodeManager<SearchCluster.Node> { // Update active documents per group and use it to decide if the group should be active for (Group group : groups.values()) group.aggregateActiveDocuments(); - for (Group currentGroup : groups.values()) { - long sumOfAactiveDocumentsInOtherGroups = 0; - for (Group otherGroup : groups.values()) - if ( otherGroup != currentGroup) - sumOfAactiveDocumentsInOtherGroups += otherGroup.getActiveDocuments(); - long averageDocumentsInOtherGroups = sumOfAactiveDocumentsInOtherGroups / (groups.size() - 1); - if (averageDocumentsInOtherGroups == 0) - currentGroup.setHasSufficientCoverage(true); // no information about any group; assume coverage - else - currentGroup.setHasSufficientCoverage( - 100 * (double)currentGroup.getActiveDocuments() / averageDocumentsInOtherGroups > minActivedocsCoveragePercentage); + if (groups.size() == 1) { + groups.values().iterator().next().setHasSufficientCoverage(true); // by definition + } else { + for (Group currentGroup : groups.values()) { + long sumOfAactiveDocumentsInOtherGroups = 0; + for (Group otherGroup : groups.values()) + if (otherGroup != currentGroup) + sumOfAactiveDocumentsInOtherGroups += otherGroup.getActiveDocuments(); + long averageDocumentsInOtherGroups = sumOfAactiveDocumentsInOtherGroups / (groups.size() - 1); + if (averageDocumentsInOtherGroups == 0) + currentGroup.setHasSufficientCoverage(true); // no information about any group; assume coverage + else + currentGroup.setHasSufficientCoverage( + 100 * (double) currentGroup.getActiveDocuments() / averageDocumentsInOtherGroups > minActivedocsCoveragePercentage); + } } - } private Pong getPong(FutureTask<Pong> futurePong, Node node) { diff --git a/container-search/src/test/java/com/yahoo/prelude/fastsearch/test/DirectSearchTestCase.java b/container-search/src/test/java/com/yahoo/prelude/fastsearch/test/DirectSearchTestCase.java index 7cf765eda9e..740639650e2 100644 --- a/container-search/src/test/java/com/yahoo/prelude/fastsearch/test/DirectSearchTestCase.java +++ b/container-search/src/test/java/com/yahoo/prelude/fastsearch/test/DirectSearchTestCase.java @@ -65,41 +65,53 @@ public class DirectSearchTestCase { tester.search("?query=test&dispatch.direct=true&nocache"); assertEquals("2 ping requests, 1 search request", 3, tester.requestCount(FastSearcherTester.selfHostname, 9999)); } - + @Test public void testNoDirectDispatchWhenInsufficientCoverage() { - FastSearcherTester tester = new FastSearcherTester(3, - FastSearcherTester.selfHostname + ":9999:0", + FastSearcherTester tester = new FastSearcherTester(3, + FastSearcherTester.selfHostname + ":9999:0", "host1:9999:1", "host2:9999:2"); double k = 38.78955; // multiply all document counts by some number > 1 to test that we compute % correctly - - tester.setActiveDocuments(FastSearcherTester.selfHostname, (long)(96 * k)); - tester.setActiveDocuments("host1", (long)(100 * k)); - tester.setActiveDocuments("host2", (long)(100 * k)); + + tester.setActiveDocuments(FastSearcherTester.selfHostname, (long) (96 * k)); + tester.setActiveDocuments("host1", (long) (100 * k)); + tester.setActiveDocuments("host2", (long) (100 * k)); assertEquals("1 ping request, 0 search requests", 1, tester.requestCount(FastSearcherTester.selfHostname, 9999)); tester.search("?query=test&dispatch.direct=true&nocache"); - assertEquals("Still 1 ping request, 0 search requests because the default coverage is 97%, and we only have 96% locally", + assertEquals("Still 1 ping request, 0 search requests because the default coverage is 97%, and we only have 96% locally", 1, tester.requestCount(FastSearcherTester.selfHostname, 9999)); - tester.setActiveDocuments(FastSearcherTester.selfHostname, (long)(99 * k)); + tester.setActiveDocuments(FastSearcherTester.selfHostname, (long) (99 * k)); assertEquals("2 ping request, 0 search requests", 2, tester.requestCount(FastSearcherTester.selfHostname, 9999)); tester.search("?query=test&dispatch.direct=true&nocache"); assertEquals("2 ping request, 1 search requests because we now have 99% locally", 3, tester.requestCount(FastSearcherTester.selfHostname, 9999)); - tester.setActiveDocuments("host1", (long)(104 * k)); + tester.setActiveDocuments("host1", (long) (104 * k)); assertEquals("2 ping request, 1 search requests", 3, tester.requestCount(FastSearcherTester.selfHostname, 9999)); tester.search("?query=test&dispatch.direct=true&nocache"); assertEquals("2 ping request, 2 search requests because 99/((104+100)/2) > 0.97", 4, tester.requestCount(FastSearcherTester.selfHostname, 9999)); - tester.setActiveDocuments("host2", (long)(102 * k)); + tester.setActiveDocuments("host2", (long) (102 * k)); assertEquals("2 ping request, 2 search requests", 4, tester.requestCount(FastSearcherTester.selfHostname, 9999)); tester.search("?query=test&dispatch.direct=true&nocache"); assertEquals("Still 2 ping request, 2 search requests because 99/((104+102)/2) < 0.97", 4, tester.requestCount(FastSearcherTester.selfHostname, 9999)); } + @Test + public void testCoverageWithSingleGroup() { + FastSearcherTester tester = new FastSearcherTester(1, FastSearcherTester.selfHostname + ":9999:0"); + + tester.setActiveDocuments(FastSearcherTester.selfHostname, 100); + assertEquals("1 ping request, 0 search requests", 1, tester.requestCount(FastSearcherTester.selfHostname, 9999)); + tester.search("?query=test&dispatch.direct=true&nocache"); + assertEquals("1 ping request, 0 search requests", + 2, tester.requestCount(FastSearcherTester.selfHostname, 9999)); + + } + } |