From cb2bd1e06df184cb1f21e0ae865c2e6195be3b31 Mon Sep 17 00:00:00 2001 From: tison Date: Tue, 30 Aug 2022 15:27:33 +0800 Subject: [PATCH 1/8] refactor QuorumConfigBuilder Signed-off-by: tison --- .../curator/test/QuorumConfigBuilder.java | 32 +++++++++++-------- .../curator/test/TestingQuorumPeerMain.java | 5 ++- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java b/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java index 2300efc9d7..42f7b27bd5 100644 --- a/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java +++ b/curator-test/src/main/java/org/apache/curator/test/QuorumConfigBuilder.java @@ -96,6 +96,22 @@ public void close() } public QuorumPeerConfig buildConfig(int instanceIndex) throws Exception + { + Properties properties = buildConfigProperties(instanceIndex); + QuorumPeerConfig config = new QuorumPeerConfig() + { + { + if ( fakeConfigFile != null ) + { + configFileStr = fakeConfigFile.getPath(); + } + } + }; + config.parseProperties(properties); + return config; + } + + public Properties buildConfigProperties(int instanceIndex) throws Exception { boolean isCluster = (instanceSpecs.size() > 1); InstanceSpec spec = instanceSpecs.get(instanceIndex); @@ -131,21 +147,9 @@ public QuorumPeerConfig buildConfig(int instanceIndex) throws Exception } Map customProperties = spec.getCustomProperties(); if (customProperties != null) { - for (Map.Entry property : customProperties.entrySet()) { - properties.put(property.getKey(), property.getValue()); - } + properties.putAll(customProperties); } - QuorumPeerConfig config = new QuorumPeerConfig() - { - { - if ( fakeConfigFile != null ) - { - configFileStr = fakeConfigFile.getPath(); - } - } - }; - config.parseProperties(properties); - return config; + return properties; } } diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java index 49d47c5408..960ed6095e 100644 --- a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java +++ b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java @@ -18,12 +18,11 @@ */ package org.apache.curator.test; +import java.lang.reflect.Field; +import java.nio.channels.ServerSocketChannel; import org.apache.zookeeper.server.ServerCnxnFactory; import org.apache.zookeeper.server.quorum.QuorumPeer; import org.apache.zookeeper.server.quorum.QuorumPeerMain; -import java.io.IOException; -import java.lang.reflect.Field; -import java.nio.channels.ServerSocketChannel; class TestingQuorumPeerMain extends QuorumPeerMain implements ZooKeeperMainFace { From 68796b43fcbe502bdbf576029af28754eb599809 Mon Sep 17 00:00:00 2001 From: tison Date: Tue, 30 Aug 2022 15:42:17 +0800 Subject: [PATCH 2/8] refactor ZooKeeperMainFace Signed-off-by: tison --- .../curator/test/TestingQuorumPeerMain.java | 27 ++++++++++ .../curator/test/TestingZooKeeperMain.java | 49 ++++++++++++++----- .../curator/test/ZooKeeperMainFace.java | 4 ++ 3 files changed, 67 insertions(+), 13 deletions(-) diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java index 960ed6095e..0aaefc133b 100644 --- a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java +++ b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java @@ -22,12 +22,19 @@ import java.nio.channels.ServerSocketChannel; import org.apache.zookeeper.server.ServerCnxnFactory; import org.apache.zookeeper.server.quorum.QuorumPeer; +import org.apache.zookeeper.server.quorum.QuorumPeerConfig; import org.apache.zookeeper.server.quorum.QuorumPeerMain; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; class TestingQuorumPeerMain extends QuorumPeerMain implements ZooKeeperMainFace { + private static final Logger log = LoggerFactory.getLogger(TestingQuorumPeerMain.class); private volatile boolean isClosed = false; + private volatile QuorumConfigBuilder configBuilder; + private volatile int instanceIndex; + @Override public void kill() { @@ -89,4 +96,24 @@ public void blockUntilStarted() throw new FailedServerStartException("quorumPeer never got set"); } } + + @Override + public void configure(QuorumConfigBuilder configBuilder, int instanceIndex) { + this.configBuilder = configBuilder; + this.instanceIndex = instanceIndex; + } + + @Override + public void start() { + new Thread(() -> { + try { + QuorumPeerConfig config = configBuilder.buildConfig(instanceIndex); + runFromConfig(config); + } catch (Exception e) { + log.error("From testing server (random state: {}) for instance: {}", configBuilder.isFromRandom(), configBuilder.getInstanceSpec(instanceIndex), e); + } + }).start(); + + blockUntilStarted(); + } } diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java index b1a873a16b..09c79b5f74 100644 --- a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java +++ b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java @@ -19,6 +19,15 @@ package org.apache.curator.test; +import java.io.IOException; +import java.lang.reflect.Field; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.nio.channels.ServerSocketChannel; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import org.apache.zookeeper.jmx.MBeanRegistry; import org.apache.zookeeper.jmx.ZKMBeanInfo; import org.apache.zookeeper.server.ContainerManager; @@ -31,27 +40,19 @@ import org.apache.zookeeper.server.quorum.QuorumPeerConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.management.JMException; -import java.io.IOException; -import java.lang.reflect.Field; -import java.net.InetAddress; -import java.net.UnknownHostException; -import java.nio.channels.ServerSocketChannel; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.concurrent.atomic.AtomicReference; public class TestingZooKeeperMain implements ZooKeeperMainFace { private static final Logger log = LoggerFactory.getLogger(TestingZooKeeperMain.class); private final CountDownLatch latch = new CountDownLatch(1); - private final AtomicReference startingException = new AtomicReference(null); + private final AtomicReference startingException = new AtomicReference<>(null); private volatile ServerCnxnFactory cnxnFactory; private volatile TestZooKeeperServer zkServer; private volatile ContainerManager containerManager; + private volatile QuorumConfigBuilder configBuilder; + private volatile int instanceIndex; private static final Timing timing = new Timing(); @@ -111,7 +112,7 @@ public void runFromConfig(QuorumPeerConfig config) throws Exception MBeanRegistry nopMBeanRegistry = new MBeanRegistry() { @Override - public void register(ZKMBeanInfo bean, ZKMBeanInfo parent) throws JMException + public void register(ZKMBeanInfo bean, ZKMBeanInfo parent) { // NOP } @@ -142,7 +143,6 @@ public void unregister(ZKMBeanInfo bean) } } - @SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter") @Override public void blockUntilStarted() { @@ -267,6 +267,29 @@ private void internalRunFromConfig(ServerConfig config) throws IOException } } + @Override + public void configure(QuorumConfigBuilder configBuilder, int instanceIndex) { + this.configBuilder = configBuilder; + this.instanceIndex = instanceIndex; + } + + @Override + public void start() { + new Thread(() -> { + try + { + QuorumPeerConfig config = configBuilder.buildConfig(instanceIndex); + runFromConfig(config); + } + catch ( Exception e ) + { + log.error(String.format("From testing server (random state: %s) for instance: %s", String.valueOf(configBuilder.isFromRandom()), configBuilder.getInstanceSpec(instanceIndex)), e); + } + }, "zk-main-thread").start(); + + blockUntilStarted(); + } + public static class TestZooKeeperServer extends ZooKeeperServer { private final FileTxnSnapLog txnLog; diff --git a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java index 904e601d73..5b60457173 100644 --- a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java +++ b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java @@ -27,5 +27,9 @@ public interface ZooKeeperMainFace extends Closeable void blockUntilStarted(); + void configure(QuorumConfigBuilder config, int instanceIndex); + + void start(); + void kill(); } From d247dfc5184ecf46aa8e46b0c35d4fa2a3842631 Mon Sep 17 00:00:00 2001 From: tison Date: Tue, 30 Aug 2022 15:56:34 +0800 Subject: [PATCH 3/8] implement ZooKeeperServerEmbeddedAdapter Signed-off-by: tison --- .../curator/test/TestingQuorumPeerMain.java | 3 +- .../curator/test/TestingZooKeeperMain.java | 6 +- .../curator/test/TestingZooKeeperServer.java | 19 +---- .../curator/test/ZooKeeperMainFace.java | 7 +- .../test/ZooKeeperServerEmbeddedAdapter.java | 75 +++++++++++++++++++ 5 files changed, 81 insertions(+), 29 deletions(-) create mode 100644 curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java index 0aaefc133b..1319220457 100644 --- a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java +++ b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java @@ -75,8 +75,7 @@ public void close() } } - @Override - public void blockUntilStarted() + private void blockUntilStarted() { long startTime = System.currentTimeMillis(); while ( (quorumPeer == null) && ((System.currentTimeMillis() - startTime) <= TestingZooKeeperMain.MAX_WAIT_MS) ) diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java index 09c79b5f74..2b18b70352 100644 --- a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java +++ b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java @@ -102,8 +102,7 @@ TestZooKeeperServer getZkServer() { return zkServer; } - @Override - public void runFromConfig(QuorumPeerConfig config) throws Exception + private void runFromConfig(QuorumPeerConfig config) throws Exception { try { @@ -143,8 +142,7 @@ public void unregister(ZKMBeanInfo bean) } } - @Override - public void blockUntilStarted() + private void blockUntilStarted() { if (!timing.awaitLatch(latch)) { diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java index e80566ad63..d31d419310 100644 --- a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java +++ b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java @@ -152,22 +152,7 @@ public void start() throws Exception return; } - new Thread(new Runnable() - { - public void run() - { - try - { - QuorumPeerConfig config = configBuilder.buildConfig(thisInstanceIndex); - main.runFromConfig(config); - } - catch ( Exception e ) - { - logger.error(String.format("From testing server (random state: %s) for instance: %s", String.valueOf(configBuilder.isFromRandom()), getInstanceSpec()), e); - } - } - }).start(); - - main.blockUntilStarted(); + main.configure(configBuilder, thisInstanceIndex); + main.start(); } } \ No newline at end of file diff --git a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java index 5b60457173..db11e1f2e2 100644 --- a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java +++ b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java @@ -18,16 +18,11 @@ */ package org.apache.curator.test; -import org.apache.zookeeper.server.quorum.QuorumPeerConfig; import java.io.Closeable; public interface ZooKeeperMainFace extends Closeable { - void runFromConfig(QuorumPeerConfig config) throws Exception; - - void blockUntilStarted(); - - void configure(QuorumConfigBuilder config, int instanceIndex); + void configure(QuorumConfigBuilder config, int instanceIndex) throws Exception; void start(); diff --git a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java new file mode 100644 index 0000000000..093d23403f --- /dev/null +++ b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.curator.test; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.Duration; +import java.util.Properties; +import org.apache.zookeeper.server.embedded.ZooKeeperServerEmbedded; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class ZooKeeperServerEmbeddedAdapter implements ZooKeeperMainFace { + private static final Logger log = LoggerFactory.getLogger(ZooKeeperServerEmbeddedAdapter.class); + private static final Duration DEFAULT_STARTUP_TIMEOUT = Duration.ofMinutes(1); + + private volatile ZooKeeperServerEmbedded zooKeeperEmbedded; + private volatile String address; + + @Override + public void configure(QuorumConfigBuilder config, int instanceIndex) throws Exception { + final Properties properties = config.buildConfigProperties(instanceIndex); + properties.put("admin.enableServer", "false"); + + final Path dataDir = Paths.get(properties.getProperty("dataDir")); + zooKeeperEmbedded = ZooKeeperServerEmbedded.builder() + .configuration(properties) + .baseDir(dataDir.getParent()) + .build(); + address = zooKeeperEmbedded.getConnectionString(); + log.info("Configure ZooKeeperServerEmbeddedAdapter with address: {}, properties: {}", address, properties); + } + + @Override + public void start() { + if (zooKeeperEmbedded != null) { + try { + zooKeeperEmbedded.start(DEFAULT_STARTUP_TIMEOUT.toMillis()); + } catch (Exception e) { + throw new FailedServerStartException(e); + } + } + + throw new FailedServerStartException(new NullPointerException("zooKeeperEmbedded")); + } + + @Override + public void kill() { + close(); + } + + @Override + public void close() { + if (zooKeeperEmbedded != null) { + zooKeeperEmbedded.close(); + } + } +} From 9ee00b0c303b7b609b13ce2ef2023ab6873ae752 Mon Sep 17 00:00:00 2001 From: tison Date: Tue, 30 Aug 2022 16:10:36 +0800 Subject: [PATCH 4/8] adapt TestingZooKeeperServer Signed-off-by: tison --- .../curator/test/TestingQuorumPeerMain.java | 5 -- .../curator/test/TestingZooKeeperServer.java | 47 ++++++++++++------- 2 files changed, 29 insertions(+), 23 deletions(-) diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java index 1319220457..c9712a1324 100644 --- a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java +++ b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java @@ -60,11 +60,6 @@ public void kill() } } - public QuorumPeer getTestingQuorumPeer() - { - return quorumPeer; - } - @Override public void close() { diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java index d31d419310..42d94fd4a0 100644 --- a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java +++ b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperServer.java @@ -19,26 +19,37 @@ package org.apache.curator.test; -import org.apache.zookeeper.server.quorum.QuorumPeer; -import org.apache.zookeeper.server.quorum.QuorumPeerConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.Closeable; import java.io.IOException; import java.util.Collection; import java.util.concurrent.atomic.AtomicReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * Thanks to Jeremie BORDIER (ahfeel) for this code */ public class TestingZooKeeperServer implements Closeable { - private static final Logger logger = LoggerFactory.getLogger(TestingZooKeeperServer.class); + private static final Logger log = LoggerFactory.getLogger(TestingZooKeeperServer.class); + private static final boolean hasZooKeeperServerEmbedded; + private final AtomicReference state = new AtomicReference<>(State.LATENT); private final QuorumConfigBuilder configBuilder; private final int thisInstanceIndex; private volatile ZooKeeperMainFace main; - private final AtomicReference state = new AtomicReference(State.LATENT); + + static { + boolean localHasZooKeeperServerEmbedded; + try { + Class.forName("org.apache.zookeeper.server.embedded.ZooKeeperServerEmbedded"); + localHasZooKeeperServerEmbedded = true; + } catch (Throwable t) { + localHasZooKeeperServerEmbedded = false; + log.info("ZooKeeperServerEmbedded is not available in the version of the ZooKeeper library being used"); + } + hasZooKeeperServerEmbedded = localHasZooKeeperServerEmbedded; + } ZooKeeperMainFace getMain() { return main; @@ -60,20 +71,22 @@ public TestingZooKeeperServer(QuorumConfigBuilder configBuilder, int thisInstanc this.configBuilder = configBuilder; this.thisInstanceIndex = thisInstanceIndex; - main = isCluster() ? new TestingQuorumPeerMain() : new TestingZooKeeperMain(); + main = createServerMain(); + } + + private ZooKeeperMainFace createServerMain() { + if (hasZooKeeperServerEmbedded) { + return new ZooKeeperServerEmbeddedAdapter(); + } else if (isCluster()) { + return new TestingQuorumPeerMain(); + } else { + return new TestingZooKeeperMain(); + } } private boolean isCluster() { return configBuilder.size() > 1; } - - public QuorumPeer getQuorumPeer() - { - if (isCluster()) { - return ((TestingQuorumPeerMain) main).getTestingQuorumPeer(); - } - throw new UnsupportedOperationException(); - } public Collection getInstanceSpecs() { @@ -91,8 +104,6 @@ public void kill() * started again. If it is not running (in a LATENT or STOPPED state) then * it will be restarted. If it is in a CLOSED state then an exception will * be thrown. - * - * @throws Exception */ public void restart() throws Exception { @@ -111,7 +122,7 @@ public void restart() throws Exception // Set to a LATENT state so we can restart state.set(State.LATENT); - main = isCluster() ? new TestingQuorumPeerMain() : new TestingZooKeeperMain(); + main = createServerMain(); start(); } From 866eb659ed371f7f22ef9a38a823b7eb49f1a1a2 Mon Sep 17 00:00:00 2001 From: tison Date: Tue, 30 Aug 2022 16:29:03 +0800 Subject: [PATCH 5/8] adapt tests Signed-off-by: tison --- .../curator/test/TestingQuorumPeerMain.java | 12 +++++-- .../curator/test/TestingZooKeeperMain.java | 12 ++++--- .../curator/test/ZooKeeperMainFace.java | 3 ++ .../test/ZooKeeperServerEmbeddedAdapter.java | 33 +++++++++++++------ .../curator/test/TestTestingServer.java | 3 +- 5 files changed, 45 insertions(+), 18 deletions(-) diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java index c9712a1324..a54e8cb335 100644 --- a/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java +++ b/curator-test/src/main/java/org/apache/curator/test/TestingQuorumPeerMain.java @@ -97,12 +97,20 @@ public void configure(QuorumConfigBuilder configBuilder, int instanceIndex) { this.instanceIndex = instanceIndex; } + @Override + public QuorumPeerConfig getConfig() throws Exception { + if (configBuilder != null) { + return configBuilder.buildConfig(instanceIndex); + } + + return null; + } + @Override public void start() { new Thread(() -> { try { - QuorumPeerConfig config = configBuilder.buildConfig(instanceIndex); - runFromConfig(config); + runFromConfig(getConfig()); } catch (Exception e) { log.error("From testing server (random state: {}) for instance: {}", configBuilder.isFromRandom(), configBuilder.getInstanceSpec(instanceIndex), e); } diff --git a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java index 2b18b70352..646cdc4f04 100644 --- a/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java +++ b/curator-test/src/main/java/org/apache/curator/test/TestingZooKeeperMain.java @@ -98,8 +98,13 @@ public void kill() } } - TestZooKeeperServer getZkServer() { - return zkServer; + @Override + public QuorumPeerConfig getConfig() throws Exception { + if (configBuilder != null) { + return configBuilder.buildConfig(instanceIndex); + } + + return null; } private void runFromConfig(QuorumPeerConfig config) throws Exception @@ -276,8 +281,7 @@ public void start() { new Thread(() -> { try { - QuorumPeerConfig config = configBuilder.buildConfig(instanceIndex); - runFromConfig(config); + runFromConfig(getConfig()); } catch ( Exception e ) { diff --git a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java index db11e1f2e2..5b8521fe68 100644 --- a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java +++ b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperMainFace.java @@ -19,6 +19,7 @@ package org.apache.curator.test; import java.io.Closeable; +import org.apache.zookeeper.server.quorum.QuorumPeerConfig; public interface ZooKeeperMainFace extends Closeable { @@ -27,4 +28,6 @@ public interface ZooKeeperMainFace extends Closeable void start(); void kill(); + + QuorumPeerConfig getConfig() throws Exception; } diff --git a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java index 093d23403f..334c97e591 100644 --- a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java +++ b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java @@ -24,6 +24,7 @@ import java.time.Duration; import java.util.Properties; import org.apache.zookeeper.server.embedded.ZooKeeperServerEmbedded; +import org.apache.zookeeper.server.quorum.QuorumPeerConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,10 +33,14 @@ public class ZooKeeperServerEmbeddedAdapter implements ZooKeeperMainFace { private static final Duration DEFAULT_STARTUP_TIMEOUT = Duration.ofMinutes(1); private volatile ZooKeeperServerEmbedded zooKeeperEmbedded; - private volatile String address; + private volatile QuorumConfigBuilder configBuilder; + private volatile int instanceIndex; @Override public void configure(QuorumConfigBuilder config, int instanceIndex) throws Exception { + this.configBuilder = config; + this.instanceIndex = instanceIndex; + final Properties properties = config.buildConfigProperties(instanceIndex); properties.put("admin.enableServer", "false"); @@ -44,21 +49,29 @@ public void configure(QuorumConfigBuilder config, int instanceIndex) throws Exce .configuration(properties) .baseDir(dataDir.getParent()) .build(); - address = zooKeeperEmbedded.getConnectionString(); - log.info("Configure ZooKeeperServerEmbeddedAdapter with address: {}, properties: {}", address, properties); + log.info("Configure ZooKeeperServerEmbeddedAdapter with properties: {}", properties); + } + + @Override + public QuorumPeerConfig getConfig() throws Exception { + if (configBuilder != null) { + return configBuilder.buildConfig(instanceIndex); + } + + return null; } @Override public void start() { - if (zooKeeperEmbedded != null) { - try { - zooKeeperEmbedded.start(DEFAULT_STARTUP_TIMEOUT.toMillis()); - } catch (Exception e) { - throw new FailedServerStartException(e); - } + if (zooKeeperEmbedded == null) { + throw new FailedServerStartException(new NullPointerException("zooKeeperEmbedded")); } - throw new FailedServerStartException(new NullPointerException("zooKeeperEmbedded")); + try { + zooKeeperEmbedded.start(DEFAULT_STARTUP_TIMEOUT.toMillis()); + } catch (Exception e) { + throw new FailedServerStartException(e); + } } @Override diff --git a/curator-test/src/test/java/org/apache/curator/test/TestTestingServer.java b/curator-test/src/test/java/org/apache/curator/test/TestTestingServer.java index 1ddf960e49..f16b2ac748 100644 --- a/curator-test/src/test/java/org/apache/curator/test/TestTestingServer.java +++ b/curator-test/src/test/java/org/apache/curator/test/TestTestingServer.java @@ -45,8 +45,7 @@ public void setCustomTickTimeTest() throws Exception { final InstanceSpec spec = new InstanceSpec(zkTmpDir, -1, -1, -1, true, -1, customTickMs, -1); final int zkTickTime; try (TestingServer testingServer = new TestingServer(spec, true)) { - TestingZooKeeperMain main = (TestingZooKeeperMain) testingServer.getTestingZooKeeperServer().getMain(); - zkTickTime = main.getZkServer().getTickTime(); + zkTickTime = testingServer.getTestingZooKeeperServer().getMain().getConfig().getTickTime(); } assertEquals(customTickMs, zkTickTime); } From c088422fab7e31cc93c38d7f597ef7c5cf87506e Mon Sep 17 00:00:00 2001 From: tison Date: Tue, 30 Aug 2022 16:32:05 +0800 Subject: [PATCH 6/8] fix license header Signed-off-by: tison --- .../org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java index 334c97e591..0e8aeb0763 100644 --- a/curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java +++ b/curator-test/src/main/java/org/apache/curator/test/ZooKeeperServerEmbeddedAdapter.java @@ -1,4 +1,4 @@ -/* +/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information From b37455c8cc3bb0d0f552c87b8412c18cb21155dc Mon Sep 17 00:00:00 2001 From: tison Date: Tue, 30 Aug 2022 17:43:27 +0800 Subject: [PATCH 7/8] fix TestReadOnly Signed-off-by: tison --- curator-framework/pom.xml | 6 +++ .../curator/framework/imps/TestReadOnly.java | 45 ++++++------------- 2 files changed, 20 insertions(+), 31 deletions(-) diff --git a/curator-framework/pom.xml b/curator-framework/pom.xml index ebc55a842e..62d12d837f 100644 --- a/curator-framework/pom.xml +++ b/curator-framework/pom.xml @@ -56,6 +56,12 @@ test + + org.assertj + assertj-core + test + + com.fasterxml.jackson.core jackson-core diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReadOnly.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReadOnly.java index 21a9130a24..1d1d2d04c3 100644 --- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReadOnly.java +++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestReadOnly.java @@ -19,6 +19,7 @@ package org.apache.curator.framework.imps; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; import com.google.common.collect.Queues; @@ -69,12 +70,9 @@ public void testConnectionStateNewClient() throws Exception client = CuratorFrameworkFactory.newClient(cluster.getConnectString(), timing.session(), timing.connection(), new RetryOneTime(100)); client.start(); client.checkExists().forPath("/"); - client.getConnectionStateListenable().addListener(new ConnectionStateListener() { - @Override - public void stateChanged(CuratorFramework client, ConnectionState newState) { - if (newState == ConnectionState.LOST) { - lostLatch.countDown(); - } + client.getConnectionStateListenable().addListener((client1, newState) -> { + if (newState == ConnectionState.LOST) { + lostLatch.countDown(); } }); @@ -95,23 +93,13 @@ public void stateChanged(CuratorFramework client, ConnectionState newState) { .build(); final BlockingQueue states = Queues.newLinkedBlockingQueue(); - client.getConnectionStateListenable().addListener - ( - new ConnectionStateListener() - { - @Override - public void stateChanged(CuratorFramework client, ConnectionState newState) - { - states.add(newState); - } - } - ); + client.getConnectionStateListenable().addListener((client12, newState) -> states.add(newState)); client.start(); client.checkExists().forPath("/"); ConnectionState state = states.poll(timing.forWaiting().milliseconds(), TimeUnit.MILLISECONDS); - assertEquals(state, ConnectionState.READ_ONLY); + assertThat(state).isEqualTo(ConnectionState.READ_ONLY); } finally { @@ -136,19 +124,14 @@ public void testReadOnly() throws Exception final CountDownLatch readOnlyLatch = new CountDownLatch(1); final CountDownLatch reconnectedLatch = new CountDownLatch(1); - ConnectionStateListener listener = new ConnectionStateListener() - { - @Override - public void stateChanged(CuratorFramework client, ConnectionState newState) + ConnectionStateListener listener = (client1, newState) -> { + if ( newState == ConnectionState.READ_ONLY ) + { + readOnlyLatch.countDown(); + } + else if ( newState == ConnectionState.RECONNECTED ) { - if ( newState == ConnectionState.READ_ONLY ) - { - readOnlyLatch.countDown(); - } - else if ( newState == ConnectionState.RECONNECTED ) - { - reconnectedLatch.countDown(); - } + reconnectedLatch.countDown(); } }; client.getConnectionStateListenable().addListener(listener); @@ -177,7 +160,7 @@ else if ( newState == ConnectionState.RECONNECTED ) } @Override - protected void createServer() throws Exception + protected void createServer() { // NOP } From 602ee9842a02a86c6f880079645210f72d0580e7 Mon Sep 17 00:00:00 2001 From: tison Date: Tue, 30 Aug 2022 18:30:37 +0800 Subject: [PATCH 8/8] fix TestLeaderSelectorEdges Signed-off-by: tison --- .../recipes/leader/ChaosMonkeyCnxnFactory.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/ChaosMonkeyCnxnFactory.java b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/ChaosMonkeyCnxnFactory.java index 07e9a17862..aaaf43c1e5 100644 --- a/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/ChaosMonkeyCnxnFactory.java +++ b/curator-recipes/src/test/java/org/apache/curator/framework/recipes/leader/ChaosMonkeyCnxnFactory.java @@ -27,6 +27,7 @@ import org.apache.zookeeper.server.NIOServerCnxnFactory; import org.apache.zookeeper.server.Request; import org.apache.zookeeper.server.ZooKeeperServer; +import org.apache.zookeeper.server.ZooKeeperServerShutdownHandler; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; @@ -76,10 +77,6 @@ public void startup() { ((TestingZooKeeperMain.TestZooKeeperServer)zks).noteStartup(); } - else - { - throw new RuntimeException("Unknown ZooKeeperServer: " + zks.getClass()); - } } @Override @@ -123,5 +120,10 @@ public void submitRequest(Request si) } } } + + @Override + public ZooKeeperServerShutdownHandler getZkShutdownHandler() { + return zks.getZkShutdownHandler(); + } } }