diff --git a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/NetworkUtils.kt b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/NetworkUtils.kt index 7c5478ba039..e69b597b851 100644 --- a/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/NetworkUtils.kt +++ b/compiler/daemon/daemon-common/src/org/jetbrains/kotlin/daemon/common/NetworkUtils.kt @@ -18,10 +18,7 @@ package org.jetbrains.kotlin.daemon.common import java.io.IOException import java.io.Serializable -import java.net.Inet6Address -import java.net.InetAddress -import java.net.ServerSocket -import java.net.Socket +import java.net.* import java.rmi.RemoteException import java.rmi.registry.LocateRegistry import java.rmi.registry.Registry @@ -33,6 +30,11 @@ import java.util.* const val SOCKET_ANY_FREE_PORT = 0 const val JAVA_RMI_SERVER_HOSTNAME = "java.rmi.server.hostname" const val DAEMON_RMI_SOCKET_BACKLOG_SIZE_PROPERTY = "kotlin.daemon.socket.backlog.size" +const val DAEMON_RMI_SOCKET_CONNECT_ATTEMPTS_PROPERTY = "kotlin.daemon.socket.connect.attempts" +const val DAEMON_RMI_SOCKET_CONNECT_INTERVAL_PROPERTY = "kotlin.daemon.socket.connect.interval" +const val DEFAULT_SERVER_SOCKET_BACKLOG_SIZE = 50 +const val DEFAULT_SOCKET_CONNECT_ATTEMPTS = 3 +const val DEFAULT_SOCKET_CONNECT_INTERVAL_MS = 10L object LoopbackNetworkInterface { @@ -41,7 +43,9 @@ object LoopbackNetworkInterface { // size of the requests queue for daemon services, so far seems that we don't need any big numbers here // but if we'll start getting "connection refused" errors, that could be the first place to try to fix it - val SERVER_SOCKET_BACKLOG_SIZE by lazy { System.getProperty(DAEMON_RMI_SOCKET_BACKLOG_SIZE_PROPERTY)?.toIntOrNull() ?: 50 } + val SERVER_SOCKET_BACKLOG_SIZE by lazy { System.getProperty(DAEMON_RMI_SOCKET_BACKLOG_SIZE_PROPERTY)?.toIntOrNull() ?: DEFAULT_SERVER_SOCKET_BACKLOG_SIZE } + val SOCKET_CONNECT_ATTEMPTS by lazy { System.getProperty(DAEMON_RMI_SOCKET_CONNECT_ATTEMPTS_PROPERTY)?.toIntOrNull() ?: DEFAULT_SOCKET_CONNECT_ATTEMPTS } + val SOCKET_CONNECT_INTERVAL_MS by lazy { System.getProperty(DAEMON_RMI_SOCKET_CONNECT_INTERVAL_PROPERTY)?.toLongOrNull() ?: DEFAULT_SOCKET_CONNECT_INTERVAL_MS } val serverLoopbackSocketFactory by lazy { ServerLoopbackSocketFactory() } val clientLoopbackSocketFactory by lazy { ClientLoopbackSocketFactory() } @@ -75,7 +79,18 @@ object LoopbackNetworkInterface { override fun hashCode(): Int = super.hashCode() @Throws(IOException::class) - override fun createSocket(host: String, port: Int): Socket = Socket(InetAddress.getByName(null), port) + override fun createSocket(host: String, port: Int): Socket { + var attemptsLeft = SOCKET_CONNECT_ATTEMPTS + while (true) { + try { + return Socket(InetAddress.getByName(null), port) + } + catch (e: ConnectException) { + if (--attemptsLeft <= 0) throw e + } + Thread.sleep(SOCKET_CONNECT_INTERVAL_MS) + } + } } }