diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-12-02 20:45:11 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-12-02 20:45:11 +0100 |
commit | 5c9f8fc0ce2cb2dd61afd8da8db95448ef02894c (patch) | |
tree | 306766b510b816d3f045761d9d38dbd300f3438b | |
parent | 5eee8f3baf801d59de8637893799f33075f5fd4d (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.java | 9 | ||||
-rw-r--r-- | config-model/src/test/java/com/yahoo/config/model/provision/ModelProvisioningTest.java | 18 |
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); } |