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);