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/11/09 02:54:45 UTC
svn commit: r1032809 - in /cassandra/trunk: ./ conf/
interface/thrift/gen-java/org/apache/cassandra/thrift/
src/java/org/apache/cassandra/cli/ src/java/org/apache/cassandra/db/
src/java/org/apache/cassandra/db/marshal/
src/java/org/apache/cassandra/dht...
Author: jbellis
Date: Tue Nov 9 01:54:44 2010
New Revision: 1032809
URL: http://svn.apache.org/viewvc?rev=1032809&view=rev
Log:
merge from 0.7
Modified:
cassandra/trunk/ (props changed)
cassandra/trunk/CHANGES.txt
cassandra/trunk/conf/cassandra.yaml
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java (props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java (props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java (props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java (props changed)
cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java (props changed)
cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java
cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java
cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
cassandra/trunk/src/java/org/apache/cassandra/db/marshal/LocalByPartionerType.java
cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractBounds.java
cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java
cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java
cassandra/trunk/src/java/org/apache/cassandra/io/util/FileUtils.java
cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java
cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java
cassandra/trunk/test/unit/org/apache/cassandra/cli/CliTest.java
cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
cassandra/trunk/test/unit/org/apache/cassandra/service/StorageProxyTest.java
Propchange: cassandra/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 9 01:54:44 2010
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6:922689-1030284
-/cassandra/branches/cassandra-0.7:1026517-1030448
+/cassandra/branches/cassandra-0.7:1026517-1032807
/incubator/cassandra/branches/cassandra-0.3:774578-796573
/incubator/cassandra/branches/cassandra-0.4:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5:888872-915439
Modified: cassandra/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Tue Nov 9 01:54:44 2010
@@ -15,6 +15,10 @@ dev
* add friendlier error for UnknownHostException on startup (CASSANDRA-1697)
* include jna dependency in RPM package (CASSANDRA-1690)
* add --skip-keys option to stress.py (CASSANDRA-1696)
+ * improve cli handling of non-string column names (CASSANDRA-1701)
+ * enable skipping bad rows on LazilyCompacted path (CASSANDRA-1702)
+ * r/m extra subcomparator line in cli keyspaces output (CASSANDRA-1712)
+ * add read repair chance to cli "show keyspaces"
0.7.0-beta3
Modified: cassandra/trunk/conf/cassandra.yaml
URL: http://svn.apache.org/viewvc/cassandra/trunk/conf/cassandra.yaml?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/conf/cassandra.yaml (original)
+++ cassandra/trunk/conf/cassandra.yaml Tue Nov 9 01:54:44 2010
@@ -216,7 +216,9 @@ dynamic_snitch_reset_interval_in_ms: 600
# 'pinning' of replicas to hosts in order to increase cache capacity.
# The badness threshold will control how much worse the pinned host has to be
# before the dynamic snitch will prefer other replicas over it. This is
-# expressed as a double which represents a percentage.
+# expressed as a double which represents a percentage. Thus, a value of
+# 0.2 means Cassandra would continue to prefer the static snitch values
+# until the pinned host was 20% worse than the fastest.
dynamic_snitch_badness_threshold: 0.0
# request_scheduler -- Set this to a class that implements
Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 9 01:54:44 2010
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:922689-1030284
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026517-1030448
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Cassandra.java:1026517-1032807
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/Cassandra.java:774578-796573
/incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/Cassandra.java:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/Cassandra.java:888872-903502
Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 9 01:54:44 2010
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:922689-1030284
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026517-1030448
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/Column.java:1026517-1032807
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/column_t.java:774578-792198
/incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/Column.java:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/Column.java:888872-903502
Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 9 01:54:44 2010
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:922689-1030284
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026517-1030448
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/InvalidRequestException.java:1026517-1032807
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:774578-796573
/incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/InvalidRequestException.java:888872-903502
Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 9 01:54:44 2010
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:922689-1030284
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026517-1030448
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/NotFoundException.java:1026517-1032807
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:774578-796573
/incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/NotFoundException.java:888872-903502
Propchange: cassandra/trunk/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Nov 9 01:54:44 2010
@@ -1,5 +1,5 @@
/cassandra/branches/cassandra-0.6/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:922689-1030284
-/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026517-1030448
+/cassandra/branches/cassandra-0.7/interface/thrift/gen-java/org/apache/cassandra/thrift/SuperColumn.java:1026517-1032807
/incubator/cassandra/branches/cassandra-0.3/interface/gen-java/org/apache/cassandra/service/superColumn_t.java:774578-792198
/incubator/cassandra/branches/cassandra-0.4/interface/gen-java/org/apache/cassandra/service/SuperColumn.java:810145-834239,834349-834350
/incubator/cassandra/branches/cassandra-0.5/interface/gen-java/org/apache/cassandra/service/SuperColumn.java:888872-903502
Modified: cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/cli/CliClient.java Tue Nov 9 01:54:44 2010
@@ -18,7 +18,7 @@
package org.apache.cassandra.cli;
import com.google.common.base.Charsets;
-import org.antlr.runtime.tree.CommonTree;
+
import org.antlr.runtime.tree.Tree;
import org.apache.cassandra.auth.SimpleAuthenticator;
import org.apache.cassandra.config.ConfigurationException;
@@ -27,6 +27,7 @@ import org.apache.cassandra.thrift.*;
import org.apache.cassandra.utils.ByteBufferUtil;
import org.apache.cassandra.utils.FBUtilities;
import org.apache.cassandra.utils.UUIDGen;
+import org.apache.thrift.TBaseHelper;
import org.apache.thrift.TException;
import java.math.BigInteger;
@@ -226,7 +227,7 @@ public class CliClient extends CliUserHe
if (columnSpecCnt != 0)
{
- byte[] superColumn = CliCompiler.getColumn(columnFamilySpec, 0).getBytes(Charsets.UTF_8);
+ byte[] superColumn = columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), columnFamily);
colParent = new ColumnParent(columnFamily).setSuper_column(superColumn);
}
@@ -251,7 +252,8 @@ public class CliClient extends CliUserHe
byte[] superColumnName = null;
byte[] columnName = null;
- boolean isSuper = getCfDef(columnFamily).column_type.equals("Super");
+ CfDef cfDef = getCfDef(columnFamily);
+ boolean isSuper = cfDef.column_type.equals("Super");
if ((columnSpecCnt < 0) || (columnSpecCnt > 2))
{
@@ -263,15 +265,15 @@ public class CliClient extends CliUserHe
{
// table.cf['key']['column']
if (isSuper)
- superColumnName = CliCompiler.getColumn(columnFamilySpec, 0).getBytes(Charsets.UTF_8);
+ superColumnName = columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef);
else
- columnName = CliCompiler.getColumn(columnFamilySpec, 0).getBytes(Charsets.UTF_8);
+ columnName = columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef);
}
else if (columnSpecCnt == 2)
{
// table.cf['key']['column']['column']
- superColumnName = CliCompiler.getColumn(columnFamilySpec, 0).getBytes(Charsets.UTF_8);
- columnName = CliCompiler.getColumn(columnFamilySpec, 1).getBytes(Charsets.UTF_8);
+ superColumnName = columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef);
+ columnName = subColumnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 1), cfDef);
}
ColumnPath path = new ColumnPath(columnFamily);
@@ -367,11 +369,11 @@ public class CliClient extends CliUserHe
String key = CliCompiler.getKey(columnFamilySpec);
String columnFamily = CliCompiler.getColumnFamily(columnFamilySpec);
int columnSpecCnt = CliCompiler.numColumnSpecifiers(columnFamilySpec);
- CfDef columnFamilyDef = getCfDef(columnFamily);
- boolean isSuper = columnFamilyDef.comparator_type.equals("Super");
+ CfDef cfDef = getCfDef(columnFamily);
+ boolean isSuper = cfDef.comparator_type.equals("Super");
byte[] superColumnName = null;
- String columnName;
+ ByteBuffer columnName;
// table.cf['key'] -- row slice
if (columnSpecCnt == 0)
@@ -384,20 +386,20 @@ public class CliClient extends CliUserHe
{
if (isSuper)
{
- superColumnName = CliCompiler.getColumn(columnFamilySpec, 0).getBytes(Charsets.UTF_8);
+ superColumnName = columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef);
doSlice(keySpace, key, columnFamily, superColumnName);
return;
}
else
{
- columnName = CliCompiler.getColumn(columnFamilySpec, 0);
+ columnName = columnNameAsBytes(CliCompiler.getColumn(columnFamilySpec, 0), cfDef);
}
}
// table.cf['key']['column']['column'] -- get of a sub-column
else if (columnSpecCnt == 2)
{
- superColumnName = CliCompiler.getColumn(columnFamilySpec, 0).getBytes(Charsets.UTF_8);
- columnName = CliCompiler.getColumn(columnFamilySpec, 1);
+ superColumnName = columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), cfDef);
+ columnName = subColumnNameAsBytes(CliCompiler.getColumn(columnFamilySpec, 1), cfDef);
}
// The parser groks an arbitrary number of these so it is possible to get here.
else
@@ -406,14 +408,22 @@ public class CliClient extends CliUserHe
return;
}
- ByteBuffer columnNameInBytes = columnNameAsBytes(columnName, columnFamily);
- AbstractType validator = getValidatorForValue(columnFamilyDef, columnNameInBytes.array());
+ AbstractType validator = getValidatorForValue(cfDef, TBaseHelper.byteBufferToByteArray(columnName));
// Perform a get()
ColumnPath path = new ColumnPath(columnFamily);
if(superColumnName != null) path.setSuper_column(superColumnName);
- path.setColumn(columnNameInBytes);
- Column column = thriftClient.get(ByteBuffer.wrap(key.getBytes(Charsets.UTF_8)), path, ConsistencyLevel.ONE).column;
+ path.setColumn(columnName);
+ Column column;
+ try
+ {
+ column = thriftClient.get(ByteBuffer.wrap(key.getBytes(Charsets.UTF_8)), path, ConsistencyLevel.ONE).column;
+ }
+ catch (NotFoundException e)
+ {
+ sessionState.out.println("Value was not found");
+ return;
+ }
byte[] columnValue = column.getValue();
String valueAsString;
@@ -433,7 +443,7 @@ public class CliClient extends CliUserHe
// setting value for output
valueAsString = valueValidator.getString(ByteBuffer.wrap(columnValue));
// updating column value validator class
- updateColumnMetaData(columnFamilyDef, columnNameInBytes, valueValidator.getClass().getName());
+ updateColumnMetaData(cfDef, columnName, valueValidator.getClass().getName());
}
else
{
@@ -556,7 +566,7 @@ public class CliClient extends CliUserHe
Tree valueTree = statement.getChild(1);
byte[] superColumnName = null;
- String columnName;
+ ByteBuffer columnName;
// table.cf['key']
if (columnSpecCnt == 0)
@@ -568,7 +578,7 @@ public class CliClient extends CliUserHe
else if (columnSpecCnt == 1)
{
// get the column name
- columnName = CliCompiler.getColumn(columnFamilySpec, 0);
+ columnName = columnNameAsBytes(CliCompiler.getColumn(columnFamilySpec, 0), columnFamily);
}
// table.cf['key']['super_column']['column'] = 'value'
else
@@ -576,21 +586,20 @@ public class CliClient extends CliUserHe
assert (columnSpecCnt == 2) : "serious parsing error (this is a bug).";
// get the super column and column names
- superColumnName = CliCompiler.getColumn(columnFamilySpec, 0).getBytes(Charsets.UTF_8);
- columnName = CliCompiler.getColumn(columnFamilySpec, 1);
+ superColumnName = columnNameAsByteArray(CliCompiler.getColumn(columnFamilySpec, 0), columnFamily);
+ columnName = subColumnNameAsBytes(CliCompiler.getColumn(columnFamilySpec, 1), columnFamily);
}
- ByteBuffer columnNameInBytes = columnNameAsBytes(columnName, columnFamily);
ByteBuffer columnValueInBytes;
switch (valueTree.getType())
{
case CliParser.FUNCTION_CALL:
- columnValueInBytes = convertValueByFunction(valueTree, getCfDef(columnFamily), columnNameInBytes, true);
+ columnValueInBytes = convertValueByFunction(valueTree, getCfDef(columnFamily), columnName, true);
break;
default:
- columnValueInBytes = columnValueAsBytes(columnNameInBytes, columnFamily, value);
+ columnValueInBytes = columnValueAsBytes(columnName, columnFamily, value);
}
ColumnParent parent = new ColumnParent(columnFamily);
@@ -599,7 +608,7 @@ public class CliClient extends CliUserHe
// do the insert
thriftClient.insert(ByteBuffer.wrap(key.getBytes(Charsets.UTF_8)), parent,
- new Column(columnNameInBytes, columnValueInBytes, FBUtilities.timestampMicros()), ConsistencyLevel.ONE);
+ new Column(columnName, columnValueInBytes, FBUtilities.timestampMicros()), ConsistencyLevel.ONE);
sessionState.out.println("Value inserted.");
}
@@ -810,7 +819,7 @@ public class CliClient extends CliUserHe
Tree arrayOfMetaAttributes = statement.getChild(i + 1);
if (!arrayOfMetaAttributes.getText().equals("ARRAY"))
throw new RuntimeException("'column_metadata' format - [{ k:v, k:v, ..}, { ... }, ...]");
- cfDef.setColumn_metadata(getCFColumnMetaFromTree(arrayOfMetaAttributes));
+ cfDef.setColumn_metadata(getCFColumnMetaFromTree(cfDef, arrayOfMetaAttributes));
break;
case MEMTABLE_OPERATIONS:
cfDef.setMemtable_operations_in_millions(Double.parseDouble(mValue));
@@ -1121,18 +1130,13 @@ public class CliClient extends CliUserHe
}
sessionState.out.printf(" Columns sorted by: %s%s\n", cf_def.comparator_type, cf_def.column_type.equals("Super") ? "/" + cf_def.subcomparator_type : "");
-
- if (cf_def.subcomparator_type != null)
- {
- sessionState.out.println(" Subcolumns sorted by: " + cf_def.comparator_type);
- }
-
sessionState.out.printf(" Row cache size / save period: %s/%s\n", cf_def.row_cache_size, cf_def.row_cache_save_period_in_seconds);
sessionState.out.printf(" Key cache size / save period: %s/%s\n", cf_def.key_cache_size, cf_def.key_cache_save_period_in_seconds);
sessionState.out.printf(" Memtable thresholds: %s/%s/%s\n",
cf_def.memtable_operations_in_millions, cf_def.memtable_throughput_in_mb, cf_def.memtable_flush_after_mins);
sessionState.out.printf(" GC grace seconds: %s\n", cf_def.gc_grace_seconds);
sessionState.out.printf(" Compaction min/max thresholds: %s/%s\n", cf_def.min_compaction_threshold, cf_def.max_compaction_threshold);
+ sessionState.out.printf(" Read repair chance: %s\n", cf_def.read_repair_chance);
if (cf_def.getColumn_metadataSize() != 0)
{
@@ -1145,6 +1149,18 @@ public class CliClient extends CliUserHe
for (ColumnDef columnDef : cf_def.getColumn_metadata())
{
String columnName = columnNameValidator.getString(columnDef.name);
+ if (columnNameValidator instanceof BytesType)
+ {
+ try
+ {
+ String columnString = UTF8Type.instance.getString(columnDef.name);
+ columnName = columnString + " (" + columnName + ")";
+ }
+ catch (MarshalException e)
+ {
+ // guess it wasn't a utf8 column name after all
+ }
+ }
sessionState.out.println(leftSpace + " Column Name: " + columnName);
sessionState.out.println(columnLeftSpace + "Validation Class: " + columnDef.getValidation_class());
@@ -1244,12 +1260,13 @@ public class CliClient extends CliUserHe
/**
* Used to parse meta tree and compile meta attributes into List<ColumnDef>
+ * @param cfDef
* @param meta (Tree representing Array of the hashes with metadata attributes)
* @return List<ColumnDef> List of the ColumnDef's
*
* meta is in following format - ^(ARRAY ^(HASH ^(PAIR .. ..) ^(PAIR .. ..)) ^(HASH ...))
*/
- private List<ColumnDef> getCFColumnMetaFromTree(Tree meta)
+ private List<ColumnDef> getCFColumnMetaFromTree(CfDef cfDef, Tree meta)
{
// this list will be returned
List<ColumnDef> columnDefinitions = new ArrayList<ColumnDef>();
@@ -1273,7 +1290,10 @@ public class CliClient extends CliUserHe
if (metaKey.equals("column_name"))
{
- columnDefinition.setName(metaVal.getBytes(Charsets.UTF_8));
+ if (cfDef.column_type.equals("Super"))
+ columnDefinition.setName(subColumnNameAsByteArray(metaVal, cfDef));
+ else
+ columnDefinition.setName(columnNameAsByteArray(metaVal, cfDef));
}
else if (metaKey.equals("validation_class"))
{
@@ -1391,20 +1411,94 @@ public class CliClient extends CliUserHe
* Converts column name into byte[] according to comparator type
* @param column - column name from parser
* @param columnFamily - column family name from parser
- * @return ByteBuffer - array of bytes in which column name was converted according to comparator type
- * @throws NoSuchFieldException - raised from getFormatTypeForColumn call
- * @throws InstantiationException - raised from getFormatTypeForColumn call
- * @throws IllegalAccessException - raised from getFormatTypeForColumn call
+ * @return ByteBuffer - bytes into which column name was converted according to comparator type
*/
- private ByteBuffer columnNameAsBytes(String column, String columnFamily) throws NoSuchFieldException, InstantiationException, IllegalAccessException
+ private ByteBuffer columnNameAsBytes(String column, String columnFamily)
{
- CfDef columnFamilyDef = getCfDef(columnFamily);
- String comparatorClass = columnFamilyDef.comparator_type;
-
+ CfDef columnFamilyDef = getCfDef(columnFamily);
+ return columnNameAsBytes(column, columnFamilyDef);
+ }
+ /**
+ * Converts column name into byte[] according to comparator type
+ * @param column - column name from parser
+ * @param columnFamilyDef - column family from parser
+ * @return ByteBuffer bytes - into which column name was converted according to comparator type
+ */
+ private ByteBuffer columnNameAsBytes(String column, CfDef columnFamilyDef)
+ {
+ String comparatorClass = columnFamilyDef.comparator_type;
return getBytesAccordingToType(column, getFormatTypeForColumn(comparatorClass));
}
/**
+ * Converts column name into byte[] according to comparator type
+ * @param column - column name from parser
+ * @param columnFamily - column family name from parser
+ * @return bytes[] - into which column name was converted according to comparator type
+ */
+ private byte[] columnNameAsByteArray(String column, String columnFamily)
+ {
+ return TBaseHelper.byteBufferToByteArray(columnNameAsBytes(column, columnFamily));
+ }
+
+ /**
+ * Converts column name into byte[] according to comparator type
+ * @param column - column name from parser
+ * @param columnFamilyDef - column family from parser
+ * @return bytes[] - into which column name was converted according to comparator type
+ */
+ private byte[] columnNameAsByteArray(String column, CfDef cfDef)
+ {
+ return TBaseHelper.byteBufferToByteArray(columnNameAsBytes(column, cfDef));
+ }
+
+ /**
+ * Converts sub-column name into ByteBuffer according to comparator type
+ * @param superColumn - sub-column name from parser
+ * @param columnFamily - column family name from parser
+ * @return ByteBuffer bytes - into which column name was converted according to comparator type
+ */
+ private ByteBuffer subColumnNameAsBytes(String superColumn, String columnFamily)
+ {
+ CfDef columnFamilyDef = getCfDef(columnFamily);
+ return subColumnNameAsBytes(superColumn, columnFamilyDef);
+ }
+
+ /**
+ * Converts column name into ByteBuffer according to comparator type
+ * @param superColumn - sub-column name from parser
+ * @param columnFamilyDef - column family from parser
+ * @return ByteBuffer bytes - into which column name was converted according to comparator type
+ */
+ private ByteBuffer subColumnNameAsBytes(String superColumn, CfDef columnFamilyDef)
+ {
+ String comparatorClass = columnFamilyDef.subcomparator_type;
+ return getBytesAccordingToType(superColumn, getFormatTypeForColumn(comparatorClass));
+ }
+
+ /**
+ * Converts column name into byte[] according to comparator type
+ * @param superColumn - sub-column name from parser
+ * @param columnFamily - column family name from parser
+ * @return bytes[] - into which column name was converted according to comparator type
+ */
+ private byte[] subColumnNameAsByteArray(String superColumn, String columnFamily)
+ {
+ return TBaseHelper.byteBufferToByteArray(subColumnNameAsBytes(superColumn, columnFamily));
+ }
+
+ /**
+ * Converts sub-column name into byte[] according to comparator type
+ * @param superColumn - sub-column name from parser
+ * @param cfDef - column family from parser
+ * @return bytes[] - into which column name was converted according to comparator type
+ */
+ private byte[] subColumnNameAsByteArray(String superColumn, CfDef cfDef)
+ {
+ return TBaseHelper.byteBufferToByteArray(subColumnNameAsBytes(superColumn, cfDef));
+ }
+
+ /**
* Converts column value into byte[] according to validation class
* @param columnName - column name to which value belongs
* @param columnFamilyName - column family name
@@ -1657,7 +1751,7 @@ public class CliClient extends CliUserHe
sessionState.out.printf("\n%d Row%s Returned.\n", slices.size(), (slices.size() > 1 ? "s" : ""));
}
- // returns super column name in human-readable format
+ // returnsub-columnmn name in human-readable format
private String formatSuperColumnName(String keyspace, String columnFamily, SuperColumn column)
throws NotFoundException, TException, IllegalAccessException, InstantiationException, NoSuchFieldException
{
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java Tue Nov 9 01:54:44 2010
@@ -355,7 +355,7 @@ public class ColumnFamily implements ICo
{
StringBuilder sb = new StringBuilder("ColumnFamily(");
CFMetaData cfm = metadata();
- sb.append(cfm == null ? "-deleted-" : cfm.cfName);
+ sb.append(cfm == null ? "<anonymous>" : cfm.cfName);
if (isMarkedForDelete())
sb.append(" -deleted at " + getMarkedForDeleteAt() + "-");
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Tue Nov 9 01:54:44 2010
@@ -1260,6 +1260,8 @@ public class ColumnFamilyStore implement
// TODO: allow merge join instead of just one index + loop
IndexExpression primary = highestSelectivityPredicate(clause);
ColumnFamilyStore indexCFS = getIndexedColumnFamilyStore(primary.column_name);
+ if (logger.isDebugEnabled())
+ logger.debug("Primary scan clause is " + getComparator().getString(primary.column_name));
assert indexCFS != null;
DecoratedKey indexKey = indexCFS.partitioner.decorateKey(primary.value);
@@ -1275,6 +1277,7 @@ public class ColumnFamilyStore implement
// otherwise, create an extraFilter to fetch by name the columns referenced by the additional expressions.
if (getMaxRowSize() < DatabaseDescriptor.getColumnIndexSize())
{
+ logger.debug("Expanding slice filter to entire row to cover additional expressions");
firstFilter = new SliceQueryFilter(FBUtilities.EMPTY_BYTE_BUFFER,
FBUtilities.EMPTY_BYTE_BUFFER,
((SliceQueryFilter) dataFilter).reversed,
@@ -1282,6 +1285,7 @@ public class ColumnFamilyStore implement
}
else
{
+ logger.debug("adding extraFilter to cover additional expressions");
SortedSet<ByteBuffer> columns = new TreeSet<ByteBuffer>(getComparator());
for (IndexExpression expr : clause.expressions)
{
@@ -1294,6 +1298,7 @@ public class ColumnFamilyStore implement
}
else
{
+ logger.debug("adding columns to firstFilter to cover additional expressions");
// just add in columns that are not part of the resultset
assert dataFilter instanceof NamesQueryFilter;
SortedSet<ByteBuffer> columns = new TreeSet<ByteBuffer>(getComparator());
@@ -1324,6 +1329,9 @@ public class ColumnFamilyStore implement
* so, we need to loop after starting with start_key, until we get to keys in the given `range`.
* But, if the calling StorageProxy is doing a good job estimating data from each range, the range
* should be pretty close to `start_key`. */
+ if (logger.isDebugEnabled())
+ logger.debug(String.format("Scanning index row %s:%s starting with %s",
+ indexCFS.columnFamily, indexKey, indexCFS.getComparator().getString(startKey)));
QueryFilter indexFilter = QueryFilter.getSliceFilter(indexKey,
new QueryPath(indexCFS.getColumnFamilyName()),
startKey,
@@ -1331,6 +1339,7 @@ public class ColumnFamilyStore implement
false,
clause.count);
ColumnFamily indexRow = indexCFS.getColumnFamily(indexFilter);
+ logger.debug("fetched {}", indexRow);
if (indexRow == null)
break;
@@ -1350,6 +1359,7 @@ public class ColumnFamilyStore implement
// get the row columns requested, and additional columns for the expressions if necessary
ColumnFamily data = getColumnFamily(new QueryFilter(dk, path, firstFilter));
+ logger.debug("fetched data row {}", data);
if (extraFilter != null)
{
// we might have gotten the expression columns in with the main data slice, but
@@ -1367,6 +1377,7 @@ public class ColumnFamilyStore implement
if (satisfies(data, clause, primary))
{
+ logger.debug("row {} satisfies all clauses", data);
// cut the resultset back to what was requested, if necessary
if (firstFilter != dataFilter)
{
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ColumnSerializer.java Tue Nov 9 01:54:44 2010
@@ -64,6 +64,9 @@ public class ColumnSerializer implements
public Column deserialize(DataInput dis) throws IOException
{
ByteBuffer name = FBUtilities.readShortByteArray(dis);
+ if (name.remaining() <= 0)
+ throw new CorruptColumnException("invalid column name length " + name.remaining());
+
int b = dis.readUnsignedByte();
if ((b & EXPIRATION_MASK) != 0)
{
@@ -97,4 +100,12 @@ public class ColumnSerializer implements
}
}
}
+
+ private static class CorruptColumnException extends IOException
+ {
+ public CorruptColumnException(String s)
+ {
+ super(s);
+ }
+ }
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/CompactionManager.java Tue Nov 9 01:54:44 2010
@@ -272,16 +272,21 @@ public class CompactionManager implement
writer = new SSTableWriter(newFilename, expectedBloomFilterSize, cfs.metadata, cfs.partitioner);
while (nni.hasNext())
{
- AbstractCompactedRow row = nni.next();
+ writer.mark();
try
{
+ AbstractCompactedRow row = nni.next();
writer.append(row);
}
- catch (IOException ex)
+ catch (Exception e)
+ {
+ logger.error("non-fatal error during compaction", e);
+ writer.reset();
+ }
+ catch (IOError e)
{
- writer.abort();
- // rethrow the exception so that caller knows compaction failed.
- throw ex;
+ logger.error("non-fatal error during compaction", e);
+ writer.reset();
}
totalkeysWritten++;
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Table.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Table.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Table.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Table.java Tue Nov 9 01:54:44 2010
@@ -368,6 +368,8 @@ public class Table
public void apply(RowMutation mutation, Object serializedMutation, boolean writeCommitLog) throws IOException
{
List<Memtable> memtablesToFlush = Collections.emptyList();
+ if (logger.isDebugEnabled())
+ logger.debug("applying mutation of {}", FBUtilities.bytesToHex(mutation.key()));
// write the mutation to the commitlog and memtables
flusherLock.readLock().lock();
@@ -394,6 +396,8 @@ public class Table
if (mutatedIndexedColumns == null)
mutatedIndexedColumns = new TreeSet<ByteBuffer>();
mutatedIndexedColumns.add(column);
+ if (logger.isDebugEnabled())
+ logger.debug("mutating indexed column " + cf.getComparator().getString(column));
}
}
@@ -458,6 +462,8 @@ public class Table
IColumn resolvedColumn = resolved == null ? null : resolved.getColumn(oldColumn.name());
if (resolvedColumn != null && resolvedColumn.equals(oldColumn))
{
+ if (logger.isDebugEnabled())
+ logger.debug("ignoring obsolete mutation of " + cf.getComparator().getString(oldColumn.name()));
cf.remove(oldColumn.name());
mutatedIndexedColumns.remove(oldColumn.name());
oldIndexedColumns.remove(oldColumn.name());
@@ -501,6 +507,9 @@ public class Table
{
cfi.addColumn(new Column(key, FBUtilities.EMPTY_BYTE_BUFFER, column.timestamp()));
}
+ System.out.println(cfi.toString());
+ if (logger.isDebugEnabled())
+ logger.debug("applying index row {}:{}", valueKey, cfi);
Memtable fullMemtable = cfs.getIndexedColumnFamilyStore(columnName).apply(valueKey, cfi);
if (fullMemtable != null)
fullMemtables = addFullMemtable(fullMemtables, fullMemtable);
@@ -520,6 +529,8 @@ public class Table
ColumnFamily cfi = cfs.newIndexedColumnFamily(columnName);
cfi.addTombstone(key, localDeletionTime, column.timestamp());
Memtable fullMemtable = cfs.getIndexedColumnFamilyStore(columnName).apply(valueKey, cfi);
+ if (logger.isDebugEnabled())
+ logger.debug("applying index tombstones {}:{}", valueKey, cfi);
if (fullMemtable != null)
fullMemtables = addFullMemtable(fullMemtables, fullMemtable);
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/db/marshal/LocalByPartionerType.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/marshal/LocalByPartionerType.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/marshal/LocalByPartionerType.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/marshal/LocalByPartionerType.java Tue Nov 9 01:54:44 2010
@@ -23,6 +23,7 @@ import java.nio.ByteBuffer;
import org.apache.cassandra.dht.IPartitioner;
import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.utils.FBUtilities;
/** for sorting columns representing row keys in the row ordering as determined by a partitioner.
* Not intended for user-defined CFs, and will in fact error out if used with such. */
@@ -37,7 +38,7 @@ public class LocalByPartionerType<T exte
public String getString(ByteBuffer bytes)
{
- return null;
+ return FBUtilities.bytesToHex(bytes);
}
public int compare(ByteBuffer o1, ByteBuffer o2)
Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractBounds.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractBounds.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractBounds.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/AbstractBounds.java Tue Nov 9 01:54:44 2010
@@ -62,14 +62,15 @@ public abstract class AbstractBounds imp
* Given token T and AbstractBounds ?L,R], returns Pair(?L,T], ?T,R])
* (where ? means that the same type of Bounds is returned -- Range or Bounds -- as the original.)
* The original AbstractBounds must contain the token T.
- * If R==T, null is returned as the right element of the Pair.
+ * If the split would cause one of the left or right side to be empty, it will be null in the result pair.
*/
-
public Pair<AbstractBounds,AbstractBounds> split(Token token)
{
assert contains(token);
- Range remainder = token.equals(right) ? null : new Range(token, right);
- return new Pair<AbstractBounds,AbstractBounds>(createFrom(token), remainder);
+ AbstractBounds lb = createFrom(token);
+ // we contain this token, so only one of the left or right can be empty
+ AbstractBounds rb = lb != null && token.equals(right) ? null : new Range(token, right);
+ return new Pair<AbstractBounds,AbstractBounds>(lb, rb);
}
@Override
@@ -83,7 +84,7 @@ public abstract class AbstractBounds imp
public abstract boolean contains(Token start);
- /** @return A clone of this AbstractBounds with a new right Token. */
+ /** @return A clone of this AbstractBounds with a new right Token, or null if an identical range would be created. */
public abstract AbstractBounds createFrom(Token right);
public abstract List<AbstractBounds> unwrap();
Modified: cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/dht/Range.java Tue Nov 9 01:54:44 2010
@@ -195,6 +195,8 @@ public class Range extends AbstractBound
public AbstractBounds createFrom(Token token)
{
+ if (token.equals(left))
+ return null;
return new Range(left, token);
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java Tue Nov 9 01:54:44 2010
@@ -38,6 +38,7 @@ import org.apache.cassandra.dht.IPartiti
import org.apache.cassandra.io.AbstractCompactedRow;
import org.apache.cassandra.io.ICompactionInfo;
import org.apache.cassandra.io.util.BufferedRandomAccessFile;
+import org.apache.cassandra.io.util.FileMark;
import org.apache.cassandra.io.util.FileUtils;
import org.apache.cassandra.io.util.SegmentedFile;
import org.apache.cassandra.service.StorageService;
@@ -55,6 +56,7 @@ public class SSTableWriter extends SSTab
private SegmentedFile.Builder dbuilder;
private final BufferedRandomAccessFile dataFile;
private DecoratedKey lastWrittenKey;
+ private FileMark dataMark;
public SSTableWriter(String filename, long keyCount) throws IOException
{
@@ -99,6 +101,25 @@ public class SSTableWriter extends SSTab
}
}
+ public void mark()
+ {
+ dataMark = dataFile.mark();
+ iwriter.mark();
+ }
+
+ public void reset()
+ {
+ try
+ {
+ dataFile.reset(dataMark);
+ iwriter.reset();
+ }
+ catch (IOException e)
+ {
+ throw new IOError(e);
+ }
+ }
+
private long beforeAppend(DecoratedKey decoratedKey) throws IOException
{
if (decoratedKey == null)
@@ -121,8 +142,8 @@ public class SSTableWriter extends SSTab
if (logger.isTraceEnabled())
logger.trace("wrote " + decoratedKey + " at " + dataPosition);
- dbuilder.addPotentialBoundary(dataPosition);
iwriter.afterAppend(decoratedKey, dataPosition);
+ dbuilder.addPotentialBoundary(dataPosition);
}
public void append(AbstractCompactedRow row) throws IOException
@@ -176,7 +197,9 @@ public class SSTableWriter extends SSTab
iwriter.close();
// main data
+ long position = dataFile.getFilePointer();
dataFile.close(); // calls force
+ FileUtils.truncate(dataFile.getPath(), position);
// write sstable statistics
writeStatistics(descriptor, estimatedRowSize, estimatedColumnCount);
@@ -358,7 +381,8 @@ public class SSTableWriter extends SSTab
public final SegmentedFile.Builder builder;
public final IndexSummary summary;
public final BloomFilter bf;
-
+ private FileMark mark;
+
IndexWriter(Descriptor desc, IPartitioner part, long keyCount) throws IOException
{
this.desc = desc;
@@ -396,11 +420,25 @@ public class SSTableWriter extends SSTab
stream.close();
// index
- indexFile.getChannel().force(true);
- indexFile.close();
+ long position = indexFile.getFilePointer();
+ indexFile.close(); // calls force
+ FileUtils.truncate(indexFile.getPath(), position);
// finalize in-memory index state
summary.complete();
}
+
+ public void mark()
+ {
+ mark = indexFile.mark();
+ }
+
+ public void reset() throws IOException
+ {
+ // we can't un-set the bloom filter addition, but extra keys in there are harmless.
+ // we can't reset dbuilder either, but that is the last thing called in afterappend so
+ // we assume that if that worked then we won't be trying to reset.
+ indexFile.reset(mark);
+ }
}
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/io/util/FileUtils.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/util/FileUtils.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/io/util/FileUtils.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/io/util/FileUtils.java Tue Nov 9 01:54:44 2010
@@ -19,7 +19,9 @@
package org.apache.cassandra.io.util;
import java.io.File;
+import java.io.FileNotFoundException;
import java.io.IOException;
+import java.io.RandomAccessFile;
import java.text.DecimalFormat;
import java.util.Comparator;
import java.util.List;
@@ -27,9 +29,6 @@ import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.sun.jna.LastErrorException;
-import org.apache.cassandra.utils.CLibrary;
-
public class FileUtils
{
@@ -65,6 +64,20 @@ public class FileUtils
throw new IOException(String.format("Failed to rename %s to %s", from.getPath(), to.getPath()));
}
+ public static void truncate(String path, long size) throws IOException
+ {
+ RandomAccessFile file;
+ try
+ {
+ file = new RandomAccessFile(path, "rw");
+ }
+ catch (FileNotFoundException e)
+ {
+ throw new RuntimeException(e);
+ }
+ file.getChannel().truncate(size);
+ }
+
public static class FileComparator implements Comparator<File>
{
public int compare(File f, File f2)
Modified: cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageProxy.java Tue Nov 9 01:54:44 2010
@@ -582,7 +582,8 @@ public class StorageProxy implements Sto
// no more splits
break;
Pair<AbstractBounds,AbstractBounds> splits = remainder.split(token);
- ranges.add(splits.left);
+ if (splits.left != null)
+ ranges.add(splits.left);
remainder = splits.right;
}
if (remainder != null)
@@ -684,6 +685,11 @@ public class StorageProxy implements Sto
throw new RuntimeException(e);
}
rows.addAll(theseRows);
+ if (logger.isDebugEnabled())
+ {
+ for (Row row : theseRows)
+ logger.debug("read " + row);
+ }
if (rows.size() >= index_clause.count)
return rows.subList(0, index_clause.count);
}
Modified: cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/CassandraServer.java Tue Nov 9 01:54:44 2010
@@ -815,13 +815,11 @@ public class CassandraServer implements
public String system_update_keyspace(KsDef ks_def) throws InvalidRequestException, TException
{
state().hasKeyspaceListAccess(Permission.WRITE);
-
+
+ ThriftValidation.validateTable(ks_def.name);
if (ks_def.getCf_defs() != null && ks_def.getCf_defs().size() > 0)
throw new InvalidRequestException("Keyspace update must not contain any column family definitions.");
- if (DatabaseDescriptor.getTableDefinition(ks_def.name) == null)
- throw new InvalidRequestException("Keyspace does not exist.");
-
try
{
KSMetaData ksm = new KSMetaData(
@@ -935,11 +933,8 @@ public class CassandraServer implements
public void set_keyspace(String keyspace) throws InvalidRequestException, TException
{
- if (DatabaseDescriptor.getTableDefinition(keyspace) == null)
- {
- throw new InvalidRequestException("Keyspace does not exist");
- }
-
+ ThriftValidation.validateTable(keyspace);
+
state().setKeyspace(keyspace);
}
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=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/thrift/ThriftValidation.java Tue Nov 9 01:54:44 2010
@@ -59,11 +59,11 @@ public class ThriftValidation
}
}
- private static void validateTable(String tablename) throws KeyspaceNotDefinedException
+ public static void validateTable(String tablename) throws KeyspaceNotDefinedException
{
if (!DatabaseDescriptor.getTables().contains(tablename))
{
- throw new KeyspaceNotDefinedException("Keyspace " + tablename + " does not exist in this schema.");
+ throw new KeyspaceNotDefinedException("Keyspace " + tablename + " does not exist");
}
}
Modified: cassandra/trunk/test/unit/org/apache/cassandra/cli/CliTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/cli/CliTest.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/cli/CliTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/cli/CliTest.java Tue Nov 9 01:54:44 2010
@@ -54,7 +54,30 @@ public class CliTest extends CleanupHelp
"list CF3[:]",
"list CF3[h:]",
"list CF3 limit 10",
- "list CF3[h:g] limit 10",
+ "list CF3[h:] limit 10",
+ "create column family CF4 with comparator=IntegerType and column_metadata=[{column_name:9999, validation_class:LongType}]",
+ "set CF4['hello'][9999] = 1234",
+ "get CF4['hello'][9999]",
+ "get CF4['hello'][9999] as Long",
+ "get CF4['hello'][9999] as Bytes",
+ "set CF4['hello'][9999] = Long(1234)",
+ "get CF4['hello'][9999]",
+ "get CF4['hello'][9999] as Long",
+ "del CF4['hello'][9999]",
+ "get CF4['hello'][9999]",
+ "create column family SCF1 with column_type=Super and comparator=IntegerType and subcomparator=LongType and column_metadata=[{column_name:9999, validation_class:LongType}]",
+ "set SCF1['hello'][1][9999] = 1234",
+ "get SCF1['hello'][1][9999]",
+ "get SCF1['hello'][1][9999] as Long",
+ "get SCF1['hello'][1][9999] as Bytes",
+ "set SCF1['hello'][1][9999] = Long(1234)",
+ "get SCF1['hello'][1][9999]",
+ "get SCF1['hello'][1][9999] as Long",
+ "del SCF1['hello'][1][9999]",
+ "get SCF1['hello'][1][9999]",
+ "set SCF1['hello'][1][9999] = Long(1234)",
+ "del SCF1['hello'][9999]",
+ "get SCF1['hello'][1][9999]",
"truncate CF1",
"update keyspace TestKeySpace with placement_strategy='org.apache.cassandra.locator.LocalStrategy'",
"update keyspace TestKeySpace with replication_factor=1 and strategy_options=[{DC1:3, DC2:4, DC5:1}]"
@@ -83,9 +106,12 @@ public class CliTest extends CleanupHelp
for (String statement : statements)
{
+ errStream.reset();
+ // System.out.println("Executing statement: " + statement);
CliMain.processStatement(statement);
String result = outStream.toString();
-
+ // System.out.println("Result:\n" + result);
+ assertEquals("", errStream.toString());
if (statement.startsWith("drop ") || statement.startsWith("create ") || statement.startsWith("update "))
{
assertTrue(result.matches("(.{8})-(.{4})-(.{4})-(.{4})-(.{12})\n"));
@@ -102,7 +128,7 @@ public class CliTest extends CleanupHelp
}
else
{
- assertTrue(result.startsWith("=> (column="));
+ assertTrue(result.startsWith("=> (column=") || result.startsWith("Value was not found"));
}
}
else if (statement.startsWith("truncate "))
Modified: cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java Tue Nov 9 01:54:44 2010
@@ -238,7 +238,8 @@ public class ColumnFamilyStoreTest exten
// verify that it's not being indexed under the deletion column value either
IColumn deletion = rm.getColumnFamilies().iterator().next().iterator().next();
- IndexExpression expr0 = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexOperator.EQ, deletion.value());
+ ByteBuffer deletionLong = FBUtilities.toByteBuffer((long) FBUtilities.byteBufferToInt(deletion.value()));
+ IndexExpression expr0 = new IndexExpression(ByteBufferUtil.bytes("birthdate"), IndexOperator.EQ, deletionLong);
IndexClause clause0 = new IndexClause(Arrays.asList(expr0), FBUtilities.EMPTY_BYTE_BUFFER, 100);
rows = cfs.scan(clause0, range, filter);
assert rows.isEmpty();
Modified: cassandra/trunk/test/unit/org/apache/cassandra/service/StorageProxyTest.java
URL: http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/service/StorageProxyTest.java?rev=1032809&r1=1032808&r2=1032809&view=diff
==============================================================================
--- cassandra/trunk/test/unit/org/apache/cassandra/service/StorageProxyTest.java (original)
+++ cassandra/trunk/test/unit/org/apache/cassandra/service/StorageProxyTest.java Tue Nov 9 01:54:44 2010
@@ -96,6 +96,8 @@ public class StorageProxyTest extends Cl
// full wraps
testGRR(range("0", "0"), range("0", "1"), range("1", "6"), range("6", ""), range("", "0"));
testGRR(range("", ""), range("", "1"), range("1", "6"), range("6", ""));
+ // wrap on member token
+ testGRR(range("6", "6"), range("6", ""), range("", "1"), range("1", "6"));
// end wrapped
testGRR(range("5", ""), range("5", "6"), range("6", ""));
}