summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-12-02 22:44:12 +0100
committerGitHub <noreply@github.com>2020-12-02 22:44:12 +0100
commit54326098072f463164067d991cc7492b220ea412 (patch)
treebac4119c41e6be24dcae62ed8b8c742d2209796c
parent69a8119cb92e7744d87986d30d807146bb576124 (diff)
parent5c9f8fc0ce2cb2dd61afd8da8db95448ef02894c (diff)
Merge pull request #15618 from vespa-engine/mpolden/handle-retirement
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);
}