diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-12-15 11:05:35 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-12-15 11:23:14 +0100 |
commit | 1468a9df93196f38d8fc86d5d2be61650a94980f (patch) | |
tree | aef1b0425009570e62afdf3f5076da0766b4d194 /zookeeper-server/zookeeper-server-3.6.2 | |
parent | b012824fe389d2a6cbfc054d42ce24d7ec76490b (diff) |
Shut down ZooKeeper properly
Diffstat (limited to 'zookeeper-server/zookeeper-server-3.6.2')
4 files changed, 74 insertions, 39 deletions
diff --git a/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/ReconfigurableVespaZooKeeperServer.java b/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/ReconfigurableVespaZooKeeperServer.java index 027bb212f09..316bf389023 100644 --- a/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/ReconfigurableVespaZooKeeperServer.java +++ b/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/ReconfigurableVespaZooKeeperServer.java @@ -14,13 +14,21 @@ import java.nio.file.Path; */ public class ReconfigurableVespaZooKeeperServer extends AbstractComponent implements VespaZooKeeperServer { + private final VespaQuorumPeer peer; + @Inject public ReconfigurableVespaZooKeeperServer(Reconfigurer reconfigurer, ZookeeperServerConfig zookeeperServerConfig) { reconfigurer.startOrReconfigure(zookeeperServerConfig, this); + peer = new VespaQuorumPeer(); + } + + @Override + public void shutdown() { + peer.shutdown(); } public void start(Path configFilePath) { - new ZooKeeperServer().start(configFilePath); + peer.start(configFilePath); } } diff --git a/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/VespaQuorumPeer.java b/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/VespaQuorumPeer.java new file mode 100644 index 00000000000..61951391f89 --- /dev/null +++ b/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/VespaQuorumPeer.java @@ -0,0 +1,53 @@ +// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.zookeeper; + +import org.apache.zookeeper.server.admin.AdminServer; +import org.apache.zookeeper.server.quorum.QuorumPeerConfig; +import org.apache.zookeeper.server.quorum.QuorumPeerMain; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Starts/stops a ZooKeeper server. Extends QuorumPeerMain to be able to call initializeAndRun() and wraps + * exceptions so it can be used by code that does not depend on ZooKeeper. + * + * @author hmusum + */ +class VespaQuorumPeer extends QuorumPeerMain { + + private static final Logger LOG = Logger.getLogger(VespaQuorumPeer.class.getName()); + + public void start(Path path) { + initializeAndRun(new String[]{ path.toFile().getAbsolutePath()}); + } + + public void shutdown() { + if (quorumPeer != null) { + try { + quorumPeer.shutdown(); + } catch (RuntimeException e) { + // If shutdown fails, we have no other option than forcing the JVM to stop and letting it be restarted. + // + // When a VespaZooKeeperServer component receives a new config, the container will try to start a new + // server with the new config, this will fail until the old server is deconstructed. If the old server + // fails to deconstruct/shut down, the new one will never start and if that happens forcing a restart is + // the better option. + LOG.log(Level.SEVERE, "Failed to shut down properly, forcing restart", e); + System.exit(1); + } + } + } + + @Override + protected void initializeAndRun(String[] args) { + try { + super.initializeAndRun(args); + } catch (QuorumPeerConfig.ConfigException | IOException | AdminServer.AdminServerException e) { + throw new RuntimeException("Exception when initializing or running ZooKeeper server", e); + } + } + +} diff --git a/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperServerImpl.java b/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperServerImpl.java index 4a9a5bb4f65..e93bae1e438 100644 --- a/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperServerImpl.java +++ b/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperServerImpl.java @@ -8,28 +8,34 @@ import com.yahoo.component.AbstractComponent; import java.nio.file.Path; /** - * Main component controlling startup and stop of zookeeper server - * * @author Ulf Lilleengen * @author Harald Musum */ public class VespaZooKeeperServerImpl extends AbstractComponent implements VespaZooKeeperServer { - private final ZooKeeperRunner zooKeeperRunner; + private final VespaQuorumPeer peer; + private final ZooKeeperRunner runner; @Inject public VespaZooKeeperServerImpl(ZookeeperServerConfig zookeeperServerConfig) { - this.zooKeeperRunner = new ZooKeeperRunner(zookeeperServerConfig, this); + this.peer = new VespaQuorumPeer(); + this.runner = new ZooKeeperRunner(zookeeperServerConfig, this); } @Override public void deconstruct() { - zooKeeperRunner.shutdown(); + runner.shutdown(); super.deconstruct(); } + @Override + public void shutdown() { + peer.shutdown(); + } + + @Override public void start(Path configFilePath) { - new ZooKeeperServer().start(configFilePath); + peer.start(configFilePath); } } diff --git a/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/ZooKeeperServer.java b/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/ZooKeeperServer.java deleted file mode 100644 index ceb036049da..00000000000 --- a/zookeeper-server/zookeeper-server-3.6.2/src/main/java/com/yahoo/vespa/zookeeper/ZooKeeperServer.java +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.zookeeper; - -import org.apache.zookeeper.server.admin.AdminServer; -import org.apache.zookeeper.server.quorum.QuorumPeerConfig; -import org.apache.zookeeper.server.quorum.QuorumPeerMain; - -import java.io.IOException; -import java.nio.file.Path; - -/** - * Class to start zookeeper server. Extends QuorumPeerMain to be able to call initializeAndRun() and wraps - * exceptions so it can be used by code that does not depend on zookeeper. - * - * @author hmusum - */ -class ZooKeeperServer extends QuorumPeerMain { - - public void start(Path path) { - initializeAndRun(new String[]{ path.toFile().getAbsolutePath()}); - } - - @Override - protected void initializeAndRun(String[] args) { - try { - super.initializeAndRun(args); - } catch (QuorumPeerConfig.ConfigException | IOException | AdminServer.AdminServerException e) { - throw new RuntimeException("Exception when initializing or running ZooKeeper server", e); - } - } - -} |