Merge branch cassandra-3.11 into trunk
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/4838e81a Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/4838e81a Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/4838e81a Branch: refs/heads/trunk Commit: 4838e81a64eb118d0f86463b61b43c450a199dc8 Parents: 41ef972 8d98a99 Author: Benjamin Lerer <[email protected]> Authored: Thu Aug 24 18:23:02 2017 +0200 Committer: Benjamin Lerer <[email protected]> Committed: Thu Aug 24 18:24:02 2017 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cassandra/db/SerializationHeader.java | 13 +- .../db/rows/AbstractTypeVersionComparator.java | 121 ++++++++++++ src/java/org/apache/cassandra/db/rows/Row.java | 18 +- src/java/org/apache/cassandra/db/rows/Rows.java | 20 +- .../io/sstable/format/SSTableReader.java | 20 +- .../org/apache/cassandra/cql3/CQLTester.java | 20 +- .../cql3/validation/entities/UserTypesTest.java | 151 +++++++++++++++ .../rows/AbstractTypeVersionComparatorTest.java | 188 +++++++++++++++++++ 9 files changed, 532 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/4838e81a/CHANGES.txt ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/4838e81a/src/java/org/apache/cassandra/db/SerializationHeader.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/db/SerializationHeader.java index 1f937f8,ddf83b7..4266629 --- a/src/java/org/apache/cassandra/db/SerializationHeader.java +++ b/src/java/org/apache/cassandra/db/SerializationHeader.java @@@ -84,8 -84,9 +84,9 @@@ public class SerializationHeade // our stats merging on the compacted files headers, which as we just said can be somewhat inaccurate, // but rather on their stats stored in StatsMetadata that are fully accurate. EncodingStats.Collector stats = new EncodingStats.Collector(); - PartitionColumns.Builder columns = PartitionColumns.builder(); - // We need to order the SSTables by descending generation to be sure that we use latest column definitions. + RegularAndStaticColumns.Builder columns = RegularAndStaticColumns.builder(); - for (SSTableReader sstable : sstables) ++ // We need to order the SSTables by descending generation to be sure that we use latest column metadata. + for (SSTableReader sstable : orderByDescendingGeneration(sstables)) { stats.updateTimestamp(sstable.getMinTimestamp()); stats.updateLocalDeletionTime(sstable.getMinLocalDeletionTime()); @@@ -95,9 -99,19 +96,19 @@@ return new SerializationHeader(true, metadata, columns.build(), stats.get()); } + private static Collection<SSTableReader> orderByDescendingGeneration(Collection<SSTableReader> sstables) + { + if (sstables.size() < 2) + return sstables; + + List<SSTableReader> readers = new ArrayList<>(sstables); + readers.sort(SSTableReader.generationReverseComparator); + return readers; + } + public SerializationHeader(boolean isForSSTable, - CFMetaData metadata, - PartitionColumns columns, + TableMetadata metadata, + RegularAndStaticColumns columns, EncodingStats stats) { this(isForSSTable, http://git-wip-us.apache.org/repos/asf/cassandra/blob/4838e81a/src/java/org/apache/cassandra/db/rows/Row.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/db/rows/Row.java index 7449e51,60ee4d4..5999864 --- a/src/java/org/apache/cassandra/db/rows/Row.java +++ b/src/java/org/apache/cassandra/db/rows/Row.java @@@ -721,10 -721,25 +721,25 @@@ public interface Row extends Unfiltered public void reduce(int idx, ColumnData data) { - column = data.column(); - if (useColumnDefinition(data.column())) ++ if (useColumnMetadata(data.column())) + column = data.column(); + versions.add(data); } + /** - * Determines it the {@code ColumnDefinition} is the one that should be used. - * @param dataColumn the {@code ColumnDefinition} to use. - * @return {@code true} if the {@code ColumnDefinition} is the one that should be used, {@code false} otherwise. ++ * Determines it the {@code ColumnMetadata} is the one that should be used. ++ * @param dataColumn the {@code ColumnMetadata} to use. ++ * @return {@code true} if the {@code ColumnMetadata} is the one that should be used, {@code false} otherwise. + */ - private boolean useColumnDefinition(ColumnDefinition dataColumn) ++ private boolean useColumnMetadata(ColumnMetadata dataColumn) + { + if (column == null) + return true; + + return AbstractTypeVersionComparator.INSTANCE.compare(column.type, dataColumn.type) < 0; + } + protected ColumnData getReduced() { if (column.isSimple()) http://git-wip-us.apache.org/repos/asf/cassandra/blob/4838e81a/src/java/org/apache/cassandra/db/rows/Rows.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/db/rows/Rows.java index 8c7143a,3331506..79c46d0 --- a/src/java/org/apache/cassandra/db/rows/Rows.java +++ b/src/java/org/apache/cassandra/db/rows/Rows.java @@@ -297,7 -297,8 +297,7 @@@ public abstract class Row int comparison = nexta == null ? 1 : nextb == null ? -1 : nexta.column.compareTo(nextb.column); ColumnData cura = comparison <= 0 ? nexta : null; ColumnData curb = comparison >= 0 ? nextb : null; - ColumnMetadata column = (cura != null ? cura : curb).column; - ColumnDefinition column = getColumnDefinition(cura, curb); - ++ ColumnMetadata column = getColumnMetadata(cura, curb); if (column.isSimple()) { timeDelta = Math.min(timeDelta, Cells.reconcile((Cell) cura, (Cell) curb, deletion, builder, nowInSec)); @@@ -403,4 -404,22 +403,22 @@@ Row row = builder.build(); return row != null && !row.isEmpty() ? row : null; } + + /** - * Returns the {@code ColumnDefinition} to use for merging the columns. - * If the 2 column definitions are different the latest one will be returned. ++ * Returns the {@code ColumnMetadata} to use for merging the columns. ++ * If the 2 column metadata are different the latest one will be returned. + */ - private static ColumnDefinition getColumnDefinition(ColumnData cura, ColumnData curb) ++ private static ColumnMetadata getColumnMetadata(ColumnData cura, ColumnData curb) + { + if (cura == null) + return curb.column; + + if (curb == null) + return cura.column; + + if (AbstractTypeVersionComparator.INSTANCE.compare(cura.column.type, curb.column.type) >= 0) + return cura.column; + + return curb.column; + } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/4838e81a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/4838e81a/test/unit/org/apache/cassandra/cql3/CQLTester.java ---------------------------------------------------------------------- --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
