You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2014/08/26 15:24:34 UTC

svn commit: r1620593 - in /qpid/trunk/qpid/java: broker-core/src/main/java/org/apache/qpid/server/model/ broker-core/src/main/java/org/apache/qpid/server/model/port/ broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/

Author: rgodfrey
Date: Tue Aug 26 13:24:34 2014
New Revision: 1620593

URL: http://svn.apache.org/r1620593
Log:
QPID-6044 : [Java Broker] [AMQP 1.0] cache the valid host names for the local machine

Modified:
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
    qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
    qpid/trunk/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java

Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java?rev=1620593&r1=1620592&r2=1620593&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/Port.java Tue Aug 26 13:24:34 2014
@@ -65,4 +65,7 @@ public interface Port<X extends Port<X>>
     Collection<Connection> getConnections();
 
     void start();
+
+    boolean isLocalMachine(final String host);
+
 }

Modified: qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java?rev=1620593&r1=1620592&r2=1620593&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java (original)
+++ qpid/trunk/qpid/java/broker-core/src/main/java/org/apache/qpid/server/model/port/AbstractPort.java Tue Aug 26 13:24:34 2014
@@ -21,6 +21,11 @@
 
 package org.apache.qpid.server.model.port;
 
+import java.net.InetAddress;
+import java.net.InterfaceAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.UnknownHostException;
 import java.security.AccessControlException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -29,6 +34,10 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.log4j.Logger;
 
@@ -54,6 +63,60 @@ abstract public class AbstractPort<X ext
 {
     private static final Logger LOGGER = Logger.getLogger(AbstractPort.class);
 
+    private static final Set<InetAddress> LOCAL_ADDRESSES = new CopyOnWriteArraySet<>();
+    private static final Set<String> LOCAL_ADDRESS_NAMES = new CopyOnWriteArraySet<>();
+    private static final Lock ADDRESS_LOCK = new ReentrantLock();
+    private static final AtomicBoolean ADDRESSES_COMPUTED = new AtomicBoolean();
+
+    static
+    {
+        Thread thread = new Thread(new Runnable()
+        {
+            public void run()
+            {
+                Lock lock = ADDRESS_LOCK;
+
+                lock.lock();
+                try
+                {
+                    for (NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces()))
+                    {
+                        for (InterfaceAddress inetAddress : networkInterface.getInterfaceAddresses())
+                        {
+                            InetAddress address = inetAddress.getAddress();
+                            LOCAL_ADDRESSES.add(address);
+                            String hostAddress = address.getHostAddress();
+                            if (hostAddress != null)
+                            {
+                                LOCAL_ADDRESS_NAMES.add(hostAddress);
+                            }
+                            String hostName = address.getHostName();
+                            if (hostName != null)
+                            {
+                                LOCAL_ADDRESS_NAMES.add(hostName);
+                            }
+                            String canonicalHostName = address.getCanonicalHostName();
+                            if (canonicalHostName != null)
+                            {
+                                LOCAL_ADDRESS_NAMES.add(canonicalHostName);
+                            }
+                        }
+                    }
+                }
+                catch (SocketException e)
+                {
+                    // ignore
+                }
+                finally
+                {
+                    ADDRESSES_COMPUTED.set(true);
+                    lock.unlock();
+                }
+            }
+        }, "Network Address Resolver");
+        thread.start();
+    }
+
     private final Broker<?> _broker;
     private State _state = State.UNINITIALIZED;
 
@@ -335,7 +398,7 @@ abstract public class AbstractPort<X ext
                 Collection<Protocol> portProtocols = existingPort.getProtocols();
                 if (portProtocols != null)
                 {
-                    final ArrayList<Protocol> intersection = new ArrayList(portProtocols);
+                    final ArrayList<Protocol> intersection = new ArrayList<>(portProtocols);
                     intersection.retainAll(getProtocols());
                     if(!intersection.isEmpty())
                     {
@@ -345,4 +408,39 @@ abstract public class AbstractPort<X ext
             }
         }
     }
+
+    public boolean isLocalMachine(final String host)
+    {
+        while(!ADDRESSES_COMPUTED.get())
+        {
+            Lock lock = ADDRESS_LOCK;
+            lock.lock();
+            lock.unlock();
+        }
+
+        boolean isNetworkAddress = true;
+        if (!LOCAL_ADDRESS_NAMES.contains(host))
+        {
+            try
+            {
+                InetAddress inetAddress = InetAddress.getByName(host);
+                if (!LOCAL_ADDRESSES.contains(inetAddress))
+                {
+                    isNetworkAddress = false;
+                }
+                else
+                {
+                    LOCAL_ADDRESS_NAMES.add(host);
+                }
+            }
+            catch (UnknownHostException e)
+            {
+                // ignore
+                isNetworkAddress = false;
+            }
+        }
+        return isNetworkAddress;
+
+    }
+
 }

Modified: qpid/trunk/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java?rev=1620593&r1=1620592&r2=1620593&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Connection_1_0.java Tue Aug 26 13:24:34 2014
@@ -22,19 +22,13 @@ package org.apache.qpid.server.protocol.
 
 import static org.apache.qpid.server.logging.subjects.LogSubjectFormat.CONNECTION_FORMAT;
 
-import java.net.InetAddress;
-import java.net.InterfaceAddress;
-import java.net.NetworkInterface;
 import java.net.SocketAddress;
-import java.net.SocketException;
-import java.net.UnknownHostException;
 import java.security.Principal;
 import java.security.PrivilegedAction;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -142,7 +136,7 @@ public class Connection_1_0 implements C
         }
 
         _vhost = ((AmqpPort)_port).getVirtualHost(host);
-        if(_vhost == null && isNetworkAddress(host))
+        if(_vhost == null && _port.isLocalMachine(host))
         {
             _vhost = ((AmqpPort)_port).getVirtualHost(_broker.getDefaultVirtualHost());
         }
@@ -163,56 +157,6 @@ public class Connection_1_0 implements C
             _subject.getPrivateCredentials().addAll(authSubject.getPrivateCredentials());
         }
     }
-
-    private boolean isNetworkAddress(final String host)
-    {
-
-        try
-        {
-            Set<InetAddress> addresses = new HashSet<>();
-
-            for(NetworkInterface networkInterface : Collections.list(NetworkInterface.getNetworkInterfaces()))
-            {
-                for(InterfaceAddress inetAddress : networkInterface.getInterfaceAddresses())
-                {
-                    InetAddress address = inetAddress.getAddress();
-                    addresses.add(address);
-                    if(host.equals(address.getHostAddress()))
-                    {
-                        return true;
-                    }
-                    if(host.equals(address.getHostName()))
-                    {
-                        return true;
-                    }
-                    if(host.equals(address.getCanonicalHostName()))
-                    {
-                        return true;
-                    }
-                }
-            }
-
-            try
-            {
-                InetAddress inetAddress = InetAddress.getByName(host);
-                if(addresses.contains(inetAddress))
-                {
-                    return true;
-                }
-            }
-            catch (UnknownHostException e)
-            {
-                // ignore
-            }
-        }
-        catch (SocketException e)
-        {
-            // ignore
-        }
-
-        return false;
-    }
-
     public void remoteSessionCreation(SessionEndpoint endpoint)
     {
         if(!_closedOnOpen)



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org