diff --git a/src/test/java/com/oltpbenchmark/api/AbstractTestCase.java b/src/test/java/com/oltpbenchmark/api/AbstractTestCase.java index d09a1d366..479f9a9ca 100644 --- a/src/test/java/com/oltpbenchmark/api/AbstractTestCase.java +++ b/src/test/java/com/oltpbenchmark/api/AbstractTestCase.java @@ -39,6 +39,8 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import java.net.ServerSocket; +import java.net.BindException; public abstract class AbstractTestCase { @@ -69,6 +71,7 @@ public abstract class AbstractTestCase { protected final String ddlOverridePath; private static final AtomicInteger portCounter = new AtomicInteger(9001); + private static final int MAX_PORT_NUMBER = 65535; public AbstractTestCase(boolean createDatabase, boolean loadDatabase) { @@ -99,7 +102,7 @@ public final void setUp() throws Exception { HsqlProperties props = new HsqlProperties(); //props.setProperty("server.remote_open", true); - int port = portCounter.incrementAndGet(); + int port = findAvailablePort(); LOG.info("starting HSQLDB server for test [{}] on port [{}]", name.getMethodName(), port); @@ -163,6 +166,23 @@ public final void setUp() throws Exception { } } + private int findAvailablePort() throws IOException { + while (true) { + int port = portCounter.incrementAndGet(); + + if (port > MAX_PORT_NUMBER) { + throw new IOException("No available port found up to " + MAX_PORT_NUMBER); + } + + try (ServerSocket testSocket = new ServerSocket(port)) { + return port; + } catch (BindException e) { + // This port is already in use. Continue to next port. + LOG.warn("Port {} is already in use. Trying next port.", port); + } + } + } + protected TransactionTypes proceduresToTransactionTypes(List> procedures) { TransactionTypes txnTypes = new TransactionTypes(new ArrayList<>());