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