From 42785ab206ff561da7e9d5b6ac6e23ccd589124a Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Tue, 30 Dec 2014 20:44:23 +0100 Subject: [PATCH] Improve stability of randomly allocated ports (when sonar.web.port or sonar.search.port are set to zero) --- .../java/org/sonar/process/NetworkUtils.java | 20 ++++++++++++------- .../java/org/sonar/search/SearchSettings.java | 2 ++ .../java/org/sonar/server/app/Connectors.java | 1 + 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/server/sonar-process/src/main/java/org/sonar/process/NetworkUtils.java b/server/sonar-process/src/main/java/org/sonar/process/NetworkUtils.java index 0443d5148be..44fcfb7677d 100644 --- a/server/sonar-process/src/main/java/org/sonar/process/NetworkUtils.java +++ b/server/sonar-process/src/main/java/org/sonar/process/NetworkUtils.java @@ -21,6 +21,8 @@ package org.sonar.process; import org.apache.commons.io.IOUtils; +import java.io.IOException; +import java.net.InetSocketAddress; import java.net.ServerSocket; public class NetworkUtils { @@ -33,14 +35,18 @@ public class NetworkUtils { * Get an unused port */ public static int freePort() { - ServerSocket s = null; - try { - s = new ServerSocket(0); - return s.getLocalPort(); - } catch (Exception e) { - throw new IllegalStateException("Can not find an open network port", e); + ServerSocket socket = null; + try { + socket = new ServerSocket(); + socket.setReuseAddress(true); + socket.bind(new InetSocketAddress(0)); + return socket.getLocalPort(); + + } catch (IOException e) { + throw new IllegalStateException("Can not find a free network port", e); + } finally { - IOUtils.closeQuietly(s); + IOUtils.closeQuietly(socket); } } } diff --git a/server/sonar-search/src/main/java/org/sonar/search/SearchSettings.java b/server/sonar-search/src/main/java/org/sonar/search/SearchSettings.java index ede9e33358c..fe781338179 100644 --- a/server/sonar-search/src/main/java/org/sonar/search/SearchSettings.java +++ b/server/sonar-search/src/main/java/org/sonar/search/SearchSettings.java @@ -130,6 +130,8 @@ class SearchSettings { // disable multicast builder.put("discovery.zen.ping.multicast.enabled", "false"); builder.put("transport.tcp.port", tcpPort); + // Elasticsearch sets the default value of TCP reuse address to true only on non-MSWindows machines, but why ? + builder.put("network.tcp.reuse_address", true); Integer httpPort = props.valueAsInt(PROP_HTTP_PORT); if (httpPort == null) { diff --git a/server/sonar-server/src/main/java/org/sonar/server/app/Connectors.java b/server/sonar-server/src/main/java/org/sonar/server/app/Connectors.java index 8bbbef09311..a402f4a8aa8 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/app/Connectors.java +++ b/server/sonar-server/src/main/java/org/sonar/server/app/Connectors.java @@ -129,6 +129,7 @@ class Connectors { Connector connector = new Connector(protocol); connector.setURIEncoding("UTF-8"); connector.setProperty("address", props.value("sonar.web.host", "0.0.0.0")); + connector.setProperty("socket.soReuseAddress", "true"); configurePool(props, connector, scheme); configureCompression(connector); return connector; -- 2.39.5