summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-12-02 20:45:11 +0100
committerMartin Polden <mpolden@mpolden.no>2020-12-02 20:45:11 +0100
commit5c9f8fc0ce2cb2dd61afd8da8db95448ef02894c (patch)
tree306766b510b816d3f045761d9d38dbd300f3438b
parent5eee8f3baf801d59de8637893799f33075f5fd4d (diff)
Allow suboptimal node count in container with ZK during retirement
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java9
-rw-r--r--config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java18
2 files changed, 23 insertions, 4 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java
index 193d12c428c..78f37275c30 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java
@@ -213,10 +213,11 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
if (isCombined) {
throw new IllegalArgumentException("A combined cluster cannot run ZooKeeper");
}
- int nodeCount = cluster.getContainers().size();
- if (nodeCount < MIN_ZOOKEEPER_NODE_COUNT || nodeCount > MAX_ZOOKEEPER_NODE_COUNT || nodeCount % 2 == 0) {
- throw new IllegalArgumentException("Clusters running ZooKeeper must have an odd number of nodes, between " +
- MIN_ZOOKEEPER_NODE_COUNT + " and " + MAX_ZOOKEEPER_NODE_COUNT);
+ long nonRetiredNodes = cluster.getContainers().stream().filter(c -> !c.isRetired()).count();
+ if (nonRetiredNodes < MIN_ZOOKEEPER_NODE_COUNT || nonRetiredNodes > MAX_ZOOKEEPER_NODE_COUNT || nonRetiredNodes % 2 == 0) {
+ throw new IllegalArgumentException("Cluster with ZooKeeper needs an odd number of nodes, between " +
+ MIN_ZOOKEEPER_NODE_COUNT + " and " + MAX_ZOOKEEPER_NODE_COUNT +
+ ", have " + nonRetiredNodes + " non-retired");
}
cluster.addSimpleComponent("com.yahoo.vespa.curator.Curator", null, "zkfacade");
diff --git a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java
index f8695a76b11..96b2cfc3118 100644
--- a/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java
+++ b/config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java
@@ -1853,6 +1853,24 @@ public class ModelProvisioningTest {
});
}
+ @Test
+ public void containerWithZooKeeperSuboptimalNodeCountDuringRetirement() {
+ String servicesXml =
+ "<?xml version='1.0' encoding='utf-8' ?>" +
+ "<services>" +
+ " <container version='1.0' id='zk'>" +
+ " <zookeeper/>" +
+ " <nodes count='4'/>" + // (3 + 1 retired)
+ " </container>" +
+ "</services>";
+ VespaModelTester tester = new VespaModelTester();
+ tester.addHosts(4);
+ VespaModel model = tester.createModel(servicesXml, true, "node-1-3-9-01");
+ ApplicationContainerCluster cluster = model.getContainerClusters().get("zk");
+ assertEquals(1, cluster.getContainers().stream().filter(Container::isRetired).count());
+ assertEquals(3, cluster.getContainers().stream().filter(c -> !c.isRetired()).count());
+ }
+
private VespaModel createNonProvisionedMultitenantModel(String services) {
return createNonProvisionedModel(true, null, services);
}