You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2016/02/01 18:48:59 UTC

[29/50] brooklyn-server git commit: fixes from code review: setting interrupted flag and cleaner hostname lookup/bailout logic

fixes from code review: setting interrupted flag and cleaner hostname lookup/bailout logic


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/a6b00ab6
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/a6b00ab6
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/a6b00ab6

Branch: refs/heads/0.4.0
Commit: a6b00ab6d6d420352a1963b06b6ad41ea89071aa
Parents: 3b8e6e7
Author: Alex Heneveld <al...@cloudsoftcorp.com>
Authored: Wed Oct 10 12:32:48 2012 +0100
Committer: Alex Heneveld <al...@cloudsoftcorp.com>
Committed: Wed Oct 10 12:32:48 2012 +0100

----------------------------------------------------------------------
 .../location/geo/UtraceHostGeoLookup.java       | 43 +++++++++-----------
 .../src/main/java/brooklyn/util/Exceptions.java | 16 ++++++++
 core/src/main/java/brooklyn/util/Time.java      |  4 +-
 3 files changed, 37 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a6b00ab6/core/src/main/java/brooklyn/location/geo/UtraceHostGeoLookup.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/location/geo/UtraceHostGeoLookup.java b/core/src/main/java/brooklyn/location/geo/UtraceHostGeoLookup.java
index 221534c..7fb7cf8 100644
--- a/core/src/main/java/brooklyn/location/geo/UtraceHostGeoLookup.java
+++ b/core/src/main/java/brooklyn/location/geo/UtraceHostGeoLookup.java
@@ -7,15 +7,17 @@ import groovy.util.XmlParser;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import brooklyn.util.Exceptions;
 import brooklyn.util.NetworkUtils;
 import brooklyn.util.ResourceUtils;
+import brooklyn.util.RuntimeInterruptedException;
 
 import com.google.common.base.Throwables;
 
@@ -54,51 +56,46 @@ Beyond this you get blacklisted and requests may time out, or return none.
         return "http://xml.utrace.de/?query="+ip.trim();
     }
 
-    static AtomicBoolean retrievingLocalExternalIp = new AtomicBoolean(false); 
-    volatile static String localExternalIp;
+    private static final AtomicBoolean retrievingLocalExternalIp = new AtomicBoolean(false);
+    private static final CountDownLatch triedLocalExternalIp = new CountDownLatch(1);
+    static volatile String localExternalIp;
+
     /** returns public IP of localhost */
-    public static synchronized String getLocalhostExternalIp() {
+    public static String getLocalhostExternalIp() {
         if (localExternalIp!=null) return localExternalIp;
 
         // do in private thread, otherwise blocks for 30s+ on dodgy network!
         // (we can skip it if someone else is doing it, we have synch lock so we'll get notified)
-        if (!retrievingLocalExternalIp.get())
+        if (retrievingLocalExternalIp.compareAndSet(false, true)) {
             new Thread(new Runnable() {
                 public void run() {
-                    if (retrievingLocalExternalIp.getAndSet(true))
-                        // someone else already trying to retrieve; caller can safely just wait,
-                        // as they will get notified by the someone else
-                        return;
                     try {
-                        if (localExternalIp!=null)
-                            // someone else succeeded
-                            return;
                         log.debug("Looking up external IP of this host in private thread "+Thread.currentThread());
                         localExternalIp = new ResourceUtils(HostGeoLookup.class).getResourceAsString("http://api.externalip.net/ip/").trim();
                         log.debug("Finished looking up external IP of this host in private thread, result "+localExternalIp);
                     } catch (Throwable t) {
                         log.debug("Not able to look up external IP of this host in private thread, probably offline ("+t+")");
                     } finally {
-                        synchronized (UtraceHostGeoLookup.class) {
-                            UtraceHostGeoLookup.class.notifyAll();        
-                            retrievingLocalExternalIp.set(false);
-                        }
+                        retrievingLocalExternalIp.set(false);
+                        triedLocalExternalIp.countDown();
                     }
                 }
             }).start();
-        
+        }
+
         try {
             // only wait 2s, so startup is fast
-            UtraceHostGeoLookup.class.wait(2000);
+            triedLocalExternalIp.await(2000, TimeUnit.MILLISECONDS);
         } catch (InterruptedException e) {
-            throw Throwables.propagate(e);
+            throw Exceptions.propagate(e);
         }
-        if (localExternalIp==null) throw 
-            Throwables.propagate(new IOException("Unable to discover external IP of local machine; response to server timed out (thread may be ongoing)"));
-        
+        if (localExternalIp==null)  
+            throw Throwables.propagate(new IOException("Unable to discover external IP of local machine; response to server timed out (ongoing="+retrievingLocalExternalIp+")"));
+
         log.debug("Looked up external IP of this host, result is: "+localExternalIp);
         return localExternalIp;
     }
+    
     public String getLookupUrlForLocalhost() {
         return getLookupUrlForPublicIp(getLocalhostExternalIp());
     }

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a6b00ab6/core/src/main/java/brooklyn/util/Exceptions.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/Exceptions.java b/core/src/main/java/brooklyn/util/Exceptions.java
new file mode 100644
index 0000000..efda008
--- /dev/null
+++ b/core/src/main/java/brooklyn/util/Exceptions.java
@@ -0,0 +1,16 @@
+package brooklyn.util;
+
+import com.google.common.base.Throwables;
+
+public class Exceptions {
+
+    /** like guava {@link Throwables#propagate(Throwable)}, 
+     * but set interrupted if interrupted exception (why doesn't guava do this?!), 
+     * and throw {@link RuntimeInterruptedException} */
+    public static RuntimeException propagate(Throwable throwable) {
+        if (throwable instanceof InterruptedException)
+            throw new RuntimeInterruptedException((InterruptedException)throwable);
+        return Throwables.propagate(throwable);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/a6b00ab6/core/src/main/java/brooklyn/util/Time.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/brooklyn/util/Time.java b/core/src/main/java/brooklyn/util/Time.java
index 0aa32b3..f49eccd 100644
--- a/core/src/main/java/brooklyn/util/Time.java
+++ b/core/src/main/java/brooklyn/util/Time.java
@@ -14,8 +14,6 @@ import java.util.concurrent.TimeUnit;
 
 import brooklyn.util.text.Strings;
 
-import com.google.common.base.Throwables;
-
 public class Time {
 
 	public static String DATE_FORMAT_PREFERRED = "yyyy-MM-dd HH:mm:ss.SSS";
@@ -152,7 +150,7 @@ public class Time {
 		try {
 			Thread.sleep(millis);
 		} catch (InterruptedException e) {
-			throw Throwables.propagate(e);
+			throw Exceptions.propagate(e);
 		}
 	}