diff options
-rw-r--r-- | container-core/src/main/java/com/yahoo/container/handler/VipStatus.java | 4 | ||||
-rw-r--r-- | container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/SearchCluster.java | 17 |
2 files changed, 12 insertions, 9 deletions
diff --git a/container-core/src/main/java/com/yahoo/container/handler/VipStatus.java b/container-core/src/main/java/com/yahoo/container/handler/VipStatus.java index 6f827041ffb..b9ef1627ce7 100644 --- a/container-core/src/main/java/com/yahoo/container/handler/VipStatus.java +++ b/container-core/src/main/java/com/yahoo/container/handler/VipStatus.java @@ -117,7 +117,9 @@ public class VipStatus { /** Returns whether this container should receive traffic at this time */ public boolean isInRotation() { - return currentlyInRotation; + synchronized (mutex) { + return currentlyInRotation; + } } } 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 dc35ebdc65f..833147e1a56 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 @@ -223,14 +223,15 @@ 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 - if (usesDirectDispatchTo(group) && sufficientCoverage != group.hasSufficientCoverage()) { - if (sufficientCoverage) { - vipStatus.addToRotation(clusterId); - } else { - vipStatus.removeFromRotation(clusterId); - } - } + boolean isInRotation = vipStatus.isInRotation(); + boolean hasChanged = sufficientCoverage != group.hasSufficientCoverage(); + boolean isDirectDispatchGroupAndChange = usesDirectDispatchTo(group) && hasChanged; group.setHasSufficientCoverage(sufficientCoverage); + if ((!isInRotation || isDirectDispatchGroupAndChange) && sufficientCoverage) { + vipStatus.addToRotation(clusterId); + } else if (isDirectDispatchGroupAndChange && ! sufficientCoverage) { + vipStatus.removeFromRotation(clusterId); + } } private boolean usesDirectDispatchTo(Node node) { @@ -373,7 +374,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, |