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", ""));
     }