You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2015/08/02 22:24:36 UTC

cassandra git commit: Fix dtest failures caused by CASSANDRA-8143

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 <br...@datastax.com>
Authored: Sat Aug 1 18:17:11 2015 +0300
Committer: Aleksey Yeschenko <al...@apache.org>
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"));
+    }
 }