Skip to content

Commit

Permalink
[7.1.0] Retry binding to ipv6 localhost (bazelbuild#20755)
Browse files Browse the repository at this point in the history
Fixes bazelbuild#20743

Commit
bazelbuild@1a0b3a0

PiperOrigin-RevId: 595935153
Change-Id: I0409552aa92f3886c5abf3bd3ce50d67594dab7e

Co-authored-by: Googler <pcloudy@google.com>
  • Loading branch information
bazel-io and meteorcloudy authored Jan 5, 2024
1 parent e16250c commit 6f07e40
Showing 1 changed file with 25 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import com.google.devtools.build.lib.util.DetailedExitCode;
import com.google.devtools.build.lib.util.ExitCode;
import com.google.devtools.build.lib.util.InterruptedFailureDetails;
import com.google.devtools.build.lib.util.OS;
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.util.io.OutErr;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
Expand Down Expand Up @@ -376,6 +377,26 @@ public void interrupt() {
commandManager.interruptInflightCommands();
}

private Server bindIpv6WithRetries(InetSocketAddress address, int maxRetries) throws IOException {
Server server = null;
for (int attempt = 1; attempt <= maxRetries; attempt++) {
try {
server =
NettyServerBuilder.forAddress(address)
.addService(this)
.directExecutor()
.build()
.start();
break;
} catch (IOException e) {
if (attempt == maxRetries) {
throw e;
}
}
}
return server;
}

@Override
public void serve() throws AbruptExitException {
Preconditions.checkState(!serving);
Expand All @@ -391,8 +412,10 @@ public void serve() throws AbruptExitException {
if (Epoll.isAvailable() && !Socket.isIPv6Preferred()) {
throw new IOException("ipv6 is not preferred on the system.");
}
server =
NettyServerBuilder.forAddress(address).addService(this).directExecutor().build().start();
// For some strange reasons, Bazel server sometimes fails to bind to IPv6 localhost when
// running in macOS sandbox-exec with internet blocked. Retrying seems to help.
// See https://github.com/bazelbuild/bazel/issues/20743
server = bindIpv6WithRetries(address, OS.getCurrent() == OS.DARWIN ? 3 : 1);
} catch (IOException ipv6Exception) {
address = new InetSocketAddress("127.0.0.1", port);
try {
Expand Down

0 comments on commit 6f07e40

Please sign in to comment.