diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2020-03-30 23:11:29 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2020-03-30 23:12:29 +0200 |
commit | 5f20981c68ea4afbd25c57e7e46eac6c60ff9ab3 (patch) | |
tree | e029232b48df96db979faf69715625fb62f8b421 /container-core | |
parent | c90c9ac78a1dc2422525b801d4b22faa251d7c5d (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.java | 25 | ||||
-rw-r--r-- | container-core/src/test/java/com/yahoo/container/handler/VipStatusTestCase.java | 68 |
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 |