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 <[email protected]> Authored: Mon May 5 09:21:46 2014 +0200 Committer: Sylvain Lebresne <[email protected]> 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)
