summaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/SearchCluster.java
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2021-05-10 17:05:20 +0200
committerGitHub <noreply@github.com>2021-05-10 17:05:20 +0200
commitc05117e4ff37ede9550a7ddc1bfc330795268194 (patch)
tree5342e2e7f4ecdd0611993ddf9f51803042db9de2 /container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/SearchCluster.java
parent22b4ff81bd1cb4ce254fcf0150088e628d281688 (diff)
Revert "Don't consider number of working nodes in coverage"
Diffstat (limited to 'container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/SearchCluster.java')
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/SearchCluster.java26
1 files changed, 21 insertions, 5 deletions
diff --git a/container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/SearchCluster.java b/container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/SearchCluster.java
index 159a42676ec..ce834b108db 100644
--- a/container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/SearchCluster.java
+++ b/container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/SearchCluster.java
@@ -311,17 +311,19 @@ public class SearchCluster implements NodeManager<Node> {
// With just one group sufficient coverage may not be the same as full coverage, as the
// group will always be marked sufficient for use.
updateSufficientCoverage(group, true);
- boolean sufficientCoverage = isGroupCoverageSufficient(group.getActiveDocuments(),
+ boolean sufficientCoverage = isGroupCoverageSufficient(group.workingNodes(),
+ group.getActiveDocuments(),
group.getActiveDocuments());
trackGroupCoverageChanges(group, sufficientCoverage, group.getActiveDocuments());
}
private void pingIterationCompletedMultipleGroups() {
- orderedGroups().forEach(Group::aggregateNodeValues);
+ aggregateNodeValues();
long medianDocuments = medianDocumentsPerGroup();
boolean anyGroupsSufficientCoverage = false;
for (Group group : orderedGroups()) {
- boolean sufficientCoverage = isGroupCoverageSufficient(group.getActiveDocuments(),
+ boolean sufficientCoverage = isGroupCoverageSufficient(group.workingNodes(),
+ group.getActiveDocuments(),
medianDocuments);
anyGroupsSufficientCoverage = anyGroupsSufficientCoverage || sufficientCoverage;
updateSufficientCoverage(group, sufficientCoverage);
@@ -329,6 +331,10 @@ public class SearchCluster implements NodeManager<Node> {
}
}
+ private void aggregateNodeValues() {
+ orderedGroups().forEach(Group::aggregateNodeValues);
+ }
+
private long medianDocumentsPerGroup() {
if (orderedGroups().isEmpty()) return 0;
var activeDocuments = orderedGroups().stream().map(Group::getActiveDocuments).collect(Collectors.toList());
@@ -350,13 +356,23 @@ public class SearchCluster implements NodeManager<Node> {
}
}
- private boolean isGroupCoverageSufficient(long activeDocuments, long medianDocuments) {
+ private boolean isGroupCoverageSufficient(int workingNodesInGroup, long activeDocuments, long medianDocuments) {
double documentCoverage = 100.0 * (double) activeDocuments / medianDocuments;
if (medianDocuments > 0 && documentCoverage < dispatchConfig.minActivedocsPercentage())
return false;
+
+ if ( ! isGroupNodeCoverageSufficient(workingNodesInGroup))
+ return false;
+
return true;
}
+ private boolean isGroupNodeCoverageSufficient(int workingNodesInGroup) {
+ int nodesAllowedDown = dispatchConfig.maxNodesDownPerGroup()
+ + (int) (((double) wantedGroupSize() * (100.0 - dispatchConfig.minGroupCoverage())) / 100.0);
+ return workingNodesInGroup + nodesAllowedDown >= wantedGroupSize();
+ }
+
public boolean isGroupWellBalanced(OptionalInt groupId) {
if (groupId.isEmpty()) return false;
Group group = groups().get(groupId.getAsInt());
@@ -370,7 +386,7 @@ public class SearchCluster implements NodeManager<Node> {
if (orderedGroups().size() == 1)
return nodes.size() >= wantedGroupSize() - dispatchConfig.maxNodesDownPerGroup();
long activeDocuments = nodes.stream().mapToLong(Node::getActiveDocuments).sum();
- return isGroupCoverageSufficient(activeDocuments, medianDocumentsPerGroup());
+ return isGroupCoverageSufficient(nodes.size(), activeDocuments, medianDocumentsPerGroup());
}
private void trackGroupCoverageChanges(Group group, boolean fullCoverage, long medianDocuments) {