Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.0 65885e7fc -> d55a51e95


Add property to allow listening on broadcast_address (CASSANDRA-9748)

patch by pauloricardomg; reviewed by aweisberg for CASSANDRA-9748


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/94c361d1
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/94c361d1
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/94c361d1

Branch: refs/heads/cassandra-3.0
Commit: 94c361d1a7a63490f1b66f5b10e02579516c5eae
Parents: f166749
Author: Paulo Motta <[email protected]>
Authored: Thu Nov 26 13:00:20 2015 -0800
Committer: Sylvain Lebresne <[email protected]>
Committed: Fri Dec 11 17:56:45 2015 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 conf/cassandra.yaml                             |  8 ++++++++
 .../org/apache/cassandra/config/Config.java     |  1 +
 .../cassandra/config/DatabaseDescriptor.java    |  5 +++++
 .../locator/ReconnectableSnitchHelper.java      |  2 +-
 .../apache/cassandra/net/MessagingService.java  | 20 ++++++++++++++++----
 .../cassandra/service/StorageService.java       |  8 ++++----
 .../org/apache/cassandra/utils/FBUtilities.java | 16 ++++++++++++++++
 .../apache/cassandra/service/RemoveTest.java    |  2 +-
 9 files changed, 53 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/94c361d1/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 5da0d42..035e471 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.2.5
+ * Add property to allow listening on broadcast interface (CASSANDRA-9748)
  * Fix regression in split size on CqlInputFormat (CASSANDRA-10835)
  * Better handling of SSL connection errors inter-node (CASSANDRA-10816)
  * Disable reloading of GossipingPropertyFileSnitch (CASSANDRA-9474)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/94c361d1/conf/cassandra.yaml
----------------------------------------------------------------------
diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml
index dc4ef32..ec30488 100644
--- a/conf/cassandra.yaml
+++ b/conf/cassandra.yaml
@@ -421,6 +421,14 @@ listen_address: localhost
 # Leaving this blank will set it to the same value as listen_address
 # broadcast_address: 1.2.3.4
 
+# When using multiple physical network interfaces, set this
+# to true to listen on broadcast_address in addition to
+# the listen_address, allowing nodes to communicate in both
+# interfaces.
+# Ignore this property if the network configuration automatically
+# routes  between the public and private networks such as EC2.
+# listen_on_broadcast_address: false
+
 # Internode authentication backend, implementing IInternodeAuthenticator;
 # used to allow/disallow connections from peer nodes.
 # internode_authenticator: 
org.apache.cassandra.auth.AllowAllInternodeAuthenticator

http://git-wip-us.apache.org/repos/asf/cassandra/blob/94c361d1/src/java/org/apache/cassandra/config/Config.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/Config.java 
b/src/java/org/apache/cassandra/config/Config.java
index a8be5f4..c8ce0d7 100644
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@ -112,6 +112,7 @@ public class Config
     public String listen_interface;
     public Boolean listen_interface_prefer_ipv6 = false;
     public String broadcast_address;
+    public Boolean listen_on_broadcast_address = false;
     public String internode_authenticator;
 
     /* intentionally left set to true, despite being set to false in stock 2.2 
cassandra.yaml

http://git-wip-us.apache.org/repos/asf/cassandra/blob/94c361d1/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java 
b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index 4fcc1fe..af0595d 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -1226,6 +1226,11 @@ public class DatabaseDescriptor
         return broadcastAddress;
     }
 
+    public static Boolean shouldListenOnBroadcastAddress()
+    {
+        return conf.listen_on_broadcast_address;
+    }
+
     public static IInternodeAuthenticator getInternodeAuthenticator()
     {
         return internodeAuthenticator;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/94c361d1/src/java/org/apache/cassandra/locator/ReconnectableSnitchHelper.java
----------------------------------------------------------------------
diff --git 
a/src/java/org/apache/cassandra/locator/ReconnectableSnitchHelper.java 
b/src/java/org/apache/cassandra/locator/ReconnectableSnitchHelper.java
index 8b34fc0..3277af7 100644
--- a/src/java/org/apache/cassandra/locator/ReconnectableSnitchHelper.java
+++ b/src/java/org/apache/cassandra/locator/ReconnectableSnitchHelper.java
@@ -63,7 +63,7 @@ public class ReconnectableSnitchHelper implements 
IEndpointStateChangeSubscriber
                 && 
!MessagingService.instance().getConnectionPool(publicAddress).endPoint().equals(localAddress))
         {
             
MessagingService.instance().getConnectionPool(publicAddress).reset(localAddress);
-            logger.trace(String.format("Intiated reconnect to an Internal IP 
%s for the %s", localAddress, publicAddress));
+            logger.debug(String.format("Intiated reconnect to an Internal IP 
%s for the %s", localAddress, publicAddress));
         }
     }
     

http://git-wip-us.apache.org/repos/asf/cassandra/blob/94c361d1/src/java/org/apache/cassandra/net/MessagingService.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/net/MessagingService.java 
b/src/java/org/apache/cassandra/net/MessagingService.java
index 09ee73f..61e58c2 100644
--- a/src/java/org/apache/cassandra/net/MessagingService.java
+++ b/src/java/org/apache/cassandra/net/MessagingService.java
@@ -447,21 +447,31 @@ public final class MessagingService implements 
MessagingServiceMBean
         getConnectionPool(ep).reset();
     }
 
+    public void listen()
+    {
+        callbacks.reset(); // hack to allow tests to stop/restart MS
+        listen(FBUtilities.getLocalAddress());
+        if (DatabaseDescriptor.shouldListenOnBroadcastAddress()
+            && 
!FBUtilities.getLocalAddress().equals(FBUtilities.getBroadcastAddress()))
+        {
+            listen(FBUtilities.getBroadcastAddress());
+        }
+        listenGate.signalAll();
+    }
+
     /**
      * Listen on the specified port.
      *
      * @param localEp InetAddress whose port to listen on.
      */
-    public void listen(InetAddress localEp) throws ConfigurationException
+    private void listen(InetAddress localEp) throws ConfigurationException
     {
-        callbacks.reset(); // hack to allow tests to stop/restart MS
         for (ServerSocket ss : getServerSockets(localEp))
         {
             SocketThread th = new SocketThread(ss, "ACCEPT-" + localEp);
             th.start();
             socketThreads.add(th);
         }
-        listenGate.signalAll();
     }
 
     @SuppressWarnings("resource")
@@ -524,7 +534,9 @@ public final class MessagingService implements 
MessagingServiceMBean
                 FileUtils.closeQuietly(socket);
                 throw new RuntimeException(e);
             }
-            logger.info("Starting Messaging Service on port {}", 
DatabaseDescriptor.getStoragePort());
+            String nic = FBUtilities.getNetworkInterface(localEp);
+            logger.info("Starting Messaging Service on {}:{}{}", localEp, 
DatabaseDescriptor.getStoragePort(),
+                        nic == null? "" : String.format(" (%s)", nic));
             ss.add(socket);
         }
         return ss;

http://git-wip-us.apache.org/repos/asf/cassandra/blob/94c361d1/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageService.java 
b/src/java/org/apache/cassandra/service/StorageService.java
index 5a8d0c2..e8e7daf 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -509,7 +509,7 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
     {
         logger.info("Gathering node replacement information for {}", 
DatabaseDescriptor.getReplaceAddress());
         if (!MessagingService.instance().isListening())
-            MessagingService.instance().listen(FBUtilities.getLocalAddress());
+            MessagingService.instance().listen();
 
         // make magic happen
         Gossiper.instance.doShadowRound();
@@ -540,7 +540,7 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
     {
         logger.debug("Starting shadow gossip round to check for endpoint 
collision");
         if (!MessagingService.instance().isListening())
-            MessagingService.instance().listen(FBUtilities.getLocalAddress());
+            MessagingService.instance().listen();
         Gossiper.instance.doShadowRound();
         if 
(!Gossiper.instance.isSafeForBootstrap(FBUtilities.getBroadcastAddress()))
         {
@@ -573,7 +573,7 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
         Gossiper.instance.start((int) (System.currentTimeMillis() / 1000)); // 
needed for node-ring gathering.
         
Gossiper.instance.addLocalApplicationState(ApplicationState.NET_VERSION, 
valueFactory.networkVersion());
         if (!MessagingService.instance().isListening())
-            MessagingService.instance().listen(FBUtilities.getLocalAddress());
+            MessagingService.instance().listen();
     }
 
     public synchronized void initServer() throws ConfigurationException
@@ -781,7 +781,7 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
             Schema.instance.updateVersionAndAnnounce(); // Ensure we know our 
own actual Schema UUID in preparation for updates
 
             if (!MessagingService.instance().isListening())
-                
MessagingService.instance().listen(FBUtilities.getLocalAddress());
+                MessagingService.instance().listen();
             LoadBroadcaster.instance.startBroadcasting();
 
             HintedHandOffManager.instance.start();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/94c361d1/src/java/org/apache/cassandra/utils/FBUtilities.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java 
b/src/java/org/apache/cassandra/utils/FBUtilities.java
index a16fa13..9eda878 100644
--- a/src/java/org/apache/cassandra/utils/FBUtilities.java
+++ b/src/java/org/apache/cassandra/utils/FBUtilities.java
@@ -166,6 +166,22 @@ public class FBUtilities
         return localAddresses;
     }
 
+    public static String getNetworkInterface(InetAddress localAddress)
+    {
+        try {
+            for(NetworkInterface ifc : 
Collections.list(NetworkInterface.getNetworkInterfaces())) {
+                if(ifc.isUp()) {
+                    for(InetAddress addr : 
Collections.list(ifc.getInetAddresses())) {
+                        if (addr.equals(localAddress))
+                            return ifc.getDisplayName();
+                    }
+                }
+            }
+        }
+        catch (SocketException e) {}
+        return null;
+    }
+
     /**
      * Given two bit arrays represented as BigIntegers, containing the given
      * number of significant bits, calculate a midpoint.

http://git-wip-us.apache.org/repos/asf/cassandra/blob/94c361d1/test/unit/org/apache/cassandra/service/RemoveTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/service/RemoveTest.java 
b/test/unit/org/apache/cassandra/service/RemoveTest.java
index 6d7cac8..9f1d6a8 100644
--- a/test/unit/org/apache/cassandra/service/RemoveTest.java
+++ b/test/unit/org/apache/cassandra/service/RemoveTest.java
@@ -78,7 +78,7 @@ public class RemoveTest
         // create a ring of 5 nodes
         Util.createInitialRing(ss, partitioner, endpointTokens, keyTokens, 
hosts, hostIds, 6);
 
-        MessagingService.instance().listen(FBUtilities.getBroadcastAddress());
+        MessagingService.instance().listen();
         Gossiper.instance.start(1);
         removalhost = hosts.get(5);
         hosts.remove(removalhost);

Reply via email to