Author: jbellis Date: Tue Jan 25 18:46:57 2011 New Revision: 1063397 URL: http://svn.apache.org/viewvc?rev=1063397&view=rev Log: merge from 0.7
Removed: cassandra/trunk/ivy.xml cassandra/trunk/ivysettings.xml Modified: cassandra/trunk/ (props changed) cassandra/trunk/CHANGES.txt cassandra/trunk/build.xml cassandra/trunk/conf/cassandra-env.sh 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/db/RowMutationVerbHandler.java cassandra/trunk/src/java/org/apache/cassandra/net/Header.java cassandra/trunk/src/java/org/apache/cassandra/net/Message.java cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterReadCallback.java cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java cassandra/trunk/test/distributed/ivy.xml Propchange: cassandra/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Jan 25 18:46:57 2011 @@ -1,5 +1,5 @@ /cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1055311,1056121,1057932 -/cassandra/branches/cassandra-0.7:1026516-1062958 +/cassandra/branches/cassandra-0.7:1026516-1063389 /cassandra/branches/cassandra-0.7.0:1053690-1055654 /cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689 /incubator/cassandra/branches/cassandra-0.3:774578-796573 Modified: cassandra/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1063397&r1=1063396&r2=1063397&view=diff ============================================================================== --- cassandra/trunk/CHANGES.txt (original) +++ cassandra/trunk/CHANGES.txt Tue Jan 25 18:46:57 2011 @@ -11,7 +11,7 @@ * buffer network stack to avoid inefficient small TCP messages while avoiding the nagle/delayed ack problem (CASSANDRA-1896) * check log4j configuration for changes every 10s (CASSANDRA-1525, 1907) - * more-efficient cross-DC replication (CASSANDRA-1530) + * more-efficient cross-DC replication (CASSANDRA-1530, -2051) * upgrade to TFastFramedTransport (CASSANDRA-1743) * avoid polluting page cache with commitlog or sstable writes and seq scan operations (CASSANDRA-1470) @@ -46,7 +46,7 @@ * add CLI verbose option in file mode (CASSANDRA-2030) * add single-line "--" comments to CLI (CASSANDRA-2032) * message serialization tests (CASSANDRA-1923) - + * switch from ivy to maven-ant-tasks (CASSANDRA-2017) 0.7.0-final * fix offsets to ByteBuffer.get (CASSANDRA-1939) Modified: cassandra/trunk/build.xml URL: http://svn.apache.org/viewvc/cassandra/trunk/build.xml?rev=1063397&r1=1063396&r2=1063397&view=diff ============================================================================== --- cassandra/trunk/build.xml (original) +++ cassandra/trunk/build.xml Tue Jan 25 18:46:57 2011 @@ -18,7 +18,7 @@ ~ under the License. --> <project basedir="." default="build" name="apache-cassandra" - xmlns:ivy="antlib:org.apache.ivy.ant"> + xmlns:artifact="antlib:org.apache.maven.artifact.ant"> <property environment="env"/> <property file="build.properties" /> <property name="debuglevel" value="source,lines,vars"/> @@ -56,9 +56,9 @@ <property name="version" value="${base.version}-SNAPSHOT"/> <property name="version.properties.dir" value="${build.classes}/org/apache/cassandra/config/"/> <property name="final.name" value="${ant.project.name}-${version}"/> - <property name="ivy.version" value="2.1.0" /> - <property name="ivy.url" - value="http://repo2.maven.org/maven2/org/apache/ivy/ivy" /> + <property name="maven-ant-tasks.version" value="2.1.1" /> + <property name="maven-ant-tasks.url" + value="http://repo2.maven.org/maven2/org/apache/maven/maven-ant-tasks" /> <property name="test.timeout" value="60000" /> <property name="test.long.timeout" value="300000" /> @@ -70,8 +70,8 @@ <property name="cobertura.classes.dir" value="${cobertura.build.dir}/classes"/> <property name="cobertura.datafile" value="${cobertura.build.dir}/cobertura.ser"/> - <condition property="ivy.jar.exists"> - <available file="${build.dir}/ivy-${ivy.version}.jar" /> + <condition property="maven-ant-tasks.jar.exists"> + <available file="${build.dir}/maven-ant-tasks-${maven-ant-tasks.version}.jar" /> </condition> <condition property="is.source.artifact"> @@ -81,25 +81,16 @@ <!-- Add all the dependencies. --> - <path id="autoivy.classpath"> - <fileset dir="${build.dir.lib}"> - <include name="**/*.jar" /> - </fileset> - <pathelement location="${build.dir}/ivy-${ivy.version}.jar"/> - </path> + <path id="maven-ant-tasks.classpath" path="${build.dir}/maven-ant-tasks-${maven-ant-tasks.version}.jar" /> <path id="cassandra.classpath"> <pathelement location="${cobertura.classes.dir}"/> <pathelement location="${build.classes}"/> <fileset dir="${build.lib}"> <include name="**/*.jar" /> </fileset> - <path refid="autoivy.classpath" /> - </path> - <path id="rat.classpath"> - <fileset dir="${build.dir.lib}"> - <include name="**/apache-rat*.jar"/> - <include name="**/commons-*.jar"/> - </fileset> + <fileset dir="${build.dir.lib}"> + <include name="**/*.jar" /> + </fileset> </path> <!-- @@ -169,42 +160,92 @@ </target> <!-- - Fetch Ivy and Cassandra's dependencies - + Fetch Maven Ant Tasks and Cassandra's dependencies These targets are intentionally free of dependencies so that they can be run stand-alone from a binary release artifact. --> - <target name="ivy-download" unless="ivy.jar.exists"> - <echo>Downloading Ivy...</echo> + <target name="maven-ant-tasks-download" unless="maven-ant-tasks.jar.exists"> + <echo>Downloading Maven ANT Tasks...</echo> <mkdir dir="${build.dir}" /> - <get src="${ivy.url}/${ivy.version}/ivy-${ivy.version}.jar" - dest="${build.dir}/ivy-${ivy.version}.jar" usetimestamp="true" /> + <get src="${maven-ant-tasks.url}/${maven-ant-tasks.version}/maven-ant-tasks-${maven-ant-tasks.version}.jar" + dest="${build.dir}/maven-ant-tasks-${maven-ant-tasks.version}.jar" usetimestamp="true" /> </target> - <target name="ivy-init" depends="ivy-download" unless="ivy.initialized"> + <target name="maven-ant-tasks-init" depends="maven-ant-tasks-download" unless="maven-ant-tasks.initialized"> <mkdir dir="${build.dir.lib}"/> - <taskdef resource="org/apache/ivy/ant/antlib.xml" - uri="antlib:org.apache.ivy.ant" - classpathref="autoivy.classpath"/> - <property name="ivy.initialized" value="true"/> - </target> - - <target name="ivy-retrieve-build" depends="ivy-init"> - <ivy:resolve file="${basedir}/ivy.xml"/> - <ivy:retrieve type="jar,source" sync="true" - pattern="${build.dir.lib}/[type]s/[artifact]-[revision].[ext]" /> - </target> - - <target name="ivy-retrieve-test" depends="ivy-init"> - <ivy:resolve file="${basedir}/test/distributed/ivy.xml"/> - <ivy:retrieve type="jar,source" sync="true" - pattern="${test.lib}/[type]s/[artifact]-[revision].[ext]" /> + <typedef uri="antlib:org.apache.maven.artifact.ant" classpathref="maven-ant-tasks.classpath" /> + + <!-- define the remote repositories we use --> + <artifact:remoteRepository id="central" url="http://repo1.maven.org/maven2"/> + <artifact:remoteRepository id="java.net2" url="http://download.java.net/maven/2"/> + <artifact:remoteRepository id="apache" url="https://repository.apache.org/content/repositories/releases"/> + <artifact:remoteRepository id="cloudera" url="https://repository.cloudera.com/content/repositories/releases"/> + <!-- for distributed tests --> + <artifact:remoteRepository id="jclouds" url="http://jclouds.googlecode.com/svn/repo"/> + <artifact:remoteRepository id="oauth" url="http://oauth.googlecode.com/svn/code/maven"/> + <artifact:remoteRepository id="twttr" url="http://maven.twttr.com"/> + + <property name="maven-ant-tasks.initialized" value="true"/> + </target> + + <target name="maven-ant-tasks-retrieve-build" depends="maven-ant-tasks-init"> + <artifact:dependencies filesetId="build-dependency-jars" + sourcesFilesetId="build-dependency-sources" + cacheDependencyRefs="true" + dependencyRefsBuildFile="${build.dir}/build-dependencies.xml"> + <!-- FIXME: paranamer can be dropped after we're depending on avro + (since it depends on them). --> + <dependency groupId="com.thoughtworks.paranamer" artifactId="paranamer-ant" version="2.1"/> + <dependency groupId="junit" artifactId="junit" version="4.6" /> + <dependency groupId="commons-logging" artifactId="commons-logging" version="1.1.1"/> + <dependency groupId="org.apache.rat" artifactId="apache-rat" version="0.6" /> + <dependency groupId="com.cloudera.hadoop" artifactId="hadoop-core" version="0.20.2-320"/> + <dependency groupId="com.cloudera.hadoop" artifactId="hadoop-streaming" version="0.20.2-320"/> + <dependency groupId="net.sf.jopt-simple" artifactId="jopt-simple" version="3.2"/> + + <dependency groupId="net.java.dev.jna" artifactId="jna" version="3.2.7"/> + <remoteRepository refid="central"/> + <remoteRepository refid="apache"/> + <remoteRepository refid="cloudera"/> + <remoteRepository refid="java.net2"/> + </artifact:dependencies> + <copy todir="${build.dir.lib}/jars"> + <fileset refid="build-dependency-jars"/> + <mapper type="flatten"/> + </copy> + <copy todir="${build.dir.lib}/sources"> + <fileset refid="build-dependency-sources"/> + <mapper type="flatten"/> + </copy> + </target> + + <target name="maven-ant-tasks-retrieve-test" depends="maven-ant-tasks-init"> + <artifact:dependencies filesetId="test-dependency-jars" + sourcesFilesetId="test-dependency-sources" + cacheDependencyRefs="true" + dependencyRefsBuildFile="${build.dir}/test-dependencies.xml"> + <dependency groupId="org.apache.whirr" artifactId="whirr-core" version="0.3.0-incubating-SNAPSHOT"/> + <dependency groupId="org.apache.whirr" artifactId="whirr-cli" version="0.3.0-incubating-SNAPSHOT"/> + <remoteRepository refid="apache"/> + <remoteRepository refid="central"/> + <remoteRepository refid="jclouds"/> + <remoteRepository refid="oauth"/> + <remoteRepository refid="twttr"/> + </artifact:dependencies> + <copy todir="${test.lib}/jars"> + <fileset refid="test-dependency-jars"/> + <mapper type="flatten"/> + </copy> + <copy todir="${test.lib}/sources"> + <fileset refid="test-dependency-sources"/> + <mapper type="flatten"/> + </copy> </target> <!-- Generate avro code --> - <target name="check-avro-generate" depends="ivy-init"> + <target name="check-avro-generate" depends="maven-ant-tasks-init"> <taskdef name="avro-protocol" classname="org.apache.avro.specific.ProtocolTask"> <classpath refid="cassandra.classpath" /> </taskdef> @@ -220,14 +261,14 @@ description="Generates Java Avro classes for client and internal use." /> <target name="avro-interface-generate-hadoop" unless="avroInterfaceUpToDate" - depends="init,check-avro-generate,ivy-retrieve-build"> + depends="init,check-avro-generate,maven-ant-tasks-retrieve-build"> <avromacro protocolname="hadoop" inputfile="${build.src.java}/org/apache/cassandra/hadoop/hadoop.genavro" jsondir="${build.src.gen-java}/org/apache/cassandra/hadoop" outputdir="${build.src}" /> </target> <target name="avro-interface-generate-internode" unless="avroINProtoUpToDate" - depends="init,check-avro-generate,ivy-retrieve-build"> + depends="init,check-avro-generate,maven-ant-tasks-retrieve-build"> <avromacro protocolname="internode" inputfile="${avro.src}/internode.genavro" jsondir="${build.dir}" outputdir="${build.src}"/> </target> @@ -297,7 +338,7 @@ The build target builds all the .class files --> <target name="build" - depends="ivy-retrieve-build,avro-generate,build-subprojects,build-project" description="Compile Cassandra classes"/> + depends="maven-ant-tasks-retrieve-build,avro-generate,build-subprojects,build-project" description="Compile Cassandra classes"/> <target name="build-subprojects" description="Compile Cassandra contrib projects"/> <target name="codecoverage" depends="cobertura-instrument,test,cobertura-report" description="Create code coverage report"/> @@ -347,7 +388,7 @@ <copy todir="${dist.dir}/lib"> <fileset dir="${build.lib}"/> <fileset dir="${build.dir}"> - <include name="*.jar" /> + <include name="${final.name}.jar" /> </fileset> </copy> <copy todir="${dist.dir}/javadoc"> @@ -480,7 +521,7 @@ </copy> </target> - <target name="build-distributed-test" depends="build-test,ivy-retrieve-test" description="Compile distributed test classes (which have additional deps)"> + <target name="build-distributed-test" depends="build-test,maven-ant-tasks-retrieve-test" description="Compile distributed test classes (which have additional deps)"> <javac debug="true" debuglevel="${debuglevel}" @@ -614,11 +655,11 @@ <!-- License audit tool --> - <target name="rat-init" depends="ivy-retrieve-build"> - <typedef resource="org/apache/rat/anttasks/antlib.xml" - uri="antlib:org.apache.rat.anttasks"> - <classpath refid="rat.classpath" /> - </typedef> + <target name="rat-init" depends="maven-ant-tasks-init"> + <artifact:dependencies pathId="rat.classpath"> + <dependency groupId="org.apache.rat" artifactId="apache-rat-tasks" version="0.6" /> + </artifact:dependencies> + <typedef uri="antlib:org.apache.rat.anttasks" classpathref="rat.classpath"/> </target> <target name="rat-check" depends="rat-init"> @@ -651,7 +692,8 @@ </tstamp> <javadoc destdir="${javadoc.dir}" author="true" version="true" use="true" windowtitle="${ant.project.name} API" classpathref="cassandra.classpath" - bottom="Copyright &copy; ${YEAR} The Apache Software Foundation"> + bottom="Copyright &copy; ${YEAR} The Apache Software Foundation" + maxmemory="256m"> <fileset dir="${build.src.java}" defaultexcludes="yes"> <include name="org/apache/**/*.java"/> Modified: cassandra/trunk/conf/cassandra-env.sh URL: http://svn.apache.org/viewvc/cassandra/trunk/conf/cassandra-env.sh?rev=1063397&r1=1063396&r2=1063397&view=diff ============================================================================== --- cassandra/trunk/conf/cassandra-env.sh (original) +++ cassandra/trunk/conf/cassandra-env.sh Tue Jan 25 18:46:57 2011 @@ -19,7 +19,7 @@ calculate_heap_sizes() case "`uname`" in Linux) system_memory_in_mb=`free -m | awk '/Mem:/ {print $2}'` - system_cpu_cores=`cat /proc/cpuinfo | egrep '^processor(\s|\t)+:.*' | wc -l` + system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo` break ;; FreeBSD) Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Jan 25 18:46:57 2011 @@ -1,5 +1,5 @@ /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1055311,1056121,1057932 -/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1062958 +/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1063389 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1055654 /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 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Jan 25 18:46:57 2011 @@ -1,5 +1,5 @@ /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1055311,1056121,1057932 -/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1062958 +/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1063389 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1055654 /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 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Jan 25 18:46:57 2011 @@ -1,5 +1,5 @@ /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1055311,1056121,1057932 -/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1062958 +/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1063389 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1055654 /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 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Jan 25 18:46:57 2011 @@ -1,5 +1,5 @@ /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1055311,1056121,1057932 -/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1062958 +/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1063389 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1055654 /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 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Jan 25 18:46:57 2011 @@ -1,5 +1,5 @@ /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1055311,1056121,1057932 -/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1062958 +/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1063389 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1055654 /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 Modified: cassandra/trunk/src/java/org/apache/cassandra/db/RowMutationVerbHandler.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/RowMutationVerbHandler.java?rev=1063397&r1=1063396&r2=1063397&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/db/RowMutationVerbHandler.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/db/RowMutationVerbHandler.java Tue Jan 25 18:46:57 2011 @@ -89,7 +89,7 @@ public class RowMutationVerbHandler impl private void forwardToLocalNodes(Message message, byte[] forwardBytes) throws UnknownHostException { // remove fwds from message to avoid infinite loop - message.setHeader(RowMutation.FORWARD_HEADER, null); + message.removeHeader(RowMutation.FORWARD_HEADER); int bytesPerInetAddress = FBUtilities.getLocalAddress().getAddress().length; assert forwardBytes.length >= bytesPerInetAddress; @@ -109,7 +109,7 @@ public class RowMutationVerbHandler impl // Send the original message to the address specified by the FORWARD_HINT // Let the response go back to the coordinator - MessagingService.instance().sendOneWay(message, message.getFrom()); + MessagingService.instance().sendOneWay(message, address); offset += bytesPerInetAddress; } Modified: cassandra/trunk/src/java/org/apache/cassandra/net/Header.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/net/Header.java?rev=1063397&r1=1063396&r2=1063397&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/net/Header.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/net/Header.java Tue Jan 25 18:46:57 2011 @@ -97,6 +97,11 @@ public class Header { details_.put(key, value); } + + void removeDetail(String key) + { + details_.remove(key); + } } class HeaderSerializer implements ICompactSerializer<Header> Modified: cassandra/trunk/src/java/org/apache/cassandra/net/Message.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/net/Message.java?rev=1063397&r1=1063396&r2=1063397&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/net/Message.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/net/Message.java Tue Jan 25 18:46:57 2011 @@ -68,6 +68,11 @@ public class Message { header_.setDetail(key, value); } + + public void removeHeader(String key) + { + header_.removeDetail(key); + } public byte[] getMessageBody() { Modified: cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterReadCallback.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterReadCallback.java?rev=1063397&r1=1063396&r2=1063397&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterReadCallback.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterReadCallback.java Tue Jan 25 18:46:57 2011 @@ -27,6 +27,7 @@ import java.util.concurrent.atomic.Atomi import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.Table; +import org.apache.cassandra.db.ReadResponse; import org.apache.cassandra.locator.IEndpointSnitch; import org.apache.cassandra.locator.NetworkTopologyStrategy; import org.apache.cassandra.net.Message; @@ -40,7 +41,7 @@ import org.apache.cassandra.utils.FBUtil public class DatacenterReadCallback<T> extends ReadCallback<T> { private static final IEndpointSnitch snitch = DatabaseDescriptor.getEndpointSnitch(); - private static final String localdc = snitch.getDatacenter(FBUtilities.getLocalAddress()); + private static final String localdc = snitch.getDatacenter(FBUtilities.getLocalAddress()); private AtomicInteger localResponses; public DatacenterReadCallback(IResponseResolver<T> resolver, ConsistencyLevel consistencyLevel, String table) @@ -54,8 +55,7 @@ public class DatacenterReadCallback<T> e { resolver.preprocess(message); - int n; - n = localdc.equals(snitch.getDatacenter(message.getFrom())) + int n = localdc.equals(snitch.getDatacenter(message.getFrom())) ? localResponses.decrementAndGet() : localResponses.get(); @@ -66,6 +66,19 @@ public class DatacenterReadCallback<T> e } @Override + public void response(ReadResponse result) + { + ((ReadResponseResolver) resolver).injectPreProcessed(result); + + int n = localResponses.decrementAndGet(); + + if (n == 0 && resolver.isDataPresent()) + { + condition.signal(); + } + } + + @Override public int determineBlockFor(ConsistencyLevel consistency_level, String table) { NetworkTopologyStrategy stategy = (NetworkTopologyStrategy) Table.open(table).getReplicationStrategy(); Modified: cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java?rev=1063397&r1=1063396&r2=1063397&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java Tue Jan 25 18:46:57 2011 @@ -292,10 +292,9 @@ public class StorageProxy implements Sto Message message = messages.getKey(); Iterator<InetAddress> iter = messages.getValue().iterator(); assert iter.hasNext(); - + // First endpoint in list is the destination for this group InetAddress target = iter.next(); - // Add all the other destinations that are bound for the same dataCenter as a header in the primary message. while (iter.hasNext()) @@ -565,7 +564,7 @@ public class StorageProxy implements Sto { Message message = command.makeReadMessage(); if (logger.isDebugEnabled()) - logger.debug("reading digest for " + command + " from " + message.getMessageId() + "@" + dataPoint); + logger.debug("reading data for " + command + " from " + message.getMessageId() + "@" + dataPoint); MessagingService.instance().sendRR(message, dataPoint, handler); } 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=1063397&r1=1063396&r2=1063397&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Tue Jan 25 18:46:57 2011 @@ -171,7 +171,7 @@ public class StorageService implements I /* This abstraction maintains the token/endpoint metadata information */ private TokenMetadata tokenMetadata_ = new TokenMetadata(); - private Set<InetAddress> replicatingNodes; + private Set<InetAddress> replicatingNodes = Collections.synchronizedSet(new HashSet<InetAddress>()); private InetAddress removingNode; /* Are we starting this node in bootstrap mode? */ @@ -449,6 +449,8 @@ public class StorageService implements I operationMode = m; if (log) logger_.info(m); + else + logger_.debug(m); } private void bootstrap(Token token) throws IOException @@ -737,9 +739,10 @@ public class StorageService implements I } /** - * Handle node being actively removed from the ring. + * Handle notification that a node being actively removed from the ring via 'removetoken' * * @param endpoint node + * @param state either REMOVED_TOKEN (node is gone) or REMOVING_TOKEN (replicas need to be restored) */ private void handleStateRemoving(InetAddress endpoint, Token removeToken, String state) { @@ -1674,17 +1677,28 @@ public class StorageService implements I /** * Force a remove operation to complete. This may be necessary if a remove operation - * blocks forever due to node/stream failure. + * blocks forever due to node/stream failure. removeToken() must be called + * first, this is a last resort measure. No further attempt will be made to restore replicas. */ public void forceRemoveCompletion() { if (!replicatingNodes.isEmpty()) + { logger_.warn("Removal not confirmed for for " + StringUtils.join(this.replicatingNodes, ",")); - replicatingNodes.clear(); + replicatingNodes.clear(); + } + else + { + throw new UnsupportedOperationException("No tokens to force removal on, call 'removetoken' first"); + } } /** - * Remove a node that has died. + * Remove a node that has died, attempting to restore the replica count. + * If the node is alive, decommission should be attempted. If decommission + * fails, then removeToken should be called. If we fail while trying to + * restore the replica count, finally forceRemoveCompleteion should be + * called to forcibly remove the node without regard to replica count. * * @param tokenString token for the node */ @@ -1705,14 +1719,13 @@ public class StorageService implements I throw new UnsupportedOperationException("Node " + endpoint + " is alive and owns this token. Use decommission command to remove it from the ring"); // A leaving endpoint that is dead is already being removed. - if (tokenMetadata_.isLeaving(endpoint)) - throw new UnsupportedOperationException("Node " + endpoint + " is already being removed."); + if (tokenMetadata_.isLeaving(endpoint)) + logger_.warn("Node " + endpoint + " is already being removed, continuing removal anyway"); - if (replicatingNodes != null) - throw new UnsupportedOperationException("This node is already processing a removal. Wait for it to complete."); + if (!replicatingNodes.isEmpty()) + throw new UnsupportedOperationException("This node is already processing a removal. Wait for it to complete, or use 'removetoken force' if this has failed."); // Find the endpoints that are going to become responsible for data - replicatingNodes = Collections.synchronizedSet(new HashSet<InetAddress>()); for (String table : DatabaseDescriptor.getNonSystemTables()) { // if the replication factor is 1 the data is lost so we shouldn't wait for confirmation @@ -1760,13 +1773,13 @@ public class StorageService implements I // indicate the token has left Gossiper.instance.addLocalApplicationState(ApplicationState.STATUS, valueFactory.removedNonlocal(localToken, token)); - replicatingNodes = null; + replicatingNodes.clear(); removingNode = null; } public void confirmReplication(InetAddress node) { - assert replicatingNodes != null; + assert !replicatingNodes.isEmpty(); replicatingNodes.remove(node); } Modified: cassandra/trunk/test/distributed/ivy.xml URL: http://svn.apache.org/viewvc/cassandra/trunk/test/distributed/ivy.xml?rev=1063397&r1=1063396&r2=1063397&view=diff ============================================================================== --- cassandra/trunk/test/distributed/ivy.xml (original) +++ cassandra/trunk/test/distributed/ivy.xml Tue Jan 25 18:46:57 2011 @@ -1,25 +0,0 @@ -<!-- - ~ 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. - --> -<ivy-module version="2.0"> - <info organisation="apache-cassandra" module="cassandra-distributed-test"/> - <dependencies> - <dependency org="org.apache.whirr" name="whirr-core" rev="0.3.0-incubating-SNAPSHOT"/> - <dependency org="org.apache.whirr" name="whirr-cli" rev="0.3.0-incubating-SNAPSHOT"/> - </dependencies> -</ivy-module>