aboutsummaryrefslogtreecommitdiffstats
path: root/container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/SearchCluster.java
diff options
context:
space:
mode:
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.java44
1 files changed, 21 insertions, 23 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 85cc16ade6f..3657e0b5c76 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
@@ -186,11 +186,17 @@ public class SearchCluster implements NodeManager<Node> {
}
/**
+ * Returns the nodes of this cluster as an immutable map indexed by host.
+ * One host may contain multiple nodes (on different ports), so this is a multi-map.
+ */
+ public ImmutableMultimap<String, Node> nodesByHost() { return nodesByHost; }
+
+ /**
* Returns the recipient we should dispatch queries directly to (bypassing fdispatch),
* or empty if we should not dispatch directly.
*/
public Optional<Node> directDispatchTarget() {
- if ( directDispatchTarget.isEmpty()) return Optional.empty();
+ if ( ! directDispatchTarget.isPresent()) return Optional.empty();
// Only use direct dispatch if the local group has sufficient coverage
Group localSearchGroup = groups.get(directDispatchTarget.get().group());
@@ -223,26 +229,24 @@ public class SearchCluster implements NodeManager<Node> {
private void updateSufficientCoverage(Group group, boolean sufficientCoverage) {
// update VIP status if we direct dispatch to this group and coverage status changed
- boolean isInRotation = vipStatus.isInRotation();
- boolean hasChanged = sufficientCoverage != group.hasSufficientCoverage();
- boolean isDirectDispatchGroupAndChange = usesDirectDispatchTo(group) && hasChanged;
- group.setHasSufficientCoverage(sufficientCoverage);
- if ((!isInRotation || isDirectDispatchGroupAndChange) && sufficientCoverage) {
- // We will set this cluster in rotation if
- // - not already in rotation and one group has sufficient coverage.
- vipStatus.addToRotation(clusterId);
- } else if (isDirectDispatchGroupAndChange) {
- // We will take it out of rotation if the group is mandatory (direct dispatch to this group)
- vipStatus.removeFromRotation(clusterId);
+ if (usesDirectDispatchTo(group) && sufficientCoverage != group.hasSufficientCoverage()) {
+ if (sufficientCoverage) {
+ vipStatus.addToRotation(clusterId);
+ } else {
+ vipStatus.removeFromRotation(clusterId);
+ }
}
+ group.setHasSufficientCoverage(sufficientCoverage);
}
private boolean usesDirectDispatchTo(Node node) {
- return directDispatchTarget.isPresent() && directDispatchTarget.get().equals(node);
+ if ( ! directDispatchTarget.isPresent()) return false;
+ return directDispatchTarget.get().equals(node);
}
private boolean usesDirectDispatchTo(Group group) {
- return directDispatchTarget.isPresent() && directDispatchTarget.get().group() == group.id();
+ if ( ! directDispatchTarget.isPresent()) return false;
+ return directDispatchTarget.get().group() == group.id();
}
/** Used by the cluster monitor to manage node status */
@@ -296,21 +300,15 @@ public class SearchCluster implements NodeManager<Node> {
sumOfActiveDocuments += activeDocumentsInGroup[i];
}
- boolean anyGroupsSufficientCoverage = false;
for (int i = 0; i < numGroups; i++) {
Group group = orderedGroups.get(i);
long activeDocuments = activeDocumentsInGroup[i];
long averageDocumentsInOtherGroups = (sumOfActiveDocuments - activeDocuments) / (numGroups - 1);
- boolean sufficientCoverage = isGroupCoverageSufficient(group.workingNodes(), group.nodes().size(), activeDocuments, averageDocumentsInOtherGroups);
- anyGroupsSufficientCoverage = anyGroupsSufficientCoverage || sufficientCoverage;
+ boolean sufficientCoverage = isGroupCoverageSufficient(group.workingNodes(), group.nodes().size(), activeDocuments,
+ averageDocumentsInOtherGroups);
updateSufficientCoverage(group, sufficientCoverage);
trackGroupCoverageChanges(i, group, sufficientCoverage, averageDocumentsInOtherGroups);
}
- if ( ! anyGroupsSufficientCoverage && (sumOfActiveDocuments == 0)) {
- // If no groups have sufficient coverage (0 might be sufficient)
- // and there are no documents in any groups, then we are down.
- vipStatus.removeFromRotation(clusterId);
- }
}
private boolean isGroupCoverageSufficient(int workingNodes, int nodesInGroup, long activeDocuments, long averageDocumentsInOtherGroups) {
@@ -383,7 +381,7 @@ public class SearchCluster implements NodeManager<Node> {
private void trackGroupCoverageChanges(int index, Group group, boolean fullCoverage, long averageDocuments) {
boolean changed = group.isFullCoverageStatusChanged(fullCoverage);
- if (changed) {
+ if(changed) {
int requiredNodes = groupSize() - dispatchConfig.maxNodesDownPerGroup();
if (fullCoverage) {
log.info(() -> String.format("Group %d is now good again (%d/%d active docs, coverage %d/%d)", index,