Author: jake Date: Tue Aug 30 15:16:03 2011 New Revision: 1163255 URL: http://svn.apache.org/viewvc?rev=1163255&view=rev Log: merge from 0.8
Modified: cassandra/trunk/ (props changed) cassandra/trunk/CHANGES.txt cassandra/trunk/NEWS.txt cassandra/trunk/contrib/ (props changed) 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/cli/Cli.g cassandra/trunk/src/java/org/apache/cassandra/cli/CliCompiler.java cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java cassandra/trunk/src/java/org/apache/cassandra/service/GCInspector.java cassandra/trunk/src/java/org/apache/cassandra/utils/BloomCalculations.java cassandra/trunk/src/java/org/apache/cassandra/utils/BloomFilter.java cassandra/trunk/test/unit/org/apache/cassandra/cli/CliTest.java cassandra/trunk/test/unit/org/apache/cassandra/dht/RangeTest.java Propchange: cassandra/trunk/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Aug 30 15:16:03 2011 @@ -1,7 +1,7 @@ /cassandra/branches/cassandra-0.6:922689-1052356,1052358-1053452,1053454,1053456-1131291 -/cassandra/branches/cassandra-0.7:1026516-1160444,1160825,1161607 +/cassandra/branches/cassandra-0.7:1026516-1163234 /cassandra/branches/cassandra-0.7.0:1053690-1055654 -/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1161708,1162844,1162851 +/cassandra/branches/cassandra-0.8:1090934-1125013,1125019-1163248 /cassandra/branches/cassandra-0.8.0:1125021-1130369 /cassandra/branches/cassandra-0.8.1:1101014-1125018 /cassandra/tags/cassandra-0.7.0-rc3:1051699-1053689 Modified: cassandra/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1163255&r1=1163254&r2=1163255&view=diff ============================================================================== --- cassandra/trunk/CHANGES.txt (original) +++ cassandra/trunk/CHANGES.txt Tue Aug 30 15:16:03 2011 @@ -84,7 +84,16 @@ * allow sstable2json to work on index sstable files (CASSANDRA-3059) * always hint counters (CASSANDRA-3099) * fix log4j initialization in EmbeddedCassandraService (CASSANDRA-2857) - + * remove gossip state when a new IP takes over a token (CASSANDRA-3071) + * work around native memory leak in com.sun.management.GarbageCollectorMXBean + (CASSANDRA-2868) + * fix UnavailableException with writes at CL.EACH_QUORM (CASSANDRA-3084) + * fix parsing of the Keyspace and ColumnFamily names in numeric + and string representations in CLI (CASSANDRA-3075) + * fix corner cases in Range.differenceToFetch (CASSANDRA-3084) + * fix ip address String representation in the ring cache (CASSANDRA-3044) + * fix ring cache compatibility when mixing pre-0.8.4 nodes with post- + in the same cluster (CASSANDRA-3023) 0.8.4 * include files-to-be-streamed in StreamInSession.getSources (CASSANDRA-2972) Modified: cassandra/trunk/NEWS.txt URL: http://svn.apache.org/viewvc/cassandra/trunk/NEWS.txt?rev=1163255&r1=1163254&r2=1163255&view=diff ============================================================================== --- cassandra/trunk/NEWS.txt (original) +++ cassandra/trunk/NEWS.txt Tue Aug 30 15:16:03 2011 @@ -124,6 +124,10 @@ Upgrading - The loadbalance command has been removed from nodetool. For similar behavior, decommission then rebootstrap with empty initial_token. - Thrift unframed mode has been removed. + - The addition of key_validation_class means the cli will assume keys + are bytes, instead of strings, in the absence of other information. + See http://wiki.apache.org/cassandra/FAQ#cli_keys for more details. + Features -------- Propchange: cassandra/trunk/contrib/ ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Aug 30 15:16:03 2011 @@ -1,7 +1,7 @@ /cassandra/branches/cassandra-0.6/contrib:922689-1052356,1052358-1053452,1053454,1053456-1068009 -/cassandra/branches/cassandra-0.7/contrib:1026516-1160444,1160825,1161607 +/cassandra/branches/cassandra-0.7/contrib:1026516-1163234 /cassandra/branches/cassandra-0.7.0/contrib:1053690-1055654 -/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1161708,1162844,1162851 +/cassandra/branches/cassandra-0.8/contrib:1090934-1125013,1125019-1163248 /cassandra/branches/cassandra-0.8.0/contrib:1125021-1130369 /cassandra/branches/cassandra-0.8.1/contrib:1101014-1125018 /cassandra/tags/cassandra-0.7.0-rc3/contrib:1051699-1053689 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Aug 30 15:16:03 2011 @@ -1,7 +1,7 @@ /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1052356,1052358-1053452,1053454,1053456-1131291 -/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1160444,1160825,1161607 +/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026516-1163234 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1053690-1055654 -/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1161708,1162844,1162851 +/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1090934-1125013,1125019-1163248 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1101014-1125018 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1051699-1053689 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Aug 30 15:16:03 2011 @@ -1,7 +1,7 @@ /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1052356,1052358-1053452,1053454,1053456-1131291 -/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1160444,1160825,1161607 +/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026516-1163234 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1053690-1055654 -/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1161708,1162844,1162851 +/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1090934-1125013,1125019-1163248 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1101014-1125018 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1051699-1053689 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Aug 30 15:16:03 2011 @@ -1,7 +1,7 @@ /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291 -/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1160444,1160825,1161607 +/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026516-1163234 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1053690-1055654 -/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1161708,1162844,1162851 +/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1090934-1125013,1125019-1163248 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1101014-1125018 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1051699-1053689 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Aug 30 15:16:03 2011 @@ -1,7 +1,7 @@ /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1052356,1052358-1053452,1053454,1053456-1131291 -/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1160444,1160825,1161607 +/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026516-1163234 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1053690-1055654 -/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1161708,1162844,1162851 +/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1090934-1125013,1125019-1163248 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1101014-1125018 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1051699-1053689 Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java ------------------------------------------------------------------------------ --- svn:mergeinfo (original) +++ svn:mergeinfo Tue Aug 30 15:16:03 2011 @@ -1,7 +1,7 @@ /cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1052356,1052358-1053452,1053454,1053456-1131291 -/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1160444,1160825,1161607 +/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026516-1163234 /cassandra/branches/cassandra-0.7.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1053690-1055654 -/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1161708,1162844,1162851 +/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1090934-1125013,1125019-1163248 /cassandra/branches/cassandra-0.8.0/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1125021-1130369 /cassandra/branches/cassandra-0.8.1/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1101014-1125018 /cassandra/tags/cassandra-0.7.0-rc3/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1051699-1053689 Modified: cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g?rev=1163255&r1=1163254&r2=1163255&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g (original) +++ cassandra/trunk/src/java/org/apache/cassandra/cli/Cli.g Tue Aug 30 15:16:03 2011 @@ -382,8 +382,8 @@ useKeyspace keyValuePairExpr - : objectName ( (AND | WITH) keyValuePair )* - -> ^(NODE_NEW_KEYSPACE_ACCESS objectName ( keyValuePair )* ) + : entityName ( (AND | WITH) keyValuePair )* + -> ^(NODE_NEW_KEYSPACE_ACCESS entityName ( keyValuePair )* ) ; keyValuePair @@ -424,13 +424,13 @@ columnFamilyExpr ; keyRangeExpr - : '[' ( startKey? ':' endKey? )? ']' - -> ^(NODE_KEY_RANGE startKey? endKey?) + : '[' ( startKey=entityName? ':' endKey=entityName? )? ']' + -> ^(NODE_KEY_RANGE $startKey? $endKey?) ; columnName - : (StringLiteral | Identifier | IntegerPositiveLiteral | IntegerNegativeLiteral) - ; + : entityName + ; attr_name : Identifier @@ -449,21 +449,17 @@ attrValueDouble : DoubleLiteral ; -objectName - : Identifier - ; - keyspace - : Identifier - ; + : entityName + ; replica_placement_strategy : StringLiteral ; keyspaceNewName - : Identifier - ; + : entityName + ; comparator : StringLiteral @@ -473,8 +469,8 @@ command : Identifier ; newColumnFamily - : Identifier - ; + : entityName + ; username: Identifier ; @@ -483,10 +479,14 @@ password: StringLiteral ; columnFamily - : Identifier - ; + : entityName + ; + +entityName + : (Identifier | StringLiteral | IntegerPositiveLiteral | IntegerNegativeLiteral) + ; -rowKey +rowKey : (Identifier | StringLiteral | IntegerPositiveLiteral | IntegerNegativeLiteral | functionCall) ; @@ -507,14 +507,6 @@ functionArgument : Identifier | StringLiteral | IntegerPositiveLiteral | IntegerNegativeLiteral ; -startKey - : (Identifier | StringLiteral) - ; - -endKey - : (Identifier | StringLiteral) - ; - columnOrSuperColumn : (Identifier | IntegerPositiveLiteral | IntegerNegativeLiteral | StringLiteral | functionCall) ; Modified: cassandra/trunk/src/java/org/apache/cassandra/cli/CliCompiler.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cli/CliCompiler.java?rev=1163255&r1=1163254&r2=1163255&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/cli/CliCompiler.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/cli/CliCompiler.java Tue Aug 30 15:16:03 2011 @@ -96,7 +96,7 @@ public class CliCompiler public static String getColumnFamily(Tree astNode, List<CfDef> cfDefs) { - return getColumnFamily(astNode.getChild(0).getText(), cfDefs); + return getColumnFamily(CliUtils.unescapeSQLString(astNode.getChild(0).getText()), cfDefs); } public static String getColumnFamily(String cfName, List<CfDef> cfDefs) Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java?rev=1163255&r1=1163254&r2=1163255&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java Tue Aug 30 15:16:03 2011 @@ -261,6 +261,24 @@ public class Range extends AbstractBound } /** + * Subtracts a portion of this range. + * @param contained The range to subtract from this. It must be totally + * contained by this range. + * @return An ArrayList of the Ranges left after subtracting contained + * from this. + */ + private ArrayList<Range> subtractContained(Range contained) + { + ArrayList<Range> difference = new ArrayList<Range>(); + + if (!left.equals(contained.left)) + difference.add(new Range(left, contained.left)); + if (!right.equals(contained.right)) + difference.add(new Range(contained.right, right)); + return difference; + } + + /** * Calculate set of the difference ranges of given two ranges * (as current (A, B] and rhs is (C, D]) * which node will need to fetch when moving to a given new token @@ -270,33 +288,35 @@ public class Range extends AbstractBound */ public Set<Range> differenceToFetch(Range rhs) { - Set<Range> difference = new HashSet<Range>(); - - int comparisonAC = Range.compare(left, rhs.left); - - if (comparisonAC == 0) // (A, B] & (A, C] + Set<Range> result; + Set<Range> intersectionSet = this.intersectionWith(rhs); + if (intersectionSet.isEmpty()) { - if (Range.compare(right, rhs.right) < 0) // B < C - { - difference.add(new Range(right, rhs.right)); - } + result = new HashSet<Range>(); + result.add(rhs); } - else if (comparisonAC > 0) // (A, B] & (C, D] where C < A (A > C) + else { - difference.add(new Range(rhs.left, left)); // first interval will be (C, A] - - if (Range.compare(rhs.right, right) > 0) // D > B + Range[] intersections = new Range[intersectionSet.size()]; + intersectionSet.toArray(intersections); + if (intersections.length == 1) { - difference.add(new Range(rhs.right, right)); // (D, B] + result = new HashSet<Range>(rhs.subtractContained(intersections[0])); + } + else + { + // intersections.length must be 2 + Range first = intersections[0]; + Range second = intersections[1]; + ArrayList<Range> temp = rhs.subtractContained(first); + + // Because there are two intersections, subtracting only one of them + // will yield a single Range. + Range single = temp.get(0); + result = new HashSet<Range>(single.subtractContained(second)); } } - else // (A, B] & (C, D] where C > A (mean that comparisonAC < 0) - { - Token newLeft = (Range.compare(rhs.left, right) > 0) ? rhs.left : right; // C > B ? (C, D] : (B, D] - difference.add(new Range(newLeft, rhs.right)); - } - - return difference; + return result; } public static boolean isTokenInRanges(Token token, Iterable<Range> ranges) Modified: cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java?rev=1163255&r1=1163254&r2=1163255&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java Tue Aug 30 15:16:03 2011 @@ -113,7 +113,7 @@ public class DatacenterSyncWriteResponse // Throw exception if any of the DC doesn't have livenodes to accept write. for (String dc: strategy.getDatacenters()) { - if (dcEndpoints.get(dc).get() != responses.get(dc).get()) + if (dcEndpoints.get(dc).get() < responses.get(dc).get()) throw new UnavailableException(); } } Modified: cassandra/trunk/src/java/org/apache/cassandra/service/GCInspector.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/GCInspector.java?rev=1163255&r1=1163254&r2=1163255&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/service/GCInspector.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/service/GCInspector.java Tue Aug 30 15:16:03 2011 @@ -104,10 +104,8 @@ public class GCInspector Long previousCount = gccounts.get(gc.getName()); Long count = gc.getCollectionCount(); - if (count == 0) continue; - if (previousCount == null) previousCount = 0L; gccounts.put(gc.getName(), count); Modified: cassandra/trunk/src/java/org/apache/cassandra/utils/BloomCalculations.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/utils/BloomCalculations.java?rev=1163255&r1=1163254&r2=1163255&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/utils/BloomCalculations.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/utils/BloomCalculations.java Tue Aug 30 15:16:03 2011 @@ -106,14 +106,21 @@ class BloomCalculations { * A wrapper class that holds two key parameters for a Bloom Filter: the * number of hash functions used, and the number of buckets per element used. */ - public static class BloomSpecification { + public static class BloomSpecification + { final int K; // number of hash functions. final int bucketsPerElement; - public BloomSpecification(int k, int bucketsPerElement) { + public BloomSpecification(int k, int bucketsPerElement) + { K = k; this.bucketsPerElement = bucketsPerElement; } + + public String toString() + { + return String.format("BloomSpecification(K=%d, bucketsPerElement=%d)", K, bucketsPerElement); + } } /** Modified: cassandra/trunk/src/java/org/apache/cassandra/utils/BloomFilter.java URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/utils/BloomFilter.java?rev=1163255&r1=1163254&r2=1163255&view=diff ============================================================================== --- cassandra/trunk/src/java/org/apache/cassandra/utils/BloomFilter.java (original) +++ cassandra/trunk/src/java/org/apache/cassandra/utils/BloomFilter.java Tue Aug 30 15:16:03 2011 @@ -70,6 +70,7 @@ public class BloomFilter extends Filter numElements, bucketsPerElement, targetBucketsPerElem)); } BloomCalculations.BloomSpecification spec = BloomCalculations.computeBloomSpec(bucketsPerElement); + logger.debug("Creating bloom filter for {} elements and spec {}", numElements, spec); return new BloomFilter(spec.K, bucketsFor(numElements, spec.bucketsPerElement)); } Modified: cassandra/trunk/test/unit/org/apache/cassandra/cli/CliTest.java URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/cli/CliTest.java?rev=1163255&r1=1163254&r2=1163255&view=diff ============================================================================== --- cassandra/trunk/test/unit/org/apache/cassandra/cli/CliTest.java (original) +++ cassandra/trunk/test/unit/org/apache/cassandra/cli/CliTest.java Tue Aug 30 15:16:03 2011 @@ -39,37 +39,42 @@ public class CliTest extends CleanupHelp // please add new statements here so they could be auto-runned by this test. private String[] statements = { "use TestKeySpace;", - "create column family CF1 with comparator=UTF8Type and column_metadata=[{ column_name:world, validation_class:IntegerType, index_type:0, index_name:IdxName }, " + + "create column family 123 with comparator=UTF8Type and column_metadata=[{ column_name:world, validation_class:IntegerType, index_type:0, index_name:IdxName }, " + "{ column_name:world2, validation_class:LongType, index_type:KEYS, index_name:LongIdxName}, " + "{ column_name:617070, validation_class:UTF8Type, index_type:KEYS }, " + "{ column_name:28292, validation_class:UTF8Type, index_type:CUSTOM, index_options:{class_name:'org.apache.cassandra.db.index.keys.KeysIndex', foo:bar}}," + "{ column_name:'-617071', validation_class:UTF8Type, index_type:KEYS }];", - "assume CF1 keys as utf8;", - "set CF1[hello][world] = 123848374878933948398384;", - "set CF1[hello][test_quote] = 'value\\'';", - "set CF1['k\\'ey'][VALUE] = 'VAL';", - "set CF1['k\\'ey'][VALUE] = 'VAL\\'';", - "set CF1[hello][-31337] = 'some string value';", - "get CF1[hello][-31337];", - "get CF1[hello][world];", - "get CF1[hello][test_quote];", - "get CF1['k\\'ey'][VALUE]", - "set CF1[hello][-31337] = -23876;", - "set CF1[hello][-31337] = long(-23876);", - "set CF1[hello][world2] = 15;", - "get CF1 where world2 = long(15);", - "get cF1 where world2 = long(15);", - "get Cf1 where world2 = long(15);", - "del CF1[utf8('hello')][utf8('world')];", - "del CF1[hello][world2];", - "set CF1['hello'][time_spent_uuid] = timeuuid(a8098c1a-f86e-11da-bd1a-00112444be1e);", + "assume 123 keys as utf8;", + "set 123[hello][world] = 123848374878933948398384;", + "set 123[hello][test_quote] = 'value\\'';", + "set 123['k\\'ey'][VALUE] = 'VAL';", + "set 123['k\\'ey'][VALUE] = 'VAL\\'';", + "set 123[hello][-31337] = 'some string value';", + "list 123;", + "list 123[:];", + "list 123[456:];", + "list 123 limit 5", + "list 123[12:15] limit 20", + "get 123[hello][-31337];", + "get 123[hello][world];", + "get 123[hello][test_quote];", + "get 123['k\\'ey'][VALUE]", + "set 123[hello][-31337] = -23876;", + "set 123[hello][-31337] = long(-23876);", + "set 123[hello][world2] = 15;", + "get 123 where world2 = long(15);", + "get 123 where world2 = long(15);", + "get 123 where world2 = long(15);", + "del 123[utf8('hello')][utf8('world')];", + "del 123[hello][world2];", + "set 123['hello'][time_spent_uuid] = timeuuid(a8098c1a-f86e-11da-bd1a-00112444be1e);", "create column family CF2 with comparator=IntegerType;", "assume CF2 keys as utf8;", "set CF2['key'][98349387493847748398334] = 'some text';", "get CF2['key'][98349387493847748398334];", "set CF2['key'][98349387493] = 'some text other';", "get CF2['key'][98349387493];", - "create column family CF3 with comparator=UTF8Type and column_metadata=[{column_name:'big world', validation_class:LongType}];", + "create column family CF3 with comparator=UTF8Type and column_metadata=[{column_name:'big world', validation_class:LongType, index_type:KEYS, index_name:WorldIdx}];", "assume CF3 keys as utf8;", "set CF3['hello']['big world'] = 3748;", "get CF3['hello']['big world'];", @@ -89,24 +94,24 @@ public class CliTest extends CleanupHelp "get CF4['hello'][9999] as Long;", "del CF4['hello'][9999];", "get CF4['hello'][9999];", - "create column family SCF1 with column_type=Super and comparator=IntegerType and subcomparator=LongType and column_metadata=[{column_name:9999, validation_class:LongType}];", - "assume SCF1 keys as utf8;", - "set SCF1['hello'][1][9999] = 1234;", - "get SCF1['hello'][1][9999];", - "get SCF1['hello'][1][9999] as Long;", - "get SCF1['hello'][1][9999] as Bytes;", - "set SCF1['hello'][1][9999] = Long(1234);", - "set SCF1['hello'][-1][-12] = Long(5678);", - "get SCF1['hello'][-1][-12];", - "set SCF1['hello'][-1][-12] = -340897;", - "set SCF1['hello'][-1][-12] = integer(-340897);", - "get SCF1['hello'][1][9999];", - "get SCF1['hello'][1][9999] as Long;", - "del SCF1['hello'][1][9999];", - "get SCF1['hello'][1][9999];", - "set SCF1['hello'][1][9999] = Long(1234);", - "del SCF1['hello'][9999];", - "get SCF1['hello'][1][9999];", + "create column family sCf1 with column_type=Super and comparator=IntegerType and subcomparator=LongType and column_metadata=[{column_name:9999, validation_class:LongType}];", + "assume sCf1 keys as utf8;", + "set sCf1['hello'][1][9999] = 1234;", + "get sCf1['hello'][1][9999];", + "get sCf1['hello'][1][9999] as Long;", + "get sCf1['hello'][1][9999] as Bytes;", + "set sCf1['hello'][1][9999] = Long(1234);", + "set sCf1['hello'][-1][-12] = Long(5678);", + "get sCf1['hello'][-1][-12];", + "set sCf1['hello'][-1][-12] = -340897;", + "set sCf1['hello'][-1][-12] = integer(-340897);", + "get sCf1['hello'][1][9999];", + "get sCf1['hello'][1][9999] as Long;", + "del sCf1['hello'][1][9999];", + "get sCf1['hello'][1][9999];", + "set sCf1['hello'][1][9999] = Long(1234);", + "del sCf1['hello'][9999];", + "get sCf1['hello'][1][9999];", "create column family Counter1 with comparator=UTF8Type and default_validation_class=CounterColumnType;", "assume Counter1 keys as utf8;", "incr Counter1['hello']['cassandra'];", @@ -117,16 +122,17 @@ public class CliTest extends CleanupHelp "decr Counter1['hello']['cassandra'] by -2;", "get Counter1['hello']['cassandra'];", "get Counter1['hello'];", - "truncate CF1;", - "drop index on CF1.world2;", - "drop index on CF1.617070;", - "drop index on CF1.'-617071';", + "truncate 123;", + "drop index on '123'.world2;", + "drop index on '123'.617070;", + "drop index on '123'.'-617071';", + "drop index on CF3.'big world';", "update keyspace TestKeySpace with placement_strategy='org.apache.cassandra.locator.LocalStrategy' and durable_writes = false;", "update keyspace TestKeySpace with strategy_options={DC1:3, DC2:4, DC5:1};", - "assume CF1 comparator as utf8;", - "assume CF1 sub_comparator as integer;", - "assume CF1 validator as lexicaluuid;", - "assume CF1 keys as timeuuid;", + "assume 123 comparator as utf8;", + "assume 123 sub_comparator as integer;", + "assume 123 validator as lexicaluuid;", + "assume 123 keys as timeuuid;", "create column family CF7;", "assume CF7 keys as utf8;", "set CF7[1][timeuuid()] = utf8(test1);", @@ -145,14 +151,15 @@ public class CliTest extends CleanupHelp "count sCf1[hello];", "count sCf1[utf8('hello')];", "count sCf1[utf8('hello')][integer(1)];", - "count sCF1[hello][1];", + "count sCf1[hello][1];", "list sCf1;", - "del SCF1['hello'][1][9999];", + "del sCf1['hello'][1][9999];", "assume sCf1 comparator as utf8;", "create column family CF8;", "drop column family cF8;", "create keyspace TESTIN;", "drop keyspace tesTIN;", + "drop column family 123;", "create column family myCF with column_type='Super' and comparator='UTF8Type' AND subcomparator='UTF8Type';", "assume myCF keys as utf8;", "create column family Countries with comparator=UTF8Type and column_metadata=[ {column_name: name, validation_class: UTF8Type} ];", Modified: cassandra/trunk/test/unit/org/apache/cassandra/dht/RangeTest.java URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/dht/RangeTest.java?rev=1163255&r1=1163254&r2=1163255&view=diff ============================================================================== --- cassandra/trunk/test/unit/org/apache/cassandra/dht/RangeTest.java (original) +++ cassandra/trunk/test/unit/org/apache/cassandra/dht/RangeTest.java Tue Aug 30 15:16:03 2011 @@ -19,12 +19,10 @@ package org.apache.cassandra.dht; import java.nio.ByteBuffer; -import java.util.Arrays; -import java.util.List; +import java.util.HashSet; import java.util.Set; import org.apache.commons.lang.StringUtils; - import org.junit.Test; public class RangeTest @@ -314,4 +312,151 @@ public class RangeTest assert Range.compare(t5, t4) == 1; assert Range.compare(t1, t4) == 0; } + + private Range makeRange(String token1, String token2) + { + return new Range(new BigIntegerToken(token1), new BigIntegerToken(token2)); + } + + private Set<Range> makeRanges(String[][] tokenPairs) + { + Set<Range> ranges = new HashSet<Range>(); + for (int i = 0; i < tokenPairs.length; ++i) + ranges.add(makeRange(tokenPairs[i][0], tokenPairs[i][1])); + return ranges; + } + + private void checkDifference(Range oldRange, String[][] newTokens, String[][] expected) + { + Set<Range> ranges = makeRanges(newTokens); + for (Range newRange : ranges) + { + Set<Range> diff = oldRange.differenceToFetch(newRange); + assert diff.equals(makeRanges(expected)) : "\n" + + "Old range: " + oldRange.toString() + "\n" + + "New range: " + newRange.toString() + "\n" + + "Difference: (result) " + diff.toString() + " != " + makeRanges(expected) + " (expected)"; + } + } + + @Test + public void testDifferenceToFetchNoWrap() + { + Range oldRange = makeRange("10", "40"); + + // New range is entirely contained + String[][] newTokens1 = { { "20", "30" }, { "10", "20" }, { "10", "40" }, { "20", "40" } }; + String[][] expected1 = { }; + checkDifference(oldRange, newTokens1, expected1); + + // Right half of the new range is needed + String[][] newTokens2 = { { "10", "50" }, { "20", "50" }, { "40", "50" } }; + String[][] expected2 = { { "40", "50" } }; + checkDifference(oldRange, newTokens2, expected2); + + // Left half of the new range is needed + String[][] newTokens3 = { { "0", "10" }, { "0", "20" }, { "0", "40" } }; + String[][] expected3 = { { "0", "10" } }; + checkDifference(oldRange, newTokens3, expected3); + + // Parts on both ends of the new range are needed + String[][] newTokens4 = { { "0", "50" } }; + String[][] expected4 = { { "0", "10" }, { "40", "50" } }; + checkDifference(oldRange, newTokens4, expected4); + } + + @Test + public void testDifferenceToFetchBothWrap() + { + Range oldRange = makeRange("1010", "40"); + + // New range is entirely contained + String[][] newTokens1 = { { "1020", "30" }, { "1010", "20" }, { "1010", "40" }, { "1020", "40" } }; + String[][] expected1 = { }; + checkDifference(oldRange, newTokens1, expected1); + + // Right half of the new range is needed + String[][] newTokens2 = { { "1010", "50" }, { "1020", "50" }, { "1040", "50" } }; + String[][] expected2 = { { "40", "50" } }; + checkDifference(oldRange, newTokens2, expected2); + + // Left half of the new range is needed + String[][] newTokens3 = { { "1000", "10" }, { "1000", "20" }, { "1000", "40" } }; + String[][] expected3 = { { "1000", "1010" } }; + checkDifference(oldRange, newTokens3, expected3); + + // Parts on both ends of the new range are needed + String[][] newTokens4 = { { "1000", "50" } }; + String[][] expected4 = { { "1000", "1010" }, { "40", "50" } }; + checkDifference(oldRange, newTokens4, expected4); + } + + @Test + public void testDifferenceToFetchOldWraps() + { + Range oldRange = makeRange("1010", "40"); + + // New range is entirely contained + String[][] newTokens1 = { { "0", "30" }, { "0", "40" }, { "10", "40" } }; + String[][] expected1 = { }; + checkDifference(oldRange, newTokens1, expected1); + + // Right half of the new range is needed + String[][] newTokens2 = { { "0", "50" }, { "10", "50" }, { "40", "50" } }; + String[][] expected2 = { { "40", "50" } }; + checkDifference(oldRange, newTokens2, expected2); + + // Whole range is needed + String[][] newTokens3 = { { "50", "90" } }; + String[][] expected3 = { { "50", "90" } }; + checkDifference(oldRange, newTokens3, expected3); + + // Both ends of the new range overlaps the old range + String[][] newTokens4 = { { "10", "1010" }, { "40", "1010" }, { "10", "1030" }, { "40", "1030" } }; + String[][] expected4 = { { "40", "1010" } }; + checkDifference(oldRange, newTokens4, expected4); + + // Only RHS of the new range overlaps the old range + String[][] newTokens5 = { { "60", "1010" }, { "60", "1030" } }; + String[][] expected5 = { { "60", "1010" } }; + checkDifference(oldRange, newTokens5, expected5); + } + + @Test + public void testDifferenceToFetchNewWraps() + { + Range oldRange = makeRange("0", "40"); + + // Only the LHS of the new range is needed + String[][] newTokens1 = { { "1010", "0" }, { "1010", "10" }, { "1010", "40" } }; + String[][] expected1 = { { "1010", "0" } }; + checkDifference(oldRange, newTokens1, expected1); + + // Both ends of the new range are needed + String[][] newTokens2 = { { "1010", "50" } }; + String[][] expected2 = { { "1010", "0" }, { "40", "50" } }; + checkDifference(oldRange, newTokens2, expected2); + + oldRange = makeRange("20", "40"); + + // Whole new range is needed + String[][] newTokens3 = { { "1010", "0" } }; + String[][] expected3 = { { "1010", "0" } }; + checkDifference(oldRange, newTokens3, expected3); + + // Whole new range is needed (matching endpoints) + String[][] newTokens4 = { { "1010", "20" } }; + String[][] expected4 = { { "1010", "20" } }; + checkDifference(oldRange, newTokens4, expected4); + + // Only RHS of new range is needed + String[][] newTokens5 = { { "30", "0" }, { "40", "0" } }; + String[][] expected5 = { { "40", "0" } }; + checkDifference(oldRange, newTokens5, expected5); + + // Only RHS of new range is needed (matching endpoints) + String[][] newTokens6 = { { "30", "20" }, { "40", "20" } }; + String[][] expected6 = { { "40", "20" } }; + checkDifference(oldRange, newTokens6, expected6); + } }