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 | |
parent | b012824fe389d2a6cbfc054d42ce24d7ec76490b (diff) |
Shut down ZooKeeper properly
Diffstat (limited to 'zookeeper-server')
12 files changed, 158 insertions, 80 deletions
diff --git a/zookeeper-server/zookeeper-server-3.5.6/src/main/java/com/yahoo/vespa/zookeeper/ReconfigurableVespaZooKeeperServer.java b/zookeeper-server/zookeeper-server-3.5.6/src/main/java/com/yahoo/vespa/zookeeper/ReconfigurableVespaZooKeeperServer.java index 027bb212f09..316bf389023 100644 --- a/zookeeper-server/zookeeper-server-3.5.6/src/main/java/com/yahoo/vespa/zookeeper/ReconfigurableVespaZooKeeperServer.java +++ b/zookeeper-server/zookeeper-server-3.5.6/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.5.6/src/main/java/com/yahoo/vespa/zookeeper/VespaQuorumPeer.java b/zookeeper-server/zookeeper-server-3.5.6/src/main/java/com/yahoo/vespa/zookeeper/VespaQuorumPeer.java new file mode 100644 index 00000000000..61951391f89 --- /dev/null +++ b/zookeeper-server/zookeeper-server-3.5.6/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.5.6/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperServerImpl.java b/zookeeper-server/zookeeper-server-3.5.6/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperServerImpl.java index c168e475ad6..a7f30ab95d8 100644 --- a/zookeeper-server/zookeeper-server-3.5.6/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperServerImpl.java +++ b/zookeeper-server/zookeeper-server-3.5.6/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 hmusum */ 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.5.6/src/main/java/com/yahoo/vespa/zookeeper/ZooKeeperServer.java b/zookeeper-server/zookeeper-server-3.5.6/src/main/java/com/yahoo/vespa/zookeeper/ZooKeeperServer.java deleted file mode 100644 index ceb036049da..00000000000 --- a/zookeeper-server/zookeeper-server-3.5.6/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); - } - } - -} 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); - } - } - -} diff --git a/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/DummyVespaZooKeeperServer.java b/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/DummyVespaZooKeeperServer.java index 91e3c07c2ee..ba53ea04b6e 100644 --- a/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/DummyVespaZooKeeperServer.java +++ b/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/DummyVespaZooKeeperServer.java @@ -16,6 +16,9 @@ public class DummyVespaZooKeeperServer extends AbstractComponent implements Vesp @Inject public DummyVespaZooKeeperServer() {} @Override + public void shutdown() {} + + @Override public void start(Path configFilePath) {} } diff --git a/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperServer.java b/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperServer.java index d627c18c8ca..ea8c6d2bbee 100644 --- a/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperServer.java +++ b/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/VespaZooKeeperServer.java @@ -4,12 +4,14 @@ package com.yahoo.vespa.zookeeper; import java.nio.file.Path; /** - * Interface for a component that writes zookeeper config and starts a zookeeper server. + * Interface for a component that starts/stops a ZooKeeper server. * * @author Harald Musum */ public interface VespaZooKeeperServer { + void shutdown(); + void start(Path configFilePath); } diff --git a/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/ZooKeeperRunner.java b/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/ZooKeeperRunner.java index 71ac4bbf62f..c64bfd783e0 100644 --- a/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/ZooKeeperRunner.java +++ b/zookeeper-server/zookeeper-server-common/src/main/java/com/yahoo/vespa/zookeeper/ZooKeeperRunner.java @@ -42,8 +42,8 @@ public class ZooKeeperRunner implements Runnable { void shutdown() { log.log(Level.INFO, "Triggering shutdown"); + server.shutdown(); executorService.shutdownNow(); - log.log(Level.INFO, "Shutdown triggered"); try { if (!executorService.awaitTermination(shutdownTimeout.toMillis(), TimeUnit.MILLISECONDS)) { log.log(Level.WARNING, "Failed to shut down within " + shutdownTimeout); diff --git a/zookeeper-server/zookeeper-server-common/src/test/java/com/yahoo/vespa/zookeeper/ReconfigurerTest.java b/zookeeper-server/zookeeper-server-common/src/test/java/com/yahoo/vespa/zookeeper/ReconfigurerTest.java index 1ca79a885fb..6ea024db0a4 100644 --- a/zookeeper-server/zookeeper-server-common/src/test/java/com/yahoo/vespa/zookeeper/ReconfigurerTest.java +++ b/zookeeper-server/zookeeper-server-common/src/test/java/com/yahoo/vespa/zookeeper/ReconfigurerTest.java @@ -154,6 +154,9 @@ public class ReconfigurerTest { } @Override + public void shutdown() {} + + @Override public void start(Path configFilePath) { } } |