Repository: cassandra Updated Branches: refs/heads/cassandra-2.2 11b7dc113 -> c947a2c42 refs/heads/cassandra-3.0 19ec8dd6c -> 2d48ddf21 refs/heads/cassandra-3.5 46860aa62 -> 2257a7a7e refs/heads/trunk 1de4a983b -> 8097d390a
Fix intra-node serialization issue for multicolumn-restrictions patch by Benjamin Lerer; reviewed by Sylvain Lebresne for CASSANDRA-11196 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/11b7dc11 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/11b7dc11 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/11b7dc11 Branch: refs/heads/cassandra-3.5 Commit: 11b7dc113ff5f73b1bbf889f306ad2aa72d01160 Parents: b9ff7fe Author: Benjamin Lerer <b.le...@gmail.com> Authored: Fri Mar 11 16:58:36 2016 +0100 Committer: Benjamin Lerer <b.le...@gmail.com> Committed: Fri Mar 11 17:03:29 2016 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../restrictions/PrimaryKeyRestrictionSet.java | 22 +++++++++++++++++++- .../PrimaryKeyRestrictionSetTest.java | 3 ++- 3 files changed, 24 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/11b7dc11/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 045b867..87bb0c0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.2.6 + * Fix intra-node serialization issue for multicolumn-restrictions (CASSANDRA-11196) * Non-obsoleting compaction operations over compressed files can impose rate limit on normal reads (CASSANDRA-11301) * Add missing newline at end of bin/cqlsh (CASSANDRA-11325) * Fix AE in nodetool cfstats (backport CASSANDRA-10859) (CASSANDRA-11297) http://git-wip-us.apache.org/repos/asf/cassandra/blob/11b7dc11/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java b/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java index 936dbd6..7ce228c 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java @@ -20,6 +20,8 @@ package org.apache.cassandra.cql3.restrictions; import java.nio.ByteBuffer; import java.util.*; +import com.google.common.collect.Lists; + import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.cql3.QueryOptions; @@ -201,7 +203,24 @@ final class PrimaryKeyRestrictionSet extends AbstractPrimaryKeyRestrictions if (r.isSlice()) { r.appendBoundTo(builder, bound, options); - return filterAndSort(setEocs(r, bound, builder.build())); + + // Since CASSANDRA-7281, the composites might not end with the same components and it is possible + // that one of the composites is an empty one. Unfortunatly, AbstractCType will always sort + // Composites.EMPTY before all the other components due to its EOC, even if it is not the desired + // behaviour in some cases. To avoid that problem the code will use normal composites for the empty + // ones until the composites are properly sorted. They will then be replaced by Composites.EMPTY as + // it is what is expected by the intra-node serialization. + // It is clearly a hack but it does not make a lot of sense to refactor 2.2 for that as the problem is + // already solved in 3.0. + List<Composite> composites = filterAndSort(setEocs(r, bound, builder.build())); + return Lists.transform(composites, new com.google.common.base.Function<Composite, Composite>() + { + @Override + public Composite apply(Composite composite) + { + return composite.isEmpty() ? Composites.EMPTY: composite; + } + }); } r.appendBoundTo(builder, bound, options); @@ -234,6 +253,7 @@ final class PrimaryKeyRestrictionSet extends AbstractPrimaryKeyRestrictions TreeSet<Composite> set = new TreeSet<Composite>(ctype); set.addAll(composites); + return new ArrayList<>(set); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/11b7dc11/test/unit/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSetTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSetTest.java b/test/unit/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSetTest.java index 1deeb9e..bf5128f 100644 --- a/test/unit/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSetTest.java +++ b/test/unit/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSetTest.java @@ -31,6 +31,7 @@ import org.apache.cassandra.cql3.statements.Bound; import org.apache.cassandra.db.ColumnFamilyType; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.composites.Composite.EOC; +import org.apache.cassandra.db.composites.Composites; import org.apache.cassandra.db.composites.CompoundSparseCellNameType; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.Int32Type; @@ -1682,7 +1683,7 @@ public class PrimaryKeyRestrictionSetTest */ private static void assertEmptyComposite(Composite composite) { - assertTrue(composite.isEmpty()); + assertEquals(Composites.EMPTY, composite); } /**