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);
+    }
 }


Reply via email to