Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ public void start() {
dockerImage,
"gunicorn",
"--bind=0.0.0.0:9000",
"--worker-class=sync",
"--worker-class=gthread",
"--threads=10",
"--access-logfile=-",
"--keep-alive=0",
Expand Down Expand Up @@ -401,6 +401,15 @@ private void dumpServerLog(String prefix, File out) throws IOException {
}
}

private static int findFreePort() {
try (java.net.ServerSocket socket = new java.net.ServerSocket(0)) {
socket.setReuseAddress(true);
return socket.getLocalPort();
} catch (java.io.IOException e) {
throw new RuntimeException("Failed to find a free port", e);
}
}
Comment on lines +404 to +411
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The setReuseAddress(true) call is ineffective because it is invoked after the ServerSocket has already been bound by the constructor. To be effective, it must be called on an unbound socket before the bind() operation. Additionally, binding specifically to 127.0.0.1 is generally preferred for local port discovery in tests to avoid potential conflicts or security prompts related to external network interfaces.

Suggested change
private static int findFreePort() {
try (java.net.ServerSocket socket = new java.net.ServerSocket(0)) {
socket.setReuseAddress(true);
return socket.getLocalPort();
} catch (java.io.IOException e) {
throw new RuntimeException("Failed to find a free port", e);
}
}
private static int findFreePort() {
try (java.net.ServerSocket socket = new java.net.ServerSocket()) {
socket.setReuseAddress(true);
socket.bind(new java.net.InetSocketAddress("127.0.0.1", 0));
return socket.getLocalPort();
} catch (java.io.IOException e) {
throw new RuntimeException("Failed to find a free port", e);
}
}


static Builder newBuilder() {
return new Builder();
}
Expand Down Expand Up @@ -495,13 +504,16 @@ static final class Builder {
private String containerName;

private Builder() {
this(
false,
DEFAULT_BASE_URI,
DEFAULT_GRPC_BASE_URI,
DEFAULT_IMAGE_NAME,
DEFAULT_IMAGE_TAG,
DEFAULT_CONTAINER_NAME);
int httpPort = findFreePort();
int grpcPort = findFreePort();
String uuid = java.util.UUID.randomUUID().toString().substring(0, 8);

this.ignorePullError = false;
this.baseUri = "http://127.0.0.1:" + httpPort;
this.gRPCBaseUri = "http://127.0.0.1:" + grpcPort;
this.dockerImageName = DEFAULT_IMAGE_NAME;
this.dockerImageTag = DEFAULT_IMAGE_TAG;
this.containerName = DEFAULT_CONTAINER_NAME + "_" + uuid;
}
Comment on lines 506 to 517
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

This constructor can be simplified by delegating to the existing parameterized constructor. This avoids duplicating field assignments and maintains consistency with the previous implementation style.

    private Builder() {
      this(
          false,
          "http://127.0.0.1:" + findFreePort(),
          "http://127.0.0.1:" + findFreePort(),
          DEFAULT_IMAGE_NAME,
          DEFAULT_IMAGE_TAG,
          DEFAULT_CONTAINER_NAME + "_" + java.util.UUID.randomUUID().toString().substring(0, 8));
    }
References
  1. Reuse pre-configured objects or existing constructors directly instead of duplicating assignments to maintain consistency and reduce bloat.


private Builder(
Expand Down
Loading