Detect misuses of CounterColumnType
patch by slebresne; reviewed by jbellis for CASSANDRA-3422


git-svn-id: 
https://svn.apache.org/repos/asf/cassandra/branches/cassandra-0.8@1211486 
13f79535-47bb-0310-9956-ffa450edef68


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/1f996108
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/1f996108
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/1f996108

Branch: refs/heads/trunk
Commit: 1f996108310009e6c384ed4eae0de80dc47747c4
Parents: 2ffe87e
Author: Sylvain Lebresne <[email protected]>
Authored: Wed Dec 7 16:00:25 2011 +0000
Committer: Sylvain Lebresne <[email protected]>
Committed: Wed Dec 7 16:00:25 2011 +0000

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 .../org/apache/cassandra/config/CFMetaData.java    |   29 ++++++++++++++-
 .../cassandra/cql/CreateColumnFamilyStatement.java |    3 +-
 3 files changed, 31 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/1f996108/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index c93a6de..82311a8 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -2,6 +2,7 @@
  * use cannonical host for local node in nodetool info (CASSANDRA-3556)
  * remove nonlocal DC write optimization since it only worked with
    CL.ONE or CL.LOCAL_QUORUM (CASSANDRA-3577)
+ * detect misuses of CounterColumnType (CASSANDRA-3422)
 
 
 0.8.8

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1f996108/src/java/org/apache/cassandra/config/CFMetaData.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/config/CFMetaData.java 
b/src/java/org/apache/cassandra/config/CFMetaData.java
index d10e2fd..35bbb8d 100644
--- a/src/java/org/apache/cassandra/config/CFMetaData.java
+++ b/src/java/org/apache/cassandra/config/CFMetaData.java
@@ -677,7 +677,8 @@ public final class CFMetaData
                       .replicateOnWrite(cf_def.replicate_on_write)
                       
.defaultValidator(TypeParser.parse(cf_def.default_validation_class))
                       
.keyValidator(TypeParser.parse(cf_def.key_validation_class))
-                      
.columnMetadata(ColumnDefinition.fromColumnDef(cf_def.column_metadata));
+                      
.columnMetadata(ColumnDefinition.fromColumnDef(cf_def.column_metadata))
+                      .validate();
     }
 
     // merges some final fields from this CFM with modifiable fields from 
CfDef into a new CFMetaData.
@@ -990,6 +991,32 @@ public final class CFMetaData
         return (cfName + "_" + comparator.getString(columnName) + 
"_idx").replaceAll("\\W", "");
     }
 
+    public CFMetaData validate() throws ConfigurationException
+    {
+        if (comparator instanceof CounterColumnType)
+            throw new ConfigurationException("CounterColumnType is not a valid 
comparator");
+        if (subcolumnComparator instanceof CounterColumnType)
+            throw new ConfigurationException("CounterColumnType is not a valid 
sub-column comparator");
+        if (keyValidator instanceof CounterColumnType)
+            throw new ConfigurationException("CounterColumnType is not a valid 
key validator");
+
+        // Mixing counter with non counter columns is not supported (#2614)
+        if (defaultValidator instanceof CounterColumnType)
+        {
+            for (ColumnDefinition def : column_metadata.values())
+                if (!(def.getValidator() instanceof CounterColumnType))
+                    throw new ConfigurationException("Cannot add a non counter 
column (" + comparator.getString(def.name) + ") in a counter column family");
+        }
+        else
+        {
+            for (ColumnDefinition def : column_metadata.values())
+                if (def.getValidator() instanceof CounterColumnType)
+                    throw new ConfigurationException("Cannot add a counter 
column (" + comparator.getString(def.name) + ") in a non counter column 
family");
+        }
+
+        return this;
+    }
+
     @Override
     public String toString()
     {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/1f996108/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java 
b/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
index ac4c6ec..2e451a1 100644
--- a/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
+++ b/src/java/org/apache/cassandra/cql/CreateColumnFamilyStatement.java
@@ -313,7 +313,8 @@ public class CreateColumnFamilyStatement
                    .columnMetadata(getColumns(comparator))
                    
.keyValidator(TypeParser.parse(comparators.get(getKeyType())))
                    
.rowCacheProvider(FBUtilities.newCacheProvider(getPropertyString(KW_ROW_CACHE_PROVIDER,
 CFMetaData.DEFAULT_ROW_CACHE_PROVIDER)))
-                   .keyAlias(keyAlias);
+                   .keyAlias(keyAlias)
+                   .validate();
         }
         catch (ConfigurationException e)
         {

Reply via email to