summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/VipStatus.java4
-rw-r--r--container-search/src/main/java/com/yahoo/search/dispatch/searchcluster/SearchCluster.java17
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,