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