You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2010/07/06 05:58:38 UTC
svn commit: r960772 - in /cassandra/trunk:
src/java/org/apache/cassandra/config/
src/java/org/apache/cassandra/db/marshal/
src/java/org/apache/cassandra/service/
src/java/org/apache/cassandra/thrift/ src/java/org/apache/cassandra/utils/
test/system/ te...
Author: jbellis
Date: Tue Jul 6 03:58:38 2010
New Revision: 960772
URL: http://svn.apache.org/viewvc?rev=960772&view=rev
Log:
replace ColumnValidator code with AbstractType and clean up to avoid reflection on the request path. also use final fields in ColumnDefinition. patch by jbellis
Removed:
cassandra/trunk/src/java/org/apache/cassandra/service/ColumnValidator.java
cassandra/trunk/src/java/org/apache/cassandra/service/ExampleColumnValidator.java
Modified:
cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
cassandra/trunk/src/java/org/apache/cassandra/config/ColumnDefinition.java
cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
cassandra/trunk/src/java/org/apache/cassandra/db/marshal/AbstractType.java
cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
cassandra/trunk/test/system/test_thrift_server.py
cassandra/trunk/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java
cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java
Modified: cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java?rev=960772&r1=960771&r2=960772&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/CFMetaData.java Tue Jul 6 03:58:38 2010
@@ -36,7 +36,6 @@ import org.apache.cassandra.db.clock.Tim
import org.apache.cassandra.db.marshal.*;
import org.apache.cassandra.db.migration.Migration;
import org.apache.cassandra.locator.DatacenterShardStrategy;
-import org.apache.cassandra.service.ColumnValidator;
import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.Pair;
@@ -323,34 +322,11 @@ public final class CFMetaData
return idGen.getAndIncrement();
}
- public ColumnValidator getColumnValidator(byte[] column)
+ public AbstractType getValueValidator(byte[] column)
{
- ColumnValidator validator = null;
ColumnDefinition columnDefinition = column_metadata.get(column);
-
- if (columnDefinition != null)
- {
- String className = columnDefinition.validation_class;
- if (className != null && className.trim().length() > 0)
- {
- try
- {
- validator = (ColumnValidator) Class.forName(className).newInstance();
- }
- catch (ClassNotFoundException cnfe)
- {
- throw new MarshalException("could not find validation class + " + className, cnfe);
- }
- catch (InstantiationException ie)
- {
- throw new MarshalException("could not instantiate validation class " + className, ie);
- }
- catch (IllegalAccessException iae)
- {
- throw new MarshalException("IllegalAccessException instantiating validation class " + className, iae);
- }
- }
- }
- return validator;
+ if (columnDefinition == null)
+ return null;
+ return columnDefinition.validator;
}
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/config/ColumnDefinition.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/ColumnDefinition.java?rev=960772&r1=960771&r2=960772&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/ColumnDefinition.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/ColumnDefinition.java Tue Jul 6 03:58:38 2010
@@ -6,58 +6,50 @@ import java.util.*;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
+import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.thrift.ColumnDef;
import org.apache.cassandra.utils.FBUtilities;
public class ColumnDefinition {
- public byte[] name;
- public String validation_class;
- public String index_type;
- public String index_name;
+ public final byte[] name;
+ public final AbstractType validator;
+ public final String index_type;
+ public final String index_name;
- public ColumnDefinition()
- {
- this(null, null, null, null);
- }
-
- public ColumnDefinition(byte[] name, String validation_class, String index_type, String index_name)
+ public ColumnDefinition(byte[] name, String validation_class, String index_type, String index_name) throws ConfigurationException
{
this.name = name;
- this.validation_class = validation_class;
this.index_type = index_type;
this.index_name = index_name;
+ this.validator = DatabaseDescriptor.getComparator(validation_class);
}
@Override
- public int hashCode()
+ public boolean equals(Object o)
{
- return new HashCodeBuilder()
- .append(name)
- .append(validation_class)
- .append(index_type)
- .append(index_name)
- .toHashCode();
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+
+ ColumnDefinition that = (ColumnDefinition) o;
+ if (index_name != null ? !index_name.equals(that.index_name) : that.index_name != null)
+ return false;
+ if (index_type != null ? !index_type.equals(that.index_type) : that.index_type != null)
+ return false;
+ if (!Arrays.equals(name, that.name))
+ return false;
+ return !(validator != null ? !validator.equals(that.validator) : that.validator != null);
}
@Override
- public boolean equals(Object obj)
+ public int hashCode()
{
- if (obj == this)
- {
- return true;
- }
- else if (obj == null || obj.getClass() != getClass())
- {
- return false;
- }
-
- ColumnDefinition rhs = (ColumnDefinition) obj;
- return new EqualsBuilder()
- .append(name, rhs.name)
- .append(validation_class, rhs.validation_class)
- .append(index_name, rhs.index_name)
- .append(index_type, rhs.index_type)
- .isEquals();
+ int result = name != null ? Arrays.hashCode(name) : 0;
+ result = 31 * result + (validator != null ? validator.hashCode() : 0);
+ result = 31 * result + (index_type != null ? index_type.hashCode() : 0);
+ result = 31 * result + (index_name != null ? index_name.hashCode() : 0);
+ return result;
}
public static byte[] serialize(ColumnDefinition cd) throws IOException
@@ -66,24 +58,15 @@ public class ColumnDefinition {
DataOutputStream out = new DataOutputStream(bout);
out.writeInt(cd.name.length);
out.write(cd.name);
-
- out.writeBoolean(cd.validation_class != null);
- if (cd.validation_class != null)
- {
- out.writeUTF(cd.validation_class);
- }
+ out.writeUTF(cd.validator.getClass().getName());
out.writeBoolean(cd.index_type != null);
if (cd.index_type != null)
- {
out.writeUTF(cd.index_type);
- }
out.writeBoolean(cd.index_name != null);
if (cd.index_name != null)
- {
out.writeUTF(cd.index_name);
- }
out.close();
return bout.toByteArray();
@@ -91,37 +74,36 @@ public class ColumnDefinition {
public static ColumnDefinition deserialize(byte[] bytes) throws IOException
{
- ColumnDefinition cd = new ColumnDefinition();
DataInputStream in = new DataInputStream(new ByteArrayInputStream(bytes));
int nameSize = in.readInt();
- cd.name = new byte[nameSize];
- if (in.read(cd.name, 0, nameSize) != nameSize)
- throw new IOException("short read of ColumnDefinition name");
-
- if (in.readBoolean())
- cd.validation_class = in.readUTF();
+ byte[] name = new byte[nameSize];
+ in.readFully(name);
+ String validation_class = in.readUTF();
+ String index_type = null;
if (in.readBoolean())
- cd.index_type = in.readUTF();
+ index_type = in.readUTF();
+ String index_name = null;
if (in.readBoolean())
- cd.index_name = in.readUTF();
+ index_name = in.readUTF();
- return cd;
+ try
+ {
+ return new ColumnDefinition(name, validation_class, index_type, index_name);
+ }
+ catch (ConfigurationException e)
+ {
+ throw new RuntimeException(e);
+ }
}
- public static ColumnDefinition fromColumnDef(ColumnDef thriftColumnDef)
+ public static ColumnDefinition fromColumnDef(ColumnDef cd) throws ConfigurationException
{
- assert thriftColumnDef != null;
- ColumnDefinition cd = new ColumnDefinition();
- cd.name = thriftColumnDef.name;
- cd.validation_class = thriftColumnDef.validation_class;
- cd.index_type = thriftColumnDef.index_type;
- cd.index_name = thriftColumnDef.index_name;
- return cd;
+ return new ColumnDefinition(cd.name, cd.validation_class, cd.index_type, cd.index_name);
}
- public static Map<byte[], ColumnDefinition> fromColumnDef(List<ColumnDef> thriftDefs)
+ public static Map<byte[], ColumnDefinition> fromColumnDef(List<ColumnDef> thriftDefs) throws ConfigurationException
{
if (thriftDefs == null)
return Collections.emptyMap();
Modified: cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java?rev=960772&r1=960771&r2=960772&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/config/DatabaseDescriptor.java Tue Jul 6 03:58:38 2010
@@ -46,7 +46,6 @@ import org.apache.cassandra.dht.IPartiti
import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.locator.AbstractReplicationStrategy;
import org.apache.cassandra.locator.IEndpointSnitch;
-import org.apache.cassandra.service.ColumnValidator;
import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.Pair;
@@ -1081,8 +1080,8 @@ public class DatabaseDescriptor
return conf.hinted_handoff_enabled;
}
- public static ColumnValidator getColumnValidator(String keyspace, String cf, byte[] column)
+ public static AbstractType getValueValidator(String keyspace, String cf, byte[] column)
{
- return getCFMetaData(keyspace, cf).getColumnValidator(column);
+ return getCFMetaData(keyspace, cf).getValueValidator(column);
}
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/marshal/AbstractType.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/marshal/AbstractType.java?rev=960772&r1=960771&r2=960772&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/marshal/AbstractType.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/marshal/AbstractType.java Tue Jul 6 03:58:38 2010
@@ -86,12 +86,4 @@ public abstract class AbstractType imple
}
return builder.toString();
}
-
- public final boolean equals(Object obj)
- {
- if (obj == null)
- return false;
- else
- return obj.getClass().getName().equals(getClass().getName());
- }
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java?rev=960772&r1=960771&r2=960772&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java Tue Jul 6 03:58:38 2010
@@ -34,7 +34,6 @@ import org.apache.cassandra.dht.IPartiti
import org.apache.cassandra.dht.RandomPartitioner;
import org.apache.cassandra.dht.Token;
import org.apache.cassandra.locator.DatacenterShardStrategy;
-import org.apache.cassandra.service.ColumnValidator;
import org.apache.cassandra.service.StorageService;
import org.apache.cassandra.utils.FBUtilities;
@@ -52,7 +51,7 @@ public class ThriftValidation
if (key.length > FBUtilities.MAX_UNSIGNED_SHORT)
{
throw new InvalidRequestException("Key length of " + key.length +
- " is longer than maximum of " + FBUtilities.MAX_UNSIGNED_SHORT);
+ " is longer than maximum of " + FBUtilities.MAX_UNSIGNED_SHORT);
}
}
@@ -148,7 +147,7 @@ public class ThriftValidation
}
private static void validateColumns(String keyspace, String columnFamilyName, byte[] superColumnName, Iterable<byte[]> column_names)
- throws InvalidRequestException
+ throws InvalidRequestException
{
if (superColumnName != null)
{
@@ -282,7 +281,7 @@ public class ThriftValidation
if (del.predicate.slice_range != null)
throw new InvalidRequestException("Deletion does not yet support SliceRange predicates.");
}
-
+
if (ColumnFamilyType.Standard == DatabaseDescriptor.getColumnFamilyType(keyspace, cfName) && del.super_column != null)
{
String msg = String.format("deletion of super_column is not possible on a standard ColumnFamily (KeySpace=%s ColumnFamily=%s Deletion=%s)", keyspace, cfName, del);
@@ -302,33 +301,27 @@ public class ThriftValidation
validateColumns(keyspace, cfName, scName, predicate.column_names);
}
- public static void runExternalColumnVerifier(String keyspace, ColumnParent column_parent, Column column) throws InvalidRequestException
+ public static void validateColumn(String keyspace, ColumnParent column_parent, Column column) throws InvalidRequestException
{
+ validateTtl(column);
+ validateColumns(keyspace, column_parent, Arrays.asList(column.name));
try
{
- ColumnValidator validator = null;
- validator = DatabaseDescriptor.getColumnValidator(keyspace, column_parent.column_family, column.name);
+ AbstractType validator = DatabaseDescriptor.getValueValidator(keyspace, column_parent.column_family, column.name);
if (validator != null)
- validator.validate(keyspace, column_parent, column);
+ validator.validate(column.value);
}
catch (MarshalException me)
{
- String msg = String.format("[%s][%s][md5(byte[])=%s] = [md5(byte[])=%s] failed validation (%s)",
- keyspace, column_parent.getColumn_family(),
- FBUtilities.hexHash("MD5", column.name),
- FBUtilities.hexHash("MD5", column.value),
- me.getMessage());
- throw new InvalidRequestException(msg); //why doesn't IRE except a caused_by argument?
+ throw new InvalidRequestException(String.format("[%s][%s][%s] = [%s] failed validation (%s)",
+ keyspace,
+ column_parent.getColumn_family(),
+ FBUtilities.bytesToHex(column.name),
+ FBUtilities.bytesToHex(column.value),
+ me.getMessage()));
}
}
- public static void validateColumn(String keyspace, ColumnParent column_parent, Column column) throws InvalidRequestException
- {
- validateTtl(column);
- validateColumns(keyspace, column_parent, Arrays.asList(column.name));
- runExternalColumnVerifier(keyspace, column_parent, column);
- }
-
public static void validatePredicate(String keyspace, ColumnParent column_parent, SlicePredicate predicate)
throws InvalidRequestException
{
Modified: cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java?rev=960772&r1=960771&r2=960772&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/utils/FBUtilities.java Tue Jul 6 03:58:38 2010
@@ -237,11 +237,6 @@ public class FBUtilities
return hash.abs();
}
- public static String hexHash(String type, byte[]... data)
- {
- return bytesToHex(hash(type, data));
- }
-
public static byte[] hash(String type, byte[]... data)
{
byte[] result;
Modified: cassandra/trunk/test/system/test_thrift_server.py
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/system/test_thrift_server.py?rev=960772&r1=960771&r2=960772&view=diff
==============================================================================
--- cassandra/trunk/test/system/test_thrift_server.py (original)
+++ cassandra/trunk/test/system/test_thrift_server.py Tue Jul 6 03:58:38 2010
@@ -1093,41 +1093,23 @@ class TestMutations(ThriftTester):
def test_column_validators(self):
ks = 'Keyspace1'
_set_keyspace(ks)
- cd = ColumnDef('col', 'org.apache.cassandra.service.ExampleColumnValidator', None, None)
+ cd = ColumnDef('col', 'LongType', None, None)
cf = CfDef('Keyspace1', 'ValidatorColumnFamily', column_metadata=[cd])
client.system_add_column_family(cf)
dks = client.describe_keyspace(ks)
assert 'ValidatorColumnFamily' in dks
cp = ColumnParent('ValidatorColumnFamily')
- col0 = Column('col', 'valuegood', Clock(0))
- col1 = Column('col', 'valuebad', Clock(0))
+ col0 = Column('col', _i64(42), Clock(0))
+ col1 = Column('col', "ceci n'est pas 64bit", Clock(0))
client.insert('key0', cp, col0, ConsistencyLevel.ONE)
e = _expect_exception(lambda: client.insert('key1', cp, col1, ConsistencyLevel.ONE), InvalidRequestException)
assert e.why.find("failed validation") >= 0
- assert e.why.find("column.value.length is even") >= 0
-
- def test_super_column_validators(self):
- ks = 'Keyspace1'
- _set_keyspace(ks)
- cd = ColumnDef('col', 'org.apache.cassandra.service.ExampleColumnValidator', None, None)
- cf = CfDef('Keyspace1', 'SuperValidatorColumnFamily', 'Super', column_metadata=[cd])
- client.system_add_column_family(cf)
- dks = client.describe_keyspace('Keyspace1')
- assert 'SuperValidatorColumnFamily' in dks
-
- cp = ColumnParent('SuperValidatorColumnFamily', 'a subcolumn')
- col0 = Column('col', 'valuegood', Clock(0))
- col1 = Column('col', 'valuebad', Clock(0))
- client.insert('key0', cp, col0, ConsistencyLevel.ONE)
- e = _expect_exception(lambda: client.insert('key1', cp, col1, ConsistencyLevel.ONE), InvalidRequestException)
- assert e.why.find("failed validation") >= 0
- assert e.why.find("column.value.length is even") >= 0
def test_system_column_family_operations(self):
_set_keyspace('Keyspace1')
# create
- cd = ColumnDef('ValidationColumn', 'randomclass', None, None)
+ cd = ColumnDef('ValidationColumn', 'BytesType', None, None)
newcf = CfDef('Keyspace1', 'NewColumnFamily', column_metadata=[cd])
client.system_add_column_family(newcf)
ks1 = client.describe_keyspace('Keyspace1')
@@ -1150,7 +1132,7 @@ class TestMutations(ThriftTester):
_set_keyspace('Keyspace1')
# create
- cd = ColumnDef('ValidationColumn', 'randomclass', None, None)
+ cd = ColumnDef('ValidationColumn', 'BytesType', None, None)
newcf = CfDef('Keyspace1', 'NewSuperColumnFamily', 'Super', column_metadata=[cd])
client.system_add_column_family(newcf)
ks1 = client.describe_keyspace('Keyspace1')
Modified: cassandra/trunk/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java?rev=960772&r1=960771&r2=960772&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/config/ColumnDefinitionTest.java Tue Jul 6 03:58:38 2010
@@ -7,17 +7,15 @@ public class ColumnDefinitionTest
@Test
public void testSerializeDeserialize() throws Exception
{
- ColumnDefinition cd0 = new ColumnDefinition(
- "TestColumnDefinitionName0".getBytes("UTF8"),
- "org.apache.cassandra.config.RandomClass0",
- "random index name 0",
- "random index type 0");
+ ColumnDefinition cd0 = new ColumnDefinition("TestColumnDefinitionName0".getBytes("UTF8"),
+ "BytesType",
+ "random index type 0",
+ "random index name 0");
- ColumnDefinition cd1 = new ColumnDefinition(
- "TestColumnDefinition1".getBytes("UTF8"),
- "org.apache.cassandra.config.RandomClass1",
- null,
- null);
+ ColumnDefinition cd1 = new ColumnDefinition("TestColumnDefinition1".getBytes("UTF8"),
+ "LongType",
+ null,
+ null);
testSerializeDeserialize(cd0);
testSerializeDeserialize(cd1);
Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java?rev=960772&r1=960771&r2=960772&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/db/DefsTest.java Tue Jul 6 03:58:38 2010
@@ -169,43 +169,6 @@ public class DefsTest extends CleanupHel
}
@Test
- public void testCanAddColumnDefinitionsInColumnMetaData() throws Exception
- {
- String ks = "Keyspace1";
- String cf = "ValidatorColumnFamily";
- KSMetaData original = DatabaseDescriptor.getTableDefinition(ks);
-
- Map<byte[], ColumnDefinition> column_metadata = new TreeMap<byte[], ColumnDefinition>(FBUtilities.byteArrayComparator);
-
- ColumnDefinition cd0 = new ColumnDefinition();
- cd0.name = "TestColumn1".getBytes("UTF8");
- cd0.validation_class = "random class one";
- cd0.index_name = null;
- cd0.index_type = null;
-
- ColumnDefinition cd1 = new ColumnDefinition();
- cd1.name = "*".getBytes("UTF8");
- cd1.validation_class = "random class two";
- cd1.index_name = "some name";
- cd1.index_type = "some type";
-
- column_metadata.put(cd0.name, cd0);
- column_metadata.put(cd1.name, cd1);
-
- CFMetaData newCf = new CFMetaData(original.name, cf, ColumnFamilyType.Standard, ClockType.Timestamp, UTF8Type.instance, null, new TimestampReconciler(), "A New Column Family", 0, false, 1.0, 0, column_metadata);
- assert !DatabaseDescriptor.getTableDefinition(ks).cfMetaData().containsKey(newCf.cfName);
- new AddColumnFamily(newCf).apply();
-
- assert DatabaseDescriptor.getTableDefinition(ks).cfMetaData().containsKey(newCf.cfName);
- assert DatabaseDescriptor.getTableDefinition(ks).cfMetaData().get(newCf.cfName).equals(newCf);
-
- ColumnFamilyStore store = Table.open(ks).getColumnFamilyStore(cf);
- assert store != null;
- store.forceBlockingFlush();
- }
-
-
- @Test
public void dropCf() throws ConfigurationException, IOException, ExecutionException, InterruptedException
{
DecoratedKey dk = Util.dk("dropCf");