You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by sv...@apache.org on 2017/03/02 12:16:07 UTC

[06/10] brooklyn-server git commit: a retry and extra logging when bind exception happens

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 <al...@cloudsoftcorp.com>
Authored: Thu Feb 16 09:32:01 2017 +0000
Committer: Alex Heneveld <al...@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