a retry and extra logging when bind exception happens to fix non-det test failures on server, due to bind conflicts
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/80322eb1 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/80322eb1 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/80322eb1 Branch: refs/heads/master Commit: 80322eb15bb91b543584e643496d08f2e4f92039 Parents: 7503519 Author: Alex Heneveld <alex.henev...@cloudsoftcorp.com> Authored: Thu Feb 16 09:32:01 2017 +0000 Committer: Alex Heneveld <alex.henev...@cloudsoftcorp.com> Committed: Wed Mar 1 08:54:55 2017 +0000 ---------------------------------------------------------------------- .../apache/brooklyn/launcher/common/BasicLauncher.java | 4 +++- .../org/apache/brooklyn/launcher/BrooklynLauncher.java | 2 +- .../apache/brooklyn/launcher/BrooklynWebServer.java | 13 ++++++++++++- .../apache/brooklyn/launcher/BrooklynLauncherTest.java | 2 +- .../java/org/apache/brooklyn/util/net/Networking.java | 6 ++++++ 5 files changed, 23 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/80322eb1/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java ---------------------------------------------------------------------- diff --git a/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java b/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java index 7b16184..d098c1d 100644 --- a/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java +++ b/launcher-common/src/main/java/org/apache/brooklyn/launcher/common/BasicLauncher.java @@ -46,7 +46,6 @@ import org.apache.brooklyn.core.catalog.internal.CatalogInitialization; import org.apache.brooklyn.core.entity.Attributes; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.StartableApplication; -import org.apache.brooklyn.core.entity.factory.ApplicationBuilder; import org.apache.brooklyn.core.entity.trait.Startable; import org.apache.brooklyn.core.internal.BrooklynProperties; import org.apache.brooklyn.core.mgmt.EntityManagementUtils; @@ -426,7 +425,10 @@ public class BasicLauncher<T extends BasicLauncher<T>> { CatalogInitialization catInit = ((ManagementContextInternal)managementContext).getCatalogInitialization(); markCatalogStartingUp(catInit); + + // note: web console is started by subclass overriding this method startingUp(); + initCamp(); handlePersistence(); populateCatalog(catInit); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/80322eb1/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynLauncher.java ---------------------------------------------------------------------- diff --git a/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynLauncher.java b/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynLauncher.java index 67ad368..1dea657 100644 --- a/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynLauncher.java +++ b/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynLauncher.java @@ -326,7 +326,7 @@ public class BrooklynLauncher extends BasicLauncher<BrooklynLauncher> { webServer.start(); } catch (Exception e) { - LOG.warn("Failed to start Brooklyn web-console (rethrowing): " + Exceptions.collapseText(e)); + LOG.warn("Failed to start Brooklyn web-console (rethrowing) on "+bindAddress+" (port constraint "+port+"): " + Exceptions.collapseText(e)); throw new FatalRuntimeException("Failed to start Brooklyn web-console: " + Exceptions.collapseText(e), e); } } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/80322eb1/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynWebServer.java ---------------------------------------------------------------------- diff --git a/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynWebServer.java b/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynWebServer.java index 1377e41..e5c6b15 100644 --- a/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynWebServer.java +++ b/launcher/src/main/java/org/apache/brooklyn/launcher/BrooklynWebServer.java @@ -20,6 +20,7 @@ package org.apache.brooklyn.launcher; import java.io.File; import java.io.InputStream; +import java.net.BindException; import java.net.InetAddress; import java.net.URI; import java.security.KeyPair; @@ -82,6 +83,8 @@ import org.apache.brooklyn.util.os.Os; import org.apache.brooklyn.util.stream.Streams; import org.apache.brooklyn.util.text.Identifiers; import org.apache.brooklyn.util.text.Strings; +import org.apache.brooklyn.util.time.Duration; +import org.apache.brooklyn.util.time.Time; import org.apache.brooklyn.util.web.ContextHandlerCollectionHotSwappable; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.jaas.JAASLoginService; @@ -447,7 +450,15 @@ public class BrooklynWebServer { rootContext.setTempDirectory(Os.mkdirs(new File(webappTempDir, "war-root"))); server.setHandler(handlers); - server.start(); + try { + server.start(); + } catch (BindException e) { + // port discovery routines may take some time to clear, e.g. 250ms for SO_TIMEOUT + // tests fail because of this; see if adding a delay improves things + log.warn("Initial server start-up failed binding (retrying after a delay): "+e); + Time.sleep(Duration.millis(500)); + server.start(); + } //reinit required because some webapps (eg grails) might wipe our language extension bindings BrooklynInitialization.reinitAll(); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/80322eb1/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java ---------------------------------------------------------------------- diff --git a/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java b/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java index c3db7ad..72f389e 100644 --- a/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java +++ b/launcher/src/test/java/org/apache/brooklyn/launcher/BrooklynLauncherTest.java @@ -293,7 +293,7 @@ public class BrooklynLauncherTest { })) .installSecurityFilter(false) .start(); - // such an error should be thrown, then caught in this calling thread + // 'deliberate-exception' error above should be thrown, then caught in this calling thread ManagementContext mgmt = launcher.getServerDetails().getManagementContext(); Assert.assertFalse( ((ManagementContextInternal)mgmt).errors().isEmpty() ); Assert.assertTrue( ((ManagementContextInternal)mgmt).errors().get(0).toString().contains("deliberate"), ""+((ManagementContextInternal)mgmt).errors() ); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/80322eb1/utils/common/src/main/java/org/apache/brooklyn/util/net/Networking.java ---------------------------------------------------------------------- diff --git a/utils/common/src/main/java/org/apache/brooklyn/util/net/Networking.java b/utils/common/src/main/java/org/apache/brooklyn/util/net/Networking.java index 4e97d5c..028b3c8 100644 --- a/utils/common/src/main/java/org/apache/brooklyn/util/net/Networking.java +++ b/utils/common/src/main/java/org/apache/brooklyn/util/net/Networking.java @@ -103,12 +103,14 @@ public class Networking { ss = new ServerSocket(); ss.setSoTimeout(250); ss.setReuseAddress(true); + if (!ss.getReuseAddress()) { logReuseAddressNotSupported(); } ss.bind(new InetSocketAddress(localAddress, port)); // Check UDP port ds = new DatagramSocket(null); ds.setSoTimeout(250); ds.setReuseAddress(true); + if (!ds.getReuseAddress()) { logReuseAddressNotSupported(); } ds.bind(new InetSocketAddress(localAddress, port)); } catch (IOException e) { if (log.isTraceEnabled()) log.trace("Failed binding to " + localAddress + " : " + port, e); @@ -176,6 +178,10 @@ public class Networking { } } + private static void logReuseAddressNotSupported() { + log.debug("Socket reuse-address not supported on this platform; port discovery may mis-report available ports"); + } + /** * Bind to the specified IP, but let the OS pick a port. * If the operation fails we know it's not because of