diff options
author | jonmv <venstad@gmail.com> | 2022-10-14 14:19:16 +0200 |
---|---|---|
committer | jonmv <venstad@gmail.com> | 2022-11-10 09:43:18 +0100 |
commit | cd91326cd9766bd4f0241c9762cd7adc852a94f0 (patch) | |
tree | bcfdfd231b99b700a282d2ce42f3d6b2aceb6548 /config-model | |
parent | b26cbb29aec75b76767e6e1631eae2a11f035823 (diff) |
Configurable through session-timeout-seconds attribute
Diffstat (limited to 'config-model')
3 files changed, 27 insertions, 7 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java index 5703de4cb18..edd74a12868 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java @@ -89,6 +89,7 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat private MbusParams mbusParams; private boolean messageBusEnabled = true; + private int zookeeperSessionTimeoutSeconds = -1; private final int transport_events_before_wakeup; private final int transport_connections_per_target; private final int heapSizePercentageOfTotalNodeMemory; @@ -315,8 +316,8 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat if (getParent() instanceof ConfigserverCluster) return; // Produces its own config super.getConfig(builder); - // 12s is 2x the current ZookeeperServerConfig.tickTime() of 6s, and the default minimum the server will accept. - builder.zookeeperSessionTimeoutSeconds(12); // TODO jonmv: make configurable + // Will be forced between 2x and 20x of ZookeeperServerConfig.tickTime(), which is currently 6s. + builder.zookeeperSessionTimeoutSeconds(zookeeperSessionTimeoutSeconds); } public Optional<String> getTlsClientAuthority() { @@ -329,6 +330,10 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat public void setMessageBusEnabled(boolean messageBusEnabled) { this.messageBusEnabled = messageBusEnabled; } + public void setZookeeperSessionTimeoutSeconds(int timeoutSeconds) { + this.zookeeperSessionTimeoutSeconds = timeoutSeconds; + } + protected boolean messageBusEnabled() { return messageBusEnabled; } public void addMbusServer(ComponentId chainId) { 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 6fbe334ba30..0219f8a5275 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 @@ -233,7 +233,9 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { } private void addZooKeeper(ApplicationContainerCluster cluster, Element spec) { - if ( ! hasZooKeeper(spec)) return; + Element zooKeeper = getZooKeeper(spec); + if (zooKeeper == null) return; + Element nodesElement = XML.getChild(spec, "nodes"); boolean isCombined = nodesElement != null && nodesElement.hasAttribute("of"); if (isCombined) { @@ -247,6 +249,17 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { } cluster.addSimpleComponent("com.yahoo.vespa.curator.Curator", null, "zkfacade"); cluster.addSimpleComponent("com.yahoo.vespa.curator.CuratorWrapper", null, "zkfacade"); + String sessionTimeoutSeconds = zooKeeper.getAttribute("session-timeout-seconds"); + if ( ! sessionTimeoutSeconds.isBlank()) { + try { + int timeoutSeconds = Integer.parseInt(sessionTimeoutSeconds); + if (timeoutSeconds <= 0) throw new IllegalArgumentException("must be a positive value"); + cluster.setZookeeperSessionTimeoutSeconds(timeoutSeconds); + } + catch (RuntimeException e) { + throw new IllegalArgumentException("invalid zookeeper session-timeout-seconds '" + sessionTimeoutSeconds + "'", e); + } + } // These need to be setup so that they will use the container's config id, since each container // have different config (id of zookeeper server) @@ -806,7 +819,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { ClusterSpec.Type.container, ClusterSpec.Id.from(cluster.getName()), log, - hasZooKeeper(containerElement)); + getZooKeeper(containerElement) != null); return createNodesFromHosts(hosts, cluster, context.getDeployState()); } @@ -1036,8 +1049,8 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> { )); } - private static boolean hasZooKeeper(Element spec) { - return XML.getChild(spec, "zookeeper") != null; + private static Element getZooKeeper(Element spec) { + return XML.getChild(spec, "zookeeper"); } /** Disallow renderers named "XmlRenderer" or "JsonRenderer" */ diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java index 562b1c25b6c..e172e68c0ee 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilderTest.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.container.xml; +import com.yahoo.cloud.config.CuratorConfig; import com.yahoo.cloud.config.ZookeeperServerConfig; import com.yahoo.component.ComponentId; import com.yahoo.config.application.api.ApplicationPackage; @@ -561,7 +562,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { void cluster_with_zookeeper() { Function<Integer, String> servicesXml = (nodeCount) -> "<container version='1.0' id='default'>" + "<nodes count='" + nodeCount + "'/>" + - "<zookeeper/>" + + "<zookeeper session-timeout-seconds='30'/>" + "</container>"; VespaModelTester tester = new VespaModelTester(); tester.addHosts(3); @@ -571,6 +572,7 @@ public class ContainerModelBuilderTest extends ContainerModelBuilderTestBase { assertNotNull(cluster); assertComponentConfigured(cluster, "com.yahoo.vespa.curator.Curator"); assertComponentConfigured(cluster, "com.yahoo.vespa.curator.CuratorWrapper"); + assertEquals(30, model.getConfig(CuratorConfig.class, cluster.getConfigId()).zookeeperSessionTimeoutSeconds()); cluster.getContainers().forEach(container -> { assertComponentConfigured(container, "com.yahoo.vespa.zookeeper.ReconfigurableVespaZooKeeperServer"); assertComponentConfigured(container, "com.yahoo.vespa.zookeeper.Reconfigurer"); |