diff --git a/conf/storage-conf.xml b/conf/storage-conf.xml index 129362f506..981e8e546f 100644 --- a/conf/storage-conf.xml +++ b/conf/storage-conf.xml @@ -14,6 +14,7 @@ 5000 tdsearch001.sf2p.facebook.com C:\Engagements\Cassandra-Nexus + 127.0.0.1 7000 7001 9160 diff --git a/src/org/apache/cassandra/config/DatabaseDescriptor.java b/src/org/apache/cassandra/config/DatabaseDescriptor.java index d0acc30993..1934ba4bf1 100644 --- a/src/org/apache/cassandra/config/DatabaseDescriptor.java +++ b/src/org/apache/cassandra/config/DatabaseDescriptor.java @@ -48,6 +48,7 @@ public class DatabaseDescriptor private static int controlPort_ = 7001; private static int httpPort_ = 7002; private static int thriftPort_ = 9160; + private static String listenAddress_ = "localhost"; private static String clusterName_ = "Test"; private static int replicationFactor_ = 3; private static long rpcTimeoutInMillis_ = 2000; @@ -176,6 +177,11 @@ public class DatabaseDescriptor if ( port != null ) storagePort_ = Integer.parseInt(port); + /* Local IP or hostname to bind services to */ + String listenAddress = xmlUtils.getNodeValue("/Storage/ListenAddress"); + if ( listenAddress != null) + listenAddress_ = listenAddress; + /* UDP port for control messages */ port = xmlUtils.getNodeValue("/Storage/ControlPort"); if ( port != null ) @@ -800,4 +806,9 @@ public class DatabaseDescriptor super(message); } } + + public static String getListenAddress() + { + return listenAddress_; + } } diff --git a/src/org/apache/cassandra/net/EndPoint.java b/src/org/apache/cassandra/net/EndPoint.java index 03d9f569f4..0280216ff1 100644 --- a/src/org/apache/cassandra/net/EndPoint.java +++ b/src/org/apache/cassandra/net/EndPoint.java @@ -30,6 +30,7 @@ import java.util.Map; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.LogUtil; import org.apache.log4j.Logger; +import org.apache.cassandra.config.DatabaseDescriptor; /** * Author : Avinash Lakshman ( alakshman@facebook.com) & Prashant Malik ( pmalik@facebook.com ) @@ -80,7 +81,14 @@ public class EndPoint implements Serializable, Comparable { try { - host_ = FBUtilities.getHostName(); + if(DatabaseDescriptor.getListenAddress() != null) + { + host_ = DatabaseDescriptor.getListenAddress(); + } + else + { + host_ = FBUtilities.getHostName(); + } port_ = port; } catch (UnknownHostException e) diff --git a/src/org/apache/cassandra/service/CassandraDaemon.java b/src/org/apache/cassandra/service/CassandraDaemon.java index 7de19674d9..685d42881b 100644 --- a/src/org/apache/cassandra/service/CassandraDaemon.java +++ b/src/org/apache/cassandra/service/CassandraDaemon.java @@ -20,6 +20,9 @@ package org.apache.cassandra.service; import java.io.File; import java.io.IOException; +import java.net.ServerSocket; +import java.net.InetSocketAddress; +import java.net.InetAddress; import org.apache.log4j.Logger; import org.apache.thrift.protocol.TBinaryProtocol; @@ -65,7 +68,22 @@ public class CassandraDaemon Cassandra.Processor processor = new Cassandra.Processor(peerStorageServer); // Transport - TServerSocket tServerSocket = new TServerSocket(listenPort); + TServerSocket tServerSocket = null; + try + { + // Make server socket + ServerSocket serverSocket = new ServerSocket(); + // Prevent 2MSL delay problem on server restarts + serverSocket.setReuseAddress(true); + // Bind to listening port + serverSocket.bind(new InetSocketAddress(DatabaseDescriptor.getListenAddress(), listenPort)); + tServerSocket = new TServerSocket(serverSocket); + } + catch (IOException ioe) + { + throw new TTransportException("Could not create ServerSocket on address " + + DatabaseDescriptor.getListenAddress() + "."); + } // Protocol factory TProtocolFactory tProtocolFactory = new TBinaryProtocol.Factory(); diff --git a/test/conf/storage-conf.xml b/test/conf/storage-conf.xml index 0cb962d4e6..a61cfabc72 100644 --- a/test/conf/storage-conf.xml +++ b/test/conf/storage-conf.xml @@ -14,6 +14,7 @@ 5000 tdsearch001.sf2p.facebook.com C:\Engagements\Cassandra-Nexus + 127.0.0.1 7000 7001 7001