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 2009/08/11 22:34:21 UTC

svn commit: r803284 - in /incubator/cassandra/trunk/src/java/org/apache/cassandra: db/ db/filter/ io/

Author: jbellis
Date: Tue Aug 11 20:34:21 2009
New Revision: 803284

URL: http://svn.apache.org/viewvc?rev=803284&view=rev
Log:
Move CFSerializer into its own file.  Rename deserializeEmpty to deserializeFromSSTableNoColumns; add serializeForSSTable and serializeWithIndexes to do the without-metadata serialization.  Add SSTableReader.makeColumnFamily to create the CF skeleton w/o reading any data.
patch by jbellis; reviewed by Sandeep Tata for CASSANDRA-233

Added:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java
Removed:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/CompactSerializerInvocationHandler.java
Modified:
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIndexer.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/io/FileStruct.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IndexHelper.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IteratingRow.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTable.java
    incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTableReader.java

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamily.java Tue Aug 11 20:34:21 2009
@@ -18,8 +18,6 @@
 
 package org.apache.cassandra.db;
 
-import java.io.*;
-import java.lang.reflect.Proxy;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -34,13 +32,10 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.io.ICompactSerializer;
 import org.apache.cassandra.io.ICompactSerializer2;
-import org.apache.cassandra.io.BufferedRandomAccessFile;
 import org.apache.cassandra.db.filter.QueryPath;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.MarshalException;
-import org.apache.cassandra.db.marshal.LongType;
 
 
 public final class ColumnFamily implements IColumnContainer
@@ -51,7 +46,7 @@
 
     private static Logger logger_ = Logger.getLogger( ColumnFamily.class );
     private static Map<String, String> columnTypes_ = new HashMap<String, String>();
-    private String type_;
+    String type_;
     private String table_;
 
     static
@@ -66,15 +61,6 @@
         return serializer_;
     }
 
-    /*
-     * This method returns the serializer whose methods are
-     * preprocessed by a dynamic proxy.
-    */
-    public static ICompactSerializer2<ColumnFamily> serializerWithIndexes()
-    {
-        return (ICompactSerializer2<ColumnFamily>)Proxy.newProxyInstance( ColumnFamily.class.getClassLoader(), new Class[]{ICompactSerializer2.class}, new CompactSerializerInvocationHandler<ColumnFamily>(serializer_) );
-    }
-
     public static String getColumnType(String key)
     {
     	if ( key == null )
@@ -93,8 +79,8 @@
     private String name_;
 
     private transient ICompactSerializer2<IColumn> columnSerializer_;
-    private long markedForDeleteAt = Long.MIN_VALUE;
-    private int localDeletionTime = Integer.MIN_VALUE;
+    long markedForDeleteAt = Long.MIN_VALUE;
+    int localDeletionTime = Integer.MIN_VALUE;
     private AtomicInteger size_ = new AtomicInteger(0);
     private ConcurrentSkipListMap<byte[], IColumn> columns_;
 
@@ -409,12 +395,12 @@
         return type_;
     }
 
-    private String getComparatorName()
+    String getComparatorName()
     {
         return getComparator().getClass().getCanonicalName();
     }
 
-    private String getSubComparatorName()
+    String getSubComparatorName()
     {
         AbstractType subcolumnComparator = getSubComparator();
         return subcolumnComparator == null ? "" : subcolumnComparator.getClass().getCanonicalName();
@@ -450,95 +436,4 @@
         }
         return cf;
     }
-
-    public static class ColumnFamilySerializer implements ICompactSerializer2<ColumnFamily>
-    {
-        /*
-         * We are going to create indexes, and write out that information as well. The format
-         * of the data serialized is as follows.
-         *
-         * 1) Without indexes:
-         *  // written by the data
-         * 	<boolean false (index is not present)>
-         * 	<column family id>
-         * 	<is marked for delete>
-         * 	<total number of columns>
-         * 	<columns data>
-
-         * 	<boolean true (index is present)>
-         *
-         *  This part is written by the column indexer
-         * 	<size of index in bytes>
-         * 	<list of column names and their offsets relative to the first column>
-         *
-         *  <size of the cf in bytes>
-         * 	<column family id>
-         * 	<is marked for delete>
-         * 	<total number of columns>
-         * 	<columns data>
-        */
-        public void serialize(ColumnFamily columnFamily, DataOutput dos) throws IOException
-        {
-            Collection<IColumn> columns = columnFamily.getSortedColumns();
-
-            dos.writeUTF(columnFamily.name());
-            dos.writeUTF(columnFamily.type_);
-            dos.writeUTF(columnFamily.getComparatorName());
-            dos.writeUTF(columnFamily.getSubComparatorName());
-            dos.writeInt(columnFamily.localDeletionTime);
-            dos.writeLong(columnFamily.markedForDeleteAt);
-
-            dos.writeInt(columns.size());
-            for ( IColumn column : columns )
-            {
-                columnFamily.getColumnSerializer().serialize(column, dos);
-            }
-        }
-
-        public ColumnFamily deserialize(DataInput dis) throws IOException
-        {
-            ColumnFamily cf = deserializeEmpty(dis);
-            int size = dis.readInt();
-            IColumn column;
-            for (int i = 0; i < size; ++i)
-            {
-                column = cf.getColumnSerializer().deserialize(dis);
-                cf.addColumn(column);
-            }
-            return cf;
-        }
-
-        private AbstractType readComparator(DataInput dis) throws IOException
-        {
-            String className = dis.readUTF();
-            if (className.equals(""))
-            {
-                return null;
-            }
-
-            try
-            {
-                return (AbstractType)Class.forName(className).getConstructor().newInstance();
-            }
-            catch (ClassNotFoundException e)
-            {
-                throw new RuntimeException("Unable to load comparator class '" + className + "'.  probably this means you have obsolete sstables lying around", e);
-            }
-            catch (Exception e)
-            {
-                throw new RuntimeException(e);
-            }
-        }
-
-        public ColumnFamily deserializeEmpty(DataInput input) throws IOException
-        {
-            ColumnFamily cf = new ColumnFamily(input.readUTF(),
-                                               input.readUTF(),
-                                               readComparator(input),
-                                               readComparator(input));
-            cf.delete(input.readInt(), input.readLong());
-            return cf;
-        }
-    }
 }
-

Added: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java?rev=803284&view=auto
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java (added)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java Tue Aug 11 20:34:21 2009
@@ -0,0 +1,106 @@
+package org.apache.cassandra.db;
+
+import java.io.DataOutput;
+import java.io.IOException;
+import java.io.DataInput;
+import java.util.Collection;
+
+import org.apache.cassandra.io.ICompactSerializer2;
+import org.apache.cassandra.db.marshal.AbstractType;
+
+public class ColumnFamilySerializer implements ICompactSerializer2<ColumnFamily>
+{
+    /*
+     * Serialized ColumnFamily format:
+     *
+     * [serialized for intra-node writes only, e.g. returning a query result]
+     * <cf name>
+     * <cf type [super or standard]>
+     * <cf comparator name>
+     * <cf subcolumn comparator name>
+     *
+     * [in sstable only]
+     * <column bloom filter>
+     * <sparse column index, start/finish columns every ColumnIndexSizeInKB of data>
+     *
+     * [always present]
+     * <local deletion time>
+     * <client-provided deletion time>
+     * <column count>
+     * <columns, serialized individually>
+    */
+    public void serialize(ColumnFamily columnFamily, DataOutput dos) throws IOException
+    {
+        dos.writeUTF(columnFamily.name());
+        dos.writeUTF(columnFamily.type_);
+        dos.writeUTF(columnFamily.getComparatorName());
+        dos.writeUTF(columnFamily.getSubComparatorName());
+        serializeForSSTable(columnFamily, dos);
+    }
+
+    public void serializeForSSTable(ColumnFamily columnFamily, DataOutput dos) throws IOException
+    {
+        dos.writeInt(columnFamily.localDeletionTime);
+        dos.writeLong(columnFamily.markedForDeleteAt);
+
+        Collection<IColumn> columns = columnFamily.getSortedColumns();
+        dos.writeInt(columns.size());
+        for ( IColumn column : columns )
+        {
+            columnFamily.getColumnSerializer().serialize(column, dos);
+        }
+    }
+
+    public void serializeWithIndexes(ColumnFamily columnFamily, DataOutput dos) throws IOException
+    {
+        ColumnIndexer.serialize(columnFamily, dos);
+        serializeForSSTable(columnFamily, dos);
+    }
+
+    public ColumnFamily deserialize(DataInput dis) throws IOException
+    {
+        ColumnFamily cf = deserializeFromSSTableNoColumns(dis.readUTF(), dis.readUTF(), readComparator(dis), readComparator(dis), dis);
+        int size = dis.readInt();
+        IColumn column;
+        for (int i = 0; i < size; ++i)
+        {
+            column = cf.getColumnSerializer().deserialize(dis);
+            cf.addColumn(column);
+        }
+        return cf;
+    }
+
+    private AbstractType readComparator(DataInput dis) throws IOException
+    {
+        String className = dis.readUTF();
+        if (className.equals(""))
+        {
+            return null;
+        }
+
+        try
+        {
+            return (AbstractType)Class.forName(className).getConstructor().newInstance();
+        }
+        catch (ClassNotFoundException e)
+        {
+            throw new RuntimeException("Unable to load comparator class '" + className + "'.  probably this means you have obsolete sstables lying around", e);
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public ColumnFamily deserializeFromSSTableNoColumns(String name, String type, AbstractType comparator, AbstractType subComparator, DataInput input) throws IOException
+    {
+        ColumnFamily cf = new ColumnFamily(name, type, comparator, subComparator);
+        return deserializeFromSSTableNoColumns(cf, input);
+    }
+
+    public ColumnFamily deserializeFromSSTableNoColumns(ColumnFamily cf, DataInput input) throws IOException
+    {
+        cf.delete(input.readInt(), input.readLong());
+        return cf;
+    }
+}

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilyStore.java Tue Aug 11 20:34:21 2009
@@ -969,14 +969,14 @@
                     columnFamilies.clear();
                     if (columnFamily != null)
                     {
-                        ColumnFamily.serializerWithIndexes().serialize(columnFamily, bufOut);
+                        ColumnFamily.serializer().serializeWithIndexes(columnFamily, bufOut);
                     }
                 }
                 else
                 {
                     // TODO deserializing only to reserialize is dumb
                     FileStruct filestruct = lfs.get(0);
-                    ColumnFamily.serializerWithIndexes().serialize(filestruct.getColumnFamily(), bufOut);
+                    ColumnFamily.serializer().serializeWithIndexes(filestruct.getColumnFamily(), bufOut);
                 }
                 if (Range.isTokenInRanges(StorageService.getPartitioner().getInitialToken(lastkey), ranges))
                 {
@@ -1139,14 +1139,14 @@
                     columnFamilies.clear();
                     if (columnFamily != null)
                     {
-                        ColumnFamily.serializerWithIndexes().serialize(columnFamily, bufOut);
+                        ColumnFamily.serializer().serializeWithIndexes(columnFamily, bufOut);
                     }
                 }
                 else
                 {
                     // TODO deserializing only to reserialize is dumb
                     FileStruct filestruct = lfs.get(0);
-                    ColumnFamily.serializerWithIndexes().serialize(filestruct.getColumnFamily(), bufOut);
+                    ColumnFamily.serializer().serializeWithIndexes(filestruct.getColumnFamily(), bufOut);
                 }
 
                 if (writer == null)
@@ -1441,7 +1441,7 @@
             List<SSTableReader> sstables = new ArrayList<SSTableReader>(ssTables_.values());
             for (SSTableReader sstable : sstables)
             {
-                iter = filter.getSSTableColumnIterator(sstable, getComparator());
+                iter = filter.getSSTableColumnIterator(sstable);
                 if (iter.hasNext()) // initializes iter.CF
                 {
                     returnCF.delete(iter.getColumnFamily());

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIndexer.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIndexer.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIndexer.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnIndexer.java Tue Aug 11 20:34:21 2009
@@ -20,6 +20,7 @@
 
 import java.io.DataOutputStream;
 import java.io.IOException;
+import java.io.DataOutput;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -45,7 +46,7 @@
 	 * @param dos data output stream
 	 * @throws IOException
 	 */
-    public static void serialize(ColumnFamily columnFamily, DataOutputStream dos) throws IOException
+    public static void serialize(ColumnFamily columnFamily, DataOutput dos) throws IOException
 	{
         Collection<IColumn> columns = columnFamily.getSortedColumns();
         BloomFilter bf = createColumnBloomFilter(columns);                    
@@ -101,7 +102,7 @@
      *            to be written.
      * @throws IOException
      */
-    private static void doIndexing(AbstractType comparator, Collection<IColumn> columns, DataOutputStream dos) throws IOException
+    private static void doIndexing(AbstractType comparator, Collection<IColumn> columns, DataOutput dos) throws IOException
     {
         assert !columns.isEmpty();
 

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/Memtable.java Tue Aug 11 20:34:21 2009
@@ -208,10 +208,10 @@
         {
             buffer.reset();
             ColumnFamily columnFamily = columnFamilies_.get(key);
-            if ( columnFamily != null )
+            if (columnFamily != null)
             {
                 /* serialize the cf with column indexes */
-                ColumnFamily.serializerWithIndexes().serialize( columnFamily, buffer );
+                ColumnFamily.serializer().serializeWithIndexes(columnFamily, buffer);
                 /* Now write the key and value to disk */
                 writer.append(partitioner.decorateKey(key), buffer);
             }

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/NamesQueryFilter.java Tue Aug 11 20:34:21 2009
@@ -7,6 +7,7 @@
 import org.apache.cassandra.utils.ReducingIterator;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.config.DatabaseDescriptor;
 
 public class NamesQueryFilter extends QueryFilter
 {
@@ -42,9 +43,9 @@
         return memtable.getNamesIterator(this);
     }
 
-    public ColumnIterator getSSTableColumnIterator(SSTableReader sstable, AbstractType comparator) throws IOException
+    public ColumnIterator getSSTableColumnIterator(SSTableReader sstable) throws IOException
     {
-        return new SSTableNamesIterator(sstable.getFilename(), key, getColumnFamilyName(), columns);
+        return new SSTableNamesIterator(sstable, key, columns);
     }
 
     public SuperColumn filterSuperColumn(SuperColumn superColumn, int gcBefore)

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/QueryFilter.java Tue Aug 11 20:34:21 2009
@@ -31,7 +31,7 @@
      * returns an iterator that returns columns from the given SSTable
      * matching the Filter criteria in sorted order.
      */
-    public abstract ColumnIterator getSSTableColumnIterator(SSTableReader sstable, AbstractType comparator) throws IOException;
+    public abstract ColumnIterator getSSTableColumnIterator(SSTableReader sstable) throws IOException;
 
     /**
      * collects columns from reducedColumns into returnCF.  Termination is determined

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableNamesIterator.java Tue Aug 11 20:34:21 2009
@@ -16,18 +16,17 @@
     private Iterator<IColumn> iter;
     public final SortedSet<byte[]> columns;
 
-    public SSTableNamesIterator(String filename, String key, String cfName, SortedSet<byte[]> columnNames) throws IOException
+    public SSTableNamesIterator(SSTableReader ssTable, String key, SortedSet<byte[]> columnNames) throws IOException
     {
         assert columnNames != null;
         this.columns = columnNames;
-        SSTableReader ssTable = SSTableReader.open(filename);
 
         String decoratedKey = ssTable.getPartitioner().decorateKey(key);
         long position = ssTable.getPosition(decoratedKey);
         if (position < 0)
             return;
 
-        BufferedRandomAccessFile file = new BufferedRandomAccessFile(filename, "r", DatabaseDescriptor.getIndexedReadBufferSizeInKB() * 1024);
+        BufferedRandomAccessFile file = new BufferedRandomAccessFile(ssTable.getFilename(), "r", DatabaseDescriptor.getIndexedReadBufferSizeInKB() * 1024);
         try
         {
             file.seek(position);
@@ -53,11 +52,11 @@
 
             List<IndexHelper.IndexInfo> indexList = IndexHelper.deserializeIndex(file);
 
-            cf = ColumnFamily.serializer().deserializeEmpty(file);
+            cf = ColumnFamily.serializer().deserializeFromSSTableNoColumns(ssTable.makeColumnFamily(), file);
             file.readInt(); // column count
 
             /* get the various column ranges we have to read */
-            AbstractType comparator = DatabaseDescriptor.getComparator(SSTable.parseTableName(filename), cfName);
+            AbstractType comparator = ssTable.getColumnComparator();
             SortedSet<IndexHelper.IndexInfo> ranges = new TreeSet<IndexHelper.IndexInfo>(IndexHelper.getComparator(comparator));
             for (byte[] name : filteredColumnNames)
             {

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SSTableSliceIterator.java Tue Aug 11 20:34:21 2009
@@ -20,20 +20,19 @@
     private final AbstractType comparator;
     private ColumnGroupReader reader;
 
-    public SSTableSliceIterator(String filename, String key, AbstractType comparator, byte[] startColumn, boolean reversed)
+    public SSTableSliceIterator(SSTableReader ssTable, String key, byte[] startColumn, boolean reversed)
     throws IOException
     {
         // TODO push finishColumn down here too, so we can tell when we're done and optimize away the slice when the index + start/stop shows there's nothing to scan for
         this.reversed = reversed;
-        SSTableReader ssTable = SSTableReader.open(filename);
 
         /* Morph key into actual key based on the partition type. */
         String decoratedKey = ssTable.getPartitioner().decorateKey(key);
         long position = ssTable.getPosition(decoratedKey);
-        this.comparator = comparator;
+        this.comparator = ssTable.getColumnComparator();
         this.startColumn = startColumn;
         if (position >= 0)
-            reader = new ColumnGroupReader(filename, decoratedKey, position);
+            reader = new ColumnGroupReader(ssTable, decoratedKey, position);
     }
 
     private boolean isColumnNeeded(IColumn column)
@@ -85,9 +84,9 @@
         private int curRangeIndex;
         private Deque<IColumn> blockColumns = new ArrayDeque<IColumn>();
 
-        public ColumnGroupReader(String filename, String key, long position) throws IOException
+        public ColumnGroupReader(SSTableReader ssTable, String key, long position) throws IOException
         {
-            this.file = new BufferedRandomAccessFile(filename, "r", DatabaseDescriptor.getSlicedReadBufferSizeInKB() * 1024);
+            this.file = new BufferedRandomAccessFile(ssTable.getFilename(), "r", DatabaseDescriptor.getSlicedReadBufferSizeInKB() * 1024);
 
             file.seek(position);
             String keyInDisk = file.readUTF();
@@ -97,7 +96,7 @@
             IndexHelper.skipBloomFilter(file);
             indexes = IndexHelper.deserializeIndex(file);
 
-            emptyColumnFamily = ColumnFamily.serializer().deserializeEmpty(file);
+            emptyColumnFamily = ColumnFamily.serializer().deserializeFromSSTableNoColumns(ssTable.makeColumnFamily(), file);
             file.readInt(); // column count
 
             columnStartPosition = file.getFilePointer();

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/db/filter/SliceQueryFilter.java Tue Aug 11 20:34:21 2009
@@ -13,6 +13,7 @@
 import org.apache.cassandra.io.SSTableReader;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.config.DatabaseDescriptor;
 
 public class SliceQueryFilter extends QueryFilter
 {
@@ -34,9 +35,9 @@
         return memtable.getSliceIterator(this, comparator);
     }
 
-    public ColumnIterator getSSTableColumnIterator(SSTableReader sstable, AbstractType comparator) throws IOException
+    public ColumnIterator getSSTableColumnIterator(SSTableReader sstable) throws IOException
     {
-        return new SSTableSliceIterator(sstable.getFilename(), key, comparator, start, reversed);
+        return new SSTableSliceIterator(sstable, key, start, reversed);
     }
 
     public SuperColumn filterSuperColumn(SuperColumn superColumn, int gcBefore)

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/io/FileStruct.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/io/FileStruct.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/io/FileStruct.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/io/FileStruct.java Tue Aug 11 20:34:21 2009
@@ -121,7 +121,7 @@
             return;
         }
 
-        row = new IteratingRow(file);
+        row = new IteratingRow(file, sstable);
         if (materialize)
         {
             while (row.hasNext())

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IndexHelper.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IndexHelper.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IndexHelper.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IndexHelper.java Tue Aug 11 20:34:21 2009
@@ -159,7 +159,7 @@
             this.width = width;
         }
 
-        public void serialize(DataOutputStream dos) throws IOException
+        public void serialize(DataOutput dos) throws IOException
         {
             ColumnSerializer.writeName(firstName, dos);
             ColumnSerializer.writeName(lastName, dos);

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IteratingRow.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IteratingRow.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IteratingRow.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/io/IteratingRow.java Tue Aug 11 20:34:21 2009
@@ -4,6 +4,8 @@
 
 import org.apache.cassandra.db.ColumnFamily;
 import org.apache.cassandra.db.IColumn;
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import com.google.common.collect.AbstractIterator;
 
 public class IteratingRow extends AbstractIterator<IColumn>
@@ -13,7 +15,7 @@
     private final ColumnFamily emptyColumnFamily;
     private final BufferedRandomAccessFile file;
 
-    public IteratingRow(BufferedRandomAccessFile file) throws IOException
+    public IteratingRow(BufferedRandomAccessFile file, SSTableReader sstable) throws IOException
     {
         this.file = file;
 
@@ -22,7 +24,7 @@
         long dataStart = file.getFilePointer();
         finishedAt = dataStart + dataSize;
         IndexHelper.skipBloomFilterAndIndex(file);
-        emptyColumnFamily = ColumnFamily.serializer().deserializeEmpty(file);
+        emptyColumnFamily = ColumnFamily.serializer().deserializeFromSSTableNoColumns(sstable.makeColumnFamily(), file);
         file.readInt(); // column count. breaking serializer encapsulation is less fugly than adding a wrapper class to allow deserializeEmpty to return both values
     }
 

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTable.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTable.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTable.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTable.java Tue Aug 11 20:34:21 2009
@@ -7,6 +7,8 @@
 
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.utils.BloomFilter;
+import org.apache.cassandra.db.ColumnFamily;
+import org.apache.cassandra.config.DatabaseDescriptor;
 
 /**
  * This class is built on top of the SequenceFile. It stores
@@ -26,6 +28,7 @@
     protected IPartitioner partitioner;
     protected BloomFilter bf;
     protected List<KeyPosition> indexPositions;
+    protected String columnFamilyName;
 
     /* Every 128th index entry is loaded into memory so we know where to start looking for the actual key w/o seeking */
     public static final int INDEX_INTERVAL = 128;/* Required extension for temporary files created during compactions. */
@@ -34,6 +37,7 @@
     public SSTable(String filename, IPartitioner partitioner)
     {
         assert filename.endsWith("-Data.db");
+        columnFamilyName = new File(filename).getName().split("-")[0];
         this.path = filename;
         this.partitioner = partitioner;
     }
@@ -67,6 +71,11 @@
         return path;
     }
 
+    public String getColumnFamilyName()
+    {
+        return columnFamilyName;
+    }
+
     public static String parseTableName(String filename)
     {
         return new File(filename).getParentFile().getName();        

Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTableReader.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTableReader.java?rev=803284&r1=803283&r2=803284&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTableReader.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/io/SSTableReader.java Tue Aug 11 20:34:21 2009
@@ -28,6 +28,8 @@
 import org.apache.cassandra.utils.FileUtils;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ColumnFamily;
+import org.apache.cassandra.db.marshal.AbstractType;
 import org.cliffc.high_scale_lib.NonBlockingHashMap;
 import com.reardencommerce.kernel.collections.shared.evictable.ConcurrentLinkedHashMap;
 
@@ -324,6 +326,19 @@
         return parseTableName(path);
     }
 
+    public AbstractType getColumnComparator()
+    {
+        return DatabaseDescriptor.getComparator(getTableName(), getColumnFamilyName());
+    }
+
+    public ColumnFamily makeColumnFamily()
+    {
+        return new ColumnFamily(getColumnFamilyName(),
+                                DatabaseDescriptor.getColumnType(getTableName(), getColumnFamilyName()),
+                                getColumnComparator(),
+                                DatabaseDescriptor.getSubComparator(getTableName(), getColumnFamilyName()));
+    }
+
     public static void deleteAll() throws IOException
     {
         for (SSTableReader sstable : openedFiles.values())