Skip to content

fix(storage): fix flaky storage integration tests#13256

Draft
nidhiii-27 wants to merge 1 commit into
mainfrom
storage/flaky-test-fix-2
Draft

fix(storage): fix flaky storage integration tests#13256
nidhiii-27 wants to merge 1 commit into
mainfrom
storage/flaky-test-fix-2

Conversation

@nidhiii-27
Copy link
Copy Markdown
Contributor

No description provided.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request updates the TestBench utility to use gthread workers and introduces dynamic port allocation for HTTP and gRPC services to improve test isolation. It also appends a unique UUID to container names. Review feedback identifies that the setReuseAddress call in the new findFreePort method is currently ineffective because it is called after the socket is bound; a code suggestion was provided to fix this. Additionally, it is recommended to refactor the Builder constructor to delegate to the existing parameterized constructor to reduce code duplication.

Comment on lines +404 to +411
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);
}
}
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);
}
}

Comment on lines 506 to 517
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;
}
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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant