Author: jbellis
Date: Tue Mar 15 16:25:41 2011
New Revision: 1081838
URL: http://svn.apache.org/viewvc?rev=1081838&view=rev
Log:
validate index names
patch by jhermes and jbellis for CASSANDRA-1761
Modified:
cassandra/branches/cassandra-0.7/CHANGES.txt
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/CassandraServer.java
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/ThriftValidation.java
cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py
Modified: cassandra/branches/cassandra-0.7/CHANGES.txt
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/CHANGES.txt?rev=1081838&r1=1081837&r2=1081838&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.7/CHANGES.txt Tue Mar 15 16:25:41 2011
@@ -2,6 +2,7 @@
* Avoid seeking when sstable2json exports the entire file (CASSANDRA-2318)
* fix tombstone handling in repair and sstable2json (CASSANDRA-2279)
* clear Built flag in system table when dropping an index (CASSANDRA-2320)
+ * validate index names (CASSANDRA-1761)
0.7.4
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/CassandraServer.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/CassandraServer.java?rev=1081838&r1=1081837&r2=1081838&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/CassandraServer.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/CassandraServer.java
Tue Mar 15 16:25:41 2011
@@ -627,7 +627,7 @@ public class CassandraServer implements
// helper method to apply migration on the migration stage. typical
migration failures will throw an
// InvalidRequestException. atypical failures will throw a
RuntimeException.
- private static void applyMigrationOnStage(final Migration m) throws
InvalidRequestException
+ private static void applyMigrationOnStage(final Migration m)
{
Future f = StageManager.getStage(Stage.MIGRATION).submit(new Callable()
{
@@ -644,23 +644,11 @@ public class CassandraServer implements
}
catch (InterruptedException e)
{
- throw new RuntimeException(e);
+ throw new AssertionError(e);
}
catch (ExecutionException e)
{
- // this means call() threw an exception. deal with it directly.
- if (e.getCause() != null)
- {
- InvalidRequestException ex = new
InvalidRequestException(e.getCause().getMessage());
- ex.initCause(e.getCause());
- throw ex;
- }
- else
- {
- InvalidRequestException ex = new
InvalidRequestException(e.getMessage());
- ex.initCause(e);
- throw ex;
- }
+ throw new RuntimeException(e);
}
}
@@ -824,6 +812,7 @@ public class CassandraServer implements
{
logger.debug("update_column_family");
state().hasColumnFamilyListAccess(Permission.WRITE);
+ ThriftValidation.validateCfDef(cf_def);
if (cf_def.keyspace == null || cf_def.name == null)
throw new InvalidRequestException("Keyspace and CF name must be
set.");
CFMetaData oldCfm =
DatabaseDescriptor.getCFMetaData(CFMetaData.getId(cf_def.keyspace,
cf_def.name));
Modified:
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/ThriftValidation.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=1081838&r1=1081837&r2=1081838&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/ThriftValidation.java
(original)
+++
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/thrift/ThriftValidation.java
Tue Mar 15 16:25:41 2011
@@ -21,15 +21,15 @@ package org.apache.cassandra.thrift;
*/
import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Set;
+import java.util.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.apache.cassandra.config.CFMetaData;
import org.apache.cassandra.config.ConfigurationException;
import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.ColumnDefinition;
import org.apache.cassandra.db.*;
import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.db.marshal.MarshalException;
@@ -422,8 +422,16 @@ public class ThriftValidation
AbstractType comparator = cfType == ColumnFamilyType.Standard
?
DatabaseDescriptor.getComparator(cf_def.comparator_type)
:
DatabaseDescriptor.getComparator(cf_def.subcomparator_type);
+
+ Set<String> indexNames = new HashSet<String>();
for (ColumnDef c : cf_def.column_metadata)
{
+ // Ensure that given idx_names and auto_generated idx_names
cannot collide
+ String idxName = CFMetaData.indexName(cf_def.name,
ColumnDefinition.fromColumnDef(c));
+ if (indexNames.contains(idxName))
+ throw new InvalidRequestException("Duplicate index names "
+ idxName);
+ indexNames.add(idxName);
+
DatabaseDescriptor.getComparator(c.validation_class);
try
Modified: cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py?rev=1081838&r1=1081837&r2=1081838&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py
(original)
+++ cassandra/branches/cassandra-0.7/test/system/test_thrift_server.py Tue Mar
15 16:25:41 2011
@@ -548,6 +548,15 @@ class TestMutations(ThriftTester):
_assert_columnpath_exists(key, ColumnPath('Super1',
super_column='sc1', column=c))
_assert_columnpath_exists(key, ColumnPath('Super2',
super_column='sc1', column=c))
+ def test_bad_system_calls(self):
+ def duplicate_index_names():
+ _set_keyspace('Keyspace1')
+ cd1 = ColumnDef('foo', 'BytesType', IndexType.KEYS, 'i')
+ cd2 = ColumnDef('bar', 'BytesType', IndexType.KEYS, 'i')
+ cf = CfDef('Keyspace1', 'BadCF', column_metadata=[cd1, cd2])
+ client.system_add_column_family(cf)
+ _expect_exception(duplicate_index_names, InvalidRequestException)
+
def test_bad_batch_calls(self):
# mutate_does_not_accept_cosc_and_deletion_in_same_mutation
def too_full():