Author: eevans
Date: Tue May 11 17:20:51 2010
New Revision: 943190

URL: http://svn.apache.org/viewvc?rev=943190&view=rev
Log:
avro-based system_add_keyspace()

Patch by eevans

Modified:
    cassandra/trunk/interface/cassandra.avpr
    cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java
    cassandra/trunk/test/system/__init__.py

Modified: cassandra/trunk/interface/cassandra.avpr
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/interface/cassandra.avpr?rev=943190&r1=943189&r2=943190&view=diff
==============================================================================
--- cassandra/trunk/interface/cassandra.avpr (original)
+++ cassandra/trunk/interface/cassandra.avpr Tue May 11 17:20:51 2010
@@ -71,6 +71,27 @@
             {"name": "deletion", "type": ["Deletion", "null"]}
           ]
       },
+      {"name": "CfDef", "type": "record",
+          "fields": [
+            {"name": "keyspace", "type": "string"},
+            {"name": "name", "type": "string"},
+            {"name": "column_type", "type": ["string", "null"]},
+            {"name": "comparator_type", "type": ["string", "null"]},
+            {"name": "subcomparator_type", "type": ["string", "null"]},
+            {"name": "comment", "type": ["string", "null"]},
+            {"name": "row_cache_size", "type": ["double", "null"]},
+            {"name": "preload_row_cache", "type": ["boolean", "null"]},
+            {"name": "key_cache_size", "type": ["double", "null"]}
+          ]
+      },
+      {"name": "KsDef", "type": "record",
+          "fields": [
+            {"name": "name", "type": "string"},
+            {"name": "strategy_class", "type": "string"},
+            {"name": "replication_factor", "type": "int"},
+            {"name": "cf_defs", "type": {"type": "array", "items": "CfDef"}}
+          ]
+      },
       {"name": "ConsistencyLevel", "type": "enum",
           "symbols": [
             "ZERO", "ONE", "QUORUM", "DCQUORUM", "DCQUORUMSYNC", "ALL"
@@ -152,6 +173,11 @@
         "request": [],
         "response": "string"
     },
+    "system_add_keyspace": {
+        "request": [{"name": "ks_def", "type": "KsDef"}],
+        "response": "null",
+        "errors": ["InvalidRequestException"]
+    },
     "set_keyspace": {
         "request": [{"name": "keyspace", "type": "string"}],
         "response": "null",

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java?rev=943190&r1=943189&r2=943190&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/avro/CassandraServer.java Tue 
May 11 17:20:51 2010
@@ -36,15 +36,20 @@ import org.apache.avro.generic.GenericAr
 import org.apache.avro.generic.GenericData;
 import org.apache.avro.ipc.AvroRemoteException;
 import org.apache.avro.util.Utf8;
+import org.apache.cassandra.concurrent.StageManager;
+import org.apache.cassandra.config.CFMetaData;
+import org.apache.cassandra.config.ConfigurationException;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.KSMetaData;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.filter.QueryPath;
 import org.apache.cassandra.db.marshal.MarshalException;
+import org.apache.cassandra.db.migration.AddKeyspace;
+import org.apache.cassandra.locator.AbstractReplicationStrategy;
 import org.apache.cassandra.service.StorageProxy;
 import static org.apache.cassandra.utils.FBUtilities.UTF8;
 
 import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.thrift.AccessLevel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import static org.apache.cassandra.avro.AvroRecordFactory.*;
@@ -477,4 +482,61 @@ public class CassandraServer implements 
         
         return null;
     }
+
+    @Override
+    public Void system_add_keyspace(KsDef ksDef) throws AvroRemoteException, 
InvalidRequestException
+    {
+        if 
(StageManager.getStage(StageManager.MIGRATION_STAGE).getQueue().size() > 0)
+            throw newInvalidRequestException("This node appears to be handling 
gossiped migrations.");
+        
+        try
+        {
+            Collection<CFMetaData> cfDefs = new 
ArrayList<CFMetaData>((int)ksDef.cf_defs.size());
+            for (CfDef cfDef : ksDef.cf_defs)
+            {
+                String subComparator = cfDef.subcomparator_type.toString();
+                
+                CFMetaData cfmeta = new CFMetaData(
+                        cfDef.keyspace.toString(),
+                        cfDef.name.toString(),
+                        
ColumnFamily.getColumnType(cfDef.column_type.toString()),
+                        
DatabaseDescriptor.getComparator(cfDef.comparator_type.toString()),
+                        subComparator.length() == 0 ? null : 
DatabaseDescriptor.getComparator(subComparator),
+                        cfDef.comment.toString(), 
+                        cfDef.row_cache_size,
+                        cfDef.preload_row_cache,
+                        cfDef.key_cache_size);
+                cfDefs.add(cfmeta);
+            }
+            
+            KSMetaData ksmeta = new KSMetaData(
+                    ksDef.name.toString(),
+                    (Class<? extends 
AbstractReplicationStrategy>)Class.forName(ksDef.strategy_class.toString()),
+                    (int)ksDef.replication_factor,
+                    cfDefs.toArray(new CFMetaData[cfDefs.size()]));
+            AddKeyspace add = new AddKeyspace(ksmeta);
+            add.apply();
+            add.announce();
+        }
+        catch (ClassNotFoundException e)
+        {
+            InvalidRequestException ire = 
newInvalidRequestException(e.getMessage());
+            ire.initCause(e);
+            throw ire;
+        }
+        catch (ConfigurationException e)
+        {
+            InvalidRequestException ire = 
newInvalidRequestException(e.getMessage());
+            ire.initCause(e);
+            throw ire;
+        }
+        catch (IOException e)
+        {
+            InvalidRequestException ire = 
newInvalidRequestException(e.getMessage());
+            ire.initCause(e);
+            throw ire;
+        }
+        
+        return null;
+    }
 }

Modified: cassandra/trunk/test/system/__init__.py
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/test/system/__init__.py?rev=943190&r1=943189&r2=943190&view=diff
==============================================================================
--- cassandra/trunk/test/system/__init__.py (original)
+++ cassandra/trunk/test/system/__init__.py Tue May 11 17:20:51 2010
@@ -190,6 +190,23 @@ class AvroTester(BaseTester):
         self.client.transceiver.conn.close()
     
     def define_schema(self):
-        pass
+        keyspace1 = dict()
+        keyspace1['name'] = 'Keyspace1'
+        keyspace1['strategy_class'] = 
'org.apache.cassandra.locator.RackUnawareStrategy'
+        keyspace1['replication_factor'] = 1
+        cfDef = dict()
+        cfDef['keyspace'] = 'Keyspace1'
+        cfDef['name'] = 'Standard1'
+        cfDef['column_type'] = 'Standard'
+        cfDef['comparator_type'] = 'BytesType'
+        cfDef['subcomparator_type'] = ''
+        cfDef['comment'] = ''
+        cfDef['row_cache_size'] = 0
+        cfDef['preload_row_cache'] = False
+        cfDef['key_cache_size'] = 200000
+        keyspace1['cf_defs'] = [cfDef]
+        #keyspace1['cf_defs'] = [{'keyspace': 'Keyspace1', 'name': 
'Standard1'}]
+
+        self.client.request('system_add_keyspace', {'ks_def': keyspace1})
 
 # vim:ai sw=4 ts=4 tw=0 et


Reply via email to