Backport CASSANDRA-12002
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/de86ab1b Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/de86ab1b Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/de86ab1b Branch: refs/heads/cassandra-3.9 Commit: de86ab1bb6e4b71451348397e0cbb2a577cd92d4 Parents: 05483a9 Author: Yuki Morishita <yu...@apache.org> Authored: Thu Aug 11 10:06:05 2016 -0500 Committer: Yuki Morishita <yu...@apache.org> Committed: Thu Aug 11 10:11:13 2016 -0500 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../apache/cassandra/tools/SSTableExport.java | 8 ++---- .../org/apache/cassandra/utils/FBUtilities.java | 28 ++++++++++++++++++++ 3 files changed, 31 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/de86ab1b/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index bd3bb75..3db2c77 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.9 + * Backport CASSANDRA-12002 (CASSANDRA-12177) * Make sure compaction stats are updated when compaction is interrupted (CASSANDRA-12100) * Fix potential bad messaging service message for paged range reads within mixed-version 3.x clusters (CASSANDRA-12249) http://git-wip-us.apache.org/repos/asf/cassandra/blob/de86ab1b/src/java/org/apache/cassandra/tools/SSTableExport.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/tools/SSTableExport.java b/src/java/org/apache/cassandra/tools/SSTableExport.java index 09dbbed..cc6b84b 100644 --- a/src/java/org/apache/cassandra/tools/SSTableExport.java +++ b/src/java/org/apache/cassandra/tools/SSTableExport.java @@ -98,14 +98,10 @@ public class SSTableExport if (!desc.version.storeRows()) throw new IOException("pre-3.0 SSTable is not supported."); - EnumSet<MetadataType> types = EnumSet.of(MetadataType.VALIDATION, MetadataType.STATS, MetadataType.HEADER); + EnumSet<MetadataType> types = EnumSet.of(MetadataType.STATS, MetadataType.HEADER); Map<MetadataType, MetadataComponent> sstableMetadata = desc.getMetadataSerializer().deserialize(desc, types); - ValidationMetadata validationMetadata = (ValidationMetadata) sstableMetadata.get(MetadataType.VALIDATION); SerializationHeader.Component header = (SerializationHeader.Component) sstableMetadata.get(MetadataType.HEADER); - - IPartitioner partitioner = SecondaryIndexManager.isIndexColumnFamily(desc.cfname) - ? new LocalPartitioner(header.getKeyType()) - : FBUtilities.newPartitioner(validationMetadata.partitioner); + IPartitioner partitioner = FBUtilities.newPartitioner(desc); CFMetaData.Builder builder = CFMetaData.Builder.create("keyspace", "table").withPartitioner(partitioner); header.getStaticColumns().entrySet().stream() http://git-wip-us.apache.org/repos/asf/cassandra/blob/de86ab1b/src/java/org/apache/cassandra/utils/FBUtilities.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java index 5f0e0a0..d996c91 100644 --- a/src/java/org/apache/cassandra/utils/FBUtilities.java +++ b/src/java/org/apache/cassandra/utils/FBUtilities.java @@ -42,11 +42,17 @@ import org.apache.cassandra.auth.IAuthorizer; import org.apache.cassandra.auth.IRoleManager; import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.db.DecoratedKey; +import org.apache.cassandra.db.SerializationHeader; import org.apache.cassandra.dht.IPartitioner; +import org.apache.cassandra.dht.LocalPartitioner; import org.apache.cassandra.dht.Range; import org.apache.cassandra.dht.Token; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.io.IVersionedSerializer; +import org.apache.cassandra.io.sstable.Descriptor; +import org.apache.cassandra.io.sstable.metadata.MetadataComponent; +import org.apache.cassandra.io.sstable.metadata.MetadataType; +import org.apache.cassandra.io.sstable.metadata.ValidationMetadata; import org.apache.cassandra.schema.CompressionParams; import org.apache.cassandra.io.util.DataOutputBuffer; import org.apache.cassandra.io.util.DataOutputBufferFixed; @@ -395,6 +401,28 @@ public class FBUtilities result.get(ms, TimeUnit.MILLISECONDS); } + /** + * Create a new instance of a partitioner defined in an SSTable Descriptor + * @param desc Descriptor of an sstable + * @return a new IPartitioner instance + * @throws IOException + */ + public static IPartitioner newPartitioner(Descriptor desc) throws IOException + { + EnumSet<MetadataType> types = EnumSet.of(MetadataType.VALIDATION, MetadataType.HEADER); + Map<MetadataType, MetadataComponent> sstableMetadata = desc.getMetadataSerializer().deserialize(desc, types); + ValidationMetadata validationMetadata = (ValidationMetadata) sstableMetadata.get(MetadataType.VALIDATION); + SerializationHeader.Component header = (SerializationHeader.Component) sstableMetadata.get(MetadataType.HEADER); + if (validationMetadata.partitioner.endsWith("LocalPartitioner")) + { + return new LocalPartitioner(header.getKeyType()); + } + else + { + return newPartitioner(validationMetadata.partitioner); + } + } + public static IPartitioner newPartitioner(String partitionerClassName) throws ConfigurationException { if (!partitionerClassName.contains("."))