Author: slebresne
Date: Wed Sep  7 17:29:53 2011
New Revision: 1166283

URL: http://svn.apache.org/viewvc?rev=1166283&view=rev
Log:
Use TreeMap backed column families for the SSTable simple writers
patch by slebresne; reviewed by jbellis for CASSANDRA-3148

Added:
    
cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
Modified:
    cassandra/trunk/CHANGES.txt
    
cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
    cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java
    cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java
    cassandra/trunk/src/java/org/apache/cassandra/db/Row.java
    cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java
    
cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java
    
cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
    
cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
    cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableWriter.java
    
cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java

Modified: cassandra/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/CHANGES.txt?rev=1166283&r1=1166282&r2=1166283&view=diff
==============================================================================
--- cassandra/trunk/CHANGES.txt (original)
+++ cassandra/trunk/CHANGES.txt Wed Sep  7 17:29:53 2011
@@ -62,6 +62,8 @@
    (CASSANDRA-2901)
  * make AbstractBounds.normalize support overlapping ranges (CASSANDRA-2641)
  * fix of the CQL count() behavior (CASSANDRA-3068)
+ * use TreeMap backed column families for the SSTable simple writers
+   (CASSANDRA-3148)
 
 0.8.5
  * fix NPE when encryption_options is unspecified (CASSANDRA-3007)

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java?rev=1166283&r1=1166282&r2=1166283&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/ArrayBackedSortedColumns.java 
Wed Sep  7 17:29:53 2011
@@ -35,7 +35,7 @@ public class ArrayBackedSortedColumns ex
     private final AbstractType<?> comparator;
     private final boolean reversed;
 
-    public static final ISortedColumns.Factory FACTORY = new Factory()
+    public static final ISortedColumns.Factory factory = new Factory()
     {
         public ISortedColumns create(AbstractType<?> comparator, boolean 
insertReversed)
         {
@@ -50,7 +50,7 @@ public class ArrayBackedSortedColumns ex
 
     public static ISortedColumns.Factory factory()
     {
-        return FACTORY;
+        return factory;
     }
 
     private ArrayBackedSortedColumns(AbstractType<?> comparator, boolean 
reversed)

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java?rev=1166283&r1=1166282&r2=1166283&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/ColumnFamilySerializer.java 
Wed Sep  7 17:29:53 2011
@@ -111,7 +111,7 @@ public class ColumnFamilySerializer impl
 
     public ColumnFamily deserialize(DataInput dis) throws IOException
     {
-        return deserialize(dis, false, ThreadSafeSortedColumns.FACTORY);
+        return deserialize(dis, false, ThreadSafeSortedColumns.factory());
     }
 
     public ColumnFamily deserialize(DataInput dis, boolean fromRemote, 
ISortedColumns.Factory factory) throws IOException

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java?rev=1166283&r1=1166282&r2=1166283&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/ReadResponse.java Wed Sep  
7 17:29:53 2011
@@ -110,7 +110,7 @@ class ReadResponseSerializer implements 
         if (!isDigest)
         {
             // This is coming from a remote host
-            row = Row.serializer().deserialize(dis, version, true, 
ArrayBackedSortedColumns.FACTORY);
+            row = Row.serializer().deserialize(dis, version, true, 
ArrayBackedSortedColumns.factory());
         }
 
         return isDigest ? new ReadResponse(ByteBuffer.wrap(digest)) : new 
ReadResponse(row);

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/Row.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/Row.java?rev=1166283&r1=1166282&r2=1166283&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/Row.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/Row.java Wed Sep  7 
17:29:53 2011
@@ -71,7 +71,7 @@ public class Row
 
         public Row deserialize(DataInputStream dis, int version) throws 
IOException
         {
-            return deserialize(dis, version, false, 
ThreadSafeSortedColumns.FACTORY);
+            return deserialize(dis, version, false, 
ThreadSafeSortedColumns.factory());
         }
     }
 }

Modified: cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java?rev=1166283&r1=1166282&r2=1166283&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/db/RowMutation.java Wed Sep  
7 17:29:53 2011
@@ -401,7 +401,7 @@ public class RowMutation implements IMut
             for (int i = 0; i < size; ++i)
             {
                 Integer cfid = Integer.valueOf(dis.readInt());
-                ColumnFamily cf = ColumnFamily.serializer().deserialize(dis, 
fromRemote, ThreadSafeSortedColumns.FACTORY);
+                ColumnFamily cf = ColumnFamily.serializer().deserialize(dis, 
fromRemote, ThreadSafeSortedColumns.factory());
                 modifications.put(cfid, cf);
             }
             return new RowMutation(table, key, modifications);

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java?rev=1166283&r1=1166282&r2=1166283&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java 
(original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/ThreadSafeSortedColumns.java 
Wed Sep  7 17:29:53 2011
@@ -29,7 +29,7 @@ import org.apache.cassandra.utils.Alloca
 
 public class ThreadSafeSortedColumns extends ConcurrentSkipListMap<ByteBuffer, 
IColumn> implements ISortedColumns
 {
-    public static final ISortedColumns.Factory FACTORY = new Factory()
+    public static final ISortedColumns.Factory factory = new Factory()
     {
         public ISortedColumns create(AbstractType<?> comparator, boolean 
insertReversed)
         {
@@ -44,7 +44,7 @@ public class ThreadSafeSortedColumns ext
 
     public static ISortedColumns.Factory factory()
     {
-        return FACTORY;
+        return factory;
     }
 
     public AbstractType<?> getComparator()

Added: 
cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java?rev=1166283&view=auto
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
 (added)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/db/TreeMapBackedSortedColumns.java
 Wed Sep  7 17:29:53 2011
@@ -0,0 +1,165 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cassandra.db;
+
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.utils.Allocator;
+
+public class TreeMapBackedSortedColumns extends TreeMap<ByteBuffer, IColumn> 
implements ISortedColumns
+{
+    public static final ISortedColumns.Factory factory = new Factory()
+    {
+        public ISortedColumns create(AbstractType<?> comparator, boolean 
insertReversed)
+        {
+            return new TreeMapBackedSortedColumns(comparator);
+        }
+
+        public ISortedColumns fromSorted(SortedMap<ByteBuffer, IColumn> 
sortedMap, boolean insertReversed)
+        {
+            return new TreeMapBackedSortedColumns(sortedMap);
+        }
+    };
+
+    public static ISortedColumns.Factory factory()
+    {
+        return factory;
+    }
+
+    public AbstractType<?> getComparator()
+    {
+        return (AbstractType)comparator();
+    }
+
+    private TreeMapBackedSortedColumns(AbstractType<?> comparator)
+    {
+        super(comparator);
+    }
+
+    private TreeMapBackedSortedColumns(SortedMap<ByteBuffer, IColumn> columns)
+    {
+        super(columns);
+    }
+
+    public ISortedColumns cloneMe()
+    {
+        return new TreeMapBackedSortedColumns(this);
+    }
+
+    /*
+     * If we find an old column that has the same name
+     * the ask it to resolve itself else add the new column
+    */
+    public void addColumn(IColumn column, Allocator allocator)
+    {
+        ByteBuffer name = column.name();
+        IColumn oldColumn = put(name, column);
+        if (oldColumn != null)
+        {
+            if (oldColumn instanceof SuperColumn)
+            {
+                assert column instanceof SuperColumn;
+                ((SuperColumn) oldColumn).putColumn((SuperColumn)column, 
allocator);
+            }
+            else
+            {
+                // calculate reconciled col from old (existing) col and new col
+                IColumn reconciledColumn = column.reconcile(oldColumn, 
allocator);
+                put(name, reconciledColumn);
+            }
+        }
+    }
+
+    /**
+     * We need to go through each column in the column container and resolve 
it before adding
+     */
+    public void addAll(ISortedColumns cm, Allocator allocator)
+    {
+        for (IColumn column : cm.getSortedColumns())
+            addColumn(column, allocator);
+    }
+
+    public boolean replace(IColumn oldColumn, IColumn newColumn)
+    {
+        if (!oldColumn.name().equals(newColumn.name()))
+            throw new IllegalArgumentException();
+
+        // We are not supposed to put the newColumn is either there was not
+        // column or the column was not equal to oldColumn (to be coherent
+        // with other implementation). We optimize for the common case where
+        // oldColumn do is present though.
+        IColumn previous = put(oldColumn.name(), newColumn);
+        if (previous == null)
+        {
+            remove(oldColumn.name());
+            return false;
+        }
+        if (!previous.equals(oldColumn))
+        {
+            put(oldColumn.name(), previous);
+            return false;
+        }
+        return true;
+    }
+
+    public IColumn getColumn(ByteBuffer name)
+    {
+        return get(name);
+    }
+
+    public void removeColumn(ByteBuffer name)
+    {
+        remove(name);
+    }
+
+    public Collection<IColumn> getSortedColumns()
+    {
+        return values();
+    }
+
+    public Collection<IColumn> getReverseSortedColumns()
+    {
+        return descendingMap().values();
+    }
+
+    public SortedSet<ByteBuffer> getColumnNames()
+    {
+        return navigableKeySet();
+    }
+
+    public int getEstimatedColumnCount()
+    {
+        return size();
+    }
+
+    public Iterator<IColumn> iterator()
+    {
+        return values().iterator();
+    }
+
+    public Iterator<IColumn> reverseIterator()
+    {
+        return getReverseSortedColumns().iterator();
+    }
+}

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java?rev=1166283&r1=1166282&r2=1166283&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
 (original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
 Wed Sep  7 17:29:53 2011
@@ -83,7 +83,7 @@ public class SSTableSimpleUnsortedWriter
         // If the CF already exist in memory, we'll just continue adding to it
         if (previous == null)
         {
-            previous = ColumnFamily.create(metadata);
+            previous = ColumnFamily.create(metadata, 
TreeMapBackedSortedColumns.factory());
             keys.put(currentKey, previous);
         }
         else

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java?rev=1166283&r1=1166282&r2=1166283&view=diff
==============================================================================
--- 
cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
 (original)
+++ 
cassandra/trunk/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
 Wed Sep  7 17:29:53 2011
@@ -79,6 +79,6 @@ public class SSTableSimpleWriter extends
 
     protected ColumnFamily getColumnFamily()
     {
-        return ColumnFamily.create(metadata);
+        return ColumnFamily.create(metadata, 
TreeMapBackedSortedColumns.factory());
     }
 }

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=1166283&r1=1166282&r2=1166283&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 
Wed Sep  7 17:29:53 2011
@@ -224,7 +224,7 @@ public class SSTableWriter extends SSTab
 
         // deserialize each column to obtain maxTimestamp and immediately 
serialize it.
         long maxTimestamp = Long.MIN_VALUE;
-        ColumnFamily cf = ColumnFamily.create(metadata, 
ArrayBackedSortedColumns.FACTORY);
+        ColumnFamily cf = ColumnFamily.create(metadata, 
ArrayBackedSortedColumns.factory());
         for (int i = 0; i < columnCount; i++)
         {
             // deserialize column with fromRemote false, in order to keep size 
of streamed column

Modified: 
cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java?rev=1166283&r1=1166282&r2=1166283&view=diff
==============================================================================
--- 
cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
 (original)
+++ 
cassandra/trunk/test/unit/org/apache/cassandra/db/ArrayBackedSortedColumnsTest.java
 Wed Sep  7 17:29:53 2011
@@ -22,7 +22,7 @@ public class ArrayBackedSortedColumnsTes
 
     private void testAddInternal(boolean reversed)
     {
-        ISortedColumns map = 
ArrayBackedSortedColumns.FACTORY.create(BytesType.instance, reversed);
+        ISortedColumns map = 
ArrayBackedSortedColumns.factory().create(BytesType.instance, reversed);
         int[] values = new int[]{ 1, 2, 2, 3 };
 
         for (int i = 0; i < values.length; ++i)
@@ -43,8 +43,8 @@ public class ArrayBackedSortedColumnsTes
 
     private void testAddAllInternal(boolean reversed)
     {
-        ISortedColumns map = 
ArrayBackedSortedColumns.FACTORY.create(BytesType.instance, reversed);
-        ISortedColumns map2 = 
ArrayBackedSortedColumns.FACTORY.create(BytesType.instance, reversed);
+        ISortedColumns map = 
ArrayBackedSortedColumns.factory().create(BytesType.instance, reversed);
+        ISortedColumns map2 = 
ArrayBackedSortedColumns.factory().create(BytesType.instance, reversed);
 
         int[] values1 = new int[]{ 1, 3, 5, 6 };
         int[] values2 = new int[]{ 2, 4, 5, 6 };
@@ -75,7 +75,7 @@ public class ArrayBackedSortedColumnsTes
 
     private void testGetCollectionInternal(boolean reversed)
     {
-        ISortedColumns map = 
ArrayBackedSortedColumns.FACTORY.create(BytesType.instance, reversed);
+        ISortedColumns map = 
ArrayBackedSortedColumns.factory().create(BytesType.instance, reversed);
         int[] values = new int[]{ 1, 2, 3, 5, 9 };
 
         List<IColumn> sorted = new ArrayList<IColumn>();
@@ -100,7 +100,7 @@ public class ArrayBackedSortedColumnsTes
 
     private void testGetNamesInternal(boolean reversed)
     {
-        ISortedColumns map = 
ArrayBackedSortedColumns.FACTORY.create(BytesType.instance, reversed);
+        ISortedColumns map = 
ArrayBackedSortedColumns.factory().create(BytesType.instance, reversed);
         List<ByteBuffer> names = new ArrayList<ByteBuffer>();
         int[] values = new int[]{ 1, 2, 3, 5, 9 };
         for (int v : values)


Reply via email to