From 20593c24a9f8c07aff8f848f4b5774ed88ea4687 Mon Sep 17 00:00:00 2001 From: T Jake Luciani Date: Thu, 12 Mar 2015 21:01:11 -0400 Subject: [PATCH 1/3] bump versions --- build.xml | 2 +- debian/changelog | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/build.xml b/build.xml index 78c6db39fb..bdbd10aca8 100644 --- a/build.xml +++ b/build.xml @@ -25,7 +25,7 @@ - + diff --git a/debian/changelog b/debian/changelog index 53fa20fb1f..2c80800948 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cassandra (2.0.13) unstable; urgency=medium + + * New release + + -- Jake Luciani Thu, 12 Mar 2015 21:00:06 -0400 + cassandra (2.0.12) unstable; urgency=medium * New release From c041ea8b3748089937168839791a6d64382b34de Mon Sep 17 00:00:00 2001 From: T Jake Luciani Date: Wed, 25 Mar 2015 12:27:50 -0400 Subject: [PATCH 2/3] Bind JMX to localhost unless explicitly configured otherwise --- CHANGES.txt | 3 + NEWS.txt | 6 ++ bin/cassandra.bat | 11 ++- build.xml | 3 +- conf/cassandra-env.ps1 | 13 +++- conf/cassandra-env.sh | 21 +++-- debian/changelog | 6 ++ .../cassandra/service/CassandraDaemon.java | 78 +++++++++++++++++-- .../utils/RMIServerSocketFactoryImpl.java | 34 ++++++++ 9 files changed, 157 insertions(+), 18 deletions(-) create mode 100644 src/java/org/apache/cassandra/utils/RMIServerSocketFactoryImpl.java diff --git a/CHANGES.txt b/CHANGES.txt index 954fa3f9d6..50c796714e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,6 @@ +2.1.4 + * If no JMX flags are set start a localhost only JMX service + 2.1.3 * Fix HSHA/offheap_objects corruption (CASSANDRA-8719) * Upgrade libthrift to 0.9.2 (CASSANDRA-8685) diff --git a/NEWS.txt b/NEWS.txt index 602770c784..076885c9b1 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -13,6 +13,12 @@ restore snapshots created with the previous major version using the 'sstableloader' tool. You can upgrade the file format of your snapshots using the provided 'sstableupgrade' tool. +2.1.4 +===== + +The default JMX config now listens to localhost only. You must enable +the other JMX flags in cassandra-env.sh manually. + 2.1.3 ===== diff --git a/bin/cassandra.bat b/bin/cassandra.bat index 99b291ad77..fefd3fcc8e 100644 --- a/bin/cassandra.bat +++ b/bin/cassandra.bat @@ -65,10 +65,13 @@ set JAVA_OPTS=-ea^ -XX:MaxTenuringThreshold=1^ -XX:CMSInitiatingOccupancyFraction=75^ -XX:+UseCMSInitiatingOccupancyOnly^ - -Dcom.sun.management.jmxremote.port=7199^ - -Dcom.sun.management.jmxremote.ssl=false^ - -Dcom.sun.management.jmxremote.authenticate=false^ - -Dlogback.configurationFile=logback.xml + -Dlogback.configurationFile=logback.xml^ + -Dcassandra.jmx.local.port=7199 +REM **** JMX REMOTE ACCESS SETTINGS SEE: https://wiki.apache.org/cassandra/JmxSecurity *** +REM -Dcom.sun.management.jmxremote.port=7199^ +REM -Dcom.sun.management.jmxremote.ssl=false^ +REM -Dcom.sun.management.jmxremote.authenticate=true^ +REM -Dcom.sun.management.jmxremote.password.file=C:\jmxremote.password REM ***** CLASSPATH library setting ***** REM Ensure that any user defined CLASSPATH variables are not used on startup diff --git a/build.xml b/build.xml index eaef5340dd..cf401e4067 100644 --- a/build.xml +++ b/build.xml @@ -25,7 +25,7 @@ - + @@ -1113,6 +1113,7 @@ + diff --git a/conf/cassandra-env.ps1 b/conf/cassandra-env.ps1 index 9c6b6f48d5..7a71a137c9 100644 --- a/conf/cassandra-env.ps1 +++ b/conf/cassandra-env.ps1 @@ -400,10 +400,17 @@ Function SetCassandraEnvironment # https://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole # for more on configuring JMX through firewalls, etc. (Short version: # get it working with no firewall first.) - $env:JVM_OPTS="$env:JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT" - $env:JVM_OPTS="$env:JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false" - $env:JVM_OPTS="$env:JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false" + # + # Due to potential security exploits, Cassandra ships with JMX accessible + # *only* from localhost. To enable remote JMX connections, uncomment lines below + # with authentication and ssl enabled. See https://wiki.apache.org/cassandra/JmxSecurity + # + #$env:JVM_OPTS="$env:JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT" + #$env:JVM_OPTS="$env:JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false" + #$env:JVM_OPTS="$env:JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=true" #$env:JVM_OPTS="$env:JVM_OPTS -Dcom.sun.management.jmxremote.password.file=C:/jmxremote.password" + $env:JVM_OPTS="$env:JVM_OPTS -Dcassandra.jmx.local.port=$JMX_PORT -XX:+DisableExplicitGC" + $env:JVM_OPTS="$env:JVM_OPTS $JVM_EXTRA_OPTS" $env:JVM_OPTS = "$env:JVM_OPTS -Dlog4j.configuration=log4j-server.properties" diff --git a/conf/cassandra-env.sh b/conf/cassandra-env.sh index 3f4c21b088..58022e6124 100644 --- a/conf/cassandra-env.sh +++ b/conf/cassandra-env.sh @@ -270,6 +270,22 @@ JVM_OPTS="$JVM_OPTS -Djava.net.preferIPv4Stack=true" # https://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole # for more on configuring JMX through firewalls, etc. (Short version: # get it working with no firewall first.) +# +# Cassandra ships with JMX accessible *only* from localhost. +# To enable remote JMX connections, uncomment lines below +# with authentication and/or ssl enabled. See https://wiki.apache.org/cassandra/JmxSecurity +# +LOCAL_JMX=yes + +if [ "$LOCAL_JMX" = "yes" ]; then + JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.local.port=$JMX_PORT -XX:+DisableExplicitGC" +else + JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT" + JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT" + JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false" + JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=true" + JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password" +fi # To use mx4j, an HTML interface for JMX, add mx4j-tools.jar to the lib/ # directory. @@ -279,11 +295,6 @@ JVM_OPTS="$JVM_OPTS -Djava.net.preferIPv4Stack=true" #MX4J_ADDRESS="-Dmx4jaddress=127.0.0.1" #MX4J_PORT="-Dmx4jport=8081" -JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT" -JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT" -JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false" -JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false" -#JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password" JVM_OPTS="$JVM_OPTS $MX4J_ADDRESS" JVM_OPTS="$JVM_OPTS $MX4J_PORT" JVM_OPTS="$JVM_OPTS $JVM_EXTRA_OPTS" diff --git a/debian/changelog b/debian/changelog index 339da0ce6e..807546033a 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cassandra (2.1.4) unstable; urgency=medium + + * New release + + -- Jake Luciani Fri, 27 Mar 2015 13:48:25 -0400 + cassandra (2.1.3) unstable; urgency=medium * New release diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java index 50c8295928..3e398bffa2 100644 --- a/src/java/org/apache/cassandra/service/CassandraDaemon.java +++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java @@ -23,14 +23,16 @@ import java.lang.management.ManagementFactory; import java.lang.management.MemoryPoolMXBean; import java.net.InetAddress; import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.Date; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.TimeUnit; +import java.rmi.registry.LocateRegistry; +import java.rmi.server.RMIServerSocketFactory; +import java.util.*; + import java.util.concurrent.TimeUnit; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.StandardMBean; +import javax.management.remote.JMXConnectorServer; +import javax.management.remote.JMXServiceURL; +import javax.management.remote.rmi.RMIConnectorServer; import com.google.common.collect.Iterables; import com.google.common.util.concurrent.Uninterruptibles; @@ -66,9 +68,61 @@ import org.apache.cassandra.utils.*; public class CassandraDaemon { public static final String MBEAN_NAME = "org.apache.cassandra.db:type=NativeAccess"; + public static JMXConnectorServer jmxServer = null; private static final Logger logger = LoggerFactory.getLogger(CassandraDaemon.class); + private static void maybeInitJmx() + { + String jmxPort = System.getProperty("com.sun.management.jmxremote.port"); + + if (jmxPort == null) + { + logger.warn("JMX is not enabled to receive remote connections. Please see cassandra-env.sh for more info."); + + jmxPort = System.getProperty("cassandra.jmx.local.port"); + + if (jmxPort == null) + { + logger.error("cassandra.jmx.local.port missing from cassandra-env.sh, unable to start local JMX service." + jmxPort); + } + else + { + System.setProperty("java.rmi.server.hostname","127.0.0.1"); + + try + { + RMIServerSocketFactory serverFactory = new RMIServerSocketFactoryImpl(); + LocateRegistry.createRegistry(Integer.valueOf(jmxPort), null, serverFactory); + + StringBuffer url = new StringBuffer(); + url.append("service:jmx:"); + url.append("rmi://localhost/jndi/"); + url.append("rmi://localhost:").append(jmxPort).append("/jmxrmi"); + + Map env = new HashMap(); + env.put(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, serverFactory); + + jmxServer = new RMIConnectorServer( + new JMXServiceURL(url.toString()), + env, + ManagementFactory.getPlatformMBeanServer() + ); + + jmxServer.start(); + } + catch (IOException e) + { + logger.error("Error starting local jmx server: ", e); + } + } + } + else + { + logger.info("JMX is enabled to receive remote connections on port: " + jmxPort); + } + } + private static final CassandraDaemon instance = new CassandraDaemon(); /** @@ -159,6 +213,8 @@ public class CassandraDaemon CLibrary.tryMlockall(); + maybeInitJmx(); + Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread t, Throwable e) @@ -432,6 +488,18 @@ public class CassandraDaemon // We rely on the shutdown hook to drain the node if (FBUtilities.isWindows()) System.exit(0); + + if (jmxServer != null) + { + try + { + jmxServer.stop(); + } + catch (IOException e) + { + logger.error("Error shutting down local JMX server: ", e); + } + } } diff --git a/src/java/org/apache/cassandra/utils/RMIServerSocketFactoryImpl.java b/src/java/org/apache/cassandra/utils/RMIServerSocketFactoryImpl.java new file mode 100644 index 0000000000..75331abd2f --- /dev/null +++ b/src/java/org/apache/cassandra/utils/RMIServerSocketFactoryImpl.java @@ -0,0 +1,34 @@ +package org.apache.cassandra.utils; + +import java.io.IOException; +import java.net.*; +import java.rmi.server.RMIServerSocketFactory; +import javax.net.ServerSocketFactory; + + +public class RMIServerSocketFactoryImpl implements RMIServerSocketFactory +{ + + public ServerSocket createServerSocket(final int pPort) throws IOException { + return ServerSocketFactory.getDefault().createServerSocket(pPort, 0, InetAddress.getLoopbackAddress()); + } + + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (obj == this) + { + return true; + } + + return obj.getClass().equals(getClass()); + } + + public int hashCode() + { + return RMIServerSocketFactoryImpl.class.hashCode(); + } +} From 2433068c157cd21d4217c98ec5c0b9a2c07e288d Mon Sep 17 00:00:00 2001 From: T Jake Luciani Date: Wed, 25 Mar 2015 12:04:09 -0400 Subject: [PATCH 3/3] Bind JMX to localhost unless explicitly configured otherwise --- CHANGES.txt | 3 + NEWS.txt | 5 ++ bin/cassandra.bat | 11 ++- build.xml | 5 +- conf/cassandra-env.sh | 22 ++++-- debian/changelog | 6 ++ .../cassandra/service/CassandraDaemon.java | 79 ++++++++++++++++++- .../utils/RMIServerSocketFactoryImpl.java | 34 ++++++++ 8 files changed, 150 insertions(+), 15 deletions(-) create mode 100644 src/java/org/apache/cassandra/utils/RMIServerSocketFactoryImpl.java diff --git a/CHANGES.txt b/CHANGES.txt index f98bb3fc73..7a3a4eada0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,6 @@ +2.0.14: + * If no JMX flags are set start a localhost only JMX service + 2.0.13: * Add offline tool to relevel sstables (CASSANDRA-8301) * Preserve stream ID for more protocol errors (CASSANDRA-8848) diff --git a/NEWS.txt b/NEWS.txt index 5a4bc3d0f4..82f643fa20 100644 --- a/NEWS.txt +++ b/NEWS.txt @@ -13,6 +13,11 @@ restore snapshots created with the previous major version using the 'sstableloader' tool. You can upgrade the file format of your snapshots using the provided 'sstableupgrade' tool. +2.0.14 +====== + The default JMX config now listens to localhost only. You must enable +the other JMX flags in cassandra-env.sh manually. + 2.0.13 ====== diff --git a/bin/cassandra.bat b/bin/cassandra.bat index 8a3bf7fdb4..c316d7f3ef 100644 --- a/bin/cassandra.bat +++ b/bin/cassandra.bat @@ -41,11 +41,14 @@ set JAVA_OPTS=-ea^ -XX:MaxTenuringThreshold=1^ -XX:CMSInitiatingOccupancyFraction=75^ -XX:+UseCMSInitiatingOccupancyOnly^ - -Dcom.sun.management.jmxremote.port=7199^ - -Dcom.sun.management.jmxremote.ssl=false^ - -Dcom.sun.management.jmxremote.authenticate=false^ -Dlog4j.configuration=log4j-server.properties^ - -Dlog4j.defaultInitOverride=true + -Dlog4j.defaultInitOverride=true^ + -Dcassandra.jmx.local.port=7199 +REM **** JMX REMOTE ACCESS SETTINGS SEE: https://wiki.apache.org/cassandra/JmxSecurity *** +REM -Dcom.sun.management.jmxremote.port=7199^ +REM -Dcom.sun.management.jmxremote.ssl=false^ +REM -Dcom.sun.management.jmxremote.authenticate=true^ +REM -Dcom.sun.management.jmxremote.password.file=C:\jmxremote.password REM ***** CLASSPATH library setting ***** diff --git a/build.xml b/build.xml index bdbd10aca8..e644b717fd 100644 --- a/build.xml +++ b/build.xml @@ -25,7 +25,7 @@ - + @@ -1035,7 +1035,8 @@ - + + diff --git a/conf/cassandra-env.sh b/conf/cassandra-env.sh index dfe8184522..70d86cf806 100644 --- a/conf/cassandra-env.sh +++ b/conf/cassandra-env.sh @@ -261,9 +261,21 @@ JVM_OPTS="$JVM_OPTS -Djava.net.preferIPv4Stack=true" # https://blogs.oracle.com/jmxetc/entry/troubleshooting_connection_problems_in_jconsole # for more on configuring JMX through firewalls, etc. (Short version: # get it working with no firewall first.) -JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT" -JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT" -JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false" -JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=false" -#JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password" +# +# Cassandra ships with JMX accessible *only* from localhost. +# To enable remote JMX connections, change the setting below to enable JMX +# with authentication and/or ssl enabled. See https://wiki.apache.org/cassandra/JmxSecurity +# +LOCAL_JMX=yes + +if [ "$LOCAL_JMX" = "yes" ]; then + JVM_OPTS="$JVM_OPTS -Dcassandra.jmx.local.port=$JMX_PORT -XX:+DisableExplicitGC" +else + JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.port=$JMX_PORT" + JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.rmi.port=$JMX_PORT" + JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.ssl=false" + JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.authenticate=true" + JVM_OPTS="$JVM_OPTS -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password" +fi + JVM_OPTS="$JVM_OPTS $JVM_EXTRA_OPTS" diff --git a/debian/changelog b/debian/changelog index 2c80800948..257d636828 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +cassandra (2.0.14) unstable; urgency=medium + + * New release + + -- Jake Luciani Thu, 26 Mar 2015 14:57:39 -0400 + cassandra (2.0.13) unstable; urgency=medium * New release diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java index cad165876f..039760ec71 100644 --- a/src/java/org/apache/cassandra/service/CassandraDaemon.java +++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java @@ -24,13 +24,21 @@ import java.lang.management.MemoryPoolMXBean; import java.net.InetAddress; import java.net.MalformedURLException; import java.net.URL; +import java.rmi.registry.LocateRegistry; +import java.rmi.server.RMIServerSocketFactory; +import java.rmi.server.RMISocketFactory; import java.util.Arrays; +import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; import javax.management.MBeanServer; import javax.management.ObjectName; import javax.management.StandardMBean; +import javax.management.remote.JMXConnectorServer; +import javax.management.remote.JMXConnectorServerFactory; +import javax.management.remote.JMXServiceURL; +import javax.management.remote.rmi.RMIConnectorServer; import com.addthis.metrics.reporter.config.ReporterConfig; @@ -38,6 +46,7 @@ import com.google.common.collect.Iterables; import com.google.common.util.concurrent.Uninterruptibles; import org.apache.cassandra.io.sstable.CorruptSSTableException; +import org.apache.cassandra.utils.*; import org.apache.log4j.PropertyConfigurator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -62,10 +71,6 @@ import org.apache.cassandra.io.util.FileUtils; import org.apache.cassandra.metrics.StorageMetrics; import org.apache.cassandra.thrift.ThriftServer; import org.apache.cassandra.tracing.Tracing; -import org.apache.cassandra.utils.CLibrary; -import org.apache.cassandra.utils.FBUtilities; -import org.apache.cassandra.utils.Mx4jTool; -import org.apache.cassandra.utils.Pair; /** * The CassandraDaemon is an abstraction for a Cassandra daemon @@ -76,6 +81,7 @@ import org.apache.cassandra.utils.Pair; public class CassandraDaemon { public static final String MBEAN_NAME = "org.apache.cassandra.db:type=NativeAccess"; + public static JMXConnectorServer jmxServer = null; static { @@ -138,6 +144,57 @@ public class CassandraDaemon private static final Logger logger = LoggerFactory.getLogger(CassandraDaemon.class); + private static void maybeInitJmx() + { + String jmxPort = System.getProperty("com.sun.management.jmxremote.port"); + + if (jmxPort == null) + { + logger.warn("JMX is not enabled to receive remote connections. Please see cassandra-env.sh for more info."); + + jmxPort = System.getProperty("cassandra.jmx.local.port"); + + if (jmxPort == null) + { + logger.error("cassandra.jmx.local.port missing from cassandra-env.sh, unable to start local JMX service." + jmxPort); + } + else + { + System.setProperty("java.rmi.server.hostname","127.0.0.1"); + + try + { + RMIServerSocketFactory serverFactory = new RMIServerSocketFactoryImpl(); + LocateRegistry.createRegistry(Integer.valueOf(jmxPort), null, serverFactory); + + StringBuffer url = new StringBuffer(); + url.append("service:jmx:"); + url.append("rmi://localhost/jndi/"); + url.append("rmi://localhost:").append(jmxPort).append("/jmxrmi"); + + Map env = new HashMap(); + env.put(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, serverFactory); + + jmxServer = new RMIConnectorServer( + new JMXServiceURL(url.toString()), + env, + ManagementFactory.getPlatformMBeanServer() + ); + + jmxServer.start(); + } + catch (IOException e) + { + logger.error("Error starting local jmx server: ", e); + } + } + } + else + { + logger.info("JMX is enabled to receive remote connections on port: " + jmxPort); + } + } + private static final CassandraDaemon instance = new CassandraDaemon(); public Server thriftServer; @@ -191,6 +248,8 @@ public class CassandraDaemon logger.info("Classpath: {}", System.getProperty("java.class.path")); CLibrary.tryMlockall(); + maybeInitJmx(); + Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { public void uncaughtException(Thread t, Throwable e) @@ -463,6 +522,18 @@ public class CassandraDaemon logger.info("Cassandra shutting down..."); thriftServer.stop(); nativeServer.stop(); + + if (jmxServer != null) + { + try + { + jmxServer.stop(); + } + catch (IOException e) + { + logger.error("Error shutting down local JMX server: ", e); + } + } } diff --git a/src/java/org/apache/cassandra/utils/RMIServerSocketFactoryImpl.java b/src/java/org/apache/cassandra/utils/RMIServerSocketFactoryImpl.java new file mode 100644 index 0000000000..75331abd2f --- /dev/null +++ b/src/java/org/apache/cassandra/utils/RMIServerSocketFactoryImpl.java @@ -0,0 +1,34 @@ +package org.apache.cassandra.utils; + +import java.io.IOException; +import java.net.*; +import java.rmi.server.RMIServerSocketFactory; +import javax.net.ServerSocketFactory; + + +public class RMIServerSocketFactoryImpl implements RMIServerSocketFactory +{ + + public ServerSocket createServerSocket(final int pPort) throws IOException { + return ServerSocketFactory.getDefault().createServerSocket(pPort, 0, InetAddress.getLoopbackAddress()); + } + + public boolean equals(Object obj) + { + if (obj == null) + { + return false; + } + if (obj == this) + { + return true; + } + + return obj.getClass().equals(getClass()); + } + + public int hashCode() + { + return RMIServerSocketFactoryImpl.class.hashCode(); + } +}