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><project>/.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