From ea7879e49396880ca47479c7583d18ce57a5ba91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=B3r=C3=A1nt=20Pint=C3=A9r?= Date: Mon, 28 Oct 2019 09:11:05 +0100 Subject: [PATCH] Use `hostname` on macOS to lookup local host name This is to work around a five second lag when using the JDK approach, see https://bugs.openjdk.java.net/browse/JDK-8143378. --- .../internal/inet/InetAddressFactory.java | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/subprojects/messaging/src/main/java/org/gradle/internal/remote/internal/inet/InetAddressFactory.java b/subprojects/messaging/src/main/java/org/gradle/internal/remote/internal/inet/InetAddressFactory.java index 9b864f2bf04e..777d227654d9 100644 --- a/subprojects/messaging/src/main/java/org/gradle/internal/remote/internal/inet/InetAddressFactory.java +++ b/subprojects/messaging/src/main/java/org/gradle/internal/remote/internal/inet/InetAddressFactory.java @@ -15,10 +15,13 @@ */ package org.gradle.internal.remote.internal.inet; +import org.gradle.internal.os.OperatingSystem; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nullable; +import java.io.BufferedReader; +import java.io.InputStreamReader; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.UnknownHostException; @@ -38,16 +41,41 @@ public class InetAddressFactory { private String hostName; public String getHostname() { - synchronized (lock) { - if (hostName == null) { - try { - hostName = InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - hostName = getCommunicationAddresses().get(0).toString(); + if (hostName == null) { + synchronized (lock) { + // Work around https://bugs.openjdk.java.net/browse/JDK-8143378 on macOS + // See also https://stackoverflow.com/a/39698914 + if (hostName == null && OperatingSystem.current() == OperatingSystem.MAC_OS) { + ProcessBuilder builder = new ProcessBuilder("hostname"); + try { + Process process = builder.start(); + int result = process.waitFor(); + if (result == 0) { + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); + try { + String line = reader.readLine(); + if (line != null) { + hostName = line; + } + } finally { + reader.close(); + } + } + } catch (Exception e) { + logger.debug("Couldn't resolve hostname by running hostname, falling back to using JDK", e); + } + } + + if (hostName == null) { + try { + hostName = InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + hostName = getCommunicationAddresses().get(0).toString(); + } } } - return hostName; } + return hostName; } /**