aboutsummaryrefslogtreecommitdiffstats
path: root/zookeeper-server
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2022-01-12 11:13:23 +0100
committerJon Marius Venstad <venstad@gmail.com>2022-01-12 11:13:23 +0100
commita27d4f7b8057485f4e6992452d062eb9078bf593 (patch)
tree3564912168cc1c6d44cf9cdeb3e34ace747ef912 /zookeeper-server
parent0a6bccac16c7e91baa8be4938bb3cd417a3aee9a (diff)
Use dynamic port allocation for ZK test
Diffstat (limited to 'zookeeper-server')
-rw-r--r--zookeeper-server/zookeeper-server-3.6.3/src/test/java/com/yahoo/vespa/zookeper/VespaZooKeeperTest.java50
-rw-r--r--zookeeper-server/zookeeper-server-3.7.0/src/test/java/com/yahoo/vespa/zookeper/VespaZooKeeperTest.java50
2 files changed, 82 insertions, 18 deletions
diff --git a/zookeeper-server/zookeeper-server-3.6.3/src/test/java/com/yahoo/vespa/zookeper/VespaZooKeeperTest.java b/zookeeper-server/zookeeper-server-3.6.3/src/test/java/com/yahoo/vespa/zookeper/VespaZooKeeperTest.java
index 405ec1365fa..435f9eaca46 100644
--- a/zookeeper-server/zookeeper-server-3.6.3/src/test/java/com/yahoo/vespa/zookeper/VespaZooKeeperTest.java
+++ b/zookeeper-server/zookeeper-server-3.6.3/src/test/java/com/yahoo/vespa/zookeper/VespaZooKeeperTest.java
@@ -17,6 +17,7 @@ import org.junit.Test;
import java.io.IOException;
import java.io.UncheckedIOException;
+import java.net.ServerSocket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -39,6 +40,7 @@ import static org.junit.Assert.assertEquals;
public class VespaZooKeeperTest {
static final Path tempDirRoot = getTmpDir();
+ static final List<Integer> ports = new ArrayList<>();
/**
* Performs dynamic reconfiguration of ZooKeeper servers.
@@ -185,13 +187,8 @@ public class VespaZooKeeperTest {
return null;
Path tempDir = tempDirRoot.resolve("zookeeper-" + id);
- String[] version = System.getProperty("zk-version").split("\\.");
- int versionPortOffset = 0;
- for (String part : version)
- versionPortOffset = 32 * (versionPortOffset + Integer.parseInt(part));
- int port = 51000 + versionPortOffset % 9785;
return new ZookeeperServerConfig.Builder()
- .clientPort(port + 3 * id)
+ .clientPort(getPorts(id).get(0))
.dataDir(tempDir.toString())
.zooKeeperConfigFile(tempDir.resolve("zookeeper.cfg").toString())
.myid(id)
@@ -200,9 +197,9 @@ public class VespaZooKeeperTest {
.server(IntStream.rangeClosed(removed + 1, removed + retired + active)
.mapToObj(i -> new ZookeeperServerConfig.Server.Builder()
.id(i)
- .clientPort(port + 3 * i)
- .electionPort(port + 3 * i + 1)
- .quorumPort(port + 3 * i + 2)
+ .clientPort(getPorts(i).get(0))
+ .electionPort(getPorts(i).get(1))
+ .quorumPort(getPorts(i).get(2))
.hostname("localhost")
.joining(i - removed > retired + active - joining)
.retired(i - removed <= retired))
@@ -210,6 +207,41 @@ public class VespaZooKeeperTest {
.build();
}
+ static List<Integer> getPorts(int id) {
+ if (ports.size() < id * 3) {
+ int previousPort;
+ if (ports.isEmpty()) {
+ String[] version = System.getProperty("zk-version").split("\\.");
+ int versionPortOffset = 0;
+ for (String part : version)
+ versionPortOffset = 32 * (versionPortOffset + Integer.parseInt(part));
+ previousPort = 20000 + versionPortOffset % 30000;
+ }
+ else
+ previousPort = ports.get(ports.size() - 1);
+
+ for (int i = 0; i < 3; i++)
+ ports.add(previousPort = nextPort(previousPort));
+ }
+ return ports.subList(id * 3 - 3, id * 3);
+ }
+
+ static int nextPort(int previousPort) {
+ for (int j = 1; j <= 30000; j++) {
+ int port = (previousPort + j);
+ while (port > 50000)
+ port -= 30000;
+
+ try (ServerSocket socket = new ServerSocket(port)) {
+ return socket.getLocalPort();
+ }
+ catch (IOException e) {
+ System.err.println("Could not bind port " + port + ": " + e);
+ }
+ }
+ throw new RuntimeException("No free ports");
+ }
+
static Path getTmpDir() {
try {
Path tempDir = Files.createTempDirectory(Paths.get(System.getProperty("java.io.tmpdir")), "vespa-zk-test");
diff --git a/zookeeper-server/zookeeper-server-3.7.0/src/test/java/com/yahoo/vespa/zookeper/VespaZooKeeperTest.java b/zookeeper-server/zookeeper-server-3.7.0/src/test/java/com/yahoo/vespa/zookeper/VespaZooKeeperTest.java
index 405ec1365fa..435f9eaca46 100644
--- a/zookeeper-server/zookeeper-server-3.7.0/src/test/java/com/yahoo/vespa/zookeper/VespaZooKeeperTest.java
+++ b/zookeeper-server/zookeeper-server-3.7.0/src/test/java/com/yahoo/vespa/zookeper/VespaZooKeeperTest.java
@@ -17,6 +17,7 @@ import org.junit.Test;
import java.io.IOException;
import java.io.UncheckedIOException;
+import java.net.ServerSocket;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
@@ -39,6 +40,7 @@ import static org.junit.Assert.assertEquals;
public class VespaZooKeeperTest {
static final Path tempDirRoot = getTmpDir();
+ static final List<Integer> ports = new ArrayList<>();
/**
* Performs dynamic reconfiguration of ZooKeeper servers.
@@ -185,13 +187,8 @@ public class VespaZooKeeperTest {
return null;
Path tempDir = tempDirRoot.resolve("zookeeper-" + id);
- String[] version = System.getProperty("zk-version").split("\\.");
- int versionPortOffset = 0;
- for (String part : version)
- versionPortOffset = 32 * (versionPortOffset + Integer.parseInt(part));
- int port = 51000 + versionPortOffset % 9785;
return new ZookeeperServerConfig.Builder()
- .clientPort(port + 3 * id)
+ .clientPort(getPorts(id).get(0))
.dataDir(tempDir.toString())
.zooKeeperConfigFile(tempDir.resolve("zookeeper.cfg").toString())
.myid(id)
@@ -200,9 +197,9 @@ public class VespaZooKeeperTest {
.server(IntStream.rangeClosed(removed + 1, removed + retired + active)
.mapToObj(i -> new ZookeeperServerConfig.Server.Builder()
.id(i)
- .clientPort(port + 3 * i)
- .electionPort(port + 3 * i + 1)
- .quorumPort(port + 3 * i + 2)
+ .clientPort(getPorts(i).get(0))
+ .electionPort(getPorts(i).get(1))
+ .quorumPort(getPorts(i).get(2))
.hostname("localhost")
.joining(i - removed > retired + active - joining)
.retired(i - removed <= retired))
@@ -210,6 +207,41 @@ public class VespaZooKeeperTest {
.build();
}
+ static List<Integer> getPorts(int id) {
+ if (ports.size() < id * 3) {
+ int previousPort;
+ if (ports.isEmpty()) {
+ String[] version = System.getProperty("zk-version").split("\\.");
+ int versionPortOffset = 0;
+ for (String part : version)
+ versionPortOffset = 32 * (versionPortOffset + Integer.parseInt(part));
+ previousPort = 20000 + versionPortOffset % 30000;
+ }
+ else
+ previousPort = ports.get(ports.size() - 1);
+
+ for (int i = 0; i < 3; i++)
+ ports.add(previousPort = nextPort(previousPort));
+ }
+ return ports.subList(id * 3 - 3, id * 3);
+ }
+
+ static int nextPort(int previousPort) {
+ for (int j = 1; j <= 30000; j++) {
+ int port = (previousPort + j);
+ while (port > 50000)
+ port -= 30000;
+
+ try (ServerSocket socket = new ServerSocket(port)) {
+ return socket.getLocalPort();
+ }
+ catch (IOException e) {
+ System.err.println("Could not bind port " + port + ": " + e);
+ }
+ }
+ throw new RuntimeException("No free ports");
+ }
+
static Path getTmpDir() {
try {
Path tempDir = Files.createTempDirectory(Paths.get(System.getProperty("java.io.tmpdir")), "vespa-zk-test");