You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by sl...@apache.org on 2014/05/05 09:28:22 UTC

[2/4] git commit: Fix super column filter conversion

Fix super column filter conversion

patch by slebresne; reviewed by thobbs for CASSANDRA-7138


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/7e8efd1b
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/7e8efd1b
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/7e8efd1b

Branch: refs/heads/trunk
Commit: 7e8efd1bbc8e25c9503883bee895df168e5a99b8
Parents: 706afc3
Author: Sylvain Lebresne <sy...@datastax.com>
Authored: Mon May 5 09:21:46 2014 +0200
Committer: Sylvain Lebresne <sy...@datastax.com>
Committed: Mon May 5 09:21:46 2014 +0200

----------------------------------------------------------------------
 CHANGES.txt                                           |  1 +
 src/java/org/apache/cassandra/db/SuperColumns.java    |  5 ++++-
 .../org/apache/cassandra/thrift/CassandraServer.java  | 14 ++++++++++----
 3 files changed, 15 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/7e8efd1b/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 5332c65..ddcb09c 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,6 @@
 2.1.0-rc1
  * Parallel streaming for sstableloader (CASSANDRA-3668)
+ * Fix bugs in supercolumns handling (CASSANDRA-7138)
 Merged from 2.0:
  * Make batchlog replica selection rack-aware (CASSANDRA-6551)
  * Suggest CTRL-C or semicolon after three blank lines in cqlsh (CASSANDRA-7142)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7e8efd1b/src/java/org/apache/cassandra/db/SuperColumns.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/SuperColumns.java b/src/java/org/apache/cassandra/db/SuperColumns.java
index bab46eb..2006cbd 100644
--- a/src/java/org/apache/cassandra/db/SuperColumns.java
+++ b/src/java/org/apache/cassandra/db/SuperColumns.java
@@ -184,7 +184,10 @@ public class SuperColumns
             int i = 0;
             for (CellName name : filter.columns)
             {
-                slices[i++] = name.slice();
+                // Note that, because the filter in argument is the one from thrift, 'name' are SimpleDenseCellName.
+                // So calling name.slice() would be incorrect, as simple cell names don't handle the EOC properly.
+                // This is why we call toByteBuffer() and rebuild a  Composite of the right type before call slice().
+                slices[i++] = type.make(name.toByteBuffer()).slice();
             }
             return new SliceQueryFilter(slices, false, slices.length, 1);
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/7e8efd1b/src/java/org/apache/cassandra/thrift/CassandraServer.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/thrift/CassandraServer.java b/src/java/org/apache/cassandra/thrift/CassandraServer.java
index 069cec7..5a296f3 100644
--- a/src/java/org/apache/cassandra/thrift/CassandraServer.java
+++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java
@@ -381,12 +381,18 @@ public class CassandraServer implements Cassandra.Iface
 
     private SliceQueryFilter toInternalFilter(CFMetaData metadata, ColumnParent parent, SliceRange range)
     {
+        if (metadata.isSuper())
+        {
+            CellNameType columnType = new SimpleDenseCellNameType(metadata.comparator.subtype(parent.isSetSuper_column() ? 1 : 0));
+            Composite start = columnType.fromByteBuffer(range.start);
+            Composite finish = columnType.fromByteBuffer(range.finish);
+            SliceQueryFilter filter = new SliceQueryFilter(start, finish, range.reversed, range.count);
+            return SuperColumns.fromSCSliceFilter(metadata.comparator, parent.bufferForSuper_column(), filter);
+        }
+
         Composite start = metadata.comparator.fromByteBuffer(range.start);
         Composite finish = metadata.comparator.fromByteBuffer(range.finish);
-        SliceQueryFilter filter = new SliceQueryFilter(start, finish, range.reversed, range.count);
-        if (metadata.isSuper())
-            filter = SuperColumns.fromSCSliceFilter(metadata.comparator, parent.bufferForSuper_column(), filter);
-        return filter;
+        return new SliceQueryFilter(start, finish, range.reversed, range.count);
     }
 
     private IDiskAtomFilter toInternalFilter(CFMetaData metadata, ColumnParent parent, SlicePredicate predicate)