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