Repository: cassandra Updated Branches: refs/heads/cassandra-3.0 5a77bd1f1 -> 14f08e6f6 refs/heads/trunk 7cd14d089 -> a5e501f09
Add indexed column to column filter in KeysSearcher Patch by Sam Tunnicliffe; reviewed by Sylvain Lebresne for CASSANDRA-11523 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/14f08e6f Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/14f08e6f Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/14f08e6f Branch: refs/heads/cassandra-3.0 Commit: 14f08e6f66ef96614fccd12d1eac482c00ee7dc5 Parents: 5a77bd1 Author: Sam Tunnicliffe <[email protected]> Authored: Thu Apr 14 17:16:27 2016 +0100 Committer: Sam Tunnicliffe <[email protected]> Committed: Wed Apr 20 16:02:34 2016 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../index/internal/keys/KeysSearcher.java | 33 ++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/14f08e6f/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index cc50a23..ae73437 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.6 + * Ensure columnfilter covers indexed columns for thrift 2i queries (CASSANDRA-11523) * Only open one sstable scanner per sstable (CASSANDRA-11412) * Option to specify ProtocolVersion in cassandra-stress (CASSANDRA-11410) * ArithmeticException in avgFunctionForDecimal (CASSANDRA-11485) http://git-wip-us.apache.org/repos/asf/cassandra/blob/14f08e6f/src/java/org/apache/cassandra/index/internal/keys/KeysSearcher.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/index/internal/keys/KeysSearcher.java b/src/java/org/apache/cassandra/index/internal/keys/KeysSearcher.java index f00bb27..189b652 100644 --- a/src/java/org/apache/cassandra/index/internal/keys/KeysSearcher.java +++ b/src/java/org/apache/cassandra/index/internal/keys/KeysSearcher.java @@ -23,7 +23,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.cassandra.config.CFMetaData; +import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.db.*; +import org.apache.cassandra.db.filter.ColumnFilter; import org.apache.cassandra.db.filter.DataLimits; import org.apache.cassandra.db.filter.RowFilter; import org.apache.cassandra.db.partitions.ImmutableBTreePartition; @@ -89,10 +91,11 @@ public class KeysSearcher extends CassandraIndexSearcher if (!command.selectsKey(key)) continue; + ColumnFilter extendedFilter = getExtendedFilter(command.columnFilter()); SinglePartitionReadCommand dataCmd = SinglePartitionReadCommand.create(isForThrift(), index.baseCfs.metadata, command.nowInSec(), - command.columnFilter(), + extendedFilter, command.rowFilter(), DataLimits.NONE, key, @@ -134,6 +137,17 @@ public class KeysSearcher extends CassandraIndexSearcher }; } + private ColumnFilter getExtendedFilter(ColumnFilter initialFilter) + { + if (command.columnFilter().includes(index.getIndexedColumn())) + return initialFilter; + + ColumnFilter.Builder builder = ColumnFilter.selectionBuilder(); + builder.addAll(initialFilter.fetchedColumns()); + builder.add(index.getIndexedColumn()); + return builder.build(); + } + private UnfilteredRowIterator filterIfStale(UnfilteredRowIterator iterator, Row indexHit, ByteBuffer indexedValue, @@ -144,10 +158,12 @@ public class KeysSearcher extends CassandraIndexSearcher if (isForThrift) { // The data we got has gone though ThrifResultsMerger, so we're looking for the row whose clustering - // is the indexed name. Ans so we need to materialize the partition. + // is the indexed name and so we need to materialize the partition. ImmutableBTreePartition result = ImmutableBTreePartition.create(iterator); iterator.close(); Row data = result.getRow(new Clustering(index.getIndexedColumn().name.bytes)); + if (data == null) + return null; // for thrift tables, we need to compare the index entry against the compact value column, // not the column actually designated as the indexed column so we don't use the index function @@ -164,7 +180,18 @@ public class KeysSearcher extends CassandraIndexSearcher } else { - return result.unfilteredIterator(); + if (command.columnFilter().includes(index.getIndexedColumn())) + return result.unfilteredIterator(); + + // The query on the base table used an extended column filter to ensure that the + // indexed column was actually read for use in the staleness check, before + // returning the results we must filter the base table partition so that it + // contains only the originally requested columns. See CASSANDRA-11523 + ClusteringComparator comparator = result.metadata().comparator; + Slices.Builder slices = new Slices.Builder(comparator); + for (ColumnDefinition selected : command.columnFilter().fetchedColumns()) + slices.add(Slice.make(comparator, selected.name.bytes)); + return result.unfilteredIterator(ColumnFilter.all(command.metadata()), slices.build(), false); } } else
