You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2011/10/18 16:07:26 UTC

svn commit: r1185669 - in /cassandra/trunk: ./ src/java/org/apache/cassandra/cql/ src/java/org/apache/cassandra/thrift/

Author: jbellis
Date: Tue Oct 18 14:07:26 2011
New Revision: 1185669

URL: http://svn.apache.org/viewvc?rev=1185669&view=rev
Log:
EACH_QUORUM is only supported for writes
patch by jbellis; reviewed by slebresne for CASSANDRA-3272

Added:
    cassandra/trunk/src/java/org/apache/cassandra/thrift/RequestType.java
Modified:
    cassandra/trunk/CHANGES.txt
    cassandra/trunk/NEWS.txt
    cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
    cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
    cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java

Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1185669&r1=1185668&r2=1185669&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Tue Oct 18 14:07:26 2011
@@ -1,5 +1,6 @@
 1.1-dev
  * off-heap cache to use sun.misc.Unsafe instead of JNA (CASSANDRA-3271)
+ * EACH_QUORUM is only supported for writes (CASSANDRA-3272)
 
 
 1.0.1

Modified: cassandra/trunk/NEWS.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/NEWS.txt?rev=1185669&r1=1185668&r2=1185669&view=diff
==============================================================================
--- cassandra/trunk/NEWS.txt (original)
+++ cassandra/trunk/NEWS.txt Tue Oct 18 14:07:26 2011
@@ -1,3 +1,13 @@
+1.1
+===
+
+Upgrading
+---------
+    - EACH_QUORUM ConsistencyLevel is only supported for writes and will now
+      throw an InvalidRequestException when used for reads.  (Previous
+      versions would silently perform a LOCAL_QUORUM read instead.)
+
+
 1.0
 ===
 

Modified: cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java?rev=1185669&r1=1185668&r2=1185669&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java Tue Oct 18 14:07:26 2011
@@ -323,6 +323,8 @@ public class QueryProcessor
     /* Test for SELECT-specific taboos */
     private static void validateSelect(String keyspace, SelectStatement select) throws InvalidRequestException
     {
+        ThriftValidation.validateConsistencyLevel(keyspace, select.getConsistencyLevel(), RequestType.READ);
+
         // Finish key w/o start key (KEY < foo)
         if (!select.isKeyRange() && (select.getKeyFinish() != null))
             throw new InvalidRequestException("Key range clauses must include a start key (i.e. KEY > term)");
@@ -650,12 +652,14 @@ public class QueryProcessor
             case INSERT: // insert uses UpdateStatement
             case UPDATE:
                 UpdateStatement update = (UpdateStatement)statement.statement;
+                ThriftValidation.validateConsistencyLevel(keyspace, update.getConsistencyLevel(), RequestType.WRITE);
                 batchUpdate(clientState, Collections.singletonList(update), update.getConsistencyLevel());
                 result.type = CqlResultType.VOID;
                 return result;
                 
             case BATCH:
                 BatchStatement batch = (BatchStatement) statement.statement;
+                ThriftValidation.validateConsistencyLevel(keyspace, batch.getConsistencyLevel(), RequestType.WRITE);
 
                 if (batch.getTimeToLive() != 0)
                     throw new InvalidRequestException("Global TTL on the BATCH statement is not supported.");

Modified: cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java?rev=1185669&r1=1185668&r2=1185669&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java Tue Oct 18 14:07:26 2011
@@ -346,7 +346,7 @@ public class CassandraServer implements 
         CFMetaData metadata = ThriftValidation.validateColumnFamily(keyspace, column_parent.column_family);
         ThriftValidation.validateColumnParent(metadata, column_parent);
         ThriftValidation.validatePredicate(metadata, column_parent, predicate);
-        ThriftValidation.validateConsistencyLevel(keyspace, consistency_level);
+        ThriftValidation.validateConsistencyLevel(keyspace, consistency_level, RequestType.READ);
 
         List<ReadCommand> commands = new ArrayList<ReadCommand>();
         if (predicate.column_names != null)
@@ -378,7 +378,7 @@ public class CassandraServer implements 
 
         CFMetaData metadata = ThriftValidation.validateColumnFamily(keyspace, column_path.column_family);
         ThriftValidation.validateColumnPath(metadata, column_path);
-        ThriftValidation.validateConsistencyLevel(keyspace, consistency_level);
+        ThriftValidation.validateConsistencyLevel(keyspace, consistency_level, RequestType.READ);
 
         QueryPath path = new QueryPath(column_path.column_family, column_path.column == null ? null : column_path.super_column);
         List<ByteBuffer> nameAsList = Arrays.asList(column_path.column == null ? column_path.super_column : column_path.column);
@@ -630,7 +630,7 @@ public class CassandraServer implements 
 
     private void doInsert(ConsistencyLevel consistency_level, List<? extends IMutation> mutations) throws UnavailableException, TimedOutException, InvalidRequestException
     {
-        ThriftValidation.validateConsistencyLevel(state().getKeyspace(), consistency_level);
+        ThriftValidation.validateConsistencyLevel(state().getKeyspace(), consistency_level, RequestType.WRITE);
         if (mutations.isEmpty())
             return;
         try
@@ -674,7 +674,7 @@ public class CassandraServer implements 
         ThriftValidation.validateColumnParent(metadata, column_parent);
         ThriftValidation.validatePredicate(metadata, column_parent, predicate);
         ThriftValidation.validateKeyRange(range);
-        ThriftValidation.validateConsistencyLevel(keyspace, consistency_level);
+        ThriftValidation.validateConsistencyLevel(keyspace, consistency_level, RequestType.READ);
 
         List<Row> rows;
         try
@@ -738,7 +738,7 @@ public class CassandraServer implements 
         ThriftValidation.validateColumnParent(metadata, column_parent);
         ThriftValidation.validatePredicate(metadata, column_parent, column_predicate);
         ThriftValidation.validateIndexClauses(metadata, index_clause);
-        ThriftValidation.validateConsistencyLevel(keyspace, consistency_level);
+        ThriftValidation.validateConsistencyLevel(keyspace, consistency_level, RequestType.READ);
 
         List<Row> rows;
         try

Added: cassandra/trunk/src/java/org/apache/cassandra/thrift/RequestType.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/RequestType.java?rev=1185669&view=auto
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/RequestType.java (added)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/RequestType.java Tue Oct 18 14:07:26 2011
@@ -0,0 +1,7 @@
+package org.apache.cassandra.thrift;
+
+public enum RequestType
+{
+    READ,
+    WRITE
+}

Modified: cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=1185669&r1=1185668&r2=1185669&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java Tue Oct 18 14:07:26 2011
@@ -87,18 +87,29 @@ public class ThriftValidation
     }
 
     // Don't check that the table exists, validateTable or validateColumnFamily must be called beforehand.
-    public static void validateConsistencyLevel(String table, ConsistencyLevel cl) throws InvalidRequestException
+    public static void validateConsistencyLevel(String table, ConsistencyLevel cl, RequestType requestType) throws InvalidRequestException
     {
         switch (cl)
         {
             case LOCAL_QUORUM:
+                requireNetworkTopologyStrategy(table, cl);
+                break;
             case EACH_QUORUM:
-                AbstractReplicationStrategy strategy = Table.open(table).getReplicationStrategy();
-                if (!(strategy instanceof NetworkTopologyStrategy))
-                    throw new InvalidRequestException("consistency level " + cl + " not compatible with replication strategy (" + strategy.getClass().getName() + ")");
+                requireNetworkTopologyStrategy(table, cl);
+                if (requestType == RequestType.READ)
+                    throw new InvalidRequestException("EACH_QUORUM ConsistencyLevel is only supported for writes");
+                break;
         }
     }
 
+    private static void requireNetworkTopologyStrategy(String table, ConsistencyLevel cl) throws InvalidRequestException
+    {
+        AbstractReplicationStrategy strategy = Table.open(table).getReplicationStrategy();
+        if (!(strategy instanceof NetworkTopologyStrategy))
+            throw new InvalidRequestException(String.format("consistency level %s not compatible with replication strategy (%s)",
+                                                            cl, strategy.getClass().getName()));
+    }
+
     public static CFMetaData validateColumnFamily(String tablename, String cfName, boolean isCommutativeOp) throws InvalidRequestException
     {
         CFMetaData metadata = validateColumnFamily(tablename, cfName);