Author: jbellis Date: Mon Apr 18 15:51:47 2011 New Revision: 1094628 URL: http://svn.apache.org/viewvc?rev=1094628&view=rev Log: add optional replication_factor fields to KsDef to make supporting both 0.8 and 0.7 easier for client devs patch by jbellis; reviewed by Nate McCall for CASSANDRA-2481
Modified: cassandra/branches/cassandra-0.8/drivers/py/cql/cassandra/constants.py cassandra/branches/cassandra-0.8/drivers/py/cql/cassandra/ttypes.py cassandra/branches/cassandra-0.8/drivers/txpy/txcql/cassandra/constants.py cassandra/branches/cassandra-0.8/drivers/txpy/txcql/cassandra/ttypes.py cassandra/branches/cassandra-0.8/interface/cassandra.thrift cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/KsDef.java cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/config/KSMetaData.java cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java cassandra/branches/cassandra-0.8/test/system/__init__.py cassandra/branches/cassandra-0.8/test/system/test_thrift_server.py Modified: cassandra/branches/cassandra-0.8/drivers/py/cql/cassandra/constants.py URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/drivers/py/cql/cassandra/constants.py?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/drivers/py/cql/cassandra/constants.py (original) +++ cassandra/branches/cassandra-0.8/drivers/py/cql/cassandra/constants.py Mon Apr 18 15:51:47 2011 @@ -7,4 +7,4 @@ from thrift.Thrift import * from ttypes import * -VERSION = "20.1.0" +VERSION = "19.10.0" Modified: cassandra/branches/cassandra-0.8/drivers/py/cql/cassandra/ttypes.py URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/drivers/py/cql/cassandra/ttypes.py?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/drivers/py/cql/cassandra/ttypes.py (original) +++ cassandra/branches/cassandra-0.8/drivers/py/cql/cassandra/ttypes.py Mon Apr 18 15:51:47 2011 @@ -246,10 +246,6 @@ class Column: def validate(self): if self.name is None: raise TProtocol.TProtocolException(message='Required field name is unset!') - if self.value is None: - raise TProtocol.TProtocolException(message='Required field value is unset!') - if self.timestamp is None: - raise TProtocol.TProtocolException(message='Required field timestamp is unset!') return @@ -2666,6 +2662,7 @@ class KsDef: - name - strategy_class - strategy_options + - replication_factor: deprecated - cf_defs """ @@ -2674,13 +2671,15 @@ class KsDef: (1, TType.STRING, 'name', None, None, ), # 1 (2, TType.STRING, 'strategy_class', None, None, ), # 2 (3, TType.MAP, 'strategy_options', (TType.STRING,None,TType.STRING,None), None, ), # 3 - (4, TType.LIST, 'cf_defs', (TType.STRUCT,(CfDef, CfDef.thrift_spec)), None, ), # 4 + (4, TType.I32, 'replication_factor', None, None, ), # 4 + (5, TType.LIST, 'cf_defs', (TType.STRUCT,(CfDef, CfDef.thrift_spec)), None, ), # 5 ) - def __init__(self, name=None, strategy_class=None, strategy_options=None, cf_defs=None,): + def __init__(self, name=None, strategy_class=None, strategy_options=None, replication_factor=None, cf_defs=None,): self.name = name self.strategy_class = strategy_class self.strategy_options = strategy_options + self.replication_factor = replication_factor self.cf_defs = cf_defs def read(self, iprot): @@ -2714,6 +2713,11 @@ class KsDef: else: iprot.skip(ftype) elif fid == 4: + if ftype == TType.I32: + self.replication_factor = iprot.readI32(); + else: + iprot.skip(ftype) + elif fid == 5: if ftype == TType.LIST: self.cf_defs = [] (_etype68, _size65) = iprot.readListBegin() @@ -2750,8 +2754,12 @@ class KsDef: oprot.writeString(viter72) oprot.writeMapEnd() oprot.writeFieldEnd() + if self.replication_factor != None: + oprot.writeFieldBegin('replication_factor', TType.I32, 4) + oprot.writeI32(self.replication_factor) + oprot.writeFieldEnd() if self.cf_defs != None: - oprot.writeFieldBegin('cf_defs', TType.LIST, 4) + oprot.writeFieldBegin('cf_defs', TType.LIST, 5) oprot.writeListBegin(TType.STRUCT, len(self.cf_defs)) for iter73 in self.cf_defs: iter73.write(oprot) Modified: cassandra/branches/cassandra-0.8/drivers/txpy/txcql/cassandra/constants.py URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/drivers/txpy/txcql/cassandra/constants.py?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/drivers/txpy/txcql/cassandra/constants.py (original) +++ cassandra/branches/cassandra-0.8/drivers/txpy/txcql/cassandra/constants.py Mon Apr 18 15:51:47 2011 @@ -7,4 +7,4 @@ from thrift.Thrift import * from ttypes import * -VERSION = "20.1.0" +VERSION = "19.10.0" Modified: cassandra/branches/cassandra-0.8/drivers/txpy/txcql/cassandra/ttypes.py URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/drivers/txpy/txcql/cassandra/ttypes.py?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/drivers/txpy/txcql/cassandra/ttypes.py (original) +++ cassandra/branches/cassandra-0.8/drivers/txpy/txcql/cassandra/ttypes.py Mon Apr 18 15:51:47 2011 @@ -246,10 +246,6 @@ class Column: def validate(self): if self.name is None: raise TProtocol.TProtocolException(message='Required field name is unset!') - if self.value is None: - raise TProtocol.TProtocolException(message='Required field value is unset!') - if self.timestamp is None: - raise TProtocol.TProtocolException(message='Required field timestamp is unset!') return @@ -2666,6 +2662,7 @@ class KsDef: - name - strategy_class - strategy_options + - replication_factor: deprecated - cf_defs """ @@ -2674,13 +2671,15 @@ class KsDef: (1, TType.STRING, 'name', None, None, ), # 1 (2, TType.STRING, 'strategy_class', None, None, ), # 2 (3, TType.MAP, 'strategy_options', (TType.STRING,None,TType.STRING,None), None, ), # 3 - (4, TType.LIST, 'cf_defs', (TType.STRUCT,(CfDef, CfDef.thrift_spec)), None, ), # 4 + (4, TType.I32, 'replication_factor', None, None, ), # 4 + (5, TType.LIST, 'cf_defs', (TType.STRUCT,(CfDef, CfDef.thrift_spec)), None, ), # 5 ) - def __init__(self, name=None, strategy_class=None, strategy_options=None, cf_defs=None,): + def __init__(self, name=None, strategy_class=None, strategy_options=None, replication_factor=None, cf_defs=None,): self.name = name self.strategy_class = strategy_class self.strategy_options = strategy_options + self.replication_factor = replication_factor self.cf_defs = cf_defs def read(self, iprot): @@ -2714,6 +2713,11 @@ class KsDef: else: iprot.skip(ftype) elif fid == 4: + if ftype == TType.I32: + self.replication_factor = iprot.readI32(); + else: + iprot.skip(ftype) + elif fid == 5: if ftype == TType.LIST: self.cf_defs = [] (_etype68, _size65) = iprot.readListBegin() @@ -2750,8 +2754,12 @@ class KsDef: oprot.writeString(viter72) oprot.writeMapEnd() oprot.writeFieldEnd() + if self.replication_factor != None: + oprot.writeFieldBegin('replication_factor', TType.I32, 4) + oprot.writeI32(self.replication_factor) + oprot.writeFieldEnd() if self.cf_defs != None: - oprot.writeFieldBegin('cf_defs', TType.LIST, 4) + oprot.writeFieldBegin('cf_defs', TType.LIST, 5) oprot.writeListBegin(TType.STRUCT, len(self.cf_defs)) for iter73 in self.cf_defs: iter73.write(oprot) Modified: cassandra/branches/cassandra-0.8/interface/cassandra.thrift URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/interface/cassandra.thrift?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/interface/cassandra.thrift (original) +++ cassandra/branches/cassandra-0.8/interface/cassandra.thrift Mon Apr 18 15:51:47 2011 @@ -46,7 +46,7 @@ namespace rb CassandraThrift # for every edit that doesn't result in a change to major/minor. # # See the Semantic Versioning Specification (SemVer) http://semver.org. -const string VERSION = "20.2.0" +const string VERSION = "19.10.0" # @@ -402,7 +402,11 @@ struct KsDef { 1: required string name, 2: required string strategy_class, 3: optional map<string,string> strategy_options, - 4: required list<CfDef> cf_defs, + + /** @deprecated */ + 4: optional i32 replication_factor, + + 5: required list<CfDef> cf_defs, } /** CQL query compression */ Modified: cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java (original) +++ cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/Constants.java Mon Apr 18 15:51:47 2011 @@ -44,6 +44,6 @@ import org.slf4j.LoggerFactory; public class Constants { - public static final String VERSION = "20.2.0"; + public static final String VERSION = "19.10.0"; } Modified: cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/KsDef.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/KsDef.java?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/KsDef.java (original) +++ cassandra/branches/cassandra-0.8/interface/thrift/gen-java/org/apache/cassandra/thrift/KsDef.java Mon Apr 18 15:51:47 2011 @@ -48,11 +48,16 @@ public class KsDef implements org.apache private static final org.apache.thrift.protocol.TField NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("name", org.apache.thrift.protocol.TType.STRING, (short)1); private static final org.apache.thrift.protocol.TField STRATEGY_CLASS_FIELD_DESC = new org.apache.thrift.protocol.TField("strategy_class", org.apache.thrift.protocol.TType.STRING, (short)2); private static final org.apache.thrift.protocol.TField STRATEGY_OPTIONS_FIELD_DESC = new org.apache.thrift.protocol.TField("strategy_options", org.apache.thrift.protocol.TType.MAP, (short)3); - private static final org.apache.thrift.protocol.TField CF_DEFS_FIELD_DESC = new org.apache.thrift.protocol.TField("cf_defs", org.apache.thrift.protocol.TType.LIST, (short)4); + private static final org.apache.thrift.protocol.TField REPLICATION_FACTOR_FIELD_DESC = new org.apache.thrift.protocol.TField("replication_factor", org.apache.thrift.protocol.TType.I32, (short)4); + private static final org.apache.thrift.protocol.TField CF_DEFS_FIELD_DESC = new org.apache.thrift.protocol.TField("cf_defs", org.apache.thrift.protocol.TType.LIST, (short)5); public String name; public String strategy_class; public Map<String,String> strategy_options; + /** + * @deprecated + */ + public int replication_factor; public List<CfDef> cf_defs; /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */ @@ -60,7 +65,11 @@ public class KsDef implements org.apache NAME((short)1, "name"), STRATEGY_CLASS((short)2, "strategy_class"), STRATEGY_OPTIONS((short)3, "strategy_options"), - CF_DEFS((short)4, "cf_defs"); + /** + * @deprecated + */ + REPLICATION_FACTOR((short)4, "replication_factor"), + CF_DEFS((short)5, "cf_defs"); private static final Map<String, _Fields> byName = new HashMap<String, _Fields>(); @@ -81,7 +90,9 @@ public class KsDef implements org.apache return STRATEGY_CLASS; case 3: // STRATEGY_OPTIONS return STRATEGY_OPTIONS; - case 4: // CF_DEFS + case 4: // REPLICATION_FACTOR + return REPLICATION_FACTOR; + case 5: // CF_DEFS return CF_DEFS; default: return null; @@ -123,6 +134,8 @@ public class KsDef implements org.apache } // isset id assignments + private static final int __REPLICATION_FACTOR_ISSET_ID = 0; + private BitSet __isset_bit_vector = new BitSet(1); public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap; static { @@ -135,6 +148,8 @@ public class KsDef implements org.apache new org.apache.thrift.meta_data.MapMetaData(org.apache.thrift.protocol.TType.MAP, new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING), new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)))); + tmpMap.put(_Fields.REPLICATION_FACTOR, new org.apache.thrift.meta_data.FieldMetaData("replication_factor", org.apache.thrift.TFieldRequirementType.OPTIONAL, + new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32))); tmpMap.put(_Fields.CF_DEFS, new org.apache.thrift.meta_data.FieldMetaData("cf_defs", org.apache.thrift.TFieldRequirementType.REQUIRED, new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, CfDef.class)))); @@ -160,6 +175,8 @@ public class KsDef implements org.apache * Performs a deep copy on <i>other</i>. */ public KsDef(KsDef other) { + __isset_bit_vector.clear(); + __isset_bit_vector.or(other.__isset_bit_vector); if (other.isSetName()) { this.name = other.name; } @@ -181,6 +198,7 @@ public class KsDef implements org.apache } this.strategy_options = __this__strategy_options; } + this.replication_factor = other.replication_factor; if (other.isSetCf_defs()) { List<CfDef> __this__cf_defs = new ArrayList<CfDef>(); for (CfDef other_element : other.cf_defs) { @@ -199,6 +217,8 @@ public class KsDef implements org.apache this.name = null; this.strategy_class = null; this.strategy_options = null; + setReplication_factorIsSet(false); + this.replication_factor = 0; this.cf_defs = null; } @@ -285,6 +305,35 @@ public class KsDef implements org.apache } } + /** + * @deprecated + */ + public int getReplication_factor() { + return this.replication_factor; + } + + /** + * @deprecated + */ + public KsDef setReplication_factor(int replication_factor) { + this.replication_factor = replication_factor; + setReplication_factorIsSet(true); + return this; + } + + public void unsetReplication_factor() { + __isset_bit_vector.clear(__REPLICATION_FACTOR_ISSET_ID); + } + + /** Returns true if field replication_factor is set (has been assigned a value) and false otherwise */ + public boolean isSetReplication_factor() { + return __isset_bit_vector.get(__REPLICATION_FACTOR_ISSET_ID); + } + + public void setReplication_factorIsSet(boolean value) { + __isset_bit_vector.set(__REPLICATION_FACTOR_ISSET_ID, value); + } + public int getCf_defsSize() { return (this.cf_defs == null) ? 0 : this.cf_defs.size(); } @@ -350,6 +399,14 @@ public class KsDef implements org.apache } break; + case REPLICATION_FACTOR: + if (value == null) { + unsetReplication_factor(); + } else { + setReplication_factor((Integer)value); + } + break; + case CF_DEFS: if (value == null) { unsetCf_defs(); @@ -372,6 +429,9 @@ public class KsDef implements org.apache case STRATEGY_OPTIONS: return getStrategy_options(); + case REPLICATION_FACTOR: + return new Integer(getReplication_factor()); + case CF_DEFS: return getCf_defs(); @@ -392,6 +452,8 @@ public class KsDef implements org.apache return isSetStrategy_class(); case STRATEGY_OPTIONS: return isSetStrategy_options(); + case REPLICATION_FACTOR: + return isSetReplication_factor(); case CF_DEFS: return isSetCf_defs(); } @@ -438,6 +500,15 @@ public class KsDef implements org.apache return false; } + boolean this_present_replication_factor = true && this.isSetReplication_factor(); + boolean that_present_replication_factor = true && that.isSetReplication_factor(); + if (this_present_replication_factor || that_present_replication_factor) { + if (!(this_present_replication_factor && that_present_replication_factor)) + return false; + if (this.replication_factor != that.replication_factor) + return false; + } + boolean this_present_cf_defs = true && this.isSetCf_defs(); boolean that_present_cf_defs = true && that.isSetCf_defs(); if (this_present_cf_defs || that_present_cf_defs) { @@ -469,6 +540,11 @@ public class KsDef implements org.apache if (present_strategy_options) builder.append(strategy_options); + boolean present_replication_factor = true && (isSetReplication_factor()); + builder.append(present_replication_factor); + if (present_replication_factor) + builder.append(replication_factor); + boolean present_cf_defs = true && (isSetCf_defs()); builder.append(present_cf_defs); if (present_cf_defs) @@ -515,6 +591,16 @@ public class KsDef implements org.apache return lastComparison; } } + lastComparison = Boolean.valueOf(isSetReplication_factor()).compareTo(typedOther.isSetReplication_factor()); + if (lastComparison != 0) { + return lastComparison; + } + if (isSetReplication_factor()) { + lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.replication_factor, typedOther.replication_factor); + if (lastComparison != 0) { + return lastComparison; + } + } lastComparison = Boolean.valueOf(isSetCf_defs()).compareTo(typedOther.isSetCf_defs()); if (lastComparison != 0) { return lastComparison; @@ -575,7 +661,15 @@ public class KsDef implements org.apache org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type); } break; - case 4: // CF_DEFS + case 4: // REPLICATION_FACTOR + if (field.type == org.apache.thrift.protocol.TType.I32) { + this.replication_factor = iprot.readI32(); + setReplication_factorIsSet(true); + } else { + org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type); + } + break; + case 5: // CF_DEFS if (field.type == org.apache.thrift.protocol.TType.LIST) { { org.apache.thrift.protocol.TList _list37 = iprot.readListBegin(); @@ -633,6 +727,11 @@ public class KsDef implements org.apache oprot.writeFieldEnd(); } } + if (isSetReplication_factor()) { + oprot.writeFieldBegin(REPLICATION_FACTOR_FIELD_DESC); + oprot.writeI32(this.replication_factor); + oprot.writeFieldEnd(); + } if (this.cf_defs != null) { oprot.writeFieldBegin(CF_DEFS_FIELD_DESC); { @@ -679,6 +778,12 @@ public class KsDef implements org.apache } first = false; } + if (isSetReplication_factor()) { + if (!first) sb.append(", "); + sb.append("replication_factor:"); + sb.append(this.replication_factor); + first = false; + } if (!first) sb.append(", "); sb.append("cf_defs:"); if (this.cf_defs == null) { @@ -714,6 +819,8 @@ public class KsDef implements org.apache private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException { try { + // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor. + __isset_bit_vector = new BitSet(1); read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in))); } catch (org.apache.thrift.TException te) { throw new java.io.IOException(te); Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/config/KSMetaData.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/config/KSMetaData.java?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/config/KSMetaData.java (original) +++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/config/KSMetaData.java Mon Apr 18 15:51:47 2011 @@ -29,6 +29,8 @@ import org.apache.avro.util.Utf8; import org.apache.cassandra.io.SerDeUtils; import org.apache.cassandra.locator.AbstractReplicationStrategy; import org.apache.cassandra.locator.NetworkTopologyStrategy; +import org.apache.cassandra.thrift.KsDef; + import org.apache.commons.lang.StringUtils; public final class KSMetaData @@ -48,7 +50,22 @@ public final class KSMetaData cfmap.put(cfm.cfName, cfm); this.cfMetaData = Collections.unmodifiableMap(cfmap); } - + + public static Map<String, String> backwardsCompatibleOptions(KsDef ks_def) + { + Map<String, String> options; + if (ks_def.isSetReplication_factor()) + { + options = new HashMap<String, String>(ks_def.strategy_options == null ? Collections.<String, String>emptyMap() : ks_def.strategy_options); + options.put("replication_factor", String.valueOf(ks_def.replication_factor)); + } + else + { + options = ks_def.strategy_options; + } + return options; + } + public int hashCode() { return name.hashCode(); Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java (original) +++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/CassandraServer.java Mon Apr 18 15:51:47 2011 @@ -24,7 +24,6 @@ import java.io.UnsupportedEncodingExcept import java.nio.ByteBuffer; import java.nio.charset.CharacterCodingException; import java.util.*; -import java.util.Map.Entry; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -55,7 +54,6 @@ import org.apache.cassandra.service.Clie import org.apache.cassandra.service.StorageProxy; import org.apache.cassandra.service.StorageService; import org.apache.cassandra.utils.ByteBufferUtil; -import org.apache.cassandra.utils.FBUtilities; import org.apache.thrift.TException; public class CassandraServer implements Cassandra.Iface @@ -858,21 +856,10 @@ public class CassandraServer implements cfDefs.add(CFMetaData.convertToCFMetaData(cfDef)); } - // Attempt to instantiate the ARS, which will throw a ConfigException if - // the strategy_options aren't fully formed or if the ARS Classname is invalid. - TokenMetadata tmd = StorageService.instance.getTokenMetadata(); - IEndpointSnitch eps = DatabaseDescriptor.getEndpointSnitch(); - Class<? extends AbstractReplicationStrategy> cls = AbstractReplicationStrategy.getClass(ks_def.strategy_class); - AbstractReplicationStrategy strat = AbstractReplicationStrategy - .createReplicationStrategy(ks_def.name, - cls, - tmd, - eps, - ks_def.strategy_options); - + ThriftValidation.validateKsDef(ks_def); KSMetaData ksm = new KSMetaData(ks_def.name, AbstractReplicationStrategy.getClass(ks_def.strategy_class), - ks_def.strategy_options, + KSMetaData.backwardsCompatibleOptions(ks_def), cfDefs.toArray(new CFMetaData[cfDefs.size()])); applyMigrationOnStage(new AddKeyspace(ksm)); @@ -891,7 +878,7 @@ public class CassandraServer implements throw ex; } } - + public synchronized String system_drop_keyspace(String keyspace) throws InvalidRequestException, SchemaDisagreementException, TException { @@ -932,9 +919,10 @@ public class CassandraServer implements try { + ThriftValidation.validateKsDef(ks_def); KSMetaData ksm = new KSMetaData(ks_def.name, AbstractReplicationStrategy.getClass(ks_def.strategy_class), - ks_def.strategy_options); + KSMetaData.backwardsCompatibleOptions(ks_def)); applyMigrationOnStage(new UpdateKeyspace(ksm)); return DatabaseDescriptor.getDefsVersion().toString(); } Modified: cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java (original) +++ cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/thrift/ThriftValidation.java Mon Apr 18 15:51:47 2011 @@ -23,16 +23,16 @@ package org.apache.cassandra.thrift; import java.nio.ByteBuffer; import java.util.*; -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.config.*; import org.apache.cassandra.db.*; import org.apache.cassandra.db.marshal.AbstractType; import org.apache.cassandra.db.marshal.MarshalException; import org.apache.cassandra.dht.IPartitioner; import org.apache.cassandra.dht.RandomPartitioner; import org.apache.cassandra.dht.Token; +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.utils.ByteBufferUtil; import org.apache.cassandra.utils.FBUtilities; @@ -554,4 +554,15 @@ public class ThriftValidation throw new InvalidRequestException("cannot achieve CL > CL.ONE without replicate_on_write on columnfamily " + metadata.cfName); } } + + static void validateKsDef(KsDef ks_def) throws ConfigurationException + { + // Attempt to instantiate the ARS, which will throw a ConfigException if + // the strategy_options aren't fully formed or if the ARS Classname is invalid. + Map<String, String> options = KSMetaData.backwardsCompatibleOptions(ks_def); + TokenMetadata tmd = StorageService.instance.getTokenMetadata(); + IEndpointSnitch eps = DatabaseDescriptor.getEndpointSnitch(); + Class<? extends AbstractReplicationStrategy> cls = AbstractReplicationStrategy.getClass(ks_def.strategy_class); + AbstractReplicationStrategy.createReplicationStrategy(ks_def.name, cls, tmd, eps, options); + } } Modified: cassandra/branches/cassandra-0.8/test/system/__init__.py URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/system/__init__.py?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/test/system/__init__.py (original) +++ cassandra/branches/cassandra-0.8/test/system/__init__.py Mon Apr 18 15:51:47 2011 @@ -33,7 +33,7 @@ import Cassandra def get_thrift_client(host='127.0.0.1', port=9170): socket = TSocket.TSocket(host, port) transport = TTransport.TFramedTransport(socket) - protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport) + protocol = TBinaryProtocol.TBinaryProtocol(transport) client = Cassandra.Client(protocol) client.transport = transport return client @@ -149,7 +149,7 @@ class ThriftTester(BaseTester): def define_schema(self): keyspace1 = Cassandra.KsDef('Keyspace1', 'org.apache.cassandra.locator.SimpleStrategy', {'replication_factor':'1'}, - [ + cf_defs=[ Cassandra.CfDef('Keyspace1', 'Standard1'), Cassandra.CfDef('Keyspace1', 'Standard2'), Cassandra.CfDef('Keyspace1', 'StandardLong1', comparator_type='LongType'), @@ -168,7 +168,7 @@ class ThriftTester(BaseTester): ]) keyspace2 = Cassandra.KsDef('Keyspace2', 'org.apache.cassandra.locator.SimpleStrategy', {'replication_factor':'1'}, - [ + cf_defs=[ Cassandra.CfDef('Keyspace2', 'Standard1'), Cassandra.CfDef('Keyspace2', 'Standard3'), Cassandra.CfDef('Keyspace2', 'Super3', column_type='Super', subcomparator_type='BytesType'), Modified: cassandra/branches/cassandra-0.8/test/system/test_thrift_server.py URL: http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/test/system/test_thrift_server.py?rev=1094628&r1=1094627&r2=1094628&view=diff ============================================================================== --- cassandra/branches/cassandra-0.8/test/system/test_thrift_server.py (original) +++ cassandra/branches/cassandra-0.8/test/system/test_thrift_server.py Mon Apr 18 15:51:47 2011 @@ -1192,20 +1192,20 @@ class TestMutations(ThriftTester): def test_invalid_ks_names(self): def invalid_keyspace(): - client.system_add_keyspace(KsDef('in-valid', 'org.apache.cassandra.locator.SimpleStrategy', {'replication_factor':'1'}, [])) + client.system_add_keyspace(KsDef('in-valid', 'org.apache.cassandra.locator.SimpleStrategy', {'replication_factor':'1'}, cf_defs=[])) _expect_exception(invalid_keyspace, InvalidRequestException) def test_invalid_strategy_class(self): def add_invalid_keyspace(): - client.system_add_keyspace(KsDef('ValidKs', 'InvalidStrategyClass', {}, [])) + client.system_add_keyspace(KsDef('ValidKs', 'InvalidStrategyClass', {}, cf_defs=[])) exc = _expect_exception(add_invalid_keyspace, InvalidRequestException) s = str(exc) assert s.find("InvalidStrategyClass") > -1, s assert s.find("Unable to find replication strategy") > -1, s def update_invalid_keyspace(): - client.system_add_keyspace(KsDef('ValidKsForUpdate', 'org.apache.cassandra.locator.SimpleStrategy', {'replication_factor':'1'}, [])) - client.system_update_keyspace(KsDef('ValidKsForUpdate', 'InvalidStrategyClass', {}, [])) + client.system_add_keyspace(KsDef('ValidKsForUpdate', 'org.apache.cassandra.locator.SimpleStrategy', {'replication_factor':'1'}, cf_defs=[])) + client.system_update_keyspace(KsDef('ValidKsForUpdate', 'InvalidStrategyClass', {}, cf_defs=[])) exc = _expect_exception(update_invalid_keyspace, InvalidRequestException) s = str(exc) @@ -1222,7 +1222,7 @@ class TestMutations(ThriftTester): def invalid_cf_inside_new_ks(): cf = CfDef('ValidKsName_invalid_cf', 'in-valid') _set_keyspace('system') - client.system_add_keyspace(KsDef('ValidKsName_invalid_cf', 'org.apache.cassandra.locator.SimpleStrategy', {'replication_factor': '1'}, [cf])) + client.system_add_keyspace(KsDef('ValidKsName_invalid_cf', 'org.apache.cassandra.locator.SimpleStrategy', {'replication_factor': '1'}, cf_defs=[cf])) _expect_exception(invalid_cf_inside_new_ks, InvalidRequestException) def test_system_cf_recreate(self): @@ -1234,7 +1234,7 @@ class TestMutations(ThriftTester): # create newcf = CfDef(keyspace, cf_name) - newks = KsDef(keyspace, 'org.apache.cassandra.locator.SimpleStrategy', {'replication_factor':'1'}, [newcf]) + newks = KsDef(keyspace, 'org.apache.cassandra.locator.SimpleStrategy', {'replication_factor':'1'}, cf_defs=[newcf]) client.system_add_keyspace(newks) _set_keyspace(keyspace) @@ -1261,7 +1261,7 @@ class TestMutations(ThriftTester): keyspace = KsDef('CreateKeyspace', 'org.apache.cassandra.locator.SimpleStrategy', {'replication_factor': '10'}, - [CfDef('CreateKeyspace', 'CreateKsCf')]) + cf_defs=[CfDef('CreateKeyspace', 'CreateKsCf')]) client.system_add_keyspace(keyspace) newks = client.describe_keyspace('CreateKeyspace') assert 'CreateKsCf' in [x.name for x in newks.cf_defs] @@ -1272,7 +1272,7 @@ class TestMutations(ThriftTester): modified_keyspace = KsDef('CreateKeyspace', 'org.apache.cassandra.locator.OldNetworkTopologyStrategy', {'replication_factor': '1'}, - []) + cf_defs=[]) client.system_update_keyspace(modified_keyspace) modks = client.describe_keyspace('CreateKeyspace') assert modks.strategy_class == modified_keyspace.strategy_class