Repository: cassandra
Updated Branches:
  refs/heads/trunk 4d63358b5 -> 17adc5963


Add broadcast_rpc_address option to cassandra.yaml

Patch by Tyler Hobbs, reviewed by Jason Brown for CASSANDRA-5899


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

Branch: refs/heads/trunk
Commit: 893c11f5451b199365f2edecc9914a20879ac552
Parents: 7e0f7a0
Author: Tyler Hobbs <[email protected]>
Authored: Fri Mar 7 13:09:05 2014 -0600
Committer: Tyler Hobbs <[email protected]>
Committed: Fri Mar 7 13:09:05 2014 -0600

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 conf/cassandra.yaml                             | 15 ++++--
 .../org/apache/cassandra/config/Config.java     |  1 +
 .../cassandra/config/DatabaseDescriptor.java    | 49 ++++++++++++++++++--
 .../cassandra/locator/Ec2MultiRegionSnitch.java |  1 +
 .../cassandra/service/CassandraDaemon.java      |  2 +-
 .../cassandra/service/StorageService.java       |  4 +-
 .../org/apache/cassandra/transport/Server.java  |  2 +
 8 files changed, 62 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/893c11f5/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 98fc33c..709b05a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.0-beta2
+ * Add broadcast_rpc_address option to cassandra.yaml (CASSANDRA-5899)
  * Auto reload GossipingPropertyFileSnitch config (CASSANDRA-5897)
  * Fix overflow of memtable_total_space_in_mb (CASSANDRA-6573)
  * Fix ABTC NPE (CASSANDRA-6692)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/893c11f5/conf/cassandra.yaml
----------------------------------------------------------------------
diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml
index 98cbb2a..477594f 100644
--- a/conf/cassandra.yaml
+++ b/conf/cassandra.yaml
@@ -373,18 +373,23 @@ native_transport_port: 9042
 start_rpc: true
 
 # The address to bind the Thrift RPC service and native transport
-# server -- clients connect here.
+# server to.
 #
-# Leaving this blank has the same effect it does for ListenAddress,
+# Leaving this blank has the same effect as on listen_address
 # (i.e. it will be based on the configured hostname of the node).
 #
-# Note that unlike ListenAddress above, it is allowed to specify 0.0.0.0
-# here if you want to listen on all interfaces, but that will break clients 
-# that rely on node auto-discovery.
+# Note that unlike listen_address, you can specify 0.0.0.0, but you must also
+# set broadcast_rpc_address to a value other than 0.0.0.0.
 rpc_address: localhost
 # port for Thrift to listen for clients on
 rpc_port: 9160
 
+# RPC address to broadcast to drivers and other Cassandra nodes. This cannot
+# be set to 0.0.0.0. If left blank, this will be set to the value of
+# rpc_address. If rpc_address is set to 0.0.0.0, broadcast_rpc_address must
+# be set.
+# broadcast_rpc_address: 1.2.3.4
+
 # enable or disable keepalive on rpc connections
 rpc_keepalive: true
 

http://git-wip-us.apache.org/repos/asf/cassandra/blob/893c11f5/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 a9b9237..c5d35a3 100644
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@ -104,6 +104,7 @@ public class Config
 
     public Boolean start_rpc = true;
     public String rpc_address;
+    public String broadcast_rpc_address;
     public Integer rpc_port = 9160;
     public Integer rpc_listen_backlog = 50;
     public String rpc_server_type = "sync";

http://git-wip-us.apache.org/repos/asf/cassandra/blob/893c11f5/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 930bbcc..25b05ff 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -68,6 +68,7 @@ public class DatabaseDescriptor
     private static InetAddress listenAddress; // leave null so we can fall 
through to getLocalHost
     private static InetAddress broadcastAddress;
     private static InetAddress rpcAddress;
+    private static InetAddress broadcastRpcAddress;
     private static SeedProvider seedProvider;
     private static IInternodeAuthenticator internodeAuthenticator;
 
@@ -325,6 +326,39 @@ public class DatabaseDescriptor
             rpcAddress = FBUtilities.getLocalAddress();
         }
 
+        /* RPC address to broadcast */
+        if (conf.broadcast_rpc_address != null)
+        {
+            if (conf.broadcast_rpc_address.equals("0.0.0.0"))
+                throw new ConfigurationException("broadcast_rpc_address cannot 
be 0.0.0.0");
+
+            try
+            {
+                broadcastRpcAddress = 
InetAddress.getByName(conf.broadcast_rpc_address);
+            }
+            catch (UnknownHostException e)
+            {
+                throw new ConfigurationException("Unkown broadcast_rpc_address 
'" + conf.broadcast_rpc_address + "'");
+            }
+        }
+        else
+        {
+            InetAddress bindAll;
+            try
+            {
+                bindAll = InetAddress.getByAddress(new byte[4]);
+            }
+            catch (UnknownHostException e)
+            {
+                throw new RuntimeException("Host 0.0.0.0 is somehow unknown");
+            }
+
+            if (rpcAddress.equals(bindAll))
+                throw new ConfigurationException("If rpc_address is set to 
0.0.0.0, you must set broadcast_rpc_address " +
+                                                 "to a value other than 
0.0.0.0");
+            broadcastRpcAddress = rpcAddress;
+        }
+
         if (conf.thrift_framed_transport_size_in_mb <= 0)
             throw new 
ConfigurationException("thrift_framed_transport_size_in_mb must be positive");
 
@@ -1026,6 +1060,16 @@ public class DatabaseDescriptor
         return rpcAddress;
     }
 
+    public static void setBroadcastRpcAddress(InetAddress broadcastRPCAddr)
+    {
+        broadcastRpcAddress = broadcastRPCAddr;
+    }
+
+    public static InetAddress getBroadcastRpcAddress()
+    {
+        return broadcastRpcAddress;
+    }
+
     public static String getRpcServerType()
     {
         return conf.rpc_server_type;
@@ -1071,11 +1115,6 @@ public class DatabaseDescriptor
         return conf.start_native_transport;
     }
 
-    public static InetAddress getNativeTransportAddress()
-    {
-        return getRpcAddress();
-    }
-
     public static int getNativeTransportPort()
     {
         return 
Integer.parseInt(System.getProperty("cassandra.native_transport_port", 
conf.native_transport_port.toString()));

http://git-wip-us.apache.org/repos/asf/cassandra/blob/893c11f5/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java 
b/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java
index 7dc2fa9..511cbb5 100644
--- a/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java
+++ b/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java
@@ -52,6 +52,7 @@ public class Ec2MultiRegionSnitch extends Ec2Snitch
         localPrivateAddress = awsApiCall(PRIVATE_IP_QUERY_URL);
         // use the Public IP to broadcast Address to other nodes.
         DatabaseDescriptor.setBroadcastAddress(localPublicAddress);
+        DatabaseDescriptor.setBroadcastRpcAddress(localPublicAddress);
     }
 
     public void gossiperStarting()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/893c11f5/src/java/org/apache/cassandra/service/CassandraDaemon.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java 
b/src/java/org/apache/cassandra/service/CassandraDaemon.java
index 50bbe02..7c56fb7 100644
--- a/src/java/org/apache/cassandra/service/CassandraDaemon.java
+++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java
@@ -360,7 +360,7 @@ public class CassandraDaemon
         thriftServer = new ThriftServer(rpcAddr, rpcPort, listenBacklog);
 
         // Native transport
-        InetAddress nativeAddr = 
DatabaseDescriptor.getNativeTransportAddress();
+        InetAddress nativeAddr = DatabaseDescriptor.getRpcAddress();
         int nativePort = DatabaseDescriptor.getNativeTransportPort();
         nativeServer = new org.apache.cassandra.transport.Server(nativeAddr, 
nativePort);
     }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/893c11f5/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 132e674..d1db703 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -637,7 +637,7 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
         getTokenMetadata().updateHostId(SystemKeyspace.getLocalHostId(), 
FBUtilities.getBroadcastAddress());
         appStates.put(ApplicationState.NET_VERSION, 
valueFactory.networkVersion());
         appStates.put(ApplicationState.HOST_ID, 
valueFactory.hostId(SystemKeyspace.getLocalHostId()));
-        appStates.put(ApplicationState.RPC_ADDRESS, 
valueFactory.rpcaddress(DatabaseDescriptor.getRpcAddress()));
+        appStates.put(ApplicationState.RPC_ADDRESS, 
valueFactory.rpcaddress(DatabaseDescriptor.getBroadcastRpcAddress()));
         appStates.put(ApplicationState.RELEASE_VERSION, 
valueFactory.releaseVersion());
         logger.info("Starting up server gossip");
         Gossiper.instance.register(this);
@@ -1049,7 +1049,7 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
     public String getRpcaddress(InetAddress endpoint)
     {
         if (endpoint.equals(FBUtilities.getBroadcastAddress()))
-            return DatabaseDescriptor.getRpcAddress().getHostAddress();
+            return 
DatabaseDescriptor.getBroadcastRpcAddress().getHostAddress();
         else if 
(Gossiper.instance.getEndpointStateForEndpoint(endpoint).getApplicationState(ApplicationState.RPC_ADDRESS)
 == null)
             return endpoint.getHostAddress();
         else

http://git-wip-us.apache.org/repos/asf/cassandra/blob/893c11f5/src/java/org/apache/cassandra/transport/Server.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/transport/Server.java 
b/src/java/org/apache/cassandra/transport/Server.java
index 4f46614..801a3e5 100644
--- a/src/java/org/apache/cassandra/transport/Server.java
+++ b/src/java/org/apache/cassandra/transport/Server.java
@@ -331,6 +331,8 @@ public class Server implements CassandraDaemon.Server
                 InetAddress rpcAddress = 
InetAddress.getByName(StorageService.instance.getRpcaddress(endpoint));
                 // If rpcAddress == 0.0.0.0 (i.e. bound on all addresses), 
returning that is not very helpful,
                 // so return the internal address (which is ok since "we're 
bound on all addresses").
+                // Note that after all nodes are running a version that 
includes CASSANDRA-5899, rpcAddress should
+                // never be 0.0.0.0, so this can eventually be removed.
                 return rpcAddress.equals(bindAll) ? endpoint : rpcAddress;
             }
             catch (UnknownHostException e)

Reply via email to