summaryrefslogtreecommitdiffstats
path: root/container-core
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@verizonmedia.com>2020-03-30 23:11:29 +0200
committerJon Bratseth <bratseth@verizonmedia.com>2020-03-30 23:12:29 +0200
commit5f20981c68ea4afbd25c57e7e46eac6c60ff9ab3 (patch)
treee029232b48df96db979faf69715625fb62f8b421 /container-core
parentc90c9ac78a1dc2422525b801d4b22faa251d7c5d (diff)
Configure initially out of rotation for config servers
Diffstat (limited to 'container-core')
-rw-r--r--container-core/src/main/java/com/yahoo/container/handler/VipStatus.java25
-rw-r--r--container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java68
2 files changed, 67 insertions, 26 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 f712690efc5..bece18a1166 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
@@ -24,6 +24,8 @@ public class VipStatus {
/** If this is non-null, its value decides whether this container is in rotation */
private Boolean rotationOverride = null;
+ private final boolean initiallyInRotation;
+
/** The current state of this */
private boolean currentlyInRotation;
@@ -44,20 +46,30 @@ public class VipStatus {
this(new QrSearchersConfig.Builder().build(), clustersStatus);
}
+ /** For testing */
public VipStatus(QrSearchersConfig dispatchers, ClustersStatus clustersStatus) {
- this(dispatchers, clustersStatus, new StateMonitor());
+ this(dispatchers, new VipStatusConfig.Builder().build(), clustersStatus, new StateMonitor());
}
@Inject
- public VipStatus(QrSearchersConfig dispatchers, ClustersStatus clustersStatus, StateMonitor healthState) {
+ public VipStatus(QrSearchersConfig dispatchers,
+ VipStatusConfig vipStatusConfig,
+ ClustersStatus clustersStatus,
+ StateMonitor healthState) {
this.clustersStatus = clustersStatus;
this.healthState = healthState;
+ initiallyInRotation = vipStatusConfig.initiallyInRotation();
healthState.status(StateMonitor.Status.initializing);
clustersStatus.setContainerHasClusters(! dispatchers.searchcluster().isEmpty());
updateCurrentlyInRotation();
}
- /** @deprecated don't pass VipStatusConfig */
+ @Deprecated // TODO: Remove on Vespa 8
+ @Inject
+ public VipStatus(QrSearchersConfig dispatchers, ClustersStatus clustersStatus, StateMonitor healthState) {
+ this(dispatchers, new VipStatusConfig.Builder().build(), clustersStatus, healthState);
+ }
+
@Deprecated // TODO: Remove on Vespa 8
public VipStatus(QrSearchersConfig dispatchers, VipStatusConfig ignored, ClustersStatus clustersStatus) {
this(dispatchers, clustersStatus);
@@ -107,7 +119,12 @@ public class VipStatus {
} else {
if (healthState.status() == StateMonitor.Status.up) {
currentlyInRotation = clustersStatus.containerShouldReceiveTraffic(ClustersStatus.Require.ONE);
- } else {
+ }
+ else if (healthState.status() == StateMonitor.Status.initializing) {
+ currentlyInRotation = clustersStatus.containerShouldReceiveTraffic(ClustersStatus.Require.ALL)
+ && initiallyInRotation;
+ }
+ else {
currentlyInRotation = clustersStatus.containerShouldReceiveTraffic(ClustersStatus.Require.ALL);
}
}
diff --git a/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java b/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java
index d3479936544..e13debcddda 100644
--- a/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java
+++ b/container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java
@@ -4,6 +4,7 @@ package com.yahoo.container.handler;
import static org.junit.Assert.*;
import com.yahoo.container.QrSearchersConfig;
+import com.yahoo.container.core.VipStatusConfig;
import com.yahoo.container.jdisc.state.StateMonitor;
import com.yahoo.jdisc.core.SystemTimer;
import org.junit.Test;
@@ -14,39 +15,45 @@ import org.junit.Test;
* @author steinar
*/
public class VipStatusTestCase {
- private static final String [] clusters = {"cluster1", "cluster2", "cluster3"};
- private static QrSearchersConfig getSearchersCfg() {
+ private static QrSearchersConfig getSearchersConfig(String[] clusters) {
var b = new QrSearchersConfig.Builder();
- var searchClusterB = new QrSearchersConfig.Searchcluster.Builder();
- for (String cluster : clusters) {
- searchClusterB.name(cluster);
+ if (clusters.length > 0) {
+ var searchClusterB = new QrSearchersConfig.Searchcluster.Builder();
+ for (String cluster : clusters) {
+ searchClusterB.name(cluster);
+ }
+ b.searchcluster(searchClusterB);
}
- b.searchcluster(searchClusterB);
return b.build();
}
- private static VipStatus getVipStatus(StateMonitor.Status startState) {
- return new VipStatus(getSearchersCfg(), new ClustersStatus(), new StateMonitor(1000, startState, new SystemTimer(), runnable -> {
- Thread thread = new Thread(runnable, "StateMonitor");
- thread.setDaemon(true);
- return thread;
- }));
+
+ private static VipStatus getVipStatus(String[] clusters, StateMonitor.Status startState, boolean initiallyInRotation) {
+ return new VipStatus(getSearchersConfig(clusters),
+ new VipStatusConfig.Builder().initiallyInRotation(initiallyInRotation).build(),
+ new ClustersStatus(),
+ new StateMonitor(1000, startState, new SystemTimer(), runnable -> {
+ Thread thread = new Thread(runnable, "StateMonitor");
+ thread.setDaemon(true);
+ return thread;
+ }));
}
- private static void removeAll(VipStatus v) {
+ private static void remove(String[] clusters, VipStatus v) {
for (String s : clusters) {
v.removeFromRotation(s);
}
}
- private static void addAll(VipStatus v) {
+
+ private static void add(String[] clusters, VipStatus v) {
for (String s : clusters) {
v.addToRotation(s);
}
}
- private static void verifyUpOrDown(StateMonitor.Status status) {
- VipStatus v = getVipStatus(status);
- removeAll(v);
+ private static void verifyUpOrDown(String[] clusters, StateMonitor.Status status) {
+ VipStatus v = getVipStatus(clusters, status, true);
+ remove(clusters, v);
// initial state
assertFalse(v.isInRotation());
v.addToRotation(clusters[0]);
@@ -59,15 +66,18 @@ public class VipStatusTestCase {
@Test
public void testInitializingOrDownRequireAllUp() {
- verifyUpOrDown(StateMonitor.Status.initializing);
- verifyUpOrDown(StateMonitor.Status.down);
+ String[] clusters = {"cluster1", "cluster2", "cluster3"};
+ verifyUpOrDown(clusters, StateMonitor.Status.initializing);
+ verifyUpOrDown(clusters, StateMonitor.Status.down);
}
@Test
public void testUpRequireAllDown() {
- VipStatus v = getVipStatus(StateMonitor.Status.initializing);
+ String[] clusters = {"cluster1", "cluster2", "cluster3"};
+
+ VipStatus v = getVipStatus(clusters, StateMonitor.Status.initializing, true);
assertFalse(v.isInRotation());
- addAll(v);
+ add(clusters, v);
assertTrue(v.isInRotation());
v.removeFromRotation(clusters[0]);
@@ -89,4 +99,18 @@ public class VipStatusTestCase {
assertTrue(v.isInRotation());
}
-}
+ @Test
+ public void testNoClustersConfiguringInitiallyInRotationFalse() {
+ String[] clusters = {};
+ VipStatus v = getVipStatus(clusters, StateMonitor.Status.initializing, false);
+ assertFalse(v.isInRotation());
+ }
+
+ @Test
+ public void testNoClustersConfiguringInitiallyInRotationTrue() {
+ String[] clusters = {};
+ VipStatus v = getVipStatus(clusters, StateMonitor.Status.initializing, true);
+ assertTrue(v.isInRotation());
+ }
+
+} \ No newline at end of file