Author: jbellis
Date: Sat Apr 23 00:13:25 2011
New Revision: 1096094

URL: http://svn.apache.org/viewvc?rev=1096094&view=rev
Log:
validate CQL create keyspace options
patch by jbellis; reviewed by eevans for CASSANDRA-2525

Modified:
    cassandra/branches/cassandra-0.8/CHANGES.txt
    cassandra/branches/cassandra-0.8/doc/cql/CQL.textile
    
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/CreateKeyspaceStatement.java

Modified: cassandra/branches/cassandra-0.8/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/CHANGES.txt?rev=1096094&r1=1096093&r2=1096094&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.8/CHANGES.txt Sat Apr 23 00:13:25 2011
@@ -1,6 +1,8 @@
 0.8.0-?
  * fix NPE compacting index CFs (CASSANDRA-2528)
  * Remove checking all column families on startup for compaction candidates 
(CASSANDRA-2444)
+ * validate CQL create keyspace options (CASSANDRA-2525)
+
 
 0.8.0-beta1
  * remove Avro RPC support (CASSANDRA-926)

Modified: cassandra/branches/cassandra-0.8/doc/cql/CQL.textile
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/doc/cql/CQL.textile?rev=1096094&r1=1096093&r2=1096094&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/doc/cql/CQL.textile (original)
+++ cassandra/branches/cassandra-0.8/doc/cql/CQL.textile Sat Apr 23 00:13:25 
2011
@@ -165,15 +165,13 @@ h2. CREATE KEYSPACE
 _Synopsis:_
 
 bc. 
-CREATE KEYSPACE <NAME> WITH replication_factor = <NUM> AND strategy_class = 
<STRATEGY>
-    [AND strategy_options.<OPTION> = <VALUE> [AND strategy_options.<OPTION> = 
<VALUE>]];
+CREATE KEYSPACE <NAME> WITH AND strategy_class = <STRATEGY>
+    AND strategy_options.<OPTION> = <VALUE> [AND strategy_options.<OPTION> = 
<VALUE>];
 
 The @CREATE KEYSPACE@ statement creates a new top-level namespace (aka 
"keyspace"). Valid names are any string constructed of alphanumeric characters 
and underscores, but must begin with a letter.  Properties such as replication 
strategy and count are specified during creation using the following accepted 
keyword arguments:
 
 |_. keyword|_. required|_. description|
-|replication_factor|yes|Numeric argument that specifies the number of replicas 
for this keyspace.|
-|strategy_class|yes|Class name to use for managing replica placement.  Any of 
the shipped strategies can be used by specifying the class name relative to 
org.apache.cassandra.locator, others will need to be fully-qualified and 
located on the classpath.|
-|strategy_options|no|Some strategies require additional arguments which can be 
supplied by appending the option name to the @strategy_options@ keyword, 
separated by a colon (@:@).  For example, a strategy option of "DC1" with a 
value of "1" would be specified as @strategy_options:DC1 = 1@.|
+|strategy_options|no|Most strategies require additional arguments which can be 
supplied by appending the option name to the @strategy_options@ keyword, 
separated by a colon (@:@).  For example, a strategy option of "DC1" with a 
value of "1" would be specified as @strategy_options:DC1 = 1@; 
replication_factor for SimpleStrategy could be 
@strategy_options:replication_factor=3@.|
 
 h2. CREATE COLUMNFAMILY
 

Modified: 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/CreateKeyspaceStatement.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/CreateKeyspaceStatement.java?rev=1096094&r1=1096093&r2=1096094&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/CreateKeyspaceStatement.java
 (original)
+++ 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/cql/CreateKeyspaceStatement.java
 Sat Apr 23 00:13:25 2011
@@ -23,6 +23,13 @@ package org.apache.cassandra.cql;
 
 import java.util.HashMap;
 import java.util.Map;
+
+import org.apache.cassandra.config.ConfigurationException;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.locator.AbstractReplicationStrategy;
+import org.apache.cassandra.locator.IEndpointSnitch;
+import org.apache.cassandra.locator.TokenMetadata;
+import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.thrift.InvalidRequestException;
 
 /** A <code>CREATE KEYSPACE</code> statement parsed from a CQL query. */
@@ -68,6 +75,20 @@ public class CreateKeyspaceStatement
         for (String key : attrs.keySet())
             if ((key.contains(":")) && (key.startsWith("strategy_options")))
                 strategyOptions.put(key.split(":")[1], attrs.get(key));
+
+        // trial run to let ARS validate class + per-class options
+        try
+        {
+            AbstractReplicationStrategy.createReplicationStrategy(name,
+                                                                  
AbstractReplicationStrategy.getClass(strategyClass),
+                                                                  
StorageService.instance.getTokenMetadata(),
+                                                                  
DatabaseDescriptor.getEndpointSnitch(),
+                                                                  
strategyOptions);
+        }
+        catch (ConfigurationException e)
+        {
+            throw new InvalidRequestException(e.getMessage());
+        }
     }
 
     public String getName()


Reply via email to