From 240a1334cb36080f38c14ac42099513529bb50ad Mon Sep 17 00:00:00 2001 From: jonmv Date: Fri, 14 Oct 2022 13:47:46 +0200 Subject: 12s session timeout for application cluster curator --- .../main/java/com/yahoo/vespa/curator/Curator.java | 31 +++++++++++++++------- .../com/yahoo/vespa/curator/SingletonManager.java | 2 +- 2 files changed, 22 insertions(+), 11 deletions(-) (limited to 'zkfacade/src/main/java/com') diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/Curator.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/Curator.java index 1da51beef29..ab35ccf545e 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/Curator.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/Curator.java @@ -63,8 +63,8 @@ public class Curator extends AbstractComponent implements AutoCloseable { private static final Logger LOG = Logger.getLogger(Curator.class.getName()); private static final File ZK_CLIENT_CONFIG_FILE = new File(Defaults.getDefaults().underVespaHome("conf/zookeeper/zookeeper-client.cfg")); - // Note that session timeout has min and max values are related to tickTime defined by server, see configserver.def - static final Duration ZK_SESSION_TIMEOUT = Duration.ofSeconds(120); + // Note that session timeout has min and max values are related to tickTime defined by server, see zookeeper-server.def + static final Duration DEFAULT_ZK_SESSION_TIMEOUT = Duration.ofSeconds(120); private static final Duration ZK_CONNECTION_TIMEOUT = Duration.ofSeconds(30); private static final Duration BASE_SLEEP_TIME = Duration.ofSeconds(1); @@ -76,18 +76,21 @@ public class Curator extends AbstractComponent implements AutoCloseable { private final CuratorFramework curatorFramework; private final ConnectionSpec connectionSpec; private final long juteMaxBuffer; + private final Duration sessionTimeout; // All lock keys, to allow re-entrancy. This will grow forever, but this should be too slow to be a problem private final ConcurrentHashMap locks = new ConcurrentHashMap<>(); /** Creates a curator instance from a comma-separated string of ZooKeeper host:port strings */ public static Curator create(String connectionSpec) { - return new Curator(ConnectionSpec.create(connectionSpec), Optional.of(ZK_CLIENT_CONFIG_FILE), defaultJuteMaxBuffer); + return new Curator(ConnectionSpec.create(connectionSpec), Optional.of(ZK_CLIENT_CONFIG_FILE), + defaultJuteMaxBuffer, DEFAULT_ZK_SESSION_TIMEOUT); } // For testing only, use Optional.empty for clientConfigFile parameter to create default zookeeper client config public static Curator create(String connectionSpec, Optional clientConfigFile) { - return new Curator(ConnectionSpec.create(connectionSpec), clientConfigFile, defaultJuteMaxBuffer); + return new Curator(ConnectionSpec.create(connectionSpec), clientConfigFile, + defaultJuteMaxBuffer, DEFAULT_ZK_SESSION_TIMEOUT); } @Inject @@ -98,31 +101,35 @@ public class Curator extends AbstractComponent implements AutoCloseable { CuratorConfig.Server::port, curatorConfig.zookeeperLocalhostAffinity()), Optional.of(ZK_CLIENT_CONFIG_FILE), - defaultJuteMaxBuffer); + defaultJuteMaxBuffer, + Duration.ofSeconds(curatorConfig.zookeeperSessionTimeoutSeconds())); } protected Curator(String connectionSpec, String zooKeeperEnsembleConnectionSpec, Function curatorFactory) { - this(ConnectionSpec.create(connectionSpec, zooKeeperEnsembleConnectionSpec), curatorFactory.apply(DEFAULT_RETRY_POLICY), defaultJuteMaxBuffer); + this(ConnectionSpec.create(connectionSpec, zooKeeperEnsembleConnectionSpec), curatorFactory.apply(DEFAULT_RETRY_POLICY), + defaultJuteMaxBuffer, DEFAULT_ZK_SESSION_TIMEOUT); } - Curator(ConnectionSpec connectionSpec, Optional clientConfigFile, long juteMaxBuffer) { + Curator(ConnectionSpec connectionSpec, Optional clientConfigFile, long juteMaxBuffer, Duration sessionTimeout) { this(connectionSpec, CuratorFrameworkFactory .builder() .retryPolicy(DEFAULT_RETRY_POLICY) - .sessionTimeoutMs((int) ZK_SESSION_TIMEOUT.toMillis()) + .sessionTimeoutMs((int) sessionTimeout.toMillis()) .connectionTimeoutMs((int) ZK_CONNECTION_TIMEOUT.toMillis()) .connectString(connectionSpec.local()) .zookeeperFactory(new VespaZooKeeperFactory(createClientConfig(clientConfigFile))) .dontUseContainerParents() // TODO: Consider changing this in Vespa 9 .build(), - juteMaxBuffer); + juteMaxBuffer, + sessionTimeout); } - private Curator(ConnectionSpec connectionSpec, CuratorFramework curatorFramework, long juteMaxBuffer) { + private Curator(ConnectionSpec connectionSpec, CuratorFramework curatorFramework, long juteMaxBuffer, Duration sessionTimeout) { this.connectionSpec = Objects.requireNonNull(connectionSpec); this.curatorFramework = Objects.requireNonNull(curatorFramework); this.juteMaxBuffer = juteMaxBuffer; + this.sessionTimeout = sessionTimeout; addLoggingListener(); curatorFramework.start(); } @@ -141,6 +148,10 @@ public class Curator extends AbstractComponent implements AutoCloseable { } } + public Duration sessionTimeout() { + return sessionTimeout; + } + /** For internal use; prefer creating a {@link CuratorCounter} */ public DistributedAtomicLong createAtomicCounter(String path) { return new DistributedAtomicLong(curatorFramework, path, new ExponentialBackoffRetry((int) BASE_SLEEP_TIME.toMillis(), MAX_RETRIES)); diff --git a/zkfacade/src/main/java/com/yahoo/vespa/curator/SingletonManager.java b/zkfacade/src/main/java/com/yahoo/vespa/curator/SingletonManager.java index e54197c39fd..2658bcce686 100644 --- a/zkfacade/src/main/java/com/yahoo/vespa/curator/SingletonManager.java +++ b/zkfacade/src/main/java/com/yahoo/vespa/curator/SingletonManager.java @@ -293,7 +293,7 @@ class SingletonManager { logger.log(FINE, "Failed pinging ZK cluster", e); return; } - if ( ! doom.compareAndSet(ourDoom, start.plus(Curator.ZK_SESSION_TIMEOUT.multipliedBy(9).dividedBy(10)))) { + if ( ! doom.compareAndSet(ourDoom, start.plus(curator.sessionTimeout().multipliedBy(9).dividedBy(10)))) { logger.log(FINE, "Deadline changed, current lease renewal is void"); } } -- cgit v1.2.3