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