You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ee...@apache.org on 2011/01/03 21:05:01 UTC

svn commit: r1054727 - in /cassandra/trunk: ./ conf/ debian/ interface/thrift/gen-java/org/apache/cassandra/thrift/ src/java/org/apache/cassandra/config/ src/java/org/apache/cassandra/dht/ src/java/org/apache/cassandra/hadoop/ src/java/org/apache/cassa...

Author: eevans
Date: Mon Jan  3 20:05:00 2011
New Revision: 1054727

URL: http://svn.apache.org/viewvc?rev=1054727&view=rev
Log:
merge w/ 0.7 branch

Modified:
    cassandra/trunk/   (props changed)
    cassandra/trunk/CHANGES.txt
    cassandra/trunk/build.xml
    cassandra/trunk/conf/cassandra.yaml
    cassandra/trunk/debian/changelog
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java   (props changed)
    cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java   (props changed)
    cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
    cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java
    cassandra/trunk/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java
    cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java
    cassandra/trunk/src/java/org/apache/cassandra/hadoop/ColumnFamilyInputFormat.java
    cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
    cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java
    cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitchMBean.java
    cassandra/trunk/src/java/org/apache/cassandra/net/IMessageCallback.java
    cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
    cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java
    cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java
    cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java

Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jan  3 20:05:00 2011
@@ -1,6 +1,6 @@
-/cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1053763
-/cassandra/branches/cassandra-0.7:1026516-1054135
-/cassandra/branches/cassandra-0.7.0:1053690-1053962
+/cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1054725
+/cassandra/branches/cassandra-0.7:1026516-1054726
+/cassandra/branches/cassandra-0.7.0:1053690-1054631
 /cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689
 /incubator/cassandra/branches/cassandra-0.3:774578-796573
 /incubator/cassandra/branches/cassandra-0.4:810145-834239,834349-834350

Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Mon Jan  3 20:05:00 2011
@@ -9,6 +9,10 @@
  * upgrade to TFastFramedTransport (CASSANDRA-1743)
  * avoid polluting page cache with commitlog or sstable writes
    and seq scan operations (CASSANDRA-1470)
+ * add RMI authentication options to nodetool (CASSANDRA-1921)
+ * Make snitches configurable at runtime (CASSANDRA-1374)
+ * retry hadoop split requests on connection failure (CASSANDRA-1927)
+ * implement describeOwnership for BOP, COPP (CASSANDRA-1928)
 
 
 0.7.0-rc4

Modified: cassandra/trunk/build.xml
URL: http://svn.apache.org/viewvc/cassandra/trunk/build.xml?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/build.xml (original)
+++ cassandra/trunk/build.xml Mon Jan  3 20:05:00 2011
@@ -47,7 +47,7 @@
     <property name="test.unit.src" value="${test.dir}/unit"/>
     <property name="test.long.src" value="${test.dir}/long"/>
     <property name="dist.dir" value="${build.dir}/dist"/>
-    <property name="base.version" value="0.7.0-rc3"/>
+    <property name="base.version" value="0.7.0-rc4"/>
     <condition property="version" value="${base.version}">
       <isset property="release"/>
     </condition>
@@ -398,6 +398,11 @@
           <exclude name="interface/avro/**" />
           <exclude name=".git/**" />
           <exclude name="bin/*" /> <!-- handled separately below -->
+          <!-- exclude Eclipse files -->
+          <exclude name=".project" />
+          <exclude name=".classpath" />
+          <exclude name=".settings/**" />
+          <exclude name=".externalToolBuilders/**" />
         </tarfileset>
 
         <!-- Shell includes and batch files in bin/ -->
@@ -603,4 +608,111 @@
     </javadoc>
    </target>
 
+  <!-- Generate Eclipse project description files -->
+  <target name="generate-eclipse-files" depends="build">
+    <echo file=".project"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+  <name>${eclipse.project.name}</name>
+  <comment></comment>
+  <projects>
+  </projects>
+    <buildSpec>
+      <buildCommand>
+        <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name>
+        <triggers>full,incremental,auto,clean,</triggers>
+        <arguments>
+          <dictionary>
+            <key>LaunchConfigHandle</key>
+            <value>&lt;project&gt;/.externalToolBuilders/Cassandra_Ant_Builder.launch</value>
+          </dictionary>
+        </arguments>
+      </buildCommand>
+    </buildSpec>
+  <natures>
+    <nature>org.eclipse.jdt.core.javanature</nature>
+  </natures>
+</projectDescription>]]>
+    </echo>
+	<echo file=".classpath"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+  <classpathentry kind="src" path="src/java"/>
+  <classpathentry kind="src" path="src/gen-java"/>
+  <classpathentry kind="src" path="interface/avro/gen-java"/>
+  <classpathentry kind="src" path="interface/thrift/gen-java"/>
+  <classpathentry kind="src" path="test/unit"/>
+  <classpathentry kind="src" path="test/long"/>
+  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+  <classpathentry kind="output" path="build/classes"/>
+  <classpathentry kind="lib" path="build/test/classes"/>
+  <classpathentry kind="lib" path="test/conf"/>
+]]>
+	</echo>	  
+  	<path id="eclipse-project-libs-path">
+  	 <fileset dir="lib">
+  	    <include name="**/*.jar" />
+     </fileset>
+ 	 <fileset dir="build/lib/jars">
+  	    <include name="**/*.jar" />
+  	 </fileset>
+  	</path>
+  	<property name="eclipse-project-libs" refid="eclipse-project-libs-path"/>
+  	<script language="javascript"> <![CDATA[
+  		importClass(java.io.File);
+  		jars = project.getProperty("eclipse-project-libs").split(":");  
+  		
+  		cp = "";
+  	    for (i=0; i< jars.length; i++) {
+  	       cp += ' <classpathentry kind="lib" path="'+jars[i]+'"/>\n';
+  		}
+  		
+  		cp += '</classpath>';
+  	    
+  		echo = project.createTask("echo");
+  	    echo.setMessage(cp);
+  		echo.setFile(new File(".classpath"));
+  		echo.setAppend(true);
+  	    echo.perform();	     
+  	]]> </script>
+    <mkdir dir=".settings" />
+    <mkdir dir=".externalToolBuilders" />
+    <echo file=".externalToolBuilders/Cassandra_Ant_Builder.launch"><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
+<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_AFTER_CLEAN_TARGETS" value="build,build-test,"/>
+<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_AUTO_TARGETS" value="build,build-test,"/>
+<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_CLEAN_TARGETS" value="build,build-test,"/>
+<stringAttribute key="org.eclipse.ant.ui.ATTR_ANT_MANUAL_TARGETS" value="build,build-test,"/>
+<booleanAttribute key="org.eclipse.ant.ui.ATTR_TARGETS_UPDATED" value="true"/>
+<booleanAttribute key="org.eclipse.ant.ui.DEFAULT_VM_INSTALL" value="false"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/${eclipse.project.name}/build.xml"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.ant.ui.AntClasspathProvider"/>
+<booleanAttribute key="org.eclipse.jdt.launching.DEFAULT_CLASSPATH" value="true"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="${eclipse.project.name}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="$${workspace_loc:/${eclipse.project.name}/build.xml}"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,auto,clean,"/>
+<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="$${workspace_loc:/${eclipse.project.name}}"/>
+</launchConfiguration>]]>
+    </echo>
+  </target>
+
+  <pathconvert property="eclipse.project.name">
+    <path path="${basedir}" />
+    <regexpmapper from="^.*/([^/]+)$$" to="\1" handledirsep="yes" />
+  </pathconvert>
+
+  <!-- Clean Eclipse project description files -->
+  <target name="clean-eclipse-files">
+    <delete file=".project" />
+    <delete file=".classpath" />
+    <delete dir=".settings" />
+  	<delete dir=".externalToolBuilders" />
+  	<delete dir="build/eclipse-classes" />
+  </target>
+
 </project>

Modified: cassandra/trunk/conf/cassandra.yaml
URL: http://svn.apache.org/viewvc/cassandra/trunk/conf/cassandra.yaml?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/conf/cassandra.yaml (original)
+++ cassandra/trunk/conf/cassandra.yaml Mon Jan  3 20:05:00 2011
@@ -38,14 +38,28 @@ authenticator: org.apache.cassandra.auth
 # authorization backend, implementing IAuthority; used to limit access/provide permissions
 authority: org.apache.cassandra.auth.AllowAllAuthority
 
-# any IPartitioner may be used, including your own as long as it is on
-# the classpath.  Out of the box, Cassandra provides
-# org.apache.cassandra.dht.RandomPartitioner
+# The partitioner is responsible for distributing rows (by key) across
+# nodes in the cluster.  Any IPartitioner may be used, including your
+# own as long as it is on the classpath.  Out of the box, Cassandra
+# provides org.apache.cassandra.dht.RandomPartitioner
 # org.apache.cassandra.dht.ByteOrderedPartitioner,
-# org.apache.cassandra.dht.OrderPreservingPartitioner, and
-# org.apache.cassandra.dht.CollatingOrderPreservingPartitioner.
-# (CollatingOPP colates according to EN,US rules, not naive byte
-# ordering.  Use this as an example if you need locale-aware collation.)
+# org.apache.cassandra.dht.OrderPreservingPartitioner (deprecated),
+# and org.apache.cassandra.dht.CollatingOrderPreservingPartitioner
+# (deprecated).
+# 
+# - RandomPartitioner distributes rows across the cluster evenly by md5.
+#   When in doubt, this is the best option.
+# - ByteOrderedPartitioner orders rows lexically by key bytes.  BOP allows
+#   scanning rows in key order, but the ordering can generate hot spots
+#   for sequential insertion workloads.
+# - OrderPreservingPartitioner is an obsolete form of BOP, that stores
+# - keys in a less-efficient format and only works with keys that are
+#   UTF8-encoded Strings.
+# - CollatingOPP colates according to EN,US rules rather than lexical byte
+#   ordering.  Use this as an example if you need custom collation.
+#
+# See http://wiki.apache.org/cassandra/Operations for more on
+# partitioners and token selection.
 partitioner: org.apache.cassandra.dht.RandomPartitioner
 
 # directories where Cassandra should store data on disk.

Modified: cassandra/trunk/debian/changelog
URL: http://svn.apache.org/viewvc/cassandra/trunk/debian/changelog?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/debian/changelog (original)
+++ cassandra/trunk/debian/changelog Mon Jan  3 20:05:00 2011
@@ -1,3 +1,9 @@
+cassandra (0.7.0~rc4) unstable; urgency=low
+
+  * Release candidate release.
+
+ -- Eric Evans <ee...@apache.org>  Thu, 30 Dec 2010 12:58:55 -0600
+
 cassandra (0.7.0~rc3) unstable; urgency=low
 
   * Release candidate release.

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jan  3 20:05:00 2011
@@ -1,6 +1,6 @@
-/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1053763
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1054135
-/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1053962
+/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1054725
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1054726
+/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1054631
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689
 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/Cassandra.java:774578-796573
 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/Cassandra.java:810145-834239,834349-834350

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jan  3 20:05:00 2011
@@ -1,6 +1,6 @@
-/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1053763
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1054135
-/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1053962
+/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1054725
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1054726
+/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1054631
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689
 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/column_t.java:774578-792198
 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/Column.java:810145-834239,834349-834350

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jan  3 20:05:00 2011
@@ -1,6 +1,6 @@
-/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1053763
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1054135
-/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1053962
+/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1054725
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1054726
+/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1054631
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689
 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:774578-796573
 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:810145-834239,834349-834350

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jan  3 20:05:00 2011
@@ -1,6 +1,6 @@
-/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1053763
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1054135
-/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1053962
+/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1054725
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1054726
+/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1054631
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689
 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:774578-796573
 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:810145-834239,834349-834350

Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Jan  3 20:05:00 2011
@@ -1,6 +1,6 @@
-/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1053763
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1054135
-/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1053962
+/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1054725
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1054726
+/cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1054631
 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689
 /incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/superColumn_t.java:774578-792198
 /incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/SuperColumn.java:810145-834239,834349-834350

Modified: cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java Mon Jan  3 20:05:00 2011
@@ -407,7 +407,7 @@ public class    DatabaseDescriptor
         IEndpointSnitch snitch = FBUtilities.construct(endpointSnitchClassName, "snitch");
         return conf.dynamic_snitch ? new DynamicEndpointSnitch(snitch) : snitch;
     }
-    
+
     /** load keyspace (table) definitions, but do not initialize the table instances. */
     public static void loadSchemas() throws IOException                         
     {
@@ -713,6 +713,10 @@ public class    DatabaseDescriptor
     {
         return snitch;
     }
+    public static void setEndpointSnitch(IEndpointSnitch eps)
+    {
+        snitch = eps;
+    }
 
     public static IRequestScheduler getRequestScheduler()
     {
@@ -1117,14 +1121,26 @@ public class    DatabaseDescriptor
     {
         return conf.dynamic_snitch_update_interval_in_ms;
     }
+    public static void setDynamicUpdateInterval(Integer dynamicUpdateInterval)
+    {
+        conf.dynamic_snitch_update_interval_in_ms = dynamicUpdateInterval;
+    }
 
     public static int getDynamicResetInterval()
     {
         return conf.dynamic_snitch_reset_interval_in_ms;
     }
+    public static void setDynamicResetInterval(Integer dynamicResetInterval)
+    {
+        conf.dynamic_snitch_reset_interval_in_ms = dynamicResetInterval;
+    }
 
     public static double getDynamicBadnessThreshold()
     {
         return conf.dynamic_snitch_badness_threshold;
     }
+    public static void setDynamicBadnessThreshold(Double dynamicBadnessThreshold)
+    {
+        conf.dynamic_snitch_badness_threshold = dynamicBadnessThreshold;
+    }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractByteOrderedPartitioner.java Mon Jan  3 20:05:00 2011
@@ -20,26 +20,33 @@ package org.apache.cassandra.dht;
 
 import java.math.BigInteger;
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.Random;
 
 import org.apache.commons.lang.ArrayUtils;
 
+import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Pair;
 
 public abstract class AbstractByteOrderedPartitioner implements IPartitioner<BytesToken>
 {
     public static final BytesToken MINIMUM = new BytesToken(ArrayUtils.EMPTY_BYTE_ARRAY);
-    
+
     public static final BigInteger BYTE_MASK = new BigInteger("255");
 
     public DecoratedKey<BytesToken> decorateKey(ByteBuffer key)
     {
         return new DecoratedKey<BytesToken>(getToken(key), key);
     }
-    
+
     public DecoratedKey<BytesToken> convertFromDiskFormat(ByteBuffer key)
     {
         return new DecoratedKey<BytesToken>(getToken(key), key);
@@ -49,7 +56,7 @@ public abstract class AbstractByteOrdere
     {
         int ll,rl;
         ByteBuffer lb,rb;
-        
+
         if(ltoken.token instanceof byte[])
         {
             ll = ((byte[])ltoken.token).length;
@@ -60,7 +67,7 @@ public abstract class AbstractByteOrdere
             ll = ((ByteBuffer)ltoken.token).remaining();
             lb = (ByteBuffer)ltoken.token;
         }
-        
+
         if(rtoken.token instanceof byte[])
         {
             rl = ((byte[])rtoken.token).length;
@@ -160,4 +167,41 @@ public abstract class AbstractByteOrdere
     }
 
     public abstract BytesToken getToken(ByteBuffer key);
+
+    public Map<Token, Float> describeOwnership(List<Token> sortedTokens)
+    {
+        // allTokens will contain the count and be returned, sorted_ranges is shorthand for token<->token math.
+        Map<Token, Float> allTokens = new HashMap<Token, Float>();
+        List<Range> sortedRanges = new ArrayList<Range>();
+
+        // this initializes the counts to 0 and calcs the ranges in order.
+        Token lastToken = sortedTokens.get(sortedTokens.size() - 1);
+        for (Token node : sortedTokens)
+        {
+            allTokens.put(node, new Float(0.0));
+            sortedRanges.add(new Range(lastToken, node));
+            lastToken = node;
+        }
+
+        for (String ks : DatabaseDescriptor.getTables())
+        {
+            for (CFMetaData cfmd : DatabaseDescriptor.getKSMetaData(ks).cfMetaData().values())
+            {
+                for (Range r : sortedRanges)
+                {
+                    // Looping over every KS:CF:Range, get the splits size and add it to the count
+                    allTokens.put(r.right, allTokens.get(r.right) + StorageService.instance.getSplits(ks, cfmd.cfName, r, 1).size());
+                }
+            }
+        }
+
+        // Sum every count up and divide count/total for the fractional ownership.
+        Float total = new Float(0.0);
+        for (Float f : allTokens.values())
+            total += f;
+        for (Map.Entry<Token, Float> row : allTokens.entrySet())
+            allTokens.put(row.getKey(), row.getValue() / total);
+
+        return allTokens;
+    }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java Mon Jan  3 20:05:00 2011
@@ -19,8 +19,6 @@
 package org.apache.cassandra.dht;
 
 import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.Map;
 
 public class ByteOrderedPartitioner extends AbstractByteOrderedPartitioner
 {
@@ -30,6 +28,4 @@ public class ByteOrderedPartitioner exte
             return MINIMUM;
         return new BytesToken(key);
     }
-
-    public Map<Token, Float> describeOwnership(List<Token> sortedTokens){ throw new UnsupportedOperationException(); }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/OrderPreservingPartitioner.java Mon Jan  3 20:05:00 2011
@@ -163,38 +163,38 @@ public class OrderPreservingPartitioner 
 
     public Map<Token, Float> describeOwnership(List<Token> sortedTokens)
     {
-        // alltokens will contain the count and be returned, sorted_ranges is shorthand for token<->token math.
-        Map<Token, Float> alltokens = new HashMap<Token, Float>();
-        List<Range> sorted_ranges = new ArrayList<Range>();
+        // allTokens will contain the count and be returned, sorted_ranges is shorthand for token<->token math.
+        Map<Token, Float> allTokens = new HashMap<Token, Float>();
+        List<Range> sortedRanges = new ArrayList<Range>();
 
         // this initializes the counts to 0 and calcs the ranges in order.
-        Token last_t = sortedTokens.get(sortedTokens.size()-1);
+        Token lastToken = sortedTokens.get(sortedTokens.size() - 1);
         for (Token node : sortedTokens)
         {
-            alltokens.put(node, new Float(0.0));
-            sorted_ranges.add(new Range(last_t, node));
-            last_t = node;
+            allTokens.put(node, new Float(0.0));
+            sortedRanges.add(new Range(lastToken, node));
+            lastToken = node;
         }
 
-        for(String ks : DatabaseDescriptor.getTables())
+        for (String ks : DatabaseDescriptor.getTables())
         {
             for (CFMetaData cfmd : DatabaseDescriptor.getKSMetaData(ks).cfMetaData().values())
             {
-                for (Range r : sorted_ranges)
+                for (Range r : sortedRanges)
                 {
                     // Looping over every KS:CF:Range, get the splits size and add it to the count
-                    alltokens.put(r.right, alltokens.get(r.right) + StorageService.instance.getSplits(ks, cfmd.cfName, r, 1).size());
+                    allTokens.put(r.right, allTokens.get(r.right) + StorageService.instance.getSplits(ks, cfmd.cfName, r, 1).size());
                 }
             }
         }
 
         // Sum every count up and divide count/total for the fractional ownership.
         Float total = new Float(0.0);
-        for (Float f : alltokens.values()) { total += f; }
-        for (Map.Entry<Token, Float> row : alltokens.entrySet()) {
-            alltokens.put(row.getKey(), row.getValue() / total);
-        }
-        
-        return alltokens;
+        for (Float f : allTokens.values())
+            total += f;
+        for (Map.Entry<Token, Float> row : allTokens.entrySet())
+            allTokens.put(row.getKey(), row.getValue() / total);
+
+        return allTokens;
     }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/hadoop/ColumnFamilyInputFormat.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/hadoop/ColumnFamilyInputFormat.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/hadoop/ColumnFamilyInputFormat.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/hadoop/ColumnFamilyInputFormat.java Mon Jan  3 20:05:00 2011
@@ -1,6 +1,6 @@
 package org.apache.cassandra.hadoop;
 /*
- * 
+ *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -8,16 +8,16 @@ package org.apache.cassandra.hadoop;
  * to you under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance
  * with the License.  You may obtain a copy of the License at
- * 
+ *
  *   http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing,
  * software distributed under the License is distributed on an
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
- * 
+ *
  */
 
 
@@ -30,6 +30,7 @@ import java.util.concurrent.ExecutorServ
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -66,7 +67,7 @@ import org.apache.thrift.transport.TTran
 public class ColumnFamilyInputFormat extends InputFormat<ByteBuffer, SortedMap<ByteBuffer, IColumn>>
 {
     private static final Logger logger = LoggerFactory.getLogger(ColumnFamilyInputFormat.class);
-    
+
     private String keyspace;
     private String cfName;
 
@@ -93,8 +94,8 @@ public class ColumnFamilyInputFormat ext
 
         keyspace = ConfigHelper.getInputKeyspace(context.getConfiguration());
         cfName = ConfigHelper.getInputColumnFamily(context.getConfiguration());
-        
-        // cannonical ranges, split into pieces, fetching the splits in parallel 
+
+        // cannonical ranges, split into pieces, fetching the splits in parallel
         ExecutorService executor = Executors.newCachedThreadPool();
         List<InputSplit> splits = new ArrayList<InputSplit>();
 
@@ -103,23 +104,23 @@ public class ColumnFamilyInputFormat ext
             List<Future<List<InputSplit>>> splitfutures = new ArrayList<Future<List<InputSplit>>>();
             for (TokenRange range : masterRangeNodes)
             {
-                // for each range, pick a live owner and ask it to compute bite-sized splits
-                splitfutures.add(executor.submit(new SplitCallable(range, conf)));
+                    // for each range, pick a live owner and ask it to compute bite-sized splits
+                    splitfutures.add(executor.submit(new SplitCallable(range, conf)));
             }
-    
+
             // wait until we have all the results back
             for (Future<List<InputSplit>> futureInputSplits : splitfutures)
             {
                 try
                 {
                     splits.addAll(futureInputSplits.get());
-                } 
+                }
                 catch (Exception e)
                 {
                     throw new IOException("Could not get input splits", e);
-                } 
+                }
             }
-        } 
+        }
         finally
         {
             executor.shutdownNow();
@@ -132,7 +133,7 @@ public class ColumnFamilyInputFormat ext
 
     /**
      * Gets a token range and splits it up according to the suggested
-     * size into input splits that Hadoop can use. 
+     * size into input splits that Hadoop can use.
      */
     class SplitCallable implements Callable<List<InputSplit>>
     {
@@ -158,7 +159,7 @@ public class ColumnFamilyInputFormat ext
             {
                 endpoints[i] = InetAddress.getByName(endpoints[i]).getHostName();
             }
-            
+
             for (int i = 1; i < tokens.size(); i++)
             {
                 ColumnFamilySplit split = new ColumnFamilySplit(tokens.get(i - 1), tokens.get(i), endpoints);
@@ -171,24 +172,29 @@ public class ColumnFamilyInputFormat ext
 
     private List<String> getSubSplits(String keyspace, String cfName, TokenRange range, Configuration conf) throws IOException
     {
-        // TODO handle failure of range replicas & retry
-        List<String> splits;
         int splitsize = ConfigHelper.getInputSplitSize(conf);
-        try
+        for (String host : range.endpoints)
         {
-            Cassandra.Client client = createConnection(range.endpoints.get(0), ConfigHelper.getRpcPort(conf), true);
-            client.set_keyspace(keyspace);
-            splits = client.describe_splits(cfName, range.start_token, range.end_token, splitsize);
-        }
-        catch (TException e)
-        {
-            throw new RuntimeException(e);
-        }
-        catch (InvalidRequestException e)
-        {
-            throw new RuntimeException(e);
+            try
+            {
+                Cassandra.Client client = createConnection(host, ConfigHelper.getRpcPort(conf), true);
+                client.set_keyspace(keyspace);
+                return client.describe_splits(cfName, range.start_token, range.end_token, splitsize);
+            }
+            catch (IOException e)
+            {
+                logger.debug("failed connect to endpoint " + host, e);
+            }
+            catch (TException e)
+            {
+                throw new RuntimeException(e);
+            }
+            catch (InvalidRequestException e)
+            {
+                throw new RuntimeException(e);
+            }
         }
-        return splits;
+        throw new IOException("failed connecting to all endpoints " + StringUtils.join(range.endpoints, ","));
     }
 
     private static Cassandra.Client createConnection(String host, Integer port, boolean framed) throws IOException

Modified: cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java Mon Jan  3 20:05:00 2011
@@ -46,9 +46,10 @@ public abstract class AbstractReplicatio
     private static final Logger logger = LoggerFactory.getLogger(AbstractReplicationStrategy.class);
 
     public final String table;
-    private final TokenMetadata tokenMetadata;
-    public final IEndpointSnitch snitch;
     public final Map<String, String> configOptions;
+    private final TokenMetadata tokenMetadata;
+
+    public IEndpointSnitch snitch;
 
     AbstractReplicationStrategy(String table, TokenMetadata tokenMetadata, IEndpointSnitch snitch, Map<String, String> configOptions)
     {

Modified: cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java Mon Jan  3 20:05:00 2011
@@ -40,19 +40,23 @@ import org.apache.cassandra.utils.FBUtil
 public class DynamicEndpointSnitch extends AbstractEndpointSnitch implements ILatencySubscriber, DynamicEndpointSnitchMBean
 {
     private static final int UPDATES_PER_INTERVAL = 10000;
-    private static final int UPDATE_INTERVAL_IN_MS = DatabaseDescriptor.getDynamicUpdateInterval();
-    private static final int RESET_INTERVAL_IN_MS = DatabaseDescriptor.getDynamicResetInterval();
-    private static final double BADNESS_THRESHOLD = DatabaseDescriptor.getDynamicBadnessThreshold();
     private static final int WINDOW_SIZE = 100;
+
+    private int UPDATE_INTERVAL_IN_MS = DatabaseDescriptor.getDynamicUpdateInterval();
+    private int RESET_INTERVAL_IN_MS = DatabaseDescriptor.getDynamicResetInterval();
+    private double BADNESS_THRESHOLD = DatabaseDescriptor.getDynamicBadnessThreshold();
+    private String mbeanName;
     private boolean registered = false;
 
     private final ConcurrentHashMap<InetAddress, Double> scores = new ConcurrentHashMap<InetAddress, Double>();
     private final ConcurrentHashMap<InetAddress, AdaptiveLatencyTracker> windows = new ConcurrentHashMap<InetAddress, AdaptiveLatencyTracker>();
     private final AtomicInteger intervalupdates = new AtomicInteger(0);
+
     public final IEndpointSnitch subsnitch;
 
     public DynamicEndpointSnitch(IEndpointSnitch snitch)
     {
+        mbeanName = "org.apache.cassandra.db:type=DynamicEndpointSnitch,instance="+hashCode();
         subsnitch = snitch;
         Runnable update = new Runnable()
         {
@@ -72,11 +76,28 @@ public class DynamicEndpointSnitch exten
         };
         StorageService.scheduledTasks.scheduleWithFixedDelay(update, UPDATE_INTERVAL_IN_MS, UPDATE_INTERVAL_IN_MS, TimeUnit.MILLISECONDS);
         StorageService.scheduledTasks.scheduleWithFixedDelay(reset, RESET_INTERVAL_IN_MS, RESET_INTERVAL_IN_MS, TimeUnit.MILLISECONDS);
+        registerMBean();
+   }
 
+    private void registerMBean()
+    {
         MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
         try
         {
-            mbs.registerMBean(this, new ObjectName("org.apache.cassandra.db:type=DynamicEndpointSnitch,instance="+hashCode()));
+            mbs.registerMBean(this, new ObjectName(mbeanName));
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void unregisterMBean()
+    {
+        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+        try
+        {
+            mbs.unregisterMBean(new ObjectName(mbeanName));
         }
         catch (Exception e)
         {
@@ -208,6 +229,25 @@ public class DynamicEndpointSnitch exten
     {
         return scores;
     }
+
+    public int getUpdateInterval()
+    {
+        return UPDATE_INTERVAL_IN_MS;
+    }
+    public int getResetInterval()
+    {
+        return RESET_INTERVAL_IN_MS;
+    }
+    public double getBadnessThreshold()
+    {
+        return BADNESS_THRESHOLD;
+    }
+    public String getSubsnitchClassName()
+    {
+        return subsnitch.getClass().getName();
+    }
+
+
 }
 
 /** a threadsafe version of BoundedStatsDeque+ArrivalWindow with modification for arbitrary times **/

Modified: cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitchMBean.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitchMBean.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitchMBean.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/locator/DynamicEndpointSnitchMBean.java Mon Jan  3 20:05:00 2011
@@ -24,4 +24,8 @@ import java.util.Map;
 
 public interface DynamicEndpointSnitchMBean {
     public Map<InetAddress, Double> getScores();
+    public int getUpdateInterval();
+    public int getResetInterval();
+    public double getBadnessThreshold();
+    public String getSubsnitchClassName();
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/net/IMessageCallback.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/net/IMessageCallback.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/net/IMessageCallback.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/net/IMessageCallback.java Mon Jan  3 20:05:00 2011
@@ -1,4 +1,25 @@
 package org.apache.cassandra.net;
+/*
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ */
+
 
 public interface IMessageCallback
 {

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Mon Jan  3 20:05:00 2011
@@ -27,11 +27,13 @@ import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.concurrent.*;
 import javax.management.MBeanServer;
+import javax.management.MalformedObjectNameException;
 import javax.management.ObjectName;
 
 import com.google.common.base.Charsets;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
+import org.apache.cassandra.locator.*;
 import org.apache.log4j.Level;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -49,9 +51,6 @@ import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.gms.*;
 import org.apache.cassandra.io.DeletionService;
 import org.apache.cassandra.io.util.FileUtils;
-import org.apache.cassandra.locator.AbstractReplicationStrategy;
-import org.apache.cassandra.locator.IEndpointSnitch;
-import org.apache.cassandra.locator.TokenMetadata;
 import org.apache.cassandra.net.IAsyncResult;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
@@ -2014,4 +2013,28 @@ public class StorageService implements I
         return Collections.unmodifiableList(tableslist);
     }
 
+    public void updateSnitch(String epSnitchClassName, Boolean dynamic, Integer dynamicUpdateInterval, Integer dynamicResetInterval, Double dynamicBadnessThreshold) throws ConfigurationException
+    {
+        IEndpointSnitch oldSnitch = DatabaseDescriptor.getEndpointSnitch();
+
+        // new snitch registers mbean during construction
+        IEndpointSnitch newSnitch = FBUtilities.construct(epSnitchClassName, "snitch");
+        if (dynamic)
+        {
+            DatabaseDescriptor.setDynamicUpdateInterval(dynamicUpdateInterval);
+            DatabaseDescriptor.setDynamicResetInterval(dynamicResetInterval);
+            DatabaseDescriptor.setDynamicBadnessThreshold(dynamicBadnessThreshold);
+            newSnitch = new DynamicEndpointSnitch(newSnitch);
+        }
+
+        // point snitch references to the new instance
+        DatabaseDescriptor.setEndpointSnitch(newSnitch);
+        for (String ks : DatabaseDescriptor.getTables())
+        {
+            Table.open(ks).getReplicationStrategy().snitch = newSnitch;
+        }
+
+        if (oldSnitch instanceof DynamicEndpointSnitch)
+            ((DynamicEndpointSnitch)oldSnitch).unregisterMBean();
+    }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageServiceMBean.java Mon Jan  3 20:05:00 2011
@@ -260,4 +260,15 @@ public interface StorageServiceMBean
     public Map<Token, Float> getOwnership();
 
     public List<String> getKeyspaces();
+
+    /**
+     * Change endpointsnitch class and dynamic-ness (and dynamic attributes) at runtime
+     * @param epSnitchClassName        the canonical path name for a class implementing IEndpointSnitch
+     * @param dynamic                  boolean that decides whether dynamicsnitch is used or not
+     * @param dynamicUpdateInterval    integer, in ms (default 100)
+     * @param dynamicResetInterval     integer, in ms (default 600,000)
+     * @param dynamicBadnessThreshold  double, (default 0.0)
+     * @throws ConfigurationException  classname not found on classpath
+     */
+    public void updateSnitch(String epSnitchClassName, Boolean dynamic, Integer dynamicUpdateInterval, Integer dynamicResetInterval, Double dynamicBadnessThreshold) throws ConfigurationException;
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/tools/NodeCmd.java Mon Jan  3 20:05:00 2011
@@ -45,6 +45,10 @@ public class NodeCmd {
     private static final String HOST_OPT_SHORT = "h";
     private static final String PORT_OPT_LONG = "port";
     private static final String PORT_OPT_SHORT = "p";
+    private static final String USERNAME_OPT_LONG = "username";
+    private static final String USERNAME_OPT_SHORT = "u";
+    private static final String PASSWORD_OPT_LONG = "password";
+    private static final String PASSWORD_OPT_SHORT = "pw";
     private static final int defaultPort = 8080;
     private static Options options = null;
     
@@ -57,6 +61,8 @@ public class NodeCmd {
         optHost.setRequired(true);
         options.addOption(optHost);
         options.addOption(PORT_OPT_SHORT, PORT_OPT_LONG, true, "remote jmx agent port number");
+        options.addOption(USERNAME_OPT_SHORT, USERNAME_OPT_LONG, true, "remote jmx agent username");
+        options.addOption(PASSWORD_OPT_SHORT, PASSWORD_OPT_LONG, true, "remote jmx agent password");
     }
     
     public NodeCmd(NodeProbe probe)
@@ -469,11 +475,13 @@ public class NodeCmd {
                 throw new ParseException("Port must be a number");
             }
         }
+        String username = cmd.getOptionValue(USERNAME_OPT_LONG);
+        String password = cmd.getOptionValue(PASSWORD_OPT_LONG);
         
         NodeProbe probe = null;
         try
         {
-            probe = new NodeProbe(host, port);
+            probe = username == null ? new NodeProbe(host, port) : new NodeProbe(host, port, username, password);
         }
         catch (IOException ioe)
         {

Modified: cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java?rev=1054727&r1=1054726&r2=1054727&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/tools/NodeProbe.java Mon Jan  3 20:05:00 2011
@@ -65,6 +65,8 @@ public class NodeProbe
     private static final int defaultPort = 8080;
     final String host;
     final int port;
+    private String username;
+    private String password;
 
     private JMXConnector jmxc;
     private MBeanServerConnection mbeanServerConn;
@@ -75,6 +77,25 @@ public class NodeProbe
     private StreamingServiceMBean streamProxy;
     
     /**
+     * Creates a NodeProbe using the specified JMX host, port, username, and password.
+     *
+     * @param host hostname or IP address of the JMX agent
+     * @param port TCP port of the remote JMX agent
+     * @throws IOException on connection failures
+     */
+    public NodeProbe(String host, int port, String username, String password) throws IOException, InterruptedException
+    {
+        assert username != null && !username.isEmpty() && null != password && !password.isEmpty()
+               : "neither username nor password can be blank";
+
+        this.host = host;
+        this.port = port;
+        this.username = username;
+        this.password = password;
+        connect();
+    }
+
+    /**
      * Creates a NodeProbe using the specified JMX host and port.
      * 
      * @param host hostname or IP address of the JMX agent
@@ -109,7 +130,13 @@ public class NodeProbe
     private void connect() throws IOException
     {
         JMXServiceURL jmxUrl = new JMXServiceURL(String.format(fmtUrl, host, port));
-        jmxc = JMXConnectorFactory.connect(jmxUrl, null);
+        Map<String,Object> env = new HashMap<String,Object>();
+        if (username != null)
+        {
+            String[] creds = { username, password };
+            env.put(JMXConnector.CREDENTIALS, creds);
+        }
+        jmxc = JMXConnectorFactory.connect(jmxUrl, env);
         mbeanServerConn = jmxc.getMBeanServerConnection();
         
         try