Author: jbellis
Date: Tue Mar 29 20:39:37 2011
New Revision: 1086729
URL: http://svn.apache.org/viewvc?rev=1086729&view=rev
Log:
disallow querying a counter CF with non-counter operation
patch by slebresne; reviewed by jbellis for CASSANDRA-2321
Modified:
cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
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
cassandra/trunk/test/system/test_thrift_server.py
cassandra/trunk/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java
Modified: cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java?rev=1086729&r1=1086728&r2=1086729&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java Tue
Mar 29 20:39:37 2011
@@ -468,6 +468,11 @@ public final class CFMetaData
{
return Collections.unmodifiableMap(column_metadata);
}
+
+ public AbstractType getComparatorFor(ByteBuffer superColumnName)
+ {
+ return superColumnName == null ? comparator : subcolumnComparator;
+ }
public boolean equals(Object obj)
{
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=1086729&r1=1086728&r2=1086729&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cql/QueryProcessor.java Tue
Mar 29 20:39:37 2011
@@ -236,7 +236,7 @@ public class QueryProcessor
// FIXME: keys as ascii is not a Real Solution
ByteBuffer key = update.getKey().getByteBuffer(AsciiType.instance);
validateKey(key);
- validateColumnFamily(keyspace, cfname);
+ validateColumnFamily(keyspace, update.getColumnFamily(), false);
validateKeyType(key, keyspace, cfname);
AbstractType<?> comparator = update.getComparator(keyspace);
@@ -460,7 +460,7 @@ public class QueryProcessor
case SELECT:
SelectStatement select = (SelectStatement)statement.statement;
clientState.hasColumnFamilyAccess(select.getColumnFamily(),
Permission.READ);
- validateColumnFamily(keyspace, select.getColumnFamily());
+ validateColumnFamily(keyspace, select.getColumnFamily(),
false);
validateSelect(keyspace, select);
List<org.apache.cassandra.db.Row> rows = null;
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=1086729&r1=1086728&r2=1086729&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
Tue Mar 29 20:39:37 2011
@@ -241,7 +241,7 @@ public class CassandraServer implements
logger.debug("get_slice");
state().hasColumnFamilyAccess(column_parent.column_family,
Permission.READ);
- return multigetSliceInternal(state().getKeyspace(),
Collections.singletonList(key), column_parent, predicate,
consistency_level).get(key);
+ return multigetSliceInternal(state().getKeyspace(),
Collections.singletonList(key), column_parent, predicate, consistency_level,
false).get(key);
}
public Map<ByteBuffer, List<ColumnOrSuperColumn>>
multiget_slice(List<ByteBuffer> keys, ColumnParent column_parent,
SlicePredicate predicate, ConsistencyLevel consistency_level)
@@ -250,14 +250,15 @@ public class CassandraServer implements
logger.debug("multiget_slice");
state().hasColumnFamilyAccess(column_parent.column_family,
Permission.READ);
- return multigetSliceInternal(state().getKeyspace(), keys,
column_parent, predicate, consistency_level);
+ return multigetSliceInternal(state().getKeyspace(), keys,
column_parent, predicate, consistency_level, false);
}
- private Map<ByteBuffer, List<ColumnOrSuperColumn>>
multigetSliceInternal(String keyspace, List<ByteBuffer> keys, ColumnParent
column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level)
+ private Map<ByteBuffer, List<ColumnOrSuperColumn>>
multigetSliceInternal(String keyspace, List<ByteBuffer> keys, ColumnParent
column_parent, SlicePredicate predicate, ConsistencyLevel consistency_level,
boolean isCommutativeOp)
throws InvalidRequestException, UnavailableException, TimedOutException
{
- ThriftValidation.validateColumnParent(keyspace, column_parent);
- ThriftValidation.validatePredicate(keyspace, column_parent, predicate);
+ CFMetaData metadata = ThriftValidation.validateColumnFamily(keyspace,
column_parent.column_family, isCommutativeOp);
+ ThriftValidation.validateColumnParent(metadata, column_parent);
+ ThriftValidation.validatePredicate(metadata, column_parent, predicate);
List<ReadCommand> commands = new ArrayList<ReadCommand>();
if (predicate.column_names != null)
@@ -281,13 +282,14 @@ public class CassandraServer implements
return getSlice(commands, consistency_level);
}
- private ColumnOrSuperColumn internal_get(ByteBuffer key, ColumnPath
column_path, ConsistencyLevel consistency_level)
+ private ColumnOrSuperColumn internal_get(ByteBuffer key, ColumnPath
column_path, ConsistencyLevel consistency_level, boolean isCommutativeOp)
throws InvalidRequestException, NotFoundException, UnavailableException,
TimedOutException
{
state().hasColumnFamilyAccess(column_path.column_family,
Permission.READ);
String keyspace = state().getKeyspace();
- ThriftValidation.validateColumnPath(keyspace, column_path);
+ CFMetaData metadata = ThriftValidation.validateColumnFamily(keyspace,
column_path.column_family, isCommutativeOp);
+ ThriftValidation.validateColumnPath(metadata, column_path);
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);
@@ -312,7 +314,7 @@ public class CassandraServer implements
{
logger.debug("get");
- return internal_get(key, column_path, consistency_level);
+ return internal_get(key, column_path, consistency_level, false);
}
public int get_count(ByteBuffer key, ColumnParent column_parent,
SlicePredicate predicate, ConsistencyLevel consistency_level)
@@ -334,7 +336,7 @@ public class CassandraServer implements
String keyspace = state().getKeyspace();
Map<ByteBuffer, Integer> counts = new HashMap<ByteBuffer, Integer>();
- Map<ByteBuffer, List<ColumnOrSuperColumn>> columnFamiliesMap =
multigetSliceInternal(keyspace, keys, column_parent, predicate,
consistency_level);
+ Map<ByteBuffer, List<ColumnOrSuperColumn>> columnFamiliesMap =
multigetSliceInternal(keyspace, keys, column_parent, predicate,
consistency_level, false);
for (Map.Entry<ByteBuffer, List<ColumnOrSuperColumn>> cf :
columnFamiliesMap.entrySet()) {
counts.put(cf.getKey(), cf.getValue().size());
@@ -342,16 +344,18 @@ public class CassandraServer implements
return counts;
}
- private void internal_insert(ByteBuffer key, ColumnParent column_parent,
Column column, ConsistencyLevel consistency_level)
+ private void internal_insert(ByteBuffer key, ColumnParent column_parent,
Column column, ConsistencyLevel consistency_level, boolean isCommutativeOp)
throws InvalidRequestException, UnavailableException, TimedOutException
{
state().hasColumnFamilyAccess(column_parent.column_family,
Permission.WRITE);
ThriftValidation.validateKey(key);
- ThriftValidation.validateColumnParent(state().getKeyspace(),
column_parent);
+ CFMetaData metadata =
ThriftValidation.validateColumnFamily(state().getKeyspace(),
column_parent.column_family, isCommutativeOp);
+ if (isCommutativeOp)
+ ThriftValidation.validateCommutativeForWrite(metadata,
consistency_level);
ThriftValidation.validateKeyType(key, state().getKeyspace(),
column_parent.column_family);
- ThriftValidation.validateColumnNames(state().getKeyspace(),
column_parent, Arrays.asList(column.name));
- ThriftValidation.validateColumnData(state().getKeyspace(),
column_parent.column_family, column);
+ ThriftValidation.validateColumnNames(metadata, column_parent,
Arrays.asList(column.name));
+ ThriftValidation.validateColumnData(metadata, column);
RowMutation rm = new RowMutation(state().getKeyspace(), key);
try
@@ -370,10 +374,10 @@ public class CassandraServer implements
{
logger.debug("insert");
- internal_insert(key, column_parent, column, consistency_level);
+ internal_insert(key, column_parent, column, consistency_level, false);
}
- private void
internal_batch_mutate(Map<ByteBuffer,Map<String,List<Mutation>>> mutation_map,
ConsistencyLevel consistency_level)
+ private void
internal_batch_mutate(Map<ByteBuffer,Map<String,List<Mutation>>> mutation_map,
ConsistencyLevel consistency_level, boolean isCommutativeOp)
throws InvalidRequestException, UnavailableException, TimedOutException
{
List<String> cfamsSeen = new ArrayList<String>();
@@ -397,9 +401,13 @@ public class CassandraServer implements
cfamsSeen.add(cfName);
}
+ CFMetaData metadata =
ThriftValidation.validateColumnFamily(state().getKeyspace(), cfName,
isCommutativeOp);
+ if (isCommutativeOp)
+ ThriftValidation.validateCommutativeForWrite(metadata,
consistency_level);
+
for (Mutation mutation : columnFamilyMutations.getValue())
{
- ThriftValidation.validateMutation(state().getKeyspace(),
cfName, mutation);
+ ThriftValidation.validateMutation(metadata, mutation);
}
}
RowMutation rm =
RowMutation.getRowMutationFromMutations(state().getKeyspace(), key,
columnFamilyToMutations);
@@ -415,16 +423,18 @@ public class CassandraServer implements
{
logger.debug("batch_mutate");
- internal_batch_mutate(mutation_map, consistency_level);
+ internal_batch_mutate(mutation_map, consistency_level, false);
}
- private void internal_remove(ByteBuffer key, ColumnPath column_path, long
timestamp, ConsistencyLevel consistency_level)
+ private void internal_remove(ByteBuffer key, ColumnPath column_path, long
timestamp, ConsistencyLevel consistency_level, boolean isCommutativeOp)
throws InvalidRequestException, UnavailableException, TimedOutException
{
state().hasColumnFamilyAccess(column_path.column_family,
Permission.WRITE);
ThriftValidation.validateKey(key);
- ThriftValidation.validateColumnPathOrParent(state().getKeyspace(),
column_path);
+ CFMetaData metadata =
ThriftValidation.validateColumnFamily(state().getKeyspace(),
column_path.column_family, isCommutativeOp);
+ if (isCommutativeOp)
+ ThriftValidation.validateCommutativeForWrite(metadata,
consistency_level);
ThriftValidation.validateKeyType(key, state().getKeyspace(),
column_path.column_family);
RowMutation rm = new RowMutation(state().getKeyspace(), key);
@@ -438,7 +448,7 @@ public class CassandraServer implements
{
logger.debug("remove");
- internal_remove(key, column_path, timestamp, consistency_level);
+ internal_remove(key, column_path, timestamp, consistency_level, false);
}
private void doInsert(ConsistencyLevel consistency_level,
List<RowMutation> mutations) throws UnavailableException, TimedOutException
@@ -503,8 +513,9 @@ public class CassandraServer implements
String keyspace = state().getKeyspace();
state().hasColumnFamilyAccess(column_parent.column_family,
Permission.READ);
- ThriftValidation.validateColumnParent(keyspace, column_parent);
- ThriftValidation.validatePredicate(keyspace, column_parent, predicate);
+ CFMetaData metadata = ThriftValidation.validateColumnFamily(keyspace,
column_parent.column_family, false);
+ ThriftValidation.validateColumnParent(metadata, column_parent);
+ ThriftValidation.validatePredicate(metadata, column_parent, predicate);
ThriftValidation.validateKeyRange(range);
List<Row> rows;
@@ -566,9 +577,10 @@ public class CassandraServer implements
state().hasColumnFamilyAccess(column_parent.column_family,
Permission.READ);
String keyspace = state().getKeyspace();
- ThriftValidation.validateColumnParent(keyspace, column_parent);
- ThriftValidation.validatePredicate(keyspace, column_parent,
column_predicate);
- ThriftValidation.validateIndexClauses(keyspace,
column_parent.column_family, index_clause);
+ CFMetaData metadata = ThriftValidation.validateColumnFamily(keyspace,
column_parent.column_family, false);
+ ThriftValidation.validateColumnParent(metadata, column_parent);
+ ThriftValidation.validatePredicate(metadata, column_parent,
column_predicate);
+ ThriftValidation.validateIndexClauses(metadata, index_clause);
List<Row> rows;
try
@@ -998,10 +1010,7 @@ public class CassandraServer implements
{
logger.debug("add");
- String keyspace = state().getKeyspace();
- ThriftValidation.validateCommutativeForWrite(keyspace,
column_parent.column_family, consistency_level);
-
- internal_insert(key, column_parent, getCounterColumn(column),
consistency_level);
+ internal_insert(key, column_parent, getCounterColumn(column),
consistency_level, true);
}
private Mutation getMutation(CounterMutation counterMutation)
@@ -1059,8 +1068,6 @@ public class CassandraServer implements
for (Entry<String, List<CounterMutation>> innerEntry :
entry.getValue().entrySet())
{
- ThriftValidation.validateCommutativeForWrite(keyspace,
innerEntry.getKey(), consistency_level);
-
List<Mutation> mutations = new
ArrayList<Mutation>(innerEntry.getValue().size());
for (CounterMutation cm : innerEntry.getValue())
{
@@ -1072,7 +1079,7 @@ public class CassandraServer implements
mutation_map.put(entry.getKey(), valueMap);
}
- internal_batch_mutate(mutation_map, consistency_level);
+ internal_batch_mutate(mutation_map, consistency_level, true);
}
private Counter getCounter(ColumnOrSuperColumn cosc)
@@ -1096,9 +1103,8 @@ public class CassandraServer implements
logger.debug("get_counter");
String keyspace = state().getKeyspace();
- ThriftValidation.validateCommutative(keyspace, path.column_family);
- return getCounter(internal_get(key, path, consistency_level));
+ return getCounter(internal_get(key, path, consistency_level, true));
}
private List<Counter> getCounters(List<ColumnOrSuperColumn> cosc)
@@ -1121,11 +1127,8 @@ public class CassandraServer implements
if (logger.isDebugEnabled())
logger.debug("get_counter_slice");
- String keyspace = state().getKeyspace();
- ThriftValidation.validateCommutative(keyspace,
column_parent.column_family);
-
state().hasColumnFamilyAccess(column_parent.column_family,
Permission.READ);
- List<ColumnOrSuperColumn> cosc =
multigetSliceInternal(state().getKeyspace(), Collections.singletonList(key),
column_parent, predicate, consistency_level).get(key);
+ List<ColumnOrSuperColumn> cosc =
multigetSliceInternal(state().getKeyspace(), Collections.singletonList(key),
column_parent, predicate, consistency_level, true).get(key);
return getCounters(cosc);
}
@@ -1136,11 +1139,8 @@ public class CassandraServer implements
if (logger.isDebugEnabled())
logger.debug("multiget_counter_slice");
- String keyspace = state().getKeyspace();
- ThriftValidation.validateCommutative(keyspace,
column_parent.column_family);
-
state().hasColumnFamilyAccess(column_parent.column_family,
Permission.READ);
- Map<ByteBuffer, List<ColumnOrSuperColumn>> slices =
multigetSliceInternal(state().getKeyspace(), keys, column_parent, predicate,
consistency_level);
+ Map<ByteBuffer, List<ColumnOrSuperColumn>> slices =
multigetSliceInternal(state().getKeyspace(), keys, column_parent, predicate,
consistency_level, true);
Map<ByteBuffer, List<Counter>> rv = new HashMap<ByteBuffer,
List<Counter>>(slices.size());
for (Entry<ByteBuffer, List<ColumnOrSuperColumn>> entry :
slices.entrySet())
{
@@ -1156,9 +1156,8 @@ public class CassandraServer implements
logger.debug("remove_counter");
String keyspace = state().getKeyspace();
- ThriftValidation.validateCommutative(keyspace, path.column_family);
- internal_remove(key, path, System.currentTimeMillis(),
consistency_level);
+ internal_remove(key, path, System.currentTimeMillis(),
consistency_level, true);
}
public CqlResult execute_cql_query(ByteBuffer query, Compression
compression)
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=1086729&r1=1086728&r2=1086729&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
Tue Mar 29 20:39:37 2011
@@ -82,103 +82,106 @@ public class ThriftValidation
}
}
- public static ColumnFamilyType validateColumnFamily(String tablename,
String cfName) throws InvalidRequestException
+ public static CFMetaData validateColumnFamily(String tablename, String
cfName, boolean isCommutativeOp) throws InvalidRequestException
{
+ validateTable(tablename);
if (cfName.isEmpty())
- {
throw new InvalidRequestException("non-empty columnfamily is
required");
+
+ CFMetaData metadata = DatabaseDescriptor.getCFMetaData(tablename,
cfName);
+ if (metadata == null)
+ throw new InvalidRequestException("unconfigured columnfamily " +
cfName);
+
+ if (isCommutativeOp)
+ {
+ if (!metadata.getDefaultValidator().isCommutative())
+ throw new InvalidRequestException("invalid operation for non
commutative columnfamily " + cfName);
}
- ColumnFamilyType cfType =
DatabaseDescriptor.getColumnFamilyType(tablename, cfName);
- if (cfType == null)
+ else
{
- throw new InvalidRequestException("unconfigured columnfamily " +
cfName);
+ if (metadata.getDefaultValidator().isCommutative())
+ throw new InvalidRequestException("invalid operation for
commutative columnfamily " + cfName);
}
- return cfType;
+ return metadata;
}
/**
- * validates the tablename and all parts of the path to the column,
including the column name
+ * validates all parts of the path to the column, including the column name
*/
- static void validateColumnPath(String tablename, ColumnPath column_path)
throws InvalidRequestException
+ public static void validateColumnPath(CFMetaData metadata, ColumnPath
column_path) throws InvalidRequestException
{
- validateTable(tablename);
- ColumnFamilyType cfType = validateColumnFamily(tablename,
column_path.column_family);
- if (cfType == ColumnFamilyType.Standard)
+ if (metadata.cfType == ColumnFamilyType.Standard)
{
if (column_path.super_column != null)
{
- throw new InvalidRequestException("supercolumn parameter is
invalid for standard CF " + column_path.column_family);
+ throw new InvalidRequestException("supercolumn parameter is
invalid for standard CF " + metadata.cfName);
}
if (column_path.column == null)
{
- throw new InvalidRequestException("column parameter is not
optional for standard CF " + column_path.column_family);
+ throw new InvalidRequestException("column parameter is not
optional for standard CF " + metadata.cfName);
}
}
else
{
if (column_path.super_column == null)
- throw new InvalidRequestException("supercolumn parameter is
not optional for super CF " + column_path.column_family);
+ throw new InvalidRequestException("supercolumn parameter is
not optional for super CF " + metadata.cfName);
}
if (column_path.column != null)
{
- validateColumnNames(tablename, column_path.column_family,
column_path.super_column, Arrays.asList(column_path.column));
+ validateColumnNames(metadata, column_path.super_column,
Arrays.asList(column_path.column));
}
if (column_path.super_column != null)
{
- validateColumnNames(tablename, column_path.column_family, null,
Arrays.asList(column_path.super_column));
+ validateColumnNames(metadata, (ByteBuffer)null,
Arrays.asList(column_path.super_column));
}
}
- static void validateColumnParent(String tablename, ColumnParent
column_parent) throws InvalidRequestException
+ public static void validateColumnParent(CFMetaData metadata, ColumnParent
column_parent) throws InvalidRequestException
{
- validateTable(tablename);
- ColumnFamilyType cfType = validateColumnFamily(tablename,
column_parent.column_family);
- if (cfType == ColumnFamilyType.Standard)
+ if (metadata.cfType == ColumnFamilyType.Standard)
{
if (column_parent.super_column != null)
{
- throw new InvalidRequestException("columnfamily alone is
required for standard CF " + column_parent.column_family);
+ throw new InvalidRequestException("columnfamily alone is
required for standard CF " + metadata.cfName);
}
}
if (column_parent.super_column != null)
{
- validateColumnNames(tablename, column_parent.column_family, null,
Arrays.asList(column_parent.super_column));
+ validateColumnNames(metadata, (ByteBuffer)null,
Arrays.asList(column_parent.super_column));
}
}
// column_path_or_parent is a ColumnPath for remove, where the "column" is
optional even for a standard CF
- static void validateColumnPathOrParent(String tablename, ColumnPath
column_path_or_parent) throws InvalidRequestException
+ static void validateColumnPathOrParent(CFMetaData metadata, ColumnPath
column_path_or_parent) throws InvalidRequestException
{
- validateTable(tablename);
- ColumnFamilyType cfType = validateColumnFamily(tablename,
column_path_or_parent.column_family);
- if (cfType == ColumnFamilyType.Standard)
+ if (metadata.cfType == ColumnFamilyType.Standard)
{
if (column_path_or_parent.super_column != null)
{
- throw new InvalidRequestException("supercolumn may not be
specified for standard CF " + column_path_or_parent.column_family);
+ throw new InvalidRequestException("supercolumn may not be
specified for standard CF " + metadata.cfName);
}
}
- if (cfType == ColumnFamilyType.Super)
+ if (metadata.cfType == ColumnFamilyType.Super)
{
if (column_path_or_parent.super_column == null &&
column_path_or_parent.column != null)
{
- throw new InvalidRequestException("A column cannot be
specified without specifying a super column for removal on super CF " +
column_path_or_parent.column_family);
+ throw new InvalidRequestException("A column cannot be
specified without specifying a super column for removal on super CF " +
metadata.cfName);
}
}
if (column_path_or_parent.column != null)
{
- validateColumnNames(tablename,
column_path_or_parent.column_family, column_path_or_parent.super_column,
Arrays.asList(column_path_or_parent.column));
+ validateColumnNames(metadata, column_path_or_parent.super_column,
Arrays.asList(column_path_or_parent.column));
}
if (column_path_or_parent.super_column != null)
{
- validateColumnNames(tablename,
column_path_or_parent.column_family, null,
Arrays.asList(column_path_or_parent.super_column));
+ validateColumnNames(metadata, (ByteBuffer)null,
Arrays.asList(column_path_or_parent.super_column));
}
}
/**
* Validates the column names but not the parent path or data
*/
- private static void validateColumnNames(String keyspace, String
columnFamilyName, ByteBuffer superColumnName, Iterable<ByteBuffer> column_names)
+ private static void validateColumnNames(CFMetaData metadata, ByteBuffer
superColumnName, Iterable<ByteBuffer> column_names)
throws InvalidRequestException
{
if (superColumnName != null)
@@ -187,10 +190,10 @@ public class ThriftValidation
throw new InvalidRequestException("supercolumn name length
must not be greater than " + IColumn.MAX_NAME_LENGTH);
if (superColumnName.remaining() == 0)
throw new InvalidRequestException("supercolumn name must not
be empty");
- if (DatabaseDescriptor.getColumnFamilyType(keyspace,
columnFamilyName) == ColumnFamilyType.Standard)
- throw new InvalidRequestException("supercolumn specified to
ColumnFamily " + columnFamilyName + " containing normal columns");
+ if (metadata.cfType == ColumnFamilyType.Standard)
+ throw new InvalidRequestException("supercolumn specified to
ColumnFamily " + metadata.cfName + " containing normal columns");
}
- AbstractType comparator = ColumnFamily.getComparatorFor(keyspace,
columnFamilyName, superColumnName);
+ AbstractType comparator = metadata.getComparatorFor(superColumnName);
for (ByteBuffer name : column_names)
{
if (name.remaining() > IColumn.MAX_NAME_LENGTH)
@@ -208,14 +211,14 @@ public class ThriftValidation
}
}
- public static void validateColumnNames(String keyspace, ColumnParent
column_parent, Iterable<ByteBuffer> column_names) throws InvalidRequestException
+ public static void validateColumnNames(CFMetaData metadata, ColumnParent
column_parent, Iterable<ByteBuffer> column_names) throws InvalidRequestException
{
- validateColumnNames(keyspace, column_parent.column_family,
column_parent.super_column, column_names);
+ validateColumnNames(metadata, column_parent.super_column,
column_names);
}
- public static void validateRange(String keyspace, ColumnParent
column_parent, SliceRange range) throws InvalidRequestException
+ public static void validateRange(CFMetaData metadata, ColumnParent
column_parent, SliceRange range) throws InvalidRequestException
{
- AbstractType comparator = ColumnFamily.getComparatorFor(keyspace,
column_parent.column_family, column_parent.super_column);
+ AbstractType comparator =
metadata.getComparatorFor(column_parent.super_column);
try
{
comparator.validate(range.start);
@@ -238,23 +241,22 @@ public class ThriftValidation
}
}
- public static void validateColumnOrSuperColumn(String keyspace, String
cfName, ColumnOrSuperColumn cosc)
+ public static void validateColumnOrSuperColumn(CFMetaData metadata,
ColumnOrSuperColumn cosc)
throws InvalidRequestException
{
if (cosc.column != null)
{
validateTtl(cosc.column);
- ThriftValidation.validateColumnPath(keyspace, new
ColumnPath(cfName).setSuper_column((ByteBuffer)null).setColumn(cosc.column.name));
- validateColumnData(keyspace, cfName, cosc.column);
+ validateColumnPath(metadata, new
ColumnPath(metadata.cfName).setSuper_column((ByteBuffer)null).setColumn(cosc.column.name));
+ validateColumnData(metadata, cosc.column);
}
if (cosc.super_column != null)
{
- ColumnParent cp = new
ColumnParent(cfName).setSuper_column(cosc.super_column.name);
for (Column c : cosc.super_column.columns)
{
- ThriftValidation.validateColumnPath(keyspace, new
ColumnPath(cfName).setSuper_column(cosc.super_column.name).setColumn(c.name));
- validateColumnData(keyspace, cp.column_family, c);
+ validateColumnPath(metadata, new
ColumnPath(metadata.cfName).setSuper_column(cosc.super_column.name).setColumn(c.name));
+ validateColumnData(metadata, c);
}
}
@@ -272,7 +274,7 @@ public class ThriftValidation
assert column.isSetTtl() || column.ttl == 0;
}
- public static void validateMutation(String keyspace, String cfName,
Mutation mut)
+ public static void validateMutation(CFMetaData metadata, Mutation mut)
throws InvalidRequestException
{
ColumnOrSuperColumn cosc = mut.column_or_supercolumn;
@@ -283,11 +285,11 @@ public class ThriftValidation
if (cosc != null)
{
- validateColumnOrSuperColumn(keyspace, cfName, cosc);
+ validateColumnOrSuperColumn(metadata, cosc);
}
else if (del != null)
{
- validateDeletion(keyspace, cfName, del);
+ validateDeletion(metadata, del);
}
else
{
@@ -295,59 +297,58 @@ public class ThriftValidation
}
}
- public static void validateDeletion(String keyspace, String cfName,
Deletion del) throws InvalidRequestException
+ public static void validateDeletion(CFMetaData metadata, Deletion del)
throws InvalidRequestException
{
- validateColumnFamily(keyspace, cfName);
if (del.predicate != null)
{
- validateSlicePredicate(keyspace, cfName, del.super_column,
del.predicate);
+ validateSlicePredicate(metadata, del.super_column, del.predicate);
if (del.predicate.slice_range != null)
throw new InvalidRequestException("Deletion does not yet
support SliceRange predicates.");
}
- if (ColumnFamilyType.Standard ==
DatabaseDescriptor.getColumnFamilyType(keyspace, cfName) && del.super_column !=
null)
+ if (metadata.cfType == ColumnFamilyType.Standard && del.super_column
!= null)
{
- String msg = String.format("deletion of super_column is not
possible on a standard ColumnFamily (KeySpace=%s ColumnFamily=%s Deletion=%s)",
keyspace, cfName, del);
+ String msg = String.format("deletion of super_column is not
possible on a standard ColumnFamily (KeySpace=%s ColumnFamily=%s Deletion=%s)",
metadata.ksName, metadata.cfName, del);
throw new InvalidRequestException(msg);
}
}
- public static void validateSlicePredicate(String keyspace, String cfName,
ByteBuffer scName, SlicePredicate predicate) throws InvalidRequestException
+ public static void validateSlicePredicate(CFMetaData metadata, ByteBuffer
scName, SlicePredicate predicate) throws InvalidRequestException
{
if (predicate.column_names == null && predicate.slice_range == null)
throw new InvalidRequestException("A SlicePredicate must be given
a list of Columns, a SliceRange, or both");
if (predicate.slice_range != null)
- validateRange(keyspace, new
ColumnParent(cfName).setSuper_column(scName), predicate.slice_range);
+ validateRange(metadata, new
ColumnParent(metadata.cfName).setSuper_column(scName), predicate.slice_range);
if (predicate.column_names != null)
- validateColumnNames(keyspace, cfName, scName,
predicate.column_names);
+ validateColumnNames(metadata, scName, predicate.column_names);
}
/**
* Validates the data part of the column (everything in the Column object
but the name)
*/
- public static void validateColumnData(String keyspace, String
column_family, Column column) throws InvalidRequestException
+ public static void validateColumnData(CFMetaData metadata, Column column)
throws InvalidRequestException
{
validateTtl(column);
try
{
- AbstractType validator =
DatabaseDescriptor.getValueValidator(keyspace, column_family, column.name);
+ AbstractType validator = metadata.getValueValidator(column.name);
if (validator != null)
validator.validate(column.value);
}
catch (MarshalException me)
{
throw new InvalidRequestException(String.format("[%s][%s][%s] =
[%s] failed validation (%s)",
- keyspace,
- column_family,
+ metadata.ksName,
+ metadata.cfName,
ByteBufferUtil.bytesToHex(column.name),
ByteBufferUtil.bytesToHex(column.value),
me.getMessage()));
}
}
- public static void validatePredicate(String keyspace, ColumnParent
column_parent, SlicePredicate predicate)
+ public static void validatePredicate(CFMetaData metadata, ColumnParent
column_parent, SlicePredicate predicate)
throws InvalidRequestException
{
if (predicate.column_names == null && predicate.slice_range == null)
@@ -356,9 +357,9 @@ public class ThriftValidation
throw new InvalidRequestException("predicate column_names and
slice_range may not both be present");
if (predicate.getSlice_range() != null)
- validateRange(keyspace, column_parent, predicate.slice_range);
+ validateRange(metadata, column_parent, predicate.slice_range);
else
- validateColumnNames(keyspace, column_parent,
predicate.column_names);
+ validateColumnNames(metadata, column_parent,
predicate.column_names);
}
public static void validateKeyRange(KeyRange range) throws
InvalidRequestException
@@ -396,13 +397,13 @@ public class ThriftValidation
}
}
- public static void validateIndexClauses(String keyspace, String
columnFamily, IndexClause index_clause)
+ public static void validateIndexClauses(CFMetaData metadata, IndexClause
index_clause)
throws InvalidRequestException
{
if (index_clause.expressions.isEmpty())
throw new InvalidRequestException("index clause list may not be
empty");
- Set<ByteBuffer> indexedColumns =
Table.open(keyspace).getColumnFamilyStore(columnFamily).getIndexedColumns();
- AbstractType nameValidator = ColumnFamily.getComparatorFor(keyspace,
columnFamily, null);
+ Set<ByteBuffer> indexedColumns =
Table.open(metadata.ksName).getColumnFamilyStore(metadata.cfName).getIndexedColumns();
+ AbstractType nameValidator =
ColumnFamily.getComparatorFor(metadata.ksName, metadata.cfName, null);
boolean isIndexed = false;
for (IndexExpression expression : index_clause.expressions)
@@ -419,7 +420,7 @@ public class ThriftValidation
me.getMessage()));
}
- AbstractType valueValidator =
DatabaseDescriptor.getValueValidator(keyspace, columnFamily,
expression.column_name);
+ AbstractType valueValidator =
DatabaseDescriptor.getValueValidator(metadata.ksName, metadata.cfName,
expression.column_name);
try
{
valueValidator.validate(expression.value);
@@ -494,37 +495,11 @@ public class ThriftValidation
}
}
- public static CFMetaData validateCFMetaData(String tablename, String
cfName) throws InvalidRequestException
- {
- if (cfName.isEmpty())
- {
- throw new InvalidRequestException("non-empty columnfamily is
required");
- }
- CFMetaData metadata = DatabaseDescriptor.getCFMetaData(tablename,
cfName);
- if (metadata == null)
- {
- throw new InvalidRequestException("unconfigured columnfamily " +
cfName);
- }
- return metadata;
- }
-
- public static CFMetaData validateCommutative(String tablename, String
cfName) throws InvalidRequestException
- {
- validateTable(tablename);
- CFMetaData metadata = validateCFMetaData(tablename, cfName);
- if (!metadata.getDefaultValidator().isCommutative())
- {
- throw new InvalidRequestException("not commutative columnfamily "
+ cfName);
- }
- return metadata;
- }
-
- public static void validateCommutativeForWrite(String tablename, String
cfName, ConsistencyLevel consistency) throws InvalidRequestException
+ public static void validateCommutativeForWrite(CFMetaData metadata,
ConsistencyLevel consistency) throws InvalidRequestException
{
- CFMetaData metadata = validateCommutative(tablename, cfName);
if (!metadata.getReplicateOnWrite() && consistency !=
ConsistencyLevel.ONE)
{
- throw new InvalidRequestException("cannot achieve CL > CL.ONE
without replicate_on_write on columnfamily " + cfName);
+ throw new InvalidRequestException("cannot achieve CL > CL.ONE
without replicate_on_write on columnfamily " + metadata.cfName);
}
}
}
Modified: cassandra/trunk/test/system/test_thrift_server.py
URL:
http://svn.apache.org/viewvc/cassandra/trunk/test/system/test_thrift_server.py?rev=1086729&r1=1086728&r2=1086729&view=diff
==============================================================================
--- cassandra/trunk/test/system/test_thrift_server.py (original)
+++ cassandra/trunk/test/system/test_thrift_server.py Tue Mar 29 20:39:37 2011
@@ -55,6 +55,13 @@ def _assert_no_columnpath(key, column_pa
except NotFoundException:
assert True, 'column did not exist'
+def _assert_no_columnpath_counter(key, column_path):
+ try:
+ client.get_counter(key, column_path, ConsistencyLevel.ONE)
+ assert False, ('columnpath %s existed in %s when it should not' %
(column_path, key))
+ except NotFoundException:
+ assert True, 'column did not exist'
+
def _insert_simple(block=True):
return _insert_multi(['key1'])
@@ -1548,7 +1555,7 @@ class TestMutations(ThriftTester):
# remove the previous column and check that it is gone
client.remove_counter('key1', ColumnPath(column_family='Counter1',
column='c1'), ConsistencyLevel.ONE)
time.sleep(5)
- _assert_no_columnpath('key1', ColumnPath(column_family='Counter1',
column='c1'))
+ _assert_no_columnpath_counter('key1',
ColumnPath(column_family='Counter1', column='c1'))
# insert again and this time delete the whole row, check that it is
gone
client.add('key1', ColumnParent(column_family='Counter1'),
CounterColumn('c1', d1), ConsistencyLevel.ONE)
@@ -1557,7 +1564,7 @@ class TestMutations(ThriftTester):
assert rv2.column.value == d1
client.remove_counter('key1', ColumnPath(column_family='Counter1'),
ConsistencyLevel.ONE)
time.sleep(5)
- _assert_no_columnpath('key1', ColumnPath(column_family='Counter1',
column='c1'))
+ _assert_no_columnpath_counter('key1',
ColumnPath(column_family='Counter1', column='c1'))
def test_incr_super_remove(self):
_set_keyspace('Keyspace1')
@@ -1573,7 +1580,7 @@ class TestMutations(ThriftTester):
# remove the previous column and check that it is gone
client.remove_counter('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1', column='c1'),
ConsistencyLevel.ONE)
time.sleep(5)
- _assert_no_columnpath('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1', column='c1'))
+ _assert_no_columnpath_counter('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1', column='c1'))
# insert again and this time delete the whole row, check that it is
gone
client.add('key1', ColumnParent(column_family='SuperCounter1',
super_column='sc1'), CounterColumn('c1', d1), ConsistencyLevel.ONE)
@@ -1582,7 +1589,7 @@ class TestMutations(ThriftTester):
assert rv2.column.value == d1
client.remove_counter('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1'),
ConsistencyLevel.ONE)
time.sleep(5)
- _assert_no_columnpath('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1', column='c1'))
+ _assert_no_columnpath_counter('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1', column='c1'))
def test_incr_decr_standard_remove(self):
_set_keyspace('Keyspace1')
@@ -1598,7 +1605,7 @@ class TestMutations(ThriftTester):
# remove the previous column and check that it is gone
client.remove_counter('key1', ColumnPath(column_family='Counter1',
column='c1'), ConsistencyLevel.ONE)
time.sleep(5)
- _assert_no_columnpath('key1', ColumnPath(column_family='Counter1',
column='c1'))
+ _assert_no_columnpath_counter('key1',
ColumnPath(column_family='Counter1', column='c1'))
# insert again and this time delete the whole row, check that it is
gone
client.add('key1', ColumnParent(column_family='Counter1'),
CounterColumn('c1', d1), ConsistencyLevel.ONE)
@@ -1607,7 +1614,7 @@ class TestMutations(ThriftTester):
assert rv2.column.value == d1
client.remove_counter('key1', ColumnPath(column_family='Counter1'),
ConsistencyLevel.ONE)
time.sleep(5)
- _assert_no_columnpath('key1', ColumnPath(column_family='Counter1',
column='c1'))
+ _assert_no_columnpath_counter('key1',
ColumnPath(column_family='Counter1', column='c1'))
def test_incr_decr_super_remove(self):
_set_keyspace('Keyspace1')
@@ -1623,7 +1630,7 @@ class TestMutations(ThriftTester):
# remove the previous column and check that it is gone
client.remove_counter('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1', column='c1'),
ConsistencyLevel.ONE)
time.sleep(5)
- _assert_no_columnpath('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1', column='c1'))
+ _assert_no_columnpath_counter('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1', column='c1'))
# insert again and this time delete the whole row, check that it is
gone
client.add('key1', ColumnParent(column_family='SuperCounter1',
super_column='sc1'), CounterColumn('c1', d1), ConsistencyLevel.ONE)
@@ -1632,7 +1639,7 @@ class TestMutations(ThriftTester):
assert rv2.column.value == d1
client.remove_counter('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1'),
ConsistencyLevel.ONE)
time.sleep(5)
- _assert_no_columnpath('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1', column='c1'))
+ _assert_no_columnpath_counter('key1',
ColumnPath(column_family='SuperCounter1', super_column='sc1', column='c1'))
def test_incr_decr_standard_batch_add(self):
_set_keyspace('Keyspace1')
@@ -1672,7 +1679,7 @@ class TestMutations(ThriftTester):
]}}
client.batch_add(update_map, ConsistencyLevel.ONE)
time.sleep(5)
- _assert_no_columnpath('key1', ColumnPath(column_family='Counter1',
column='c1'))
+ _assert_no_columnpath_counter('key1',
ColumnPath(column_family='Counter1', column='c1'))
# insert again and this time delete the whole row, check that it is
gone
update_map = {'key1': {'Counter1': [
@@ -1689,7 +1696,7 @@ class TestMutations(ThriftTester):
]}}
client.batch_add(update_map, ConsistencyLevel.ONE)
time.sleep(5)
- _assert_no_columnpath('key1', ColumnPath(column_family='Counter1',
column='c1'))
+ _assert_no_columnpath_counter('key1',
ColumnPath(column_family='Counter1', column='c1'))
def test_incr_decr_standard_slice(self):
_set_keyspace('Keyspace1')
Modified:
cassandra/trunk/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java
URL:
http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java?rev=1086729&r1=1086728&r2=1086729&view=diff
==============================================================================
---
cassandra/trunk/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java
(original)
+++
cassandra/trunk/test/unit/org/apache/cassandra/thrift/ThriftValidationTest.java
Tue Mar 29 20:39:37 2011
@@ -30,12 +30,12 @@ public class ThriftValidationTest extend
@Test(expected=InvalidRequestException.class)
public void testValidateCommutativeWithStandard() throws
InvalidRequestException
{
- ThriftValidation.validateCommutative("Keyspace1", "Standard1");
+ ThriftValidation.validateColumnFamily("Keyspace1", "Standard1", true);
}
@Test
public void testValidateCommutativeWithCounter() throws
InvalidRequestException
{
- ThriftValidation.validateCommutative("Keyspace1", "Counter1");
+ ThriftValidation.validateColumnFamily("Keyspace1", "Counter1", true);
}
}