Author: jbellis
Date: Fri Mar 18 18:10:58 2011
New Revision: 1083000

URL: http://svn.apache.org/viewvc?rev=1083000&view=rev
Log:
fix reversed slices on large supercolumn rows

Modified:
    cassandra/branches/cassandra-0.6/CHANGES.txt
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/IndexHelper.java

Modified: cassandra/branches/cassandra-0.6/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/CHANGES.txt?rev=1083000&r1=1082999&r2=1083000&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.6/CHANGES.txt Fri Mar 18 18:10:58 2011
@@ -1,5 +1,6 @@
 0.6.13
  * shut down server for OOM on a Thrift thread (CASSANDRA-2269)
+ * fix reversed slices on large supercolumn rows (CASSANDRA-2212)
 
 
 0.6.12

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java?rev=1083000&r1=1082999&r2=1083000&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java
 Fri Mar 18 18:10:58 2011
@@ -80,7 +80,7 @@ public class SSTableNamesIterator extend
 
             /* get the various column ranges we have to read */
             AbstractType comparator = ssTable.getColumnComparator();
-            SortedSet<IndexHelper.IndexInfo> ranges = new 
TreeSet<IndexHelper.IndexInfo>(IndexHelper.getComparator(comparator));
+            SortedSet<IndexHelper.IndexInfo> ranges = new 
TreeSet<IndexHelper.IndexInfo>(IndexHelper.getComparator(comparator, false));
             for (byte[] name : filteredColumnNames)
             {
                 int index = IndexHelper.indexFor(name, indexList, comparator, 
false);

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java?rev=1083000&r1=1082999&r2=1083000&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
 Fri Mar 18 18:10:58 2011
@@ -139,8 +139,6 @@ class SSTableSliceIterator extends Abstr
 
             file.mark();
             curRangeIndex = IndexHelper.indexFor(startColumn, indexes, 
comparator, reversed);
-            if (reversed && curRangeIndex == indexes.size())
-                curRangeIndex--;
         }
 
         public ColumnFamily getEmptyColumnFamily()

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/IndexHelper.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/IndexHelper.java?rev=1083000&r1=1082999&r2=1083000&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/IndexHelper.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/IndexHelper.java
 Fri Mar 18 18:10:58 2011
@@ -103,26 +103,39 @@ public class IndexHelper
 
     /**
      * the index of the IndexInfo in which @name will be found.
-     * If the index is @indexList.size(), the @name appears nowhere.
+     * If the index is @indexList.size() or -1, the @name appears nowhere.
      */
     public static int indexFor(byte[] name, List<IndexInfo> indexList, 
AbstractType comparator, boolean reversed)
     {
         if (name.length == 0 && reversed)
             return indexList.size() - 1;
         IndexInfo target = new IndexInfo(name, name, 0, 0);
-        int index = Collections.binarySearch(indexList, target, 
getComparator(comparator));
-        return index < 0 ? -1 * (index + 1) : index;
+        int index = Collections.binarySearch(indexList, target, 
getComparator(comparator, reversed));
+        return index < 0 ? -index - (reversed ? 2 : 1) : index;
     }
 
-    public static Comparator<IndexInfo> getComparator(final AbstractType 
nameComparator)
+    public static Comparator<IndexInfo> getComparator(final AbstractType 
nameComparator, boolean reversed)
     {
-        return new Comparator<IndexInfo>()
+        if (reversed)
         {
-            public int compare(IndexInfo o1, IndexInfo o2)
+            return new Comparator<IndexInfo>()
             {
-                return nameComparator.compare(o1.lastName, o2.lastName);
-            }
-        };
+                public int compare(IndexInfo o1, IndexInfo o2)
+                {
+                    return nameComparator.compare(o1.firstName, o2.firstName);
+                }
+            };
+        }
+        else
+        {
+            return new Comparator<IndexInfo>()
+            {
+                public int compare(IndexInfo o1, IndexInfo o2)
+                {
+                    return nameComparator.compare(o1.lastName, o2.lastName);
+                }
+            };
+        }
     }
 
     public static class IndexInfo


Reply via email to