Repository: cassandra Updated Branches: refs/heads/trunk b623375c5 -> 6aa7d6ce8
Fix dtest failures caused by CASSANDRA-8143 patch by Branimir Lambov; reviewed by Aleksey Yeschenko Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/6aa7d6ce Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/6aa7d6ce Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/6aa7d6ce Branch: refs/heads/trunk Commit: 6aa7d6ce89f155b72111bffce54e9bee66080b03 Parents: b623375 Author: Branimir Lambov <[email protected]> Authored: Sat Aug 1 18:17:11 2015 +0300 Committer: Aleksey Yeschenko <[email protected]> Committed: Sun Aug 2 23:02:12 2015 +0300 ---------------------------------------------------------------------- .../org/apache/cassandra/config/CFMetaData.java | 17 ++++++++++++++ .../db/marshal/PartitionerDefinedOrder.java | 22 +++++++++++++++++- .../apache/cassandra/schema/SchemaKeyspace.java | 24 +++----------------- .../cassandra/thrift/CassandraServer.java | 2 +- .../utils/NativeSSTableLoaderClient.java | 15 +++++++----- .../cassandra/db/marshal/TypeParserTest.java | 24 +++++++++++++++++--- 6 files changed, 72 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/6aa7d6ce/src/java/org/apache/cassandra/config/CFMetaData.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java b/src/java/org/apache/cassandra/config/CFMetaData.java index ffb7b5e..43c95ea 100644 --- a/src/java/org/apache/cassandra/config/CFMetaData.java +++ b/src/java/org/apache/cassandra/config/CFMetaData.java @@ -24,6 +24,7 @@ import java.nio.ByteBuffer; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; @@ -1390,6 +1391,22 @@ public final class CFMetaData : (isCompactTable() ? compactValueColumn().type : BytesType.instance); } + public static Set<Flag> flagsFromStrings(Set<String> strings) + { + return strings.stream() + .map(String::toUpperCase) + .map(Flag::valueOf) + .collect(Collectors.toSet()); + } + + public static Set<String> flagsToStrings(Set<Flag> flags) + { + return flags.stream() + .map(Flag::toString) + .map(String::toLowerCase) + .collect(Collectors.toSet()); + } + @Override public String toString() { http://git-wip-us.apache.org/repos/asf/cassandra/blob/6aa7d6ce/src/java/org/apache/cassandra/db/marshal/PartitionerDefinedOrder.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/marshal/PartitionerDefinedOrder.java b/src/java/org/apache/cassandra/db/marshal/PartitionerDefinedOrder.java index efaea53..88f9906 100644 --- a/src/java/org/apache/cassandra/db/marshal/PartitionerDefinedOrder.java +++ b/src/java/org/apache/cassandra/db/marshal/PartitionerDefinedOrder.java @@ -18,14 +18,16 @@ package org.apache.cassandra.db.marshal; import java.nio.ByteBuffer; +import java.util.Iterator; +import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.cql3.Term; import org.apache.cassandra.db.PartitionPosition; import org.apache.cassandra.serializers.TypeSerializer; import org.apache.cassandra.serializers.MarshalException; - import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.utils.ByteBufferUtil; +import org.apache.cassandra.utils.FBUtilities; /** for sorting columns representing row keys in the row ordering as determined by a partitioner. * Not intended for user-defined CFs, and will in fact error out if used with such. */ @@ -38,6 +40,18 @@ public class PartitionerDefinedOrder extends AbstractType<ByteBuffer> this.partitioner = partitioner; } + public static AbstractType<?> getInstance(TypeParser parser) + { + IPartitioner partitioner = DatabaseDescriptor.getPartitioner(); + Iterator<String> argIterator = parser.getKeyValueParameters().keySet().iterator(); + if (argIterator.hasNext()) + { + partitioner = FBUtilities.newPartitioner(argIterator.next()); + assert !argIterator.hasNext(); + } + return partitioner.partitionOrdering(); + } + @Override public ByteBuffer compose(ByteBuffer bytes) { @@ -88,4 +102,10 @@ public class PartitionerDefinedOrder extends AbstractType<ByteBuffer> { throw new UnsupportedOperationException("You can't do this with a local partitioner."); } + + @Override + public String toString() + { + return String.format("%s(%s)", getClass().getName(), partitioner.getClass().getName()); + } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/6aa7d6ce/src/java/org/apache/cassandra/schema/SchemaKeyspace.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java index b33ba76..ba6a2e1 100644 --- a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java +++ b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java @@ -50,8 +50,6 @@ import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; import org.apache.cassandra.utils.concurrent.OpOrder; -import static java.util.stream.Collectors.toSet; - import static org.apache.cassandra.cql3.QueryProcessor.executeOnceInternal; import static org.apache.cassandra.utils.FBUtilities.fromJsonMap; import static org.apache.cassandra.utils.FBUtilities.json; @@ -835,7 +833,7 @@ public final class SchemaKeyspace .map("caching", table.getCaching().asMap()) .map("compaction", buildCompactionMap(table)) .map("compression", table.compressionParameters().asMap()) - .set("flags", flagsToStrings(table.flags())) + .set("flags", CFMetaData.flagsToStrings(table.flags())) .build(); if (withColumnsAndTriggers) @@ -1080,7 +1078,7 @@ public final class SchemaKeyspace UUID id = row.getUUID("id"); Set<CFMetaData.Flag> flags = row.has("flags") - ? flagsFromStrings(row.getSet("flags", UTF8Type.instance)) + ? CFMetaData.flagsFromStrings(row.getSet("flags", UTF8Type.instance)) : Collections.emptySet(); boolean isSuper = flags.contains(CFMetaData.Flag.SUPER); @@ -1132,22 +1130,6 @@ public final class SchemaKeyspace return cfm; } - public static Set<CFMetaData.Flag> flagsFromStrings(Set<String> strings) - { - return strings.stream() - .map(String::toUpperCase) - .map(CFMetaData.Flag::valueOf) - .collect(toSet()); - } - - private static Set<String> flagsToStrings(Set<CFMetaData.Flag> flags) - { - return flags.stream() - .map(CFMetaData.Flag::toString) - .map(String::toLowerCase) - .collect(toSet()); - } - /* * Column metadata serialization/deserialization. */ @@ -1241,7 +1223,7 @@ public final class SchemaKeyspace private static CFMetaData.DroppedColumn createDroppedColumnFromDroppedColumnRow(UntypedResultSet.Row row) { String name = row.getString("column_name"); - AbstractType type = TypeParser.parse(row.getString("type")); + AbstractType<?> type = TypeParser.parse(row.getString("type")); long droppedTime = TimeUnit.MILLISECONDS.toMicros(row.getLong("dropped_time")); return new CFMetaData.DroppedColumn(name, type, droppedTime); http://git-wip-us.apache.org/repos/asf/cassandra/blob/6aa7d6ce/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 a7b8b07..c679479 100644 --- a/src/java/org/apache/cassandra/thrift/CassandraServer.java +++ b/src/java/org/apache/cassandra/thrift/CassandraServer.java @@ -1766,7 +1766,7 @@ public class CassandraServer implements Cassandra.Iface public String describe_partitioner() throws TException { - return StorageService.instance.getTokenMetadata().getClass().getName(); + return StorageService.instance.getPartitionerName(); } public String describe_snitch() throws TException http://git-wip-us.apache.org/repos/asf/cassandra/blob/6aa7d6ce/src/java/org/apache/cassandra/utils/NativeSSTableLoaderClient.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/NativeSSTableLoaderClient.java b/src/java/org/apache/cassandra/utils/NativeSSTableLoaderClient.java index 435c505..5063245 100644 --- a/src/java/org/apache/cassandra/utils/NativeSSTableLoaderClient.java +++ b/src/java/org/apache/cassandra/utils/NativeSSTableLoaderClient.java @@ -24,7 +24,6 @@ import com.datastax.driver.core.*; import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.config.CFMetaData; -import org.apache.cassandra.config.DatabaseDescriptor; import org.apache.cassandra.cql3.ColumnIdentifier; import org.apache.cassandra.db.marshal.*; import org.apache.cassandra.dht.*; @@ -68,7 +67,8 @@ public class NativeSSTableLoaderClient extends SSTableLoader.Client Set<TokenRange> tokenRanges = metadata.getTokenRanges(); - TokenFactory tokenFactory = FBUtilities.newPartitioner(metadata.getPartitioner()).getTokenFactory(); + IPartitioner partitioner = FBUtilities.newPartitioner(metadata.getPartitioner()); + TokenFactory tokenFactory = partitioner.getTokenFactory(); for (TokenRange tokenRange : tokenRanges) { @@ -79,7 +79,7 @@ public class NativeSSTableLoaderClient extends SSTableLoader.Client addRangeForEndpoint(range, endpoint.getAddress()); } - tables.putAll(fetchTablesMetadata(keyspace, session)); + tables.putAll(fetchTablesMetadata(keyspace, session, partitioner)); } } @@ -99,8 +99,11 @@ public class NativeSSTableLoaderClient extends SSTableLoader.Client * SchemaKeyspace.createTableFromTableRowAndColumnRows(). * It might be safer to have a simple wrapper of the driver ResultSet/Row implementing * UntypedResultSet/UntypedResultSet.Row and reuse the original method. + * + * Note: It is not safe for this class to use static methods from SchemaKeyspace (static final fields are ok) + * as that triggers initialization of the class, which fails in client mode. */ - private static Map<String, CFMetaData> fetchTablesMetadata(String keyspace, Session session) + private static Map<String, CFMetaData> fetchTablesMetadata(String keyspace, Session session, IPartitioner partitioner) { Map<String, CFMetaData> tables = new HashMap<>(); String query = String.format("SELECT * FROM %s.%s WHERE keyspace_name = ?", SchemaKeyspace.NAME, SchemaKeyspace.TABLES); @@ -112,7 +115,7 @@ public class NativeSSTableLoaderClient extends SSTableLoader.Client Set<CFMetaData.Flag> flags = row.isNull("flags") ? Collections.emptySet() - : SchemaKeyspace.flagsFromStrings(row.getSet("flags", String.class)); + : CFMetaData.flagsFromStrings(row.getSet("flags", String.class)); boolean isSuper = flags.contains(CFMetaData.Flag.SUPER); boolean isCounter = flags.contains(CFMetaData.Flag.COUNTER); @@ -137,7 +140,7 @@ public class NativeSSTableLoaderClient extends SSTableLoader.Client isCounter, isMaterializedView, defs, - DatabaseDescriptor.getPartitioner())); + partitioner)); } return tables; http://git-wip-us.apache.org/repos/asf/cassandra/blob/6aa7d6ce/test/unit/org/apache/cassandra/db/marshal/TypeParserTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/db/marshal/TypeParserTest.java b/test/unit/org/apache/cassandra/db/marshal/TypeParserTest.java index ee3052c..808a680 100644 --- a/test/unit/org/apache/cassandra/db/marshal/TypeParserTest.java +++ b/test/unit/org/apache/cassandra/db/marshal/TypeParserTest.java @@ -19,8 +19,12 @@ package org.apache.cassandra.db.marshal; import org.junit.Test; + +import static org.junit.Assert.assertSame; import static org.junit.Assert.fail; +import org.apache.cassandra.config.DatabaseDescriptor; +import org.apache.cassandra.dht.*; import org.apache.cassandra.exceptions.ConfigurationException; import org.apache.cassandra.exceptions.SyntaxException; @@ -29,7 +33,7 @@ public class TypeParserTest @Test public void testParse() throws ConfigurationException, SyntaxException { - AbstractType type; + AbstractType<?> type; type = TypeParser.parse(null); assert type == BytesType.instance; @@ -54,11 +58,11 @@ public class TypeParserTest type = TypeParser.parse("LongType(reversed=true)"); assert type == ReversedType.getInstance(LongType.instance); - assert ((ReversedType)type).baseType == LongType.instance; + assert ((ReversedType<?>)type).baseType == LongType.instance; type = TypeParser.parse("LongType(reversed)"); assert type == ReversedType.getInstance(LongType.instance); - assert ((ReversedType)type).baseType == LongType.instance; + assert ((ReversedType<?>)type).baseType == LongType.instance; } @Test @@ -80,4 +84,18 @@ public class TypeParserTest catch (ConfigurationException e) {} catch (SyntaxException e) {} } + + @Test + public void testParsePartitionerOrder() throws ConfigurationException, SyntaxException + { + for (IPartitioner partitioner: new IPartitioner[] { Murmur3Partitioner.instance, + ByteOrderedPartitioner.instance, + RandomPartitioner.instance, + OrderPreservingPartitioner.instance }) + { + AbstractType<?> type = partitioner.partitionOrdering(); + assertSame(type, TypeParser.parse(type.toString())); + } + assertSame(DatabaseDescriptor.getPartitioner().partitionOrdering(), TypeParser.parse("PartitionerDefinedOrder")); + } }
